当前位置: 首页
数据库
MySQL UNION操作符用法详解与实例

MySQL UNION操作符用法详解与实例

热心网友 时间:2026-07-06
转载

在数据库查询中,UNION 是一个极为实用的关键字,其核心功能是将多个 SELECT 查询的结果集合并输出

MySQL中UNION的用法详解

但在实际开发中,许多开发者容易混淆 UNIONJOIN 的区别。其实一句话就能概括:

  • 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 表提取 namephone,再从 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 的逻辑非常清晰:

  1. 先从 users 表取出 id 最大的 10 条记录;
  2. 再从 admins 表取出 id 最大的 10 条记录;
  3. 最后将两部分结果合并,并按 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 的新手,容易将 UNIONJOIN 混淆。两者其实很好区分。

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 的用法。核心要点如下:

  1. UNION 用于合并多个 SELECT 查询结果;
  2. UNION 默认会去除重复行;
  3. UNION ALL 不会去重,性能通常更优;
  4. 多个 SELECT 的列数必须一致;
  5. 对应列的数据类型最好保持兼容;
  6. 最终结果的列名由第一个 SELECT 决定;
  7. ORDER BY 写在最后时,是对整体结果排序;
  8. UNION 是纵向拼接,JOIN 是横向关联。

一句话来记忆:

UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。

来源:https://www.jb51.net/database/366718m94.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Oracle 12c安装报OSDBA组不存在?预先创建用户组解决

Oracle 12c安装报OSDBA组不存在?预先创建用户组解决

在Linux上安装Oracle12c时,“OSDBAgroupdoesnotexist”报错因缺少dba组,需执行groupadddba并将用户加入该组,用id-a验证。Windows不识别dba组,应使用ORA_DBA组。config o文件硬编码OSDBA组名,需检查其值是否为dba。创建组后仍需注意sudo、su或容器等场景下会话上下文未继承新组的问题

时间:2026-07-06 07:07
高并发系统缓存更新先删缓存还是先更新数据库

高并发系统缓存更新先删缓存还是先更新数据库

高并发系统中缓存与数据库更新易致数据不一致。先删缓存再更新可能引入脏数据,建议先更新数据库再删缓存。延迟双删、MQ补偿及Canal监听binlog等方案可保证最终一致性,数据库是最终数据源,缓存为加速层。

时间:2026-07-06 07:07
SQL中DENSE_RANK为何比RANK更符合业务排名逻辑

SQL中DENSE_RANK为何比RANK更符合业务排名逻辑

在SQL中,RANK()函数因相同排名后跳号,导致TopN查询可能多出数据;而DENSE_RANK()不跳号,排名连续,更符合“第几档”业务语义,避免歧义,常应用于需要连续排名的分档统计场景中。

时间:2026-07-06 07:07
高并发SQL INSERT锁竞争成为系统瓶颈的原因

高并发SQL INSERT锁竞争成为系统瓶颈的原因

很多开发者想当然地认为INSERT只会锁定新插入的那一行,但实际情况远比这复杂。它不仅要施加行锁,还需要在检查唯一约束、分配自增ID以及维护二级索引时,额外申请insert intention lock、gap lock、next-key lock,甚至表级auto-inc lock。这些锁并非各自

时间:2026-07-06 07:07
如何在SQL SELECT语句中使用CASE WHEN函数实现复杂逻辑分支

如何在SQL SELECT语句中使用CASE WHEN函数实现复杂逻辑分支

CASEWHEN是表达式而非函数,若忘记ELSE或条件顺序写错易导致NULL结果。需注意数据类型隐式转换问题,在WHERE中宜用布尔表达式,ORDERBY中可自定义排序规则,聚合常与SUM COUNT函数搭配使用。避免深层嵌套,不同数据库语法有差异。

时间:2026-07-06 07:07
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