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 02 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL创建定时任务
Jan 22 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 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
一个用于网络的工具函数库
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
DOM 事件流详解
2015/01/20 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Router解决跨模块下的页面跳转示例
2018/01/11 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
幼儿园庆六一游园活动方案
2014/01/29 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
演讲稿的写法
2014/05/19 职场文书
群众路线领导对照材料
2014/08/23 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
机修车间主任岗位职责
2015/04/08 职场文书