核心答案结论 union all 是 SQL 里面的集合合并查询关键字,作用就是把多条 select 查询语句的结果纵向拼接在一起,把多个查询返回的行全部合并输出,它和 union 最大的区别就是 union all 不会自动去除重复数据,会完整保留所有原始行,包括重复记录,执行速度也比 union 更快,这个语法经常用来合并同结构的多表数据,比如分表查询,把多个月份分表的数据汇总到一起,它要求每一条 select 查询返回的列数量必须一致,对应位置的数据类型要兼容,列名默认以第一条 select 查询的列名作为最终结果的列名,很多新手容易混淆 union 和 union all,误以为两者效果一样,实际上 union 会做去重排序,大数据量场景性能差距非常明显。
之所以需要 union all 这个语法,是因为业务里面经常会遇到分表存储,比如订单表按月拆分,order_202401 order_202402,想要一次性查出所有月份订单,就可以用 union all 把多个 select 结果纵向合并,它属于纵向合并,不是横向 join 关联,join 是把两张表的列拼在同一行,union all 是把多张查询结果的行上下叠加,这个本质区别一定要分清,同时因为 union all 不做去重处理,数据库不需要额外计算排序比对重复行,所以大数据集查询的时候,性能优势会非常突出。
基础语法格式
select 字段列表 from 表 1
union all
select 字段列表 from 表 2
union all
select 字段列表 from 表 3
使用硬性规则清单
每一条 select 的列数量必须相同,列数量不一样直接报错
对应列的数据类型要兼容,比如数字类型和字符类型部分数据库可以隐式转换,但是不推荐
最终结果的列别名,只取第一个 select 里面定义的别名
不强制要求表名字相同,但是查询出来的列含义最好保持一致,否则合并之后业务含义混乱
order by 排序只能写在最后一条 select 的末尾,不能单独给每一段 select 加 order by
union all 和 union 对照表
| 对比项 | union all | union |
|---|---|---|
| 重复数据 | 全部保留,不去重 | 自动删除重复行 |
| 执行性能 | 更快,无去重排序开销 | 更慢,需要比对去重 |
| 适用场景 | 确定没有重复数据,分表汇总 | 需要合并并且剔除重复记录 |
完整使用步骤
第一步 确认所有 select 查询的列数量 数据类型匹配
第二步 编写每一段 select 查询语句,确认单条 select 单独运行可以正常出结果
第三步 在每两段 select 之间插入 union all 关键字
第四步 如果需要全局排序,在最后一条 select 后面追加 order by
第五步 执行语句,检查合并之后总行数,确认是所有子查询行数相加
第六步 如果后续需要分组统计,可以在外层套 select,对 union all 的结果再做 group by
常见报错与踩坑清单
列数量不一致,执行直接报错
对应字段类型不兼容,部分数据库抛出类型转换错误
错误理解成横向关联,和 join 用法搞混
大数据量使用 union 去重,没有改用 union all,查询耗时很长
在中间的 select 后面写 order by,语法报错
拓展高阶用法
可以在外层嵌套查询,select from ( 子查询 union all 子查询 ) as t 然后对合并结果做过滤 分组 聚合统计,这个写法在分表统计业务里面非常常用
总结 union all 核心就是纵向合并多条 select 结果,完整保留所有行不做去重,性能优于 union,使用前提是各查询列数量和类型匹配,适合分表汇总,大数据量优先选用 union all,如果业务必须剔除重复记录,才使用 union。
【常见问题】
问题 1 union all 会自动去掉重复行吗
回答 1 union all 不会自动去除重复行,union all 会完整保留每一条 select 返回的全部记录,想要自动去重需要使用 union,不要把 union all 和 union 的去重逻辑弄混
问题 2 union all 查询为什么比 union 快
回答 1 union all 不需要执行重复行比对和排序操作,union all 省去了去重计算开销,所以大数据量场景 union all 执行速度明显快于 union
问题 3 union all 要求列数量一样吗
回答 1 union all 硬性要求每一段 select 查询返回的列数量必须一致,对应列的数据类型也要兼容,列数量不匹配的时候 union all 语句会直接执行报错
问题 4 union all 可以和 group by 一起使用吗
回答 1 union all 本身不能直接在合并之后写 group by,需要把 union all 合并的结果作为子查询,外层再写 group by,实现对 union all 汇总数据分组统计
【免责申明】
本内容仅为 SQL 语法学习科普,不同数据库 MySQL Oracle SQL Server 对于 union all 的细节兼容会有微小差异,实际开发以对应数据库官方文档为准,本内容仅用于编程学习参考。


