UNION ALL比UNION更快更直白,不自动去重和排序,要求各SELECT列数一致、类型兼容,列名以首个SELECT为准;适用于无重复、允许重复、大数据量或含TEXT字段的场景,需显式ORDER BY实现排序。

直接用 UNION ALL 就行,它比 UNION 更快、更直白,只要你不介意重复数据。
UNION ALL 的基本写法
语法和 UNION 完全一样,只是把 UNION 换成 UNION ALL:
- 每个 SELECT 的列数必须一致
- 对应列的数据类型要兼容(比如都是字符串或都是数字)
- 列名以第一个 SELECT 为准
示例:
SELECT id, name FROM usersUNION ALL
SELECT id, nickname FROM admins;
UNION 和 UNION ALL 的核心区别
去重与否是唯一本质区别:
- UNION:合并后自动去重 + 默认按字段顺序隐式排序(MySQL 实现中会建临时表 + unordered_set 去重)
- UNION ALL:原样拼接,不做任何去重或排序,直接返回所有行
这意味着:如果两个子查询结果里都有 (1, 'Alice'),UNION 只出现一次,UNION ALL 出现两次。
什么时候该选 UNION ALL
满足以下任一条件,就优先用 UNION ALL:
- 你已确认各子查询结果之间没有重复(比如查的是不同状态的订单表)
- 业务逻辑本身允许重复(如日志归集、多源埋点数据合并)
- 数据量较大,对性能敏感(实测常快 30% 以上,尤其在千万级结果时)
- 字段含 TEXT 类型——UNION 在某些 MySQL 版本中不支持 TEXT 列去重,而 UNION ALL 支持
一个小提醒
UNION ALL 不排序,所以如果你需要最终结果有序,必须显式加 ORDER BY,且只能写在最后:
SELECT id, name FROM usersUNION ALL
SELECT id, nickname FROM admins
ORDER BY id;










