🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 5.4: 右连接 - 包含右表中的所有记录

右连接(或 右外连接)是 左连接 的逻辑相反。它确保所有来自“右”表(在 JOIN 关键字后提到的表)的行都包含在结果集中,无论它们是否在“左”表中有匹配。

什么是右连接?

右连接 返回 所有 来自右表的行以及来自左表的匹配行。如果左表中没有匹配,结果将包含左表列的 NULL 值。

可视化:

   表 A (客户)           表 B (付款)
   +----+----------+            +----+----------+
   | id | name     |            | id | amount   |
   +----+----------+            +----+----------+
   | 1  | Alice    | <--------> | 1  | 10.00    | (匹配!)
   | NULL          | <--------> | 4  | 50.00    | (没有匹配,保留付款 4!)
   +----+----------+            +----+----------+

在这个例子中,即使没有客户与之关联,ID 为 4 的付款仍然被保留(尽管在像 Sakila 这样的良好设计的数据库中,由于外键约束,这种情况很少见)。

右连接语法

语法遵循与其他连接相同的模式:

SELECT
    table1.column1,
    table2.column2
FROM
    table1
RIGHT JOIN
    table2 ON table1.common_column = table2.common_column;
  • RIGHT JOIN:确保保留来自 table2(右表)的所有行。
  • ON:指定连接条件。

实际示例(Sakila 数据库)

虽然 右连接 在实践中不如 左连接 常见(因为任何 右连接 都可以通过交换表的顺序重写为 左连接),但理解它仍然很重要。

1. 列出所有地址及其员工

假设我们想查看系统中的所有地址,并检查是否有任何员工当前分配给它们。

SELECT
    s.first_name,
    s.last_name,
    a.address
FROM
    staff AS s
RIGHT JOIN
    address AS a ON s.address_id = a.address_id
ORDER BY
    s.last_name;

这将返回 address 表中的所有地址。如果某个地址没有员工,姓名将为 NULL。

右连接与左连接

每个 右连接 都可以表示为 左连接。大多数 SQL 开发人员更喜欢仅使用 左连接,并简单地重新排序表以将“主”表放在左侧。这通常使查询从上到下更易于阅读。

等价示例:

-- 使用右连接
SELECT f.title, i.inventory_id
FROM film f
RIGHT JOIN inventory i ON f.film_id = i.film_id;

-- 使用左连接(相同结果)
SELECT f.title, i.inventory_id
FROM inventory i
LEFT JOIN film f ON i.film_id = f.film_id;

本课的关键要点

  • 右连接 返回来自右表的所有行。
  • 它是 左连接镜像
  • 左表的列在没有找到匹配时将包含 NULL
  • 大多数开发人员更喜欢 左连接 以保持一致性,但理解两者对于阅读现有代码至关重要。