目录
🧩 什么是 UNION
?
UNION
是 SQL 中的一个关键字,用于 合并多个 SELECT 查询结果,并去除重复的记录,形成一个新的结果表。
基本语法:
SELECT 列1, 列2, ...
FROM 表1
UNION
SELECT 列1, 列2, ...
FROM 表2;
重点规则:
每个
SELECT
查询的列数量必须一致。每个对应列的数据类型要兼容(如都是字符串、都是数字)。
UNION
会自动去除重复行,如果你想保留重复,可以使用UNION ALL
。
UNION
vs UNION ALL
操作符 | 是否去重 | 性能 | 用途 |
---|---|---|---|
UNION |
是 | 较慢(多了去重操作) | 多来源整合数据,避免重复记录 |
UNION ALL |
否 | 更快 | 统计所有记录(包括重复项) |
-- 去除重复
SELECT name FROM employees
UNION
SELECT name FROM managers;
-- 保留重复
SELECT name FROM employees
UNION ALL
SELECT name FROM managers;
✅ 简单例子
假设我们有两个表:
表:students_2023
+----+--------+
| id | name |
+----+--------+
| 1 | Alice |
| 2 | Bob |
+----+--------+
表:students_2024
+----+--------+
| id | name |
+----+--------+
| 3 | Carol |
| 4 | Bob |
+----+--------+
用 UNION 合并名字:
SELECT name FROM students_2023
UNION
SELECT name FROM students_2024;
结果:
+--------+
| name |
+--------+
| Alice |
| Bob |
| Carol |
+--------+
Bob 出现了两次,但只保留了一个。
用 UNION ALL 不去重:
SELECT name FROM students_2023
UNION ALL
SELECT name FROM students_2024;
结果:
+--------+
| name |
+--------+
| Alice |
| Bob |
| Carol |
| Bob |
+--------+
UNION 的常见应用场景
1. 多张表中合并数据
合并来自不同年度的学生名单:
SELECT id, name FROM students_2023
UNION
SELECT id, name FROM students_2024;
2. 合并来自不同来源的相似数据
SELECT email FROM customers
UNION
SELECT email FROM suppliers;
3. 加标签显示不同来源 (分类展示)
SELECT name, '2023' AS 来源 FROM students_2023
UNION
SELECT name, '2024' FROM students_2024;
与其他子句联合使用
1. UNION
与 ORDER BY
如上所示,ORDER BY
必须在最后一个 SELECT 的末尾出现。
2. UNION
与 LIMIT
你可以限制最终结果的行数:
SELECT name FROM customers
UNION
SELECT name FROM employees
LIMIT 10;
3. UNION
与 WHERE
每个 SELECT 可以有自己的条件:
SELECT id, name FROM orders WHERE status = 'shipped'
UNION
SELECT id, name FROM orders_archive WHERE status = 'shipped';
🚧 UNION注意事项
错误信息 | 原因 | 解决方法 |
---|---|---|
列数不一致 | 两个 SELECT 的列数不同 | 确保 SELECT 的列数相同 |
类型不一致 | 比如一个是数字,一个是字符串 | 用 CAST() 或 CONVERT() 转换类型 |
排序无效 | ORDER BY 写错位置 |
必须写在最后的 SELECT 之后 |
正确排序方式:
SELECT name FROM students_2023
UNION
SELECT name FROM students_2024
ORDER BY name;
性能优化建议
如果你不需要去重,尽量用
UNION ALL
,性能会提升。各子句中尽可能使用索引字段进行过滤。
对于大型数据源,先进行聚合再合并结果(如
GROUP BY
+UNION
)。