MySQL利用UNION连接2个查询排序失效详解

 更新时间:2019年12月15日 16:21:33   作者:试着奔跑的菜鸟  
这篇文章主要给大家介绍了关于MySQL利用UNION连接2个查询排序失效的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

概述

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', '今天很严肃');

默认表数据显示如下


运行结果分析

-- 查询1
SELECT
 *
FROM
 test_user u
ORDER BY AGE

结果集1


-- 查询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条记录

结果集3:使用UNION ALL

如果需要使用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

 改进

在经过一番搜索相关的经验后发现,是我之前有些画蛇添足了,原来可以在不使用子查询即可完成排序的方法:

-- 查询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唯一索引的注意事项及说明

    这篇文章主要介绍了使用MySQL唯一索引的注意事项及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL使用binlog日志恢复数据的方法步骤

    MySQL使用binlog日志恢复数据的方法步骤

    binlog日志是用于记录所有修改数据库内容的操作,本文主要介绍了MySQL使用binlog日志恢复数据的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • MySQL触发器Trigger加载及目前局限性

    MySQL触发器Trigger加载及目前局限性

    这篇文章主要为大家介绍了MySQL触发器Trigger加载以及目前局限性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Redis什么是热Key问题以及如何解决热Key问题

    Redis什么是热Key问题以及如何解决热Key问题

    这篇文章主要介绍了Redis什么是热Key问题以及如何解决热Key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 通过mysql-proxy完成mysql读写分离

    通过mysql-proxy完成mysql读写分离

    前不久做了下mysql读写分离的实验,也参考了很多的资料,谢谢哪些提供资料的兄弟
    2014-05-05
  • 详解MySQL中UNION的用法

    详解MySQL中UNION的用法

    这篇文章主要介绍了详解MySQL中UNION的用法,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • 浅谈为什么MySQL不建议delete删除数据

    浅谈为什么MySQL不建议delete删除数据

    这篇文章主要介绍了浅谈为什么MySQL不建议delete删除数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • mysql5.7.17安装配置图文教程

    mysql5.7.17安装配置图文教程

    这篇文章主要为大家详细介绍了mysql5.7.17安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SQLyog错误号码2058最新解决办法

    SQLyog错误号码2058最新解决办法

    这篇文章主要给大家介绍了关于SQLyog错误号码2058的最新解决办法,使用sqlyog连接数据库过程中可能会出现2058错误,出现的原因是因为MYSQL8.0对密码的加密方式进行了改变,需要的朋友可以参考下
    2023-08-08
  • Mysql 8.0.18 hash join测试(推荐)

    Mysql 8.0.18 hash join测试(推荐)

    这篇文章给大家介绍Mysql 8.0.18 hash join测试的相关知识,本文通过实例代码讲解,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-10-10

最新评论