SQL Server 中的 JOIN:类型及示例

⚡ 智能摘要

SQL Server 中的 JOIN 操作基于相关列将两个或多个表中的行组合在一起,使用 INNER、LEFT OUTER、RIGHT OUTER 和 FULL OUTER 连接来控制结果中显示哪些匹配的行和哪些不匹配的行。

  • 🔗 目的: JOIN 通过匹配公共列(通常是键)从两个或多个表中检索相关数据。
  • 🎯 内连接: INNER JOIN 只返回两个表中连接条件都为真的行。
  • ⬅️ 左外连接: LEFT OUTER JOIN 返回左表中的每一行,并将右表中不匹配的列填充为 NULL。
  • ➡️ 右外连接: RIGHT OUTER JOIN 返回右表中的每一行,并将左表中不匹配的列填充为 NULL。
  • 🔄 完全外连接: FULL OUTER JOIN 返回两个表中的所有行,在条件不满足的地方使用 NULL。
  • ???? 条件: ON 子句指定连接表的列,通常是一对主键和外键。

SQL Server 中的连接:INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 示例

SQL Server 中的连接是什么?

可以使用 JOIN 语句从多个表中检索数据。 SQL服务器JOIN 操作基于两个或多个表中的相关列(通常是列)将其中的行合并在一起。 主键 与……匹配 外键SQL Server 中主要有四种类型的 JOIN:

  • 内连接/简单连接
  • 左外连接 / 左连接
  • 右外连接 / 右连接
  • 全外连接

下表总结了每种 JOIN 类型返回的行数:

连接类型 返回的行
INNER JOIN 仅显示两个表中连接条件匹配的行。
左外连接 左表中的所有行,加上右表中匹配的行(如果没有匹配项,则为 NULL)。
右外连接 右表中的所有行,加上左表的匹配行(如果找不到匹配项,则为 NULL)。
全外连接 两个表中所有行,条件不满足处用 NULL 值表示。

以下示例使用了两个 表学生和费用数据通过共同的入学信息列进行连接。每个部分解释一种 JOIN 类型及其语法、示例查询和结果。

INNER JOIN

这类 SQL服务器 JOIN 函数返回所有满足连接条件的表中的行。它的语法如下:

SELECT columns
FROM table_1 
INNER JOIN table_2
ON table_1.column = table_2.column;

我们将使用以下两个表格来说明这一点。下面的“学生”表格列出了每位学生及其录取编号:

学生表列出了入学、名字和姓氏列

下表记录了每个入场号码所支付的金额:

费用表列出了入场人数和已付金额列

以下命令通过示例演示了 SQL Server 中的 INNER JOIN:

SELECT Students.admission, Students.firstName, Students.lastName, Fee.amount_paid
FROM Students
INNER JOIN Fee
ON Students.admission = Fee.admission

该命令返回以下结果,仅显示两个表中都存在的录取人数:

INNER JOIN 结果仅显示录取信息同时出现在两个表中的学生。

我们可以知道哪些学生已经缴纳了学费。我们使用了两个表中都包含相同值的列,即录取信息列。

左外连接

这种类型的连接会返回左侧表中的所有行,以及右侧表中具有匹配值的记录。例如:

SELECT Students.admission, Students.firstName, Students.lastName, Fee.amount_paid
FROM Students
LEFT OUTER JOIN Fee
ON Students.admission = Fee.admission

代码返回以下结果,keeping 即使没有缴费记录,也应向每位学生收费:

左外连接结果保留ping 所有学生的未匹配费用行都为 NULL。

在相应的列中,没有匹配值的记录将被替换为 NULL。

右外连接

这种类型的连接返回右侧表中的所有行以及左侧表中具有匹配值的行。例如:

SELECT Students.admission, Students.firstName, Students.lastName, Fee.amount_paid
FROM Students
RIGHT OUTER JOIN Fee
ON Students.admission = Fee.admission

SQL Server 中的 OUTER JOIN 语句返回以下结果:

右外连接结果保留ping 每行费用和对应的学生行

出现上述输出的原因是,当在 admission 列上匹配时,Fee 表中的所有行均可在 Students 表中使用。

全外连接

这种类型的连接会返回两个表中的所有行,如果连接条件不成立,则返回 NULL 值。例如:

SELECT Students.admission, Students.firstName, Students.lastName, Fee.amount_paid
FROM Students
FULL OUTER JOIN Fee
ON Students.admission = Fee.admission

该代码对 FULL OUTER JOIN 查询返回以下结果 SQL将两个表中的每一行合并:

使用 FULL OUTER JOIN 连接所有学生和费用行,并用 NULL 值填补空缺。

常见问题

CROSS JOIN 操作返回两个表的笛卡尔积,将第一个表的每一行与第二个表的每一行配对。它没有 ON 条件,因此一个 10 行的表和一个 5 行的表会生成 50 行。

您使用自连接 (SELF JOIN):将表以不同的别名列出两次,然后基于相关列进行连接,以比较同一表中的行。这常用于层级数据,例如将每个员工与其经理进行匹配。

JOIN 将相关表中的列并排合并,并根据条件匹配行。UNION 将两个 SELECT 查询的结果垂直堆叠,并添加行。JOIN 会加宽结果;UNION 会加长结果。

是的。ON 子句可以测试多个用 AND 连接的列,例如 ON a.col1 = b.col1 AND a.col2 = b.col2。当单个列无法唯一标识一行时,复合条件很常见。

ON 子句定义了表之间的匹配方式,并在连接执行期间应用。WHERE 子句则在连接完成后筛选合并后的结果。对于外连接,移动连接条件可能会改变返回的行数。

是的。不带前缀的 JOIN 语句默认使用 INNER JOIN,因此只返回匹配的行。在 OUTER JOIN 语句前添加 LEFT、RIGHT 或 FULL 前缀,可以改变结果中保留哪些不匹配的行。

是的。 GitHub 副驾驶 可以根据自然语言提示编写 INNER、LEFT、RIGHT 和 FULL OUTER JOIN 查询。务必检查 ON 条件和连接类型,确保结果集与预期一致。

人工智能和机器学习助手会建议正确的连接类型,生成多表 ON 条件,并标记缺失的键或意外的笛卡尔积。它们还可以推荐连接列的索引。开发人员会在运行每个建议之前进行验证。

总结一下这篇文章: