UNION ALL
UNION ALL 和 UNION 几乎一样——合并多条 SELECT 的结果——区别是它不去重,直接把所有行堆在一起。这带来了两个好处:一是性能更好(省去排序和去重的开销),二是不会丢失重复行(如果业务上需要保留)。
什么时候用 UNION ALL?绝大多数情况下应该用 UNION ALL,除非真的需要去重。两堆来源不同、不可能有重复的数据,用 UNION 白白浪费性能。只有数据来源有交叉、且业务上需要去重时,才选 UNION。
以飞翔科技为例:
-- 合并所有部门员工的完整列表(不去重)
SELECT emp_name, basic_salary, '技术部' AS dept_label
FROM employees WHERE dept_code = 2
UNION ALL
SELECT emp_name, basic_salary, '产品部' AS dept_label
FROM employees WHERE dept_code = 1
UNION ALL
SELECT emp_name, basic_salary, '运营部' AS dept_label
FROM employees WHERE dept_code = 3;
-- 全年订单汇总(前半年 + 后半年,不去重)
SELECT order_id, order_date, amount
FROM orders WHERE order_date < '2025-07-01'
UNION ALL
SELECT order_id, order_date, amount
FROM orders WHERE order_date >= '2025-07-01'
ORDER BY order_date;
第一个例子给每个部门加了 dept_label 标签列,三个部门的数据来源不同,不可能重复,所以 UNION ALL 最合适。第二个例子前半年和后半年的订单按日期分为两个 SELECT,物理上不重叠,UNION ALL 快速堆叠后统一按日期排序。