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之DML语言
Apr 05 MySQL
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
Mysql数据库命令大全
May 26 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
详解PHP PDO简单教程
2019/05/28 PHP
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
医生实习工作总结的自我评价
2013/09/27 职场文书
yy结婚证婚词
2014/01/10 职场文书
经销商会议欢迎词
2014/01/11 职场文书
党员作风建设整改方案
2014/10/27 职场文书
2014年学生会工作总结
2014/11/07 职场文书
辞职信如何写
2015/02/27 职场文书
毕业实习证明范本
2015/06/16 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书