0Pricing
Coding Interview Prep · 课时

使用 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 years

EXCEPT 返回什么

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. UNION 与 UNION ALL
  2. 列数与类型兼容性
  3. 使用 INTERSECT 和 EXCEPT 进行比较
  4. 使用连接模拟集合运算
← 返回 Coding Interview Prep