如何在mysql中使用union all_mysql union all区别说明

15次阅读

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

如何在mysql中使用union all_mysql union all区别说明

直接用 UNION ALL 就行,它比 UNION 更快、更直白,只要你不介意重复数据。

UNION ALL 的基本写法

语法和 UNION 完全一样,只是把 UNION 换成 UNION ALL

  • 每个 SELECT 的列数必须一致
  • 对应列的数据类型要兼容(比如都是字符串或都是数字)
  • 列名以第一个 SELECT 为准

示例:

SELECT id, name FROM users
UNION 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 users
UNION ALL
SELECT id, nickname FROM admins
ORDER BY id;

text=ZqhQzanResources