UNION、INTERSECT、EXCEPT
使用 UNION 合并兼容的结果集,使用 INTERSECT 查找共有行,并使用 EXCEPT 查找差集。
UNION、INTERSECT、EXCEPT 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
集合运算概述
三个集合运算符按行组合结果集:
UNION— A 或 B 中的行(去重)INTERSECT— A 和 B 中都有的行EXCEPT— A 中有但 B 中没有的行
UNION
合并两个结果集,并删除重复行:
SELECT email FROM users
UNION
SELECT email FROM newsletter_subscribers;列兼容性
两个查询必须拥有相同数量的列,并且列类型兼容:
-- OK:
SELECT email FROM users UNION SELECT email FROM customers;
-- ERROR — different column count:
SELECT email FROM users UNION SELECT email, name FROM customers;INTERSECT
同时出现在两个查询中的行:
SELECT product_id FROM orders WHERE user_id = 1
INTERSECT
SELECT product_id FROM orders WHERE user_id = 2;
-- Products bought by BOTH users.EXCEPT
出现在第一个查询中但不在第二个查询中的行:
SELECT product_id FROM products
EXCEPT
SELECT product_id FROM order_items;
-- Products never ordered.集合运算符中的 ORDER BY
ORDER BY 作用于合并后的完整结果。请将它放在末尾:
SELECT email FROM users
UNION
SELECT email FROM customers
ORDER BY email;集合运算符与 NULL
对于集合运算,两个 NULL 会被视为相等 — UNION 会将它们去重,INTERSECT 会将它们匹配。(这与 WHERE 中的 NULL = NULL 不同。)
对子查询使用集合运算符
请用括号包围子查询,以提高可读性并与 LIMIT 组合:
(SELECT id FROM users ORDER BY created_at DESC LIMIT 10)
UNION
(SELECT id FROM users ORDER BY total DESC LIMIT 10);运算符优先级
INTERSECT 的绑定优先级高于 UNION/EXCEPT。请使用括号:
SELECT id FROM a
UNION
SELECT id FROM b
INTERSECT
SELECT id FROM c;
-- means: a UNION (b INTERSECT c)
-- Use parens to force order:
(SELECT id FROM a UNION SELECT id FROM b) INTERSECT SELECT id FROM c;性能
UNION 会通过排序进行去重。INTERSECT 和 EXCEPT 也会执行类似的工作。对于大型集合,请优先考虑 JOIN/EXISTS 模式,并且只在集合运算的语义明确合适时使用它们。
标准 SQL 与供应商差异
PostgreSQL 支持全部三个运算符。MySQL 直到 8.0.31 才加入 INTERSECT 和 EXCEPT;较早版本需要使用 JOIN/NOT IN 模拟。
回顾
集合运算符可以表达行之间的 OR/AND/MINUS。
- UNION — 合并并去重
- INTERSECT — 共同的行
- EXCEPT — A 减去 B
快速检查
哪个集合运算符会返回“A 中有但 B 中 NOT 有的行”?
常见问题解答
「UNION、INTERSECT、EXCEPT」课时是免费的吗?
是的 — 「UNION、INTERSECT、EXCEPT」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「UNION、INTERSECT、EXCEPT」这节课中我会学到什么?
使用 UNION 合并兼容的结果集,使用 INTERSECT 查找共有行,并使用 EXCEPT 查找差集。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「UNION、INTERSECT、EXCEPT」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- UNION、INTERSECT、EXCEPT
- UNION ALL 与 UNION(去重成本)
- CASE 表达式与透视查询
- 交叉表模式(PostgreSQL crosstab())