SQLite - 聯接



SQLite 的聯接(Joins)子句用於組合資料庫中兩個或多個表中的記錄。聯接是一種透過使用每個表中共同的值來組合兩個表中的欄位的方法。

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           Engineering 2
3           Finance     7

交叉聯接(CROSS JOIN)

交叉聯接(CROSS JOIN)將第一個表的每一行與第二個表的每一行匹配。如果輸入表分別具有 x 和 y 行,則結果表將具有 x*y 行。由於交叉聯接有可能生成非常大的表,因此必須注意僅在適當的時候使用它們。

以下是 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)

內聯接(INNER JOIN)透過根據聯接謂詞組合兩個表(table1 和 table2)的列值來建立一個新的結果表。查詢比較 table1 的每一行與 table2 的每一行,以查詢滿足聯接謂詞的所有行對。當聯接謂詞滿足時,A 和 B 的每對匹配行的列值將組合到結果行中。

內聯接是最常見和預設的聯接型別。您可以選擇性地使用 INNER 關鍵字。

以下是 INNER JOIN 的語法:

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

為了避免冗餘並保持措辭簡潔,INNER JOIN 條件可以使用USING表示式宣告。此表示式指定一個或多個列的列表。

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)

外聯接(OUTER JOIN)是內聯接(INNER JOIN)的擴充套件。雖然 SQL 標準定義了三種類型的外聯接:左聯接、右聯接和全聯接,但 SQLite 僅支援左外聯接(LEFT OUTER JOIN)。

外聯接的條件與內聯接相同,使用 ON、USING 或 NATURAL 關鍵字表示。初始結果表以相同的方式計算。計算完主聯接後,外聯接將獲取一個或兩個表中任何未聯接的行,用 NULL 填充它們,並將它們附加到結果表中。

以下是 LEFT OUTER JOIN 的語法:

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

為了避免冗餘並保持措辭簡潔,OUTER JOIN 條件可以使用 USING 表示式宣告。此表示式指定一個或多個列的列表。

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
廣告

© . All rights reserved.