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 相关文章推荐
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
Mysql基础之常见函数
Apr 22 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
mysql sql常用语句大全
Jun 21 MySQL
Mysql数据库group by原理详解
Jul 07 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL数据管理操作示例讲解
Dec 24 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
Zerg基本策略
2020/03/14 星际争霸
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
json的前台操作和后台操作实现代码
2012/01/20 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
Python合并字符串的3种方法
2015/05/21 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
在python shell中运行python文件的实现
2019/12/21 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
环保宣传标语
2014/06/12 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
学校施工安全责任书
2015/01/29 职场文书
大学生读书笔记范文
2015/07/01 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js