为什么在子查询中分组时分组不转到主查询

问题描述 投票:0回答:1
select sum(age),customer_id 
from (select age,customer_id from customers group by first_name)

在第一个客户表中,按first_name分组,然后选择age和customer_id。我的疑问是,为什么组不是从子查询到主查询,而是每个组的第一个元素。因此 sum(age) 折叠了整个数据从子查询到一个条目。它应该找到子查询中形成的每个组的年龄总和,并且应该输出多个条目数据集。

sql mysql group-by
1个回答
0
投票

子查询在主查询的其余部分之前执行。

SELECT age, customer_id
FROM customers
GROUP BY first_name

此子查询获取所有客户并按名字对他们进行分组。奇怪的是,MySQL 允许您选择

age
customer_id
,尽管它们在每个组中不一定是唯一的。它可能会在这里选择任何值,甚至可能是组中一位客户的年龄和另一位客户的 ID。

然后,这个子查询的结果(它是一个包含列

age
customer_id
的表,我们称这个表为
t
)被用作“外部”查询中的表,如下所示:

SELECT SUM(age), customer_id
FROM t

由于

SUM(age)
是聚合,因此
t
的所有行都聚合为一行作为最终输出。 MySQL 的
customer_id
再次发生了相当奇怪的行为:可以选择任何值。

您可能想做的事情:

SELECT first_name, SUM(age)
FROM customers
GROUP BY first_name

这似乎是您可能想要尝试的唯一有意义的查询...它将所有具有相同名字的客户放入一个组中并总结他们的年龄,返回共同的名字和总和。

© www.soinside.com 2019 - 2024. All rights reserved.