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 就够了。 把"主要关心的表"放左边。