SQL JOIN

2025年1月10日 | 阅读 9 分钟

顾名思义,JOIN 就是组合一些东西。在 SQL 中,JOIN 意味着“组合两个或多个表”。

什么是 Join?

JOIN 是一种从两个或多个表中提取信息的方法。在 SQL 中,JOIN 子句用于组合数据库中两个或多个表的记录。它是 SQL 最重要的功能之一,允许从两个或多个共享一组公共值的相关表中检索行。连接两个表后获得的行是基于一个条件:第一个表中的列(定义为主键)必须匹配第二个表中被该外键引用的主键列。

SQL JOIN 的类型

  1. INNER JOIN (内连接)
  2. NATURAL JOIN
  3. LEFT JOIN
  4. RIGHT JOIN
  5. FULL JOIN
  6. 自连接 (SELF JOIN)
  7. CARTESIAN JOIN

示例表

EMPLOYEE

EMP_IDEMP_NAMECITY工资年龄
1AngelinaChicago20000030
2RobertAustin30000026
3基督徒Denver10000042
4KristenWashington50000029
5罗素Los angels20000036
6Marry加拿大60000048

PROJECT

PROJECT_NOEMP_IDDEPARTMENT
1011测试
1022开发
1033设计
1044开发

1. INNER JOIN

这种类型的连接称为 EQUI join,因为它包含一个等号运算符 JOIN 条件。它是 join 的一种类型,其中 join 条件包含等号运算符。在 SQL 中,INNER JOIN 选择两个表中具有匹配值的记录,只要条件满足。它返回两个表中满足条件的行的组合。

以下语法用于创建 INNER JOIN。

语法

在上面的语法中,table1.column1 表示要检索数据的表和列。条件 table1.matching_column = table2.matching_column 是连接 table1 和 table2 的连接条件。如果所有表中的列名都不同,则不必在列名前加上表名。当同一个列名出现在多个表中时,有必要在列名前加上表名。除了连接条件之外,join 查询的 WHERE 子句还可以包含引用单个表列的其他条件。此条件可以进一步限制 join 查询的行。

示例 1

要检索每个员工的员工姓名和项目部门。我们将不得不基于公共列 Emp_ID 连接 EMPLOYEE 和 PROJECT 表。

查询

说明

在上面的示例中,要执行 join,SQL 会从 Project 和 Department 这两个表中提取行的组合,并检查连接条件 PROJECT.EMP_ID = EMPLOYEE.EMP_ID 是否为真。如果连接条件为真,SQL 将在此结果集中显示此行的组合,否则将拒绝。如果 PROJECT 表中有一个员工没有匹配的 EMP_ID,那么该员工的记录将不会显示在查询结果中。在连接条件中,PROJECT.EMP_ID 作为外键,EMPLOYEE.EMP_ID 作为主键。

以下是查询的输出

输出

EMP_NAMEDEPARTMENT
Angelina测试
Robert开发
基督徒设计
Kristen开发

您还可以使用 AND、OR、NOT 运算符添加其他搜索条件。

示例 2

要检索员工姓名和部门是“Development”的员工的项目部门,请使用以下查询。

查询

以下是查询的输出

输出

EMP_NAMEDEPARTMENT
Robert开发
Kristen开发

说明

在上面的查询中,结果的计算方式如下:

  • PROJECT 表中的每一行都与 EMPLOYEE 表中的每一行组合。如果 EMPLOYEE 表包含 m 行,PROJECT 表包含 n 行,则我们将得到 m * n 行。
  • 从这些行中,选择满足 (PROJECT.EMP_ID = EMPLOYEE.EMP_ID) 条件的行,其中 DEPARTMENT 相同。
  • 从这个结果中,最终选择所有满足 (DEPARTMENT = ‘DEVELOPMENT) 条件的行。

2. Natural JOIN

如果执行 join 操作,对 join 中列的每次引用都必须明确,这意味着如果该列存在于 join 中引用的多个表中。,则必须在列名前加上表名。在 join 的结果中,公共列只出现一次。它有助于基于具有匹配数据类型和名称的列来连接两个或多个表。

以下语法用于创建 NATURAL JOIN。

示例 1

3. LEFT JOIN

SQL LEFT JOIN 返回左表的所有值以及右表中匹配的值。如果没有匹配的 join 值,则返回 NULL。

以下语法用于创建 LEFT JOIN。

查询

说明

执行后显示输出。检索员工的 EMP_Name、DEPARTMENT 信息,即使某个部门信息不包含员工。对于 EMPLOYEE 表中的所有没有在 PROJECT 表中找到匹配行的行,SQL 将为包含 PROJECT 表列的任何 select 表达式返回 NULL。

以下是查询的输出

输出

EMP_NAMEDEPARTMENT
Angelina测试
Robert开发
基督徒设计
Kristen开发
罗素NULL
MarryNULL

4. RIGHT JOIN

在 SQL 中,RIGHT JOIN 返回右表中所有行以及左表中匹配的值。如果两个表中都没有匹配项,则返回 NULL。

以下语法用于创建 RIGHT JOIN。

查询

说明

在上面的示例中,检索员工的 EMP_Name、DEPARTMENT 信息,即使某个部门信息不包含员工。对于 PROJECT 表中所有没有在 EMPLOYEE 表中找到匹配行的行,SQL 将为包含 EMPLOYEE 表列的任何 select 表达式返回 NULL。

以下是查询的输出

输出

EMP_NAMEDEPARTMENT
Angelina测试
Robert开发
基督徒设计
Kristen开发

