LEFT/RIGHT JOIN 与外连接
使用 LEFT JOIN 保留不匹配的行,理解 RIGHT 和 FULL OUTER 连接,并使用 WHERE x IS NULL 检测缺失数据。
LEFT/RIGHT JOIN 与外连接 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
LEFT JOIN:保留左表的所有行
LEFT JOIN 会返回左表中的每一行;如果存在匹配,就返回右侧的列,否则右侧列为 NULL。
SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
-- Users without orders still appear, with order_id = NULL.RIGHT JOIN
LEFT JOIN 的镜像操作——保留所有 RIGHT 行。为了提高可读性,大多数人会将 RIGHT 连接改写为 LEFT 连接:
SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;
-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;FULL OUTER JOIN
保留两侧的行。未匹配的列为 NULL:
SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;查找缺失的匹配项
使用 WHERE right.id IS NULL 的 LEFT JOIN,可以找出左表中在右表没有匹配项的行——这就是经典的“反连接”:
SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL; -- users who have never placed an order带聚合的 LEFT JOIN
适用于“缺失时显示 0”的报表:
SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;筛选条件的位置很重要
将针对右表的筛选条件放在 WHERE 中,会把 LEFT JOIN 变回 INNER JOIN。将条件放在 ON 中,才能保留 LEFT 行为:
-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;
-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;多个 LEFT JOIN
将它们串联起来。每个 LEFT 都会保留该运算符左侧的行:
SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;LEFT JOIN 性能
与 INNER JOIN 相比,LEFT JOIN 有少量额外开销(规划器必须保留未匹配的行)。这通常可以忽略不计,但如果您不需要未匹配的行,INNER JOIN 会稍微节省一些开销。
外连接与 NULL 输出
LEFT JOIN 输出的 NULL 可能会让下游代码感到意外。请使用 COALESCE 提供默认值:
SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;CROSS JOIN——需要所有配对时
将 A 的每一行与 B 的每一行连接。请谨慎使用:
SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);反连接模式
查找“左表中没有匹配项”的三种惯用方式:
-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;
-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);回顾
OUTER 连接会保留未匹配的行。
- LEFT = 保留所有左侧行,未匹配时右侧为 NULL
- RIGHT = 镜像操作;为了可读性请使用 LEFT
- FULL OUTER = 保留两侧
- 反连接 = LEFT JOIN ... WHERE right IS NULL
快速检查
哪种 JOIN 类型会返回即使没有 NO 订单的用户?
用 AI 导师学习 SQL — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 46
- 课程
- 183
常见问题解答
「LEFT/RIGHT JOIN 与外连接」课时是免费的吗?
是的 — 「LEFT/RIGHT JOIN 与外连接」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「LEFT/RIGHT JOIN 与外连接」这节课中我会学到什么?
使用 LEFT JOIN 保留不匹配的行,理解 RIGHT 和 FULL OUTER 连接,并使用 WHERE x IS NULL 检测缺失数据。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「LEFT/RIGHT JOIN 与外连接」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么需要连接(关系模型回顾)
- INNER JOIN 的工作机制
- LEFT/RIGHT JOIN 与外连接
- 自连接与别名