MySQL利用UNION连接2个查询排序失效详解


Posted in MySQL onNovember 20, 2021

概述

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', '今天很严肃');

默认表数据显示如下

MySQL利用UNION连接2个查询排序失效详解

运行结果分析

-- 查询1
SELECT
 *
FROM
 test_user u
ORDER BY AGE

结果集1

MySQL利用UNION连接2个查询排序失效详解

-- 查询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条记录

MySQL利用UNION连接2个查询排序失效详解

结果集3:使用UNION ALL

MySQL利用UNION连接2个查询排序失效详解

如果需要使用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
 )
 ) a
ORDER BY
 AGE;

结果集4

MySQL利用UNION连接2个查询排序失效详解

 改进

在经过一番搜索相关的经验后发现,是我之前有些画蛇添足了,原来可以在不使用子查询即可完成排序的方法:

-- 查询5
-- 第一个查询不使用排序,如果使用的话不加括号会报错(这也是我之前为什么会想用子查询的原因而没有想过这种方式了)
SELECT
 *
FROM
 test_user u
 
UNION ALL
 
SELECT
 *
FROM
 test_user u
ORDER BY
 AGE

运行出来的结果集与结果集4是相同的,此处就不再粘出结果。

结论

当我们使用UNION(或者UNION ALL)语句时,如果UNION的两个结果集在单独排序后再拼接,则他们的ORDER BY是失效的。如果我们要进行排序有以下两种方法:

  1. 将它们作为子查询再ORDER BY查询一次(还是建议使用方法2,子查询太不简洁了)
  2. 在第一个结果集中不使用排序,且不用括号分隔,而在第二个结果集后使用ORDER BY

参考链接

cnblogs:MySQL中UNION和UNION ALL的使用

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

MySQL 相关文章推荐
MySQL 数据丢失排查案例
May 08 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 #MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
MySQL中order by的使用详情
Nov 17 #MySQL
关于MySQL中的 like操作符详情
Nov 17 #MySQL
MySQL窗口函数的具体使用
MySQL中varchar和char类型的区别
Nov 17 #MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 #MySQL
You might like
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
javascript回调函数详解
2018/02/06 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
Vue可自定义tab组件用法实例
2019/10/24 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
python sys.argv[]用法实例详解
2018/05/25 Python
python获取中文字符串长度的方法
2018/11/14 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python @property及getter setter原理详解
2020/03/31 Python
Python新手学习函数默认参数设置
2020/06/03 Python
python中str内置函数用法总结
2020/12/27 Python
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
出国留学自荐信
2013/10/25 职场文书
大学生应聘推荐信范文
2013/11/19 职场文书
企业安全生产责任书
2014/04/14 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
产品售后服务承诺书
2014/05/21 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
街道社区活动报告
2015/02/05 职场文书