我可以在 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 ALL 查询在 FROM 子句中出现语法错误