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

时间:2020-02-23 16:03:00

标签: mysql sql sql-order-by

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

餐桌人物

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;

2 个答案:

答案 0 :(得分:1)

您的查询格式不正确-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;

答案 1 :(得分: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),而最后要使用一个查询。