當添加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