union 和 unionAll 的区别
union和unionAll均用于 “合并多个 SELECT 语句的结果集”,核心区别在于 “是否去重” 和 “性能”,具体对比如下:
# 1. 核心区别
| 对比维度 | union | unionAll |
|---|---|---|
| 去重功能 | 自动去除结果集中的重复行 | 不去除重复行,保留所有行 |
| 排序功能 | 自动对结果集按第一列升序排序(可通过 ORDER BY 指定排序) | 不排序,结果集顺序与各 SELECT 语句执行顺序一致 |
| 性能 | 较低(需额外执行去重和排序操作) | 较高(直接合并结果,无额外操作) |
| 适用场景 | 需合并且去重的场景(如合并两个无重复数据的表) | 无需去重的场景(如合并日志表、统计结果表) |
# 2. 语法示例与结果对比
# 测试数据:
-- 表A
CREATE TABLE table_a (id INT, name VARCHAR(20));
INSERT INTO table_a VALUES (1, '张三'), (2, '李四');
-- 表B(包含与表A的重复数据)
CREATE TABLE table_b (id INT, name VARCHAR(20));
INSERT INTO table_b VALUES (2, '李四'), (3, '王五');
1
2
3
4
5
6
7
2
3
4
5
6
7
# (1)union 示例(去重 + 排序)
SELECT id, name FROM table_a
UNION
SELECT id, name FROM table_b;
1
2
3
2
3
# 结果(去重 + 按 id 升序排序):
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
# (2)unionAll 示例(不去重 + 不排序)
SELECT id, name FROM table_a
UNION ALL
SELECT id, name FROM table_b;
1
2
3
2
3
# 结果(保留重复行,顺序与 SELECT 顺序一致):
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 2 | 李四 |
| 3 | 王五 |
# 3. 关键注意事项
结果集结构一致:两个 SELECT 语句的字段数必须相同,字段类型需兼容(如 INT 和 VARCHAR 可兼容,DATE 和 INT 不兼容);
排序位置:union 的 ORDER BY 需写在最后一个 SELECT 语句后(作用于整个结果集),unionAll 的 ORDER BY 需写在每个 SELECT 语句后(作用于单个结果集);
-- union 排序整个结果集 SELECT id, name FROM table_a UNION SELECT id, name FROM table_b ORDER BY id DESC; -- 按id降序排序 -- unionAll 排序单个结果集 SELECT id, name FROM table_a ORDER BY id DESC UNION ALL SELECT id, name FROM table_b ORDER BY id DESC;1
2
3
4
5
6
7
8
9
10性能优化:若确定两个结果集无重复数据,优先使用 unionAll(性能比 union 高 30%-50%);若需去重,再使用 union。
上次更新: 12/30/2025