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