SQL Server JOIN

17 Mar 2025 | 6 分钟阅读

在现实生活中,我们把数据存储在多个逻辑表中,这些表通过关系数据库(如 SQL Server、OracleMySQL 等)中的公共键值连接起来。因此,我们经常需要根据一些条件从两个或多个表中获取数据以获得所需的输出。在 SQL Server 中,我们可以使用 SQL JOIN 子句快速实现这种数据获取。本文将通过示例完整介绍 JOIN 及其不同类型。

JOIN 子句允许我们从两个或多个相关表中检索数据,形成一个有意义的结果集。我们可以使用 SELECT 语句和 JOIN 条件来连接表。它指示 SQL Server 如何使用一个表中的数据来选择另一个表中的行。通常,表之间通过外键约束相互关联。

在 JOIN 查询中,条件指示两个表如何关联。

  • 选择每个表中应在 JOIN 中使用的列。JOIN 条件指示一个表中的外键及其在另一个表中的对应键。
  • 指定比较列值的逻辑运算符,例如 =、< 或 >。

SQL Server 中 JOIN 的类型

SQL Server 主要支持四种 JOIN 类型,每种 JOIN 类型都定义了查询中两个表如何关联。以下是 SQL Server 支持的 JOIN 类型:

  1. INNER JOIN (内连接)
  2. 自连接 (SELF JOIN)
  3. CROSS JOIN (交叉连接)
  4. OUTER JOIN
SQL Server JOINS

让我们详细讨论这些 JOIN。

INNER JOIN (内连接)

此 JOIN 返回来自多个表的满足指定 JOIN 条件的所有记录。它是最简单和最流行的 JOIN 形式,并被认为是默认 JOIN。如果我们在 JOIN 查询中省略 INNER 关键字,我们将得到相同的输出。

以下可视化表示解释了 INNER JOIN 如何从 table1table2 返回匹配的记录:

SQL Server JOINS

INNER JOIN 语法

以下语法说明了在 SQL Server 中使用 INNER JOIN

INNER JOIN 示例

首先,我们使用以下语句创建两个表“Student”和“Fee

接下来,我们将使用以下语句向这些表插入一些记录

执行 SELECT 语句以验证记录

表:Student

SQL Server JOINS

表:Fee

SQL Server JOINS

我们可以使用以下命令演示 INNER JOIN

此命令给出以下结果

SQL Server JOINS

在此示例中,我们使用 admission_no 列作为 JOIN 条件从两个表中获取数据。根据此表,我们可以看到已支付费用的学生信息。

自连接 (SELF JOIN)

表通过 SELF JOIN 连接到自身。这意味着每个表行都与自身以及所有其他表行结合。SELF JOIN 可以被认为是同一表的两个副本的 JOIN。我们可以借助表名别名来为每个表实例分配特定名称。表别名使我们能够使用我们将在查询中使用的表的临时名称。这是一种提取分层数据和比较单个表中行的有用方法。

SELF JOIN 语法

以下表达式说明了 SQL Server 中 SELF JOIN 的语法。它的工作方式与连接两个不同表的语法相同。在这里,我们使用表的别名,因为两个表的名称相同。

示例

我们可以使用以下命令演示 SELF JOIN

此命令给出以下结果

SQL Server JOINS

在此示例中,我们使用 id 和 city 列作为 JOIN 条件从两个表中获取数据。

CROSS JOIN (交叉连接)

SQL Server 中的 CROSS JOIN 结合了两个或多个表的所有可能性,并返回包含所有贡献表中所有行的结果。它也称为 CARTESIAN JOIN,因为它生成所有链接表的笛卡尔积。笛卡尔积表示第一个表中所有行乘以第二个表中所有行。

下面的可视化表示说明了 CROSS JOIN。它将给出 table1table2 的所有记录,其中每行都是两个表行的组合。

SQL Server JOINS

CROSS JOIN 语法

以下语法说明了在 SQL Server 中使用 CROSS JOIN

示例

我们可以使用以下命令演示 CROSS JOIN

此命令给出以下结果

SQL Server JOINS

OUTER JOIN

SQL Server 中的 OUTER JOIN 返回满足 JOIN 条件的两个表中的所有记录。换句话说,此 JOIN 不仅返回匹配的记录,还返回一个或两个表中所有不匹配的行。

我们可以将 OUTER JOIN 进一步分为三种类型

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

LEFT OUTER JOIN (左外连接)

LEFT OUTER JOIN 检索左表中的所有记录和右表中的匹配行。当在右表中找不到匹配记录时,它将返回 NULL。由于 OUTER 是可选关键字,它也称为 LEFT JOIN。

下面的可视化表示说明了 LEFT OUTER JOIN

SQL Server JOINS

LEFT OUTER JOIN 语法

以下语法说明了在 SQL Server 中使用 LEFT OUTER JOIN

示例

我们可以使用以下命令演示 LEFT OUTER JOIN

此命令给出以下结果

SQL Server JOINS

此输出显示不匹配行的值在相应列中被 NULL 替换。

右外连接 (RIGHT OUTER JOIN)

RIGHT OUTER JOIN 检索右表中的所有记录和左表中的匹配行。当在左表中找不到匹配记录时,它将返回 NULL。由于 OUTER 是可选关键字,它也称为 RIGHT JOIN。

下面的可视化表示说明了 RIGHT OUTER JOIN

SQL Server JOINS

RIGHT OUTER JOIN 语法

以下语法说明了在 SQL Server 中使用 RIGHT OUTER JOIN

示例

以下示例解释了如何使用 RIGHT OUTER JOIN 从两个表中获取记录

此命令给出以下结果

SQL Server JOINS

在此输出中,我们可以看到没有列具有 NULL 值,因为根据指定条件,Fee 表中的所有行都在 Student 表中可用。

全外连接 (FULL OUTER JOIN)

SQL Server 中的 FULL OUTER JOIN 返回包含两个表中所有行的结果。当在左表中找不到匹配记录时,右表的列返回 NULL。如果右表中找不到匹配记录,则左表的列返回 NULL。

下面的可视化表示说明了 FULL OUTER JOIN

SQL Server JOINS

FULL OUTER JOIN 语法

以下语法说明了在 SQL Server 中使用 FULL OUTER JOIN

示例

以下示例解释了如何使用 FULL OUTER JOIN 从两个表中获取记录

此命令给出以下结果

SQL Server JOINS

在此输出中,我们可以看到当根据指定条件在左表和右表中找不到匹配记录时,列具有 NULL 值。