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多表查询-笔记七
Apr 05 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL开启事务的方式
Jun 26 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 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
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
CSS常用网站布局实例
2008/04/03 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
详解vue-cli3使用
2018/08/14 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
python 获取等间隔的数组实例
2019/07/04 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
Python通过format函数格式化显示值
2020/10/17 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
简单说说tomcat的配置
2013/05/28 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
婚礼主持词
2014/03/13 职场文书
工作总结与自我评价
2014/09/18 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
vscode内网访问服务器的方法
2022/06/28 Servers