天天看點

sqlite3學習之Join 子句&UNION 子句&NULL 值&别名(表或列的重命名)

SQLite 的 Join 子句用于結合兩個或多個資料庫中表的記錄,它是是一種通過共同值來結合兩個表中字段的手段,SQL 定義了三種主要類型的連接配接,如下:

  • 交叉連接配接 - CROSS JOIN
  • 内連接配接 - INNER JOIN
  • 外連接配接 - OUTER JOIN

我們先來假設有兩個表 COMPANY 和 DEPARTMENT,再來假設 COMPANY 表的記錄清單如下 :

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0
           

再來看 DEPARTMENT 表中的記錄清單:

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineerin  2
3           Finance     7
           

之後,我們就來看交叉連接配接(CROSS JOIN),它主要是把第一個表的每一行與第二個表的每一行進行比對。如果兩個輸入表分别有 x 和 y 行,則結果表有 x*y 行。由于交叉連接配接(CROSS JOIN)有可能産生非常大的表,使用時必須謹慎,隻在适當的時候使用它們。

交叉連接配接的操作,它們都傳回被連接配接的兩個表所有資料行的笛卡爾積,傳回到的資料行數等于第一個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數,來看下文法格式:

SELECT ... FROM table1 CROSS JOIN table2 ...
           

執行個體如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
           

再來就是内連接配接(INNER JOIN),它是根據連接配接謂詞結合兩個表(table1 和 table2)的列值來建立一個新的結果表。查詢會把 table1 中的每一行與 table2 中的每一行進行比較,找到所有滿足連接配接謂詞的行的比對對。當滿足連接配接謂詞時,A 和 B 行的每個比對對的列值會合并成一個結果行。内連接配接(INNER JOIN)是最常見的連接配接類型,是預設的連接配接類型。INNER 關鍵字是可選的,來看下内連接配接(INNER JOIN)的文法:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
           

為了避免備援,并保持較短的措辭,可以使用 USING 表達式聲明内連接配接(INNER JOIN)條件。這個表達式指定一個或多個列的清單:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
           

自然連接配接(NATURAL JOIN)類似于 JOIN...USING,隻是它會自動測試存在兩個表中的每一列的值之間相等值:

SELECT ... FROM table1 NATURAL JOIN table2...
           

基于上面的表,我們可以寫一個内連接配接(INNER JOIN),如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
           

再來就是外連接配接(OUTER JOIN)了,它是内連接配接(INNER JOIN)的擴充。雖然 SQL 标準定義了三種類型的外連接配接:LEFT、RIGHT、FULL,但 SQLite 隻支援 左外連接配接(LEFT OUTER JOIN)。

外連接配接(OUTER JOIN)聲明條件的方法與内連接配接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 關鍵字來表達。最初的結果表以相同的方式進行計算。一旦主連接配接計算完成,外連接配接(OUTER JOIN)将從一個或兩個表中任何未連接配接的行合并進來,外連接配接的列使用 NULL 值,将它們附加到結果表中,我們來看下左外連接配接(LEFT OUTER JOIN)的文法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
           

為了避免備援,并保持較短的措辭,可以使用 USING 表達式聲明外連接配接(OUTER JOIN)條件。這個表達式指定一個或多個列的清單:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
           

基于上面的表,我們可以寫一個外連接配接(OUTER JOIN),如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
           

SQLite的 UNION 子句/運算符用于合并兩個或多個 SELECT 語句的結果,不傳回任何重複的行。為了使用 UNION,每個 SELECT 被選擇的列數必須是相同的,相同數目的清單達式,相同的資料類型,并確定它們有相同的順序,但它們不必具有相同的長度,來看下UNION 的基本文法:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
           

上述代碼給定的條件根據需要可以是任何表達式。

我們再來假設COMPANY 表的資料如下:

