MySQL中UNION与ORDER BY同时使用的正确方法

周予安
周予安
发布时间:2026-10-13 | 5人浏览过
原创

在 MySQL 开发中,将 UNION 和 ORDER BY 配合使用时常因语法限制导致报错。本文将通过实际案例演示如何正确处理这一组合,解析三种可行的 SQL 写法及其背后的逻辑差异。

问题背景:直接混用会报错

假设表中存在数据,如下所示:

若尝试直接在两个独立的查询语句后分别添加 ORDER BY 并使用 UNION 合并,通常会遇到如下错误:

Incorrect usage of UNION and ORDER BY

原始报错 SQL 示例:

SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

解决方案:三种正确的写法

针对上述报错,可根据实际需求选择以下三种修改方式。

第1步:仅在外层保留 ORDER BY(适用于整体排序)

目的:忽略各分句内部的排序,最终对所有合并后的数据进行统一排序。

操作:移除第一个查询语句中的 ORDER BY,仅保留最后一个查询的排序条件。此时,ORDER BY 作用于整个 UNION 的结果集。

SELECT * FROM t1 WHERE username LIKE 'l%'
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

第2步:子查询包裹(适用于特定情况,但需注意无效性)

目的:试图让每个子查询先进行局部排序,再合并。

操作:给每个查询加上括号。

(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC)
UNION
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC)

注意:虽然此写法语法上不再报错,但在标准 SQL 及多数 MySQL 版本中,UNION 会丢弃子查询内的排序规则,因此这两个 ORDER BY 实际上并未生效,最终结果依然无序。

第3步:双层嵌套子查询(推荐:确保局部排序生效)

目的:强制让每个子查询完成独立排序后,再将有序结果集进行合并(UNION 或 UNION ALL)。

操作:在每个子查询外部再套一层查询,将带排序的子查询作为源表。

SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC) AS t3
UNION
SELECT * FROM
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC) AS t4

原理:ORDER BY 不能直接出现在 UNION 的子句中,但可以出现在“子句的子句”中(即内层子查询)。外层查询只是简单地将已排序的数据取出,从而保留了顺序。

补充知识:UNION 与 UNION ALL 的区别

在使用联合查询时,区分两者有助于性能优化:

  • UNION:会对结果集进行去重处理,过滤掉两个查询中完全相同的行。
  • UNION ALL:不会去重,直接保留所有记录,效率通常高于 UNION。

以上就是 MySQL 中 UNION 与 ORDER BY 同时使用的详细内容,更多关于 SQL 查询技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表