在 SQL 中,UNION ALL 是一个高效的数据合并工具,它能够将多个查询结果直接拼接在一起,并且不进行去重操作,也不会自动排序。在数据整合、日志合并、分表查询等场景中,它几乎每天都在被使用。下面我们将系统梳理它的语法、用法、性能特点以及常见注意事项。

一、基本语法
语法结构简单直观,就是将几个 SELECT 语句用 UNION ALL 连接起来:
SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2;
- 每个
SELECT返回的字段数量必须相同; - 对应位置的字段类型要能兼容(比如
INT和BIGINT没问题); - 最终结果集的列名,使用的是第一个
SELECT里的命名。
二、使用条件
要正确使用 UNION ALL,需要满足两个硬性条件:
- 列数一致:所有参与联合的查询,返回的字段个数必须完全相同;
- 数据类型兼容:每个位置上的列,要么类型相同,要么可以隐式转换。
举个例子:一个查询返回
(id, name),另一个返回(code, title),只要id和code类型兼容、name和title类型兼容,就能直接用UNION ALL。当然最好用别名统一成(id, name),看起来更清晰。
三、典型使用示例
示例1:合并两个员工表(保留重复)
假设有两个表:employees 和 contractors:
-- employees 表 id | name ---|------ 1 | Alice 2 | Bob -- contractors 表 id | name ---|------ 1 | Da vid 2 | Alice
执行:
SELECT name FROM employees UNION ALL SELECT name FROM contractors;
结果:
name
------
Alice
Bob
Da vid
Alice ← 重复项保留
这充分体现了 UNION ALL 不去重 的特性。
示例2:多季度销售数据合并
假如每季度销售数据存在不同表里(Q1_sales、Q2_sales),结构一样:
SELECT product, sales FROM Q1_sales UNION ALL SELECT product, sales FROM Q2_sales ORDER BY sales DESC;
需要特别注意:
ORDER BY必须放在整个UNION ALL语句的末尾,不能在每个子查询里单独加。
示例3:列转行(宽表转长表)
想把一张宽表 sales_summary(A_sales, B_sales, C_sales) 转成长表格式:
SELECT 'A' AS product_type, A_sales AS amount FROM sales_summary UNION ALL SELECT 'B', B_sales FROM sales_summary UNION ALL SELECT 'C', C_sales FROM sales_summary;
这个技巧在数据重塑(pivoting)中很实用,是 UNION ALL 的进阶用法之一。
四、与UNION的关键区别
| 特性 | UNION | UNION ALL |
|---|---|---|
| 去重 | 自动去除重复行 | 保留所有行(含重复) |
| 性能 | 较低(需排序+去重) | 更高(直接拼接) |
| 排序 | 默认对结果排序 | 不排序 |
| 适用场景 | 需唯一结果集 | 允许重复或已知无重复时 |
由于
UNION需要通过排序来实现去重,当数据量较大时,其性能会显著低于UNION ALL。
五、性能与注意事项
- 性能更优:
UNION ALL省掉了去重步骤,执行速度更快。只要不需要去重,应优先使用它。 - 结果排序不可控:除非主动加
ORDER BY,否则结果集的排序无法预测。 - 空值处理规则:
NULL被视为普通值,多个NULL会全部保留。 - 常见错误排查:
- 列数不一致时,数据库会报错:“查询具有不正确的结果列数”;
- 数据类型不兼容,可能导致隐式转换错误或结果异常。
六、实际应用场景
- 多源日志合并:把多台服务器的日志表合在一起统一分析,所有数据都不能丢失;
- 分表数据汇总:按时间或地域拆分的业务表(比如按月拆分的订单表),用
UNION ALL汇总; - ETL过程中的原始数据拼接:在数据清洗前先完整合并,再统一进行清洗;
- 多来源报表生成:组合结构一致但来源不同的数据(如线上与线下销售数据)。
总结
UNION ALL 是 SQL 中高效合并结果集的常用工具,它具备保留重复、不自动排序、高性能等特点,因此在大多数数据整合场景下比 UNION 更加实用。使用时只需确保各查询的列数和数据类型一致,再根据业务需要决定是否后续去重或排序,就能轻松应对复杂查询。熟练掌握 UNION ALL,能让你的 SQL 查询更加灵活高效。
