这些是集合操作,用于合并两个查询的结果。UNION 合并行(去除重复),INTERSECT 返回两个查询中都存在的行,EXCEPT 返回仅在第一个查询中存在但不在第二个查询中的行。它们以垂直方式对整个结果集进行操作(堆叠行),不同于 JOIN(水平方向合并列)。
UNION — 合并结果(去重)
name, email customers
name, email suppliers;
name customers
name suppliers;
这些是集合操作,用于合并两个查询的结果。UNION 合并行(去除重复),INTERSECT 返回两个查询中都存在的行,EXCEPT 返回仅在第一个查询中存在但不在第二个查询中的行。它们以垂直方式对整个结果集进行操作(堆叠行),不同于 JOIN(水平方向合并列)。
name, email customers
name, email suppliers;
name customers
name suppliers;
UNION 将两个查询的行堆叠在一起(必须具有兼容的列 — 相同数量、兼容的类型),并删除重复项。UNION ALL 保留重复项,速度更快(无去重过程) — 当你知道没有重复项或不关心重复时使用它。
-- people who are BOTH customers AND suppliers
SELECT email FROM customers
INTERSECT
SELECT email FROM suppliers;
-- customers who are NOT suppliers
SELECT email FROM customers
EXCEPT
SELECT email FROM suppliers;
Requirements for set operations:
✓ Both queries must have the SAME number of columns
✓ Corresponding columns must have COMPATIBLE types
✓ Column names come from the FIRST query
UNION vs UNION ALL:
UNION → removes duplicates (extra work — sorts/compares)
UNION ALL → keeps all rows (faster) — prefer it when dedup isn't needed
JOIN → combines tables HORIZONTALLY (adds columns from related rows)
UNION → combines results VERTICALLY (stacks rows from separate queries)
→ Different purposes: JOIN for related data across tables, UNION for merging
similar result sets.
集合操作(UNION、INTERSECT、EXCEPT)是合并结果集的有用 SQL 特性,理解它们对于需要从多个数据源合并、求交集或相减数据的查询很有价值。
最常用的是 UNION(合并两个查询的行 — 类似于合并来自不同表的相似数据),一个重要的实际区别是 UNION 与 UNION ALL:UNION 删除重复项(需要排序/比较成本),而 UNION ALL 保留所有行并且速度更快 — 知道在不需要去重时优先使用 UNION ALL 是一个有用的性能实践。INTERSECT(两个查询中都存在的行)和 EXCEPT(在第一个查询中但不在第二个查询中的行)简洁地处理集合差异逻辑。
理解要求(匹配列数和兼容类型)以及集合操作和 JOIN 之间的关键概念差异 — 集合操作以垂直方式合并结果(堆叠来自独立查询的行),而 JOIN 以水平方式合并(从相关行添加列) — 对于选择正确的工具很重要。
由于从多个查询合并结果集是真实的需求(合并来自相似表的数据、查找集合之间的公共或不同的条目),并且由于理解这些操作、UNION/UNION ALL 性能区别,以及集合操作与 JOIN 的差异有助于你正确且高效地表达这些需求,掌握集合操作是有用的、实际相关的 SQL 知识,它补充了 JOIN 并使涉及合并或比较整个结果集的一类查询成为可能。