我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?

Posted

技术标签:

【中文标题】我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?【英文标题】:Can I add an ORDER BY clause on a query with an UNION clause in SQL? 【发布时间】:2020-02-23 16:03:00 【问题描述】:

想象一下,我有下表,其中已经插入了以下数据:

桌人

id_person          name         age
------------------------------------------
    1              name1        18
    2              name2        37
    3              name3        23

现在假设我想执行一个显示 30 岁以上和 20 岁以下的人的查询,并且我想使用 UNION 子句,如下所示:

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20;

此查询将给出的输出是:

   name      age
-------------------
   name2      37
   name1      18

但是如果我想使用order by 子句对输出进行排序怎么办? 我应该在哪里写子句?

以下任何查询都有效吗?

select name, age from person
where age >= 30
group by name
order by age asc
UNION
select name, age from person
where age <= 20;

...

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20
group by name
order by age asc;

【问题讨论】:

为什么不安装mysql,看看? 您的查询格式错误。您有一个 group by 但在 select 中有未聚合的列。 【参考方案1】:

您的最后一个查询(尽管age 在选择列表中不明确,因为它不包含在 group by 子句中):

select name, age from person
where age >= 30
UNION
select name, age from person
where age <= 20
group by name
order by age asc;

等同于:

(select name, age from person
where age >= 30)
UNION
(select name, age from person
where age <= 20
group by name)
order by age asc;

正如documentation中解释的那样:

不带括号的语句等价于带括号的...

所以order by 子句会影响UNION 的结果。 另外重要的是要知道:

对单个 SELECT 语句使用 ORDER BY 并不意味着 行在最终结果中出现的顺序,因为 UNION 默认情况下会产生一组无序的行

所以不要在两个查询中都使用ORDER BY(如果您也不想设置LIMIT),但在最后使用一个作为最终结果。

【讨论】:

【参考方案2】:

您的查询格式不正确 - group by 查询中的列既不是键也不是聚合的。但是,MySQL 中的一般思想是使用括号:

(<query 1>)
union all
(<query 2>)
order by <whatever>

您的特定查询可以写成:

select name, age
from person
where age >= 30 or age <= 20
order by age asc;

【讨论】:

以上是关于我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?的主要内容,如果未能解决你的问题,请参考以下文章

.如何使用UNION子句,它必须符合哪两条基本准则?

使用 UNION ALL 查询在 FROM 子句中出现语法错误

SQL Server:如何将 UNION 与两个都有 WHERE 子句的查询一起使用?

SQL-子查询;union;limit

联合查询sql注入

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?