UNION ALL 是 SQL 中用于合并多个 SELECT 查询结果集的操作符。它与 UNION 类似,但有一个关键区别:UNION ALL 保留所有行(包括重复行),而 UNION 会自动去重。
sql
SELECT column1, column2, ... FROM table1
UNION ALL
SELECT column1, column2, ... FROM table2
UNION ALL
SELECT column1, column2, ... FROM table3;
- 每个 SELECT 语句的列数必须相同
- 对应列的数据类型需兼容(如都是字符串或数字)
- 列的顺序必须一致
| 特性 | UNION ALL |
UNION |
|---|---|---|
| 是否去重 | ❌ 保留所有重复行 | ✅ 自动去除重复行 |
| 是否排序 | ❌ 不排序 | ✅ 隐式排序(用于去重) |
| 性能 | ⚡ 更快(无去重开销) | 🐢 较慢(需排序+去重) |
| 适用场景 | 数据互斥、无需去重 | 需要唯一结果集 |
在大数据量下,UNION 可能因去重操作触发临时表写入和内存溢出,而 UNION ALL 几乎无额外开销,速度通常快 3--5 倍。
例子
sql
-- 合并 2023 年和 2024 年的订单表(数据天然互斥)
SELECT order_id, amount, '2023' AS year FROM orders_2023
UNION ALL
SELECT order_id, amount, '2024' AS year FROM orders_2024;
sql
-- 快速生成包含重复值的测试集
SELECT 'Alice' AS name, 25 AS age
UNION ALL
SELECT 'Bob', 30
UNION ALL
SELECT 'Alice', 25; -- 重复行会被保留
- 列名以第一个 SELECT 为准
结果集的列名由第一个查询决定,后续查询的列名会被忽略。 - 避免在不需要去重时使用 UNION
如果你确定数据无重复(如分表查询),用 UNION ALL 更高效。 - 与 ORDER BY 配合使用
若需对最终结果排序,必须将整个 UNION ALL 作为子查询:
sql
SELECT * FROM (
SELECT name, age FROM table1
UNION ALL
SELECT name, age FROM table2
) AS combined
ORDER BY age;
"不确定是否重复?先用 UNION ALL,再根据业务需求决定是否去重。"