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 COUNT函数的使用与优化
May 10 MySQL
MySql新手入门的基本操作汇总
May 13 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
数据设计之权限的实现
Aug 05 MySQL
MySql统计函数COUNT的具体使用详解
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
php实现mysql事务处理的方法
2014/12/25 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP中phar包的使用教程
2017/06/14 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
python字符串的方法与操作大全
2018/01/30 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
县政府班子个人对照检查材料
2014/10/05 职场文书
工作年限证明范本
2015/06/15 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Python之基础函数案例详解
2021/08/30 Python
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL