MySQL利用UNION连接2个查询排序失效详解
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,概述UNION连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录UNION ALL连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录今天在接到一个需求的时候使用了
千家信息网最后更新 2025年11月07日MySQL利用UNION连接2个查询排序失效详解
概述
UNION
连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录
UNION ALL
连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录
今天在接到一个需求的时候使用了UNION进行查询后发现,如果两个查询分别使用ORDER BY后拼接居然无法成功排序,经过了好一番折腾,记录下
表结构及数据
-- 创建表CREATE TABLE test_user ( ID int(11) NOT NULL AUTO_INCREMENT, USER_ID int(11) DEFAULT NULL COMMENT '用户账号', USER_NAME varchar(255) DEFAULT NULL COMMENT '用户名', AGE int(5) DEFAULT NULL COMMENT '年龄', COMMENT varchar(255) DEFAULT NULL COMMENT '简介', PRIMARY KEY (ID)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; -- 数据插入语句INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', '开心菜鸟', '18', '今天很开心');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲伤菜鸟', '21', '今天很悲伤');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '认真菜鸟', '30', '今天很认真');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', '高兴菜鸟', '18', '今天很高兴');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '严肃菜鸟', '21', '今天很严肃');默认表数据显示如下

运行结果分析
-- 查询1SELECT *FROM test_user uORDER BY AGE
结果集1

-- 查询2-- 使用UNION( SELECT * FROM test_user u ORDER BY AGE)UNION( SELECT * FROM test_user u ORDER BY AGE); -- 查询3-- 使用UNION ALL( SELECT * FROM test_user u ORDER BY AGE)UNION ALL( SELECT * FROM test_user u ORDER BY AGE)
结果集2:使用UNION
由于UNION会合并相同的记录(与DISTINCT实现相同效果),因此此处显示仅有5条记录
结果集3:使用UNION ALL
如果需要使用UNION ALL又需要进行排序,则要将其作为一个子查询来查
-- 查询4-- 将UNION ALL作为子查询并进行排序SELECT *FROM ( ( SELECT * FROM test_user u ORDER BY AGE ) UNION ALL ( SELECT * FROM test_user u ORDER BY AGE ) ) aORDER BY AGE;
结果集4
改进
在经过一番搜索相关的经验后发现,是我之前有些画蛇添足了,原来可以在不使用子查询即可完成排序的方法:
-- 查询5-- 第一个查询不使用排序,如果使用的话不加括号会报错(这也是我之前为什么会想用子查询的原因而没有想过这种方式了)SELECT *FROM test_user u UNION ALL SELECT *FROM test_user uORDER BY AGE
运行出来的结果集与结果集4是相同的,此处就不再粘出结果。
结论
当我们使用UNION(或者UNION ALL)语句时,如果UNION的两个结果集在单独排序后再拼接,则他们的ORDER BY是失效的。如果我们要进行排序有以下两种方法:
- 将它们作为子查询再ORDER BY查询一次(还是建议使用方法2,子查询太不简洁了)
- 在第一个结果集中不使用排序,且不用括号分隔,而在第二个结果集后使用ORDER BY
参考链接
cnblogs:MySQL中UNION和UNION ALL的使用
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
查询
结果
排序
相同
数据
菜鸟
两个
方法
高兴
悲伤
关键
关键字
内容
括号
用户
语句
参考
学习
运行
简洁
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全出行安全小报四年级
如何用数据库判断出高位
瑶海区专业性网络技术服务哪家好
孤岛惊魂6服务器无法连接 ps
信息安全到网络安全
我们企业网站和网络安全法
数据库有主键怎么办
琳琅服务器
越权删除数据库被判多久
玩加电竞服务器
召开网络安全讲座
福建商贸学校网络安全等保建设
网络安全涉及国防
网络安全类股票有哪些内容
网络安全能报公务员哪些专业
甘肃库存管理软件开发
维护网络安全三个必须
江西综合软件开发服务电话
新软件开发选址
数据库技术及应用考试答案
数据库维护整理
分享通网络技术有限公司
csgo国服连接不到官方服务器
链接数据库和链接字符串一样吗
陕西单招软件开发
pc客户端软件开发
网络安全板块股票信息
怎样查看本机开放的网络安全
服务器iis管理及维护
固定资产软件开发