Z
ZHANK
编程在线教程SQL 教程LEFT/RIGHT JOIN 外连接
多表查询

LEFT/RIGHT JOIN 外连接

掌握左连接、右连接、全外连接的区别与应用

LEFT/RIGHT JOIN 外连接

INNER JOIN 只保留匹配的行。外连接会保留其中一张表的所有行,匹配不上的填 NULL。

学完本章你将: 掌握 LEFT JOIN(最常用)、RIGHT JOIN、FULL OUTER JOIN。


LEFT JOIN —— 左表全保留

"我有多少用户"比"用户下了多少单"更重要。LEFT JOIN 保留左表所有行,右表没匹配的列填 NULL。

sql
-- 所有用户(不管有没有订单)
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 结果:小明 99.9 / 小明 50.0 / 小红 30.0 / 小刚 NULL
-- 小刚没订单,但还是出现了(amount 为 NULL)

实际场景: "查所有用户及其订单"、"统计每个用户的订单总金额(含零订单用户)"


RIGHT JOIN —— 右表全保留

和 LEFT JOIN 对称,保留右表所有行。实际很少用(改成 LEFT JOIN 换来写更直观)。

sql
-- 等价于交换两表位置的 LEFT JOIN
SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
-- 等价于
SELECT u.name, o.amount
FROM orders o
LEFT JOIN users u ON u.id = o.user_id;

FULL OUTER JOIN —— 两表都全保留

MySQL 不原生支持,SQLite 也不直接支持。可用 LEFT JOIN UNION RIGHT JOIN 模拟。


JOIN 选择策略

需求用哪个
只要匹配上的INNER JOIN
保留所有用户LEFT JOIN (users 在左边)
保留所有订单LEFT JOIN (orders 在左边)

💡 95% 的情况用 LEFT JOIN 就够了。 把"主要关心的表"放左边。