说明

在上面的示例中,要执行 join,SQL 会从 Project 和 Department 这两个表中提取行的组合,并检查连接条件 PROJECT.EMP_ID = EMPLOYEE.EMP_ID 是否为真。如果连接条件为真,SQL 将在此结果集中显示此行的组合,否则将拒绝。此过程从两个表的每一行组合重复执行。

5. FULL JOIN

在 SQL 中,FULL JOIN 是 left 和 right outer join 的组合结果。Join 表包含两个表的所有记录。它在找不到匹配项的地方放置 NULL。FULL JOIN 只是 EQUI JOIN 结果的扩展。在使用 EQUI JOIN 时,如果一个表中存在与第二个表中不匹配的记录,则这些行将不会被选中。我们可以使用 FULL JOIN 强制选择这些行。

以下语法用于创建 FULL JOIN。

查询

说明

在上面的示例中,要执行 join,SQL 会从 Project 和 Department 这两个表中提取行的组合,并检查连接条件 PROJECT.EMP_ID = EMPLOYEE.EMP_ID 是否为真。如果连接条件为真,SQL 将在此结果集中显示此行的组合,否则将拒绝。此过程从两个表的每一行组合重复执行。

以下是查询的输出

输出

EMP_NAMEDEPARTMENT
Angelina测试
Robert开发
基督徒设计
Kristen开发
罗素NULL
MarryNULL

6. SELF JOIN

在 SQL 中,另一种 join 的形式是 SELF JOIN,它是表与其自身的 join。对于 SELF JOIN,我们需要打开同一表的两个副本。由于表名相同,为了避免混淆,我们在 join 条件中使用别名来限定列名。

以下语法用于创建 SELF JOIN。

示例

要检索有关员工及其经理的信息,您需要使用 SQL 中的 self join 概念将表与其自身连接。您需要通过在 From 子句中使用两个不同的别名指定 Emp 表及其列(Emp_name, manager_name)两次来完成此操作,从而将 EMP 表视为两个独立的表。让我们执行以下查询。

步骤 1: 首先,我们需要使用以下查询创建“EMP”表。

步骤 2: 现在我们将使用 INSERT INTO 语句向“EMP”表添加数据

以下是查询的输出

输出

emp_namemanager_name
SmithFord
RobertBlake
PriyaSharma
RohitRaj
MohammadRoy

7. Cartesian JOIN

如果 join 查询中省略了 join 条件,则结果是笛卡尔积。它也称为 Cross Join,它将连接的表的笛卡尔积返回。在这种情况下,一个表的每一行都与另一个表的每一行连接。

以下语法用于创建 Cartesian JOIN。

示例 1

说明

执行上述查询后,如果 EMPLOYEE 表包含 m 行,PRODUCT 表包含 n 行,它将检索 m * n 行。因此,执行后,将检索 24 行,因为 EMPLOYEE 表包含 6 行,PRODUCT 表包含 4 行。

以下是查询的输出

输出

EMP_NAMECITY工资AGE PROJECT_NO
AngelinaChicago20000030101
AngelinaChicago20000030102
AngelinaChicago20000030103
AngelinaChicago20000030104
RobertAustin30000026101
RobertAustin30000026102
RobertAustin30000026103
RobertAustin30000026104
基督徒Denver10000042101
基督徒Denver10000042102
基督徒Denver10000042103
基督徒Denver10000042104
KristenWashington50000029101
KristenWashington50000029102
KristenWashington50000029103
KristenWashington50000029104
罗素Los angels20000036101
罗素Los angels20000036102
罗素Los angels20000036103
罗素Los angels20000036104
Marry加拿大60000048101
Marry加拿大60000048102
Marry加拿大60000048103
Marry加拿大60000048104

SQL JOIN 多项选择题

1. 在 SQL 中,以下哪个 join 指的是合并右表中没有左表匹配键的记录?

  • 全外连接 (FULL OUTER JOIN)
  • 右外连接 (RIGHT OUTER JOIN)
  • INNER JOIN (内连接)
  • LEFT OUTER JOIN (左外连接)

答案:b

解释: RIGHT OUTER JOIN 指的是合并右表中具有.

2. 以下哪个 join 在 SQL 中包含等号运算符?

  • 全外连接 (FULL OUTER JOIN)
  • 右外连接 (RIGHT OUTER JOIN)
  • INNER JOIN (内连接)
  • LEFT OUTER JOIN (左外连接)

答案:c

解释: 它是 join 的一种类型,其中 join 条件包含等号运算符。

3. 在 SQL 中,以下哪个关键字与 INNER JOIN 一起使用?

  • 导通
  • BETWEEN
  • IN
  • 并且

答案:a

解释: ON 关键字用于 INNER JOIN。

4. 以下哪个是 RIGHT JOIN 的语法?

  • SELECT table1.column1, table2.column1 FROM table1 JOIN table2 ON table1.matching_column = table2.matching_column;
  • SELECT table1.column1, table2.column1 FROM table1 RIGHT JOIN table2 ON table1.matching_column = table2.matching_column
  • SELECT table1.column1, table2.column1 FROM table1 RIGHT JOIN table2 ON table1.matching_column = table2.matching_column;
  • SELECT table1.column1, table2.column1 FROM table1 RIGHT table2 ON table1.matching_column = table2.matching_column;

答案:c

解释: 以下语法用于在 SQL 中创建 RIGHT JOIN。

 
下一个主题DBMS SQL 集合运算