SQLite 聯接

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 - 交叉聯接

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 - 內部聯接

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 - 外聯接

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
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清