使用 INTERSECT 和 EXCEPT 进行比较
查找两个数据集之间的相同行和差异行
使用 INTERSECT 和 EXCEPT 进行比较 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
比较运算符
INTERSECT 和 EXCEPT 是用于比较两个结果集而不是合并结果集的集合运算符。面试官会在“哪些客户同时出现在两份列表中”或“哪些行在 A 中但不在 B 中”这类问题中使用它们。
INTERSECT= 两个查询中都存在的行。EXCEPT= 第一个查询中存在、但第二个查询中不存在的行。
INTERSECT 返回什么
INTERSECT 只返回同时出现在两个结果集中的不重复行。只有每一列都匹配,某行才算共同存在。
与 UNION 一样,普通的 INTERSECT 会移除重复行,使每个共同的行只返回一次。
SELECT customer_id FROM orders_2023
INTERSECT
SELECT customer_id FROM orders_2024;
-- customers who ordered in BOTH yearsEXCEPT 返回什么
EXCEPT(在甲骨文数据库中称为 MINUS)返回第一个查询中存在、但第二个查询中不存在的不重复行。它具有方向性:A EXCEPT B 与 B EXCEPT A 不同。
这是查找第二个数据集中缺少哪些记录的自然方式。
SELECT customer_id FROM orders_2023
EXCEPT
SELECT customer_id FROM orders_2024;
-- ordered in 2023 but NOT in 2024 (churned)EXCEPT 不具有对称性
面试中的一个常考点是:EXCEPT 具有方向性。交换两个查询,回答的就是另一个问题。
A EXCEPT B= 在 A 中,但不在 B 中。B EXCEPT A= 在 B 中,但不在 A 中。
相比之下,INTERSECT 具有对称性:A INTERSECT B 等于 B INTERSECT A。
-- new customers in 2024 (not seen in 2023):
SELECT customer_id FROM orders_2024
EXCEPT
SELECT customer_id FROM orders_2023;重复行与 DISTINCT 默认行为
标准的 INTERSECT 和 EXCEPT 会像 UNION 一样处理不重复的行。比较前会先合并重复的输入行。
有些数据库支持 INTERSECT ALL 和 EXCEPT ALL,会保留重复次数,但这些运算符较少见。如果面试官没有说 ALL,请假定采用不重复语义。
SELECT city FROM a
INTERSECT ALL
SELECT city FROM b;
-- multiplicity-aware (Postgres supports this; MySQL 8+ too)比较完整行是否相等
这两个运算符会比较所选列组成的完整行。只有每一列都匹配,两个行才相等。这使它们非常适合检测两个表是否存储了完全相同的数据。
请选出您关心的完整列集,以确保比较有意义。
SELECT id, name, email FROM prod_users
EXCEPT
SELECT id, name, email FROM staging_users;
-- rows in prod that differ from / are missing in staging双向表差异模式
要检查两个表是否完全相同,请沿两个方向运行 EXCEPT,并合并差异。如果合并后的结果为空,说明两表完全匹配。
这是迁移和对账检查中经典的数据验证面试答案。
(SELECT * FROM table_a EXCEPT SELECT * FROM table_b)
UNION ALL
(SELECT * FROM table_b EXCEPT SELECT * FROM table_a);
-- empty result => tables are identical如何处理 NULL
在集合运算内部,为了进行匹配,两个 NULL 值会被视为彼此相等,这不同于通常情况下 NULL = NULL 的结果是 UNKNOWN。
因此,一列中含有 NULL 的行会与相同位置也含有 NULL 的另一行匹配。面试官会考查这一点,因为它与普通比较规则相矛盾。
-- (1, NULL) INTERSECT (1, NULL) -> returns (1, NULL)
SELECT id, region FROM a
INTERSECT
SELECT id, region FROM b;集合运算符之间的优先级
在混合使用运算符时,INTERSECT 通常比 UNION 和 EXCEPT 绑定得更紧,这是标准中的规定。为避免歧义,请将分支放在括号中。
说明您使用括号来明确求值顺序,能体现您在面试中的成熟度。
(SELECT id FROM a EXCEPT SELECT id FROM b)
UNION
(SELECT id FROM c);选择 INTERSECT/EXCEPT 还是连接
INTERSECT 和 EXCEPT 简洁,并且通过内置去重比较完整行。连接更灵活(您可以返回额外列,并选择如何处理重复项)。
当问题纯粹是“哪些行相同或缺失”时,优先选择集合运算符。需要两侧的列,或数据库方言不支持这些运算符时,请改用连接。
将这些内容串起来
您可以这样总结:“INTERSECT 返回两个查询中都有的行,并且具有对称性;EXCEPT 返回第一个查询中有、但第二个查询中没有的行,并且具有方向性。两者都比较完整行,将 NULL 视为相等,并默认返回不重复结果。”
在数据对账的后续问题中补充双向 EXCEPT 差异技巧,您就完整覆盖了这个主题。
快速检查
您希望找出在 2023 年下过订单、但在 2024 年 NOT 下过订单的客户(流失客户)。
回顾
要点:
INTERSECT= 两个查询中都有的行;具有对称性。EXCEPT(甲骨文数据库:MINUS)= 第一个查询中有、但第二个查询中没有的行;具有方向性。- 两者都比较完整行,并默认返回不重复的结果。
- 匹配时将 NULL 视为相等。
- 双向
EXCEPT可以得到完整的表差异。
常见问题解答
「使用 INTERSECT 和 EXCEPT 进行比较」课时是免费的吗?
是的 — 「使用 INTERSECT 和 EXCEPT 进行比较」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「使用 INTERSECT 和 EXCEPT 进行比较」这节课中我会学到什么?
查找两个数据集之间的相同行和差异行 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 INTERSECT 和 EXCEPT 进行比较」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- UNION 与 UNION ALL
- 列数与类型兼容性
- 使用 INTERSECT 和 EXCEPT 进行比较
- 使用连接模拟集合运算