想象一下我的下表中已经插入了以下数据:
餐桌人物
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;
答案 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
),而最后要使用一个查询。