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 20 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
Mysql数据库group by原理详解
Jul 07 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
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
js验证表单大全
2006/11/25 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
matplotlib设置legend图例代码示例
2017/12/19 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
详解python配置虚拟环境
2019/04/08 Python
Python错误的处理方法
2020/06/23 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
珍珠奶茶店创业计划书
2014/01/11 职场文书
求职自荐信怎么写
2014/03/06 职场文书
同事去世追悼词
2015/06/23 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android