课程 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。
- 大多数开发人员更喜欢 左连接 以保持一致性,但理解两者对于阅读现有代码至关重要。