MySQL UNION操作符用法详解与实例
在数据库查询中,UNION 是一个极为实用的关键字,其核心功能是将多个 SELECT 查询的结果集合并输出。

但在实际开发中,许多开发者容易混淆 UNION 与 JOIN 的区别。其实一句话就能概括:
UNION将结果纵向拼接JOIN则将表数据横向关联
接下来,我们将逐一深入解析 UNION 的详细用法。
一、UNION 是什么?基本概念与作用
UNION 专门用于合并两个及以上的 SELECT 语句所返回的查询结果。其基本语法非常直观:
SELECT 列1, 列2 FROM 表AUNIONSELECT 列1, 列2 FROM 表B;
举例说明:
SELECT name, phone FROM customersUNIONSELECT name, phone FROM suppliers;
这条 SQL 的意图很明确——先从 customers 表提取 name 和 phone,再从 suppliers 表取出相同字段,最后将两批结果合并成一个完整数据集返回。
二、UNION 默认会去重(UNION DISTINCT)
MySQL 中的 UNION 默认会帮助用户去除重复的数据行。
例如:
SELECT 1 AS idUNIONSELECT 1 AS id;
查询结果如下:
id--1
虽然两次查询都返回了 1,但最终结果仅保留一行。换句话说,UNION 等价于 UNION DISTINCT,去重是其默认行为。
三、UNION ALL 不会去重,性能更优
如果需要将所有查询结果原封不动地保留,包括重复数据,则应使用 UNION ALL。
再看一个实例:
SELECT 1 AS idUNION ALLSELECT 1 AS id;
查询结果:
id
--
这次两条相同的 1 全部显示出来。
从实战角度考量,如果你能确定数据本身不会重复,或者业务上允许重复,建议优先选择 UNION ALL。原因很简单——去重操作存在性能开销,UNION ALL 跳过这一步骤,执行效率通常比 UNION 高出一截。
四、UNION 的使用要求与限制
使用 UNION 时,有几项基本规则必须遵守。
1. 每个 SELECT 查询的列数必须相同
正确写法:
SELECT id, name FROM usersUNIONSELECT id, name FROM admins;
错误写法:
SELECT id, name FROM usersUNIONSELECT id FROM admins;
第一种返回两列,第二种仅返回一列,列数不一致,MySQL 直接拒绝执行。
2. 对应列的数据类型应当兼容
看一下这个示例:
SELECT id, name FROM usersUNIONSELECT id, title FROM articles;
语法上或许能通过,因为两个查询都返回两列。但从业务语义来看,第二列一边是用户名 name,一边是文章标题 title,含义完全不匹配。因此,使用 UNION 时不仅要确保列数对齐,对应列的数据含义也应保持一致。
3. 最终结果的列名取第一个 SELECT 的列名
例如:
SELECT id AS user_id, name AS user_name FROM usersUNIONSELECT id AS admin_id, name AS admin_name FROM admins;
最终返回的列名是:
user_id | user_name
而不是:
admin_id | admin_name
换言之,UNION 结果集中的字段名完全由第一个 SELECT 决定。
五、UNION 中 ORDER BY 和 LIMIT 的用法
假如需要对合并后的最终结果进行排序,直接将 ORDER BY 写在最后即可。
示例:
SELECT id, name FROM usersUNION ALLSELECT id, name FROM adminsORDER BY id DESC;
这里的 ORDER BY id DESC 是对两个查询合并后的整体结果统一排序。
如果需求更为复杂——比如每个查询内部先排序或限定行数,则需要借助括号:
(SELECT id, name FROM users ORDER BY id DESC LIMIT 10)UNION ALL(SELECT id, name FROM admins ORDER BY id DESC LIMIT 10)ORDER BY id DESC;
这条 SQL 的逻辑非常清晰:
- 先从
users表取出id最大的 10 条记录; - 再从
admins表取出id最大的 10 条记录; - 最后将两部分结果合并,并按
id降序整体排列。
六、UNION 的常见使用场景(分表合并)
假设现在有两张学生表:
students_2024students_2025
你想将两个年份的学生数据合并在一起查询,可以这样写:
SELECT id, name, '2024' AS year FROM students_2024UNION ALLSELECT id, name, '2025' AS year FROM students_2025;
这里添加了固定字段,分别标注 '2024' AS year 和 '2025' AS year。这样每一行数据来自哪一年,一目了然。
结果大致如下:
id | name | year
---|------|------
1 | 张三 | 2024
2 | 李四 | 2024
1 | 王五 | 2025
2 | 赵六 | 2025
这种写法在分表查询、历史数据合并、报表统计等场景中十分常见。
七、UNION 与 JOIN 的区别详解
许多刚接触 SQL 的新手,容易将 UNION 和 JOIN 混淆。两者其实很好区分。
UNION:纵向合并结果
SELECT name FROM customersUNIONSELECT name FROM suppliers;
可以理解为:
customers 查询结果
+
suppliers 查询结果
它只是简单地将多批结果堆叠在一起,生成更多行。
JOIN:横向关联字段
SELECT orders.id, users.nameFROM ordersJOIN users ON orders.user_id = users.id;
可以理解为:
订单信息 + 用户信息
它是根据关联条件,将多张表的数据拼接到同一行中。
一句话总结:UNION 是纵向拼接,JOIN 是横向关联。
八、UNION 与 UNION ALL 如何选择?性能与去重
这个选择并不复杂:
需要去重时选用 UNION:
UNION
不需要去重时选用 UNION ALL:
UNION ALL
实际项目中,UNION ALL 的使用频率往往更高。因为它省去了去重步骤,性能更优。只有在系统确实需要过滤重复数据时,才会用到 UNION。
九、总结:UNION 核心要点速记
这篇文章全面梳理了 MySQL 中 UNION 的用法。核心要点如下:
UNION用于合并多个SELECT查询结果;UNION默认会去除重复行;UNION ALL不会去重,性能通常更优;- 多个
SELECT的列数必须一致; - 对应列的数据类型最好保持兼容;
- 最终结果的列名由第一个
SELECT决定; ORDER BY写在最后时,是对整体结果排序;UNION是纵向拼接,JOIN是横向关联。
一句话来记忆:
UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Oracle 12c安装报OSDBA组不存在?预先创建用户组解决
在Linux上安装Oracle12c时,“OSDBAgroupdoesnotexist”报错因缺少dba组,需执行groupadddba并将用户加入该组,用id-a验证。Windows不识别dba组,应使用ORA_DBA组。config o文件硬编码OSDBA组名,需检查其值是否为dba。创建组后仍需注意sudo、su或容器等场景下会话上下文未继承新组的问题
高并发系统缓存更新先删缓存还是先更新数据库
高并发系统中缓存与数据库更新易致数据不一致。先删缓存再更新可能引入脏数据,建议先更新数据库再删缓存。延迟双删、MQ补偿及Canal监听binlog等方案可保证最终一致性,数据库是最终数据源,缓存为加速层。
SQL中DENSE_RANK为何比RANK更符合业务排名逻辑
在SQL中,RANK()函数因相同排名后跳号,导致TopN查询可能多出数据;而DENSE_RANK()不跳号,排名连续,更符合“第几档”业务语义,避免歧义,常应用于需要连续排名的分档统计场景中。
高并发SQL INSERT锁竞争成为系统瓶颈的原因
很多开发者想当然地认为INSERT只会锁定新插入的那一行,但实际情况远比这复杂。它不仅要施加行锁,还需要在检查唯一约束、分配自增ID以及维护二级索引时,额外申请insert intention lock、gap lock、next-key lock,甚至表级auto-inc lock。这些锁并非各自
如何在SQL SELECT语句中使用CASE WHEN函数实现复杂逻辑分支
CASEWHEN是表达式而非函数,若忘记ELSE或条件顺序写错易导致NULL结果。需注意数据类型隐式转换问题,在WHERE中宜用布尔表达式,ORDERBY中可自定义排序规则,聚合常与SUM COUNT函数搭配使用。避免深层嵌套,不同数据库语法有差异。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-06 07:07
2026-07-06 07:07
2026-07-06 07:07
2026-07-06 07:07
2026-07-06 07:07
2026-07-06 07:07
2026-07-06 07:06
2026-07-06 07:06
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

