SQLite Joins子句用于合并數據庫中兩個或多個表中的記錄。JOIN是一種通過使用每個表的公用值來組合兩個表中的字段的方法。
SQL定義了三種主要的聯接類型-
交叉聯接
內部聯接
外聯接
在繼續(xù)之前,讓我們考慮兩個表COMPANY和DEPARTMENT。我們已經看到了INSERT語句來填充COMPANY表。所以讓我們假設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,具有以下定義-
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
這是用于填充DEPARTMENT表的INSERT語句的列表-
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7 );
最后,我們在DEPARTMENT表中有以下可用的記錄列表-
ID DEPT EMP_ID ---------- ---------- ---------- 1 IT Billing 1 2 Engineering 2 3 Finance 7
CROSS JOIN將第一個表的每一行與第二個表的每一行匹配。如果輸入表分別具有x和y行,則結果表將具有x * y行。由于CROSS JOINs可能會生成極大的表,因此必須注意僅在適當的時候使用它們。
以下是CROSS JOIN的語法-
SELECT ... FROM table1 CROSS JOIN table2 ...
根據上表,您可以編寫CROSS JOIN,如下所示:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
上面的查詢將產生以下結果-
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Paul Engineering 7 Paul Finance 1 Allen IT Billing 2 Allen Engineering 7 Allen Finance 1 Teddy IT Billing 2 Teddy Engineering 7 Teddy Finance 1 Mark IT Billing 2 Mark Engineering 7 Mark Finance 1 David IT Billing 2 David Engineering 7 David Finance 1 Kim IT Billing 2 Kim Engineering 7 Kim Finance 1 James IT Billing 2 James Engineering 7 James Finance
INNER JOIN通過基于連接謂詞組合兩個表(table1和table2)的列值來創(chuàng)建新的結果表。該查詢將table1的每一行與table2的每一行進行比較,以找到滿足join謂詞的所有行對。當滿足連接謂詞時,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,如下所示:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
上面的查詢將產生以下結果-
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Allen Engineering 7 James Finance
OUTER JOIN是INNER JOIN的擴展。盡管SQL標準定義了三種外部聯接類型:LEFT,RIGHT和FULL,但是SQLite僅支持LEFT OUTER JOIN。
外部聯接的條件與內部聯接的條件相同,使用ON,USING或NATURAL關鍵字表示。初始結果表的計算方法相同。一旦計算了主JOIN,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 ,... ) ...
基于上面的表,您可以編寫內部聯接,如下所示:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
上面的查詢將產生以下結果-
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Allen Engineering Teddy Mark David Kim 7 James Finance