当添加WHERE
子句,它过滤设定接下来将流传下来的GROUP BY
行,所以WHERE
施加之前基团。在GROUP BY
被应用之前,将被分组并且将在其上执行像SUM(),MAX(),MIN(),COUNT()
那样的聚合的行已经被限于那些匹配WHERE
条件的行。
至于为什么在将列添加到SELECT
和GROUP BY
时获得更多行 - 那么,GROUP BY
聚合就是如此工作的。如果您将其他列添加到SELECT
中,则还必须对它们进行分组(大多数RDBMS中),并且只要行之间的值不同,它们将导致更多的分组行。
考虑一下这个表:
Name Score
John 2
Bill 3
John 1
单GROUP BY
上Name
将John
行折叠成一个:
SELECT Name, SUM(Score) AS total
FROM scores
GROUP BY name
Name total
John 3
Bill 3
现在考虑这个表,这对于运动的另一列。在这里,John
有2个不同的运动代表,而比尔只有1个。要在SELECT
列表中包括Name, Sport
,他们必须都在GROUP BY
。跨行类似的值塌陷成团,但现在John
有套类似的价值观,以组:
Name Sport Score
John Baseball 3
John Bowling 9
Bill Baseball 10
Bill Baseball 6
John Bowling 12
SELECT Name, Sport, SUM(Score) AS total
FROM scores
GROUP BY Name, Sport
Name Sport total
John Baseball 3
John Bowling 21
Bill Baseball 16
因此增加额外的列到GROUP BY
将导致更多的输出行如果列跨越具有不同的价值观行。
应用一个WHERE
子句第二个表,寻找只John
行,将消除所有Bill
行前应用组。结果将是两行。
SELECT Name, Sport, SUM(Score) AS total
FROM scores
-- Filter with a WHERE clause this time
WHERE Name = 'John'
GROUP BY Name, Sport
-- Results in only John's rows
Name Sport Score
John Baseball 3
John Bowling 21
我现在明白了。优秀的解释,谢谢! – wallenpb