在处理数据时,有时我们需要将来自不同表或同一表的不同查询结果合并在一起。例如:
- 合并两个部门的员工名单;
- 将多个地区的销售数据汇总;
- 显示某段时间内所有新增和修改的记录。
这时候,我们就需要用到 SQL 中非常强大的两个关键字 —— UNION
和 UNION ALL
!
它们可以帮助我们轻松地将多个查询结果集合并为一个结果集,但两者之间有一些关键的区别需要注意。
一、什么是 UNION 和 UNION ALL?
UNION
:用于合并两个或多个SELECT
语句的结果集,并自动去除重复行。UNION ALL
:也用于合并两个或多个SELECT
语句的结果集,但它不会去除重复行。
你可以把它们理解为:“将不同的查询结果合并成一个大集合”。
二、基本语法
SELECT column1, column2, ...
FROM table1
UNION [ALL]
SELECT column1, column2, ...
FROM table2;
- 必须保证每个
SELECT
语句中的列数相同,且对应列的数据类型兼容。 UNION
默认会去除重复行,而UNION ALL
则保留所有行。
三、示例讲解
假设我们有两个表:employees_north
和 employees_south
,分别存储了北部和南部地区员工的信息。
表:employees_north
id | name |
---|---|
1 | 张三 |
2 | 李四 |
表:employees_south
id | name |
---|---|
3 | 王五 |
4 | 李四 |
示例1:使用 UNION 合并两个表的数据(去重)
SELECT name FROM employees_north
UNION
SELECT name FROM employees_south;
结果:
name |
---|
张三 |
李四 |
王五 |
这里使用 UNION
自动去除了重复的名字“李四”。
示例2:使用 UNION ALL 保留所有数据(含重复)
SELECT name FROM employees_north
UNION ALL
SELECT name FROM employees_south;
结果:
name |
---|
张三 |
李四 |
王五 |
李四 |
这里使用 UNION ALL
保留了所有的记录,包括重复的名字“李四”。
示例3:结合 WHERE 和 ORDER BY 使用
-- 查找名字以“张”开头的所有员工,并按名字排序
(SELECT name FROM employees_north WHERE name LIKE '张%')
UNION
(SELECT name FROM employees_south WHERE name LIKE '张%')
ORDER BY name;
结果:
name |
---|
张三 |
先筛选出符合条件的记录,再进行合并并排序。
示例4:多列合并(注意列数和顺序一致性)
假设我们有两张表 orders_2024
和 orders_2025
,结构如下:
表:orders_2024
order_id | product | amount |
---|---|---|
1 | 手机 | 2999 |
2 | 耳机 | 499 |
表:orders_2025
order_id | product | amount |
---|---|---|
3 | 鼠标 | 199 |
4 | 键盘 | 399 |
SELECT * FROM orders_2024
UNION ALL
SELECT * FROM orders_2025;
结果:
order_id | product | amount |
---|---|---|
1 | 手机 | 2999 |
2 | 耳机 | 499 |
3 | 鼠标 | 199 |
4 | 键盘 | 399 |
注意:UNION
或 UNION ALL
合并时,必须确保每个 SELECT
语句返回的列数一致,并且对应的列类型兼容。
注意
对比项 | UNION | UNION ALL |
---|---|---|
是否去重 | 是 | 否 |
性能 | 较慢(需要额外的去重操作) | 更快 |
使用场景 | 当你需要唯一值时 | 当你不介意重复值时 |
⚠️ 注意:使用
UNION
时,数据库需要对结果集进行排序和去重,这可能会消耗更多资源。如果不需要去重,建议优先使用UNION ALL
提高性能。
四、总结对比表
场景 | SQL 示例 |
---|---|
合并两表数据(去重) | SELECT name FROM table1 UNION SELECT name FROM table2; |
合并两表数据(含重复) | SELECT name FROM table1 UNION ALL SELECT name FROM table2; |
多列合并 | SELECT col1, col2 FROM table1 UNION ALL SELECT col1, col2 FROM table2; |
结合筛选条件 | (SELECT name FROM table1 WHERE condition) UNION (SELECT name FROM table2 WHERE condition) |