鍍金池/ 教程/ 數(shù)據(jù)庫/ SQLite Joins
SQLite Having 子句
SQLite 運(yùn)算符
SQLite 注入
SQLite Delete 語句
SQLite – Python
SQLite 數(shù)據(jù)類型
SQLite 簡介
SQLite 創(chuàng)建數(shù)據(jù)庫
SQLite Vacuum
SQLite Group By
SQLite 日期 & 時(shí)間
SQLite AND/OR 運(yùn)算符
SQLite 刪除表
SQLite Distinct
SQLite Alter 命令
SQLite PRAGMA
SQLite 約束
SQLite 創(chuàng)建表
SQLite Like 子句
SQLite Limit 子句
SQLite Autoincrement
SQLite 子查詢
SQLite – C/C++
SQLite – PHP
SQLite 命令
SQLite Order By
SQLite Select 語句
SQLite Unions 子句
SQLite – Perl
SQLite – Java
SQLite 別名
SQLite 常用函數(shù)
SQLite Explain(解釋)
SQLite NULL 值
SQLite Glob 子句
SQLite 表達(dá)式
SQLite 視圖
SQLite Where 子句
SQLite Truncate Table
SQLite 索引
SQLite Insert 語句
SQLite 安裝
SQLite Indexed By
SQLite 分離數(shù)據(jù)庫
SQLite 觸發(fā)器
SQLite 語法
SQLite Joins
SQLite Update 語句
SQLite 附加數(shù)據(jù)庫
SQLite 事務(wù)

SQLite Joins

SQLite 的 Joins 子句用于結(jié)合兩個(gè)或多個(gè)數(shù)據(jù)庫中表的記錄。JOIN 是一種通過共同值來結(jié)合兩個(gè)表中字段的手段。

SQL 定義了三種主要類型的連接:

  • 交叉連接 - CROSS JOIN
  • 內(nèi)連接 - INNER JOIN
  • 外連接 - OUTER JOIN

在我們繼續(xù)之前,讓我們假設(shè)有兩個(gè)表 COMPANY 和 DEPARTMENT。我們已經(jīng)看到了用來填充 COMPANY 表的 INSERT 語句?,F(xiàn)在讓我們假設(shè) 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

另一個(gè)表是 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

交叉連接(CROSS JOIN)把第一個(gè)表的每一行與第二個(gè)表的每一行進(jìn)行匹配。如果兩個(gè)輸入表分別有 x 和 y 列,則結(jié)果表有 x+y 列。由于交叉連接(CROSS JOIN)有可能產(chǎn)生非常大的表,使用時(shí)必須謹(jǐn)慎,只在適當(dāng)?shù)臅r(shí)候使用它們。

下面是交叉連接(CROSS JOIN)的語法:

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

基于上面的表,我們可以寫一個(gè)交叉連接(CROSS JOIN),如下所示:

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

上面的查詢會產(chǎn)生以下結(jié)果:

    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

內(nèi)連接 - INNER JOIN

內(nèi)連接(INNER JOIN)根據(jù)連接謂詞結(jié)合兩個(gè)表(table1 和 table2)的列值來創(chuàng)建一個(gè)新的結(jié)果表。查詢會把 table1 中的每一行與 table2 中的每一行進(jìn)行比較,找到所有滿足連接謂詞的行的匹配對。當(dāng)滿足連接謂詞時(shí),A 和 B 行的每個(gè)匹配對的列值會合并成一個(gè)結(jié)果行。

內(nèi)連接(INNER JOIN)是最常見的連接類型,是默認(rèn)的連接類型。INNER 關(guān)鍵字是可選的。

下面是內(nèi)連接(INNER JOIN)的語法:

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

為了避免冗余,并保持較短的措辭,可以使用 USING 表達(dá)式聲明內(nèi)連接(INNER JOIN)條件。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:

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

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

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

基于上面的表,我們可以寫一個(gè)內(nèi)連接(INNER JOIN),如下所示:

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

上面的查詢會產(chǎn)生以下結(jié)果:

    EMP_ID      NAME        DEPT
    ----------  ----------  ----------
    1           Paul        IT Billing
    2           Allen       Engineerin
    7           James       Finance

外連接 - OUTER JOIN

外連接(OUTER JOIN)是內(nèi)連接(INNER JOIN)的擴(kuò)展。雖然 SQL 標(biāo)準(zhǔn)定義了三種類型的外連接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外連接(LEFT OUTER JOIN)。

外連接(OUTER JOIN)聲明條件的方法與內(nèi)連接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 關(guān)鍵字來表達(dá)。最初的結(jié)果表以相同的方式進(jìn)行計(jì)算。一旦主連接計(jì)算完成,外連接(OUTER JOIN)將從一個(gè)或兩個(gè)表中任何未連接的行合并進(jìn)來,外連接的列使用 NULL 值,將它們附加到結(jié)果表中。

下面是左外連接(LEFT OUTER JOIN)的語法:

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

為了避免冗余,并保持較短的措辭,可以使用 USING 表達(dá)式聲明外連接(OUTER JOIN)條件。這個(gè)表達(dá)式指定一個(gè)或多個(gè)列的列表:

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

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

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

上面的查詢會產(chǎn)生以下結(jié)果:

    EMP_ID      NAME        DEPT
    ----------  ----------  ----------
    1           Paul        IT Billing
    2           Allen       Engineerin
                Teddy
                Mark
                David
                Kim
    7           James       Finance
下一篇:SQLite 命令