SQLite JOINS連接
SQLite的連接子句用於從兩個或多個數據庫中的表的記錄相結合。JOIN是一種手段,從兩個表中使用常見於每個值相結合的字段。
SQL定義了三種主要類型的聯接:
-
交叉連接 - CROSS JOIN
-
內連接 - INNER JOIN
-
外連接 - OUTER JOIN
在開始之前,讓我們考慮兩個表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 Engineerin 2 3 Finance 7
交叉連接 - CROSS JOIN
交叉連接匹配的第一個表與第二個表中的每一行的每一行。如果輸入表,結果表x和y列,分彆有X + Y列。由於交叉聯接有可能產生非常大的表,必須謹慎,隻在適當的時候使用它們。
以下是交叉連接的語法:
SELECT ... FROM table1 CROSS JOIN table2 ...
根據上麵的表上,我們可以寫一個交叉連接如下:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
上麵的查詢會產生以下結果:
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Paul Engineerin 7 Paul Finance 1 Allen IT Billing 2 Allen Engineerin 7 Allen Finance 1 Teddy IT Billing 2 Teddy Engineerin 7 Teddy Finance 1 Mark IT Billing 2 Mark Engineerin 7 Mark Finance 1 David IT Billing 2 David Engineerin 7 David Finance 1 Kim IT Billing 2 Kim Engineerin 7 Kim Finance 1 James IT Billing 2 James Engineerin 7 James Finance
內連接 - INNER JOIN
INNER JOIN 創建一個新的結果表中,通過結合兩個表(表1和表2)根據聯接謂詞的列值。查詢比較table1中的每一行,每一行表2,找到所有對滿足連接謂詞的行。當聯接謂詞滿意,每個匹配的一對排列值A和B合並成一個結果行。
內部聯接是最常見的連接類型和連接是默認的類型。可以使用可選INNER關鍵字。
以下是內連接的語法:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
為了避免冗餘,並保持較短的措辭,可以聲明一個使用表達式內連接條件。這個表達式指定一個或多個列的列表:
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
自然聯接是類似於一個JOIN...USING,隻是它自動測試存在兩個表中的每一列的值之間相等:
SELECT ... FROM table1 NATURAL JOIN table2...
根據上麵的表上,我們可以寫一個內連接如下:
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 Engineerin 7 James Finance
外連接 - OUTER JOIN
外連接是一個擴展的內連接。雖然SQL標準定義了三種類型的外連接:LEFT, RIGHT,FULL,但隻支持SQLite 左外連接。
外連接有一個條件,是為內部連接相同,表示使用 ON, USING, 或NATURAL關鍵字。初步的研究結果表中的計算相同的方式。一旦主連接是計算,OUTER JOIN將采取任何未連接的行,從一個或兩個表,他們使用空值,將它們附加到生成的表。
以下是LEFT OUTER JOIN 的語法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
為了避免冗餘和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 Engineerin Teddy Mark David Kim 7 James Finance