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 InnoDB存储引擎的内存管理
Apr 08 MySQL
详解MySQL的半同步
Apr 22 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL导致索引失效的几种情况
Jun 25 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
vuex存取值和映射函数使用说明
2020/07/24 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
详解Python3.1版本带来的核心变化
2015/04/07 Python
python搜索指定目录的方法
2015/04/29 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
python实现图书管理系统
2018/03/12 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
电子信息专业学生自荐信
2013/11/09 职场文书
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
寒假思想汇报
2014/01/10 职场文书
前台接待岗位职责
2015/02/03 职场文书
户外亲子活动总结
2015/05/08 职场文书
团支部书记竞选稿
2015/11/21 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书