在处理数据时,有时我们需要将来自不同表或同一表的不同查询结果合并在一起。例如:
- 合并两个部门的员工名单;
 - 将多个地区的销售数据汇总;
 - 显示某段时间内所有新增和修改的记录。
 
这时候,我们就需要用到 SQL 中非常强大的两个关键字 ------ UNION 和 UNION ALL!
它们可以帮助我们轻松地将多个查询结果集合并为一个结果集,但两者之间有一些关键的区别需要注意。
一、什么是 UNION 和 UNION ALL?
UNION:用于合并两个或多个SELECT语句的结果集,并自动去除重复行。UNION ALL:也用于合并两个或多个SELECT语句的结果集,但它不会去除重复行。
你可以把它们理解为:"将不同的查询结果合并成一个大集合"。
二、基本语法
            
            
              sql
              
              
            
          
          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 合并两个表的数据(去重)
            
            
              sql
              
              
            
          
          SELECT name FROM employees_north
UNION
SELECT name FROM employees_south;
        结果:
| name | 
|---|
| 张三 | 
| 李四 | 
| 王五 | 
这里使用 UNION 自动去除了重复的名字"李四"。
示例2:使用 UNION ALL 保留所有数据(含重复)
            
            
              sql
              
              
            
          
          SELECT name FROM employees_north
UNION ALL
SELECT name FROM employees_south;
        结果:
| name | 
|---|
| 张三 | 
| 李四 | 
| 王五 | 
| 李四 | 
这里使用 UNION ALL 保留了所有的记录,包括重复的名字"李四"。
示例3:结合 WHERE 和 ORDER BY 使用
            
            
              sql
              
              
            
          
          -- 查找名字以"张"开头的所有员工,并按名字排序
(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 | 
            
            
              sql
              
              
            
          
          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) |