UNIONALL用于合并多个查询结果,保留所有重复行且不排序,因此执行效率高,性能优于UNION;UNION则自动去重但需排序,导致性能较低,开销大。使用要求各查询列数一致、数据类型兼容。常用于日志合并、分表汇总等数据整合场景。
在 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),使结果更清晰。
假设存在 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 不去重 的特性。
假设每季度销售数据存储在不同表(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语句末尾,不能在每个子查询中单独添加。
将宽表 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 ALL |
|---|---|---|
| 去重 | 自动去除重复行 | 保留所有行(含重复) |
| 性能 | 较低(需排序+去重) | 更高(直接拼接) |
| 排序 | 默认对结果排序 | 不排序 |
| 适用场景 | 需唯一结果集 | 允许重复或已知无重复时 |
因为
UNION需要去重(通常通过排序实现),数据量较大时性能明显低于UNION ALL。
UNION ALL 省去了去重步骤,执行更快。只要不需要去重,优先使用它。ORDER BY,否则结果排序不可预测。NULL 被视为普通值,多个 NULL 会全部保留。UNION ALL 汇总;UNION ALL 是 SQL 中高效合并结果集的利器,其“保留重复、不排序、高性能”的特点,使其在多数数据整合场景中比 UNION 更常用。使用时只需确保各查询的列数和数据类型一致,再根据业务需求决定是否后续去重或排序,即可轻松应对复杂查询。掌握它,能让 SQL 编写更灵活高效。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述