← 返回题目列表

UNION 和 UNION ALL 有什么区别?

高频 简单 第 4 / 28 题 更新于 2026/07/27
SQLUNION去重

简化版

UNION 合并多个查询结果后去重,UNION ALL 保留全部行,包括重复行。确认业务不需要去重时优先使用 UNION ALL,因为它避免了额外的去重工作,但最终性能仍应以执行计划和数据量为准。

详细版

参与集合运算的各查询必须返回相同数量的列,对应列的数据类型需要兼容。最终列名通常取自第一个查询块,末尾的 ORDER BYLIMIT 作用于合并后的整体结果;若要限制某个分支,需要用括号或派生表明确其作用域。

SELECT user_id FROM web_order
UNION ALL
SELECT user_id FROM store_order;

若同一用户在两个表中都出现,UNION ALL 会保留两行;改成 UNION 后只保留一个相同结果行。这里去重比较的是输出行的所有列,不是只看第一列。

完整版教学

一、UNION 操作的是结果集

UNION 不是表连接。JOIN 横向扩展列,根据条件把多张表的行配对;UNION 纵向追加行,把结构兼容的结果集叠在一起。

SELECT id, name FROM current_customer
UNION ALL
SELECT id, name FROM archived_customer;

两个分支都返回两列,位置一一对应。数据库按列位置匹配,不按列名自动寻找对应关系。

二、去重范围是整行

SELECT 1 AS id, 'A' AS name
UNION
SELECT 1 AS id, 'B' AS name;

结果仍有两行,因为 (1, 'A')(1, 'B') 并不相同。如果只想按 id 去重同时保留一条完整记录,需要定义保留规则,常用窗口函数配合 ROW_NUMBER(),不能指望 UNION 自动决定保留哪个 name

三、为什么 UNION ALL 通常更省工作

UNION 等价于集合合并后执行 DISTINCT 语义,数据库通常需要排序、哈希或其他方式识别重复行。UNION ALL 可以直接保留各分支结果,少了去重步骤。

不过“通常更快”不等于任何查询都能观察到显著差异。数据量、索引、并行执行和后续操作都会影响成本。正确原则是:业务允许重复就用 UNION ALL;业务要求结果行唯一才用 UNION 或显式去重。

四、ORDER BY 的作用域

SELECT id, created_at FROM order_a
UNION ALL
SELECT id, created_at FROM order_b
ORDER BY created_at DESC;

末尾排序针对合并后的整份结果。不能依赖每个分支内部的自然顺序,因为 SQL 结果只有最终 ORDER BY 才保证顺序。若要先从每个来源各取前 N 条再合并,应使用派生表或目标数据库支持的括号语法明确分支范围。

五、类型兼容与隐式转换

对应列类型不兼容时会报错;可以转换时,数据库会选择共同类型。隐式转换可能带来精度、长度或排序规则变化,生产 SQL 最好用 CAST 明确意图。列别名也建议在第一个查询中定义清楚,便于最终排序和上层读取。

六、常见误区与追问

写法是否去重成本特征
UNION ALL不去重直接追加结果,通常成本更低
UNION整行去重需要排序或哈希去重
外层 ORDER BY控制最终顺序对合并后的总结果生效
分支子查询排序控制分支截断需要显式包裹分支
  • 误区:UNION 只按第一列去重。 UNION 的去重单位是整行,只有所有输出列都相同才会被视为重复。
  • 误区:UNION ALL 会改变每个分支内部的列名和类型规则。 最终列名通常取第一个查询分支,列数必须一致,类型需要兼容或能转换。
  • 误区:每个 SELECT 后随便写 ORDER BY 就能控制最终顺序。 合并结果的最终展示顺序要在整个 UNION 外层写 ORDER BY
  • 追问:为什么 UNION ALL 通常更快? 它不需要全局去重,少了排序或哈希去重成本;在确认业务允许重复时应优先考虑。
  • 追问:什么场景必须用 UNION? 多个来源可能产生完全重复行,而业务要求集合语义、不能重复展示或重复统计时才用 UNION
  • 追问:UNION 后 LIMIT 应该放哪里? 放在最终结果外层限制合并后的总结果;若要限制某个分支,需要用子查询明确该分支的排序和截断。

记忆钩子:UNION ALL 是拼接,UNION 是拼接后整行去重;是否需要去重由业务语义决定。

七、加强记忆

JOIN 是横向拼列,UNION 是纵向叠行;UNION 去重整行,UNION ALL 原样保留。列数必须一致、对应类型要兼容,末尾 ORDER BY 管整个合并结果。是否去重由业务决定,不需要去重就不要付出去重成本。