如何从集合的角度考虑聚合函数

时间:2009-09-08 01:51:55

标签: sql mysql

我试图用集合来思考数据但是对集合函数有一些疑问。

这是wiki的定义

  

聚合函数是一个函数   从a返回单个值   输入值的集合,例如a   设置

所以,例如,

select c.id, c.user_id, c.name, c.created_at, count(c.id) from collections c;

可以想到“count从collection c set返回单个值”

select c.id, c.user_id, c.name, c.created_at, count(c.id) 
from collections c group by c.user_id

可以想到“count从集合(c)集中的每个子集(从分组中设置)返回单个值”

我的问题是,我如何知道计数返回的“单个值”,在这种情况下,集合(c)集合或每个“分组依据”子集。

考虑一个更复杂的查询(TOP N PER GROUP)

select c.id, c.user_id, c.name, c.created_at 
from collections c 
left join collections co on c.user_id = co.user_id and c.name <=co.name 
group by c.user_id, c.name 
having count(*)<=2;

这里设置group by(c.user_id)有自己的子集(c.name),我怎么知道count(*)将返回什么(整个集合的单个值(只有一个) rol)?或每个子集的单个值(c.user_id)或每个子集的单个值(c.name)?)

3 个答案:

答案 0 :(得分:1)

对于执行聚合工作的任何查询,您需要按正确的字段进行分组。

第一个查询应该失败,因为c.id,c.user_id,c.name和c.created_at字段未使用GROUP BY分组。

同样,第二个查询也会失败,因为只有第一个字段被分组。

要使最后一个查询起作用,您可能还需要在GROUP BY中包含该ID。

聚合函数仅在SELECT子句的所有非聚合元素(例如,c.id,c.user_id等)表示正在聚合的组(即包含在GROUP BY子句中)时有效。 / p>

答案 1 :(得分:1)

GROUP BY不会生成多个集合。它成为一个;在你的情况下,它由对(c.user_id,c.name)分组。任何具有相同行(c.user_id,c.name)的行都放在一个组中,这些是count count(*)将要处理的组。

答案 2 :(得分:0)

聚合函数在计算之后计算 a)加入 b)根据where子句过滤行。

一旦完成连接并根据查询中的where子句过滤了行,就会对您的数据集进行Picturize。 group by子句现在将根据where子句中指定的列将数据集细分为不同的组。给定组中的所有行对于where子句中指定的所有列都具有相同的值。

将原始数据集中的行分类为组后,您只能查询(即选择列)组中常见的行。在您按c.user_id分组的第二个示例中,集合表中的每个不同user_id将有一个组。如果查询中没有“HAVING”子句,则查询将为每个组返回一行。您可以将每个组视为(仅认为)包含列的行。这些列将表示整个组共有的内容,如count(*),SUM,MAX,MIN等。组形成的列名对于每个组也是相同的!

having子句类似于group的where子句。它过滤掉了不满足having子句中谓词的整个组。