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