ID          NAME                  AGE         ADDRESS     SALARY
----------  --------------------  ----------  ----------  ----------
1           Paul                  32          California  20000.0
2           Allen                 25          Texas       15000.0
3           Teddy                 23          Norway      20000.0
4           Mark                  25          Rich-Mond   65000.0
5           David                 27          Texas       85000.0
6           Kim                   22          South-Hall  45000.0
7           James                 24          Houston     10000.0
           

還有DEPARTMENT表的資料如下:

ID          DEPT                  EMP_ID
----------  --------------------  ----------
1           IT Billing            1
2           Engineering           2
3           Finance               7
4           Engineering           3
5           Finance               4
6           Engineering           5
7           Finance               6
           

接下來,我們使用 SELECT 語句及 UNION 子句來連接配接兩個表,如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
           

UNION ALL 運算符用于結合兩個 SELECT 語句的結果,包括重複行,适用于 UNION 的規則同樣适用于 UNION ALL 運算符,來看下UNION ALL 的基本文法:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

UNION ALL

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
           

上述代碼給定的條件根據需要可以是任何表達式。

現在,讓我們使用 SELECT 語句及 UNION ALL 子句來連接配接兩個表,如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION ALL
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
           

SQLite 的 NULL 是用來表示一個缺失值的項。表中的一個 NULL 值是在字段中顯示為空白的一個值。帶有 NULL 值的字段是一個不帶有值的字段。NULL 值與零值或包含空格的字段是不同的,了解這點是非常重要的,我們來看下建立表時使用 NULL 的基本文法:

SQLite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
           

上述代碼中,NOT NULL 表示列總是接受給定資料類型的顯式值。這裡有兩個列我們沒有使用 NOT NULL,這意味着這兩個列可以為 NULL。帶有 NULL 值的字段在記錄建立的時候可以保留為空。

NULL 值在選擇資料時會引起問題,因為當把一個未知的值與另一個值進行比較時,結果總是未知的,且不會包含在最後的結果中,接下來,我們使用 UPDATE 語句來設定一些允許空值的值為 NULL,如下:

UPDATE COMPANY SET ADDRESS = NULL, SALARY = NULL where ID IN(6,7);
           

記下來我們看看 IS NOT NULL 運算符的用法,如下:

SELECT  ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NOT NULL;
           

再來看下IS NULL 運算符的用法,列出所有 SALARY 為 NULL 的記錄:

SELECT  ID, NAME, AGE, ADDRESS, SALARY FROM COMPANY WHERE SALARY IS NULL;
           

我們還可以暫時把表或列重命名為另一個名字,這被稱為别名。使用表别名是指在一個特定的 SQLite 語句中重命名表。重命名是臨時的改變,在資料庫中實際的表的名稱不會改變。列别名用來為某個特定的 SQLite 語句重命名表中的列,表 别名的基本文法如下:

SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
           

列 别名的基本文法如下:

SELECT column_name AS alias_name
FROM table_name
WHERE [condition];
           

來看執行個體:

#表别名 的用法,在這裡我們使用 C 和 D 分别作為 COMPANY 和 DEPARTMENT 表的别名
SELECT C.ID, C.NAME, C.AGE, D.DEPT FROM COMPANY AS C, DEPARTMENT AS D WHERE  C.ID = D.EMP_ID;

#列别名 的執行個體,在這裡 COMPANY_ID 是 ID 列的别名,COMPANY_NAME 是 name 列的别名
SELECT C.ID AS COMPANY_ID, C.NAME AS COMPANY_NAME, C.AGE, D.DEPT FROM COMPANY AS C, DEPARTMENT AS D WHERE  C.ID = D.EMP_ID;
           

和其他資料庫類似,别名的關鍵字 as 可以被省略,像下面的sql和之前的sql相比較,結果是完全一樣的:

SELECT id AS identification, name AS nickname FROM company;
SELECT id identification, name AS nickname FROM company;
           

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。

繼續閱讀