在學習 GROUP BY 和 HAVING 子句之前,必須先了解 SQL 中一類特殊的函數——聚合函數,例如 SUM、COUNT、MAX、AVG 等。這些函數與一般函數的根本差別在於:它們作用於多筆記錄,而非單一數值。
以 SELECT SUM(population) FROM bbc 為例,SUM 作用於所有回傳記錄的 population 欄位,查詢結果僅會回傳一個值——所有國家的總人口數。
透過 GROUP BY 子句,我們可以讓聚合函數針對「同一組」的資料運作。當指定 GROUP BY region 時,屬於同一個 region(地區)的資料會被分成一組,每組僅回傳一行結果。換句話說,除 region 之外的欄位,只能透過 SUM、COUNT 等聚合函數運算後,才能回傳單一值。
HAVING 子句則用於篩選分組後的群組資料。它與 WHERE 子句的關鍵差別在於執行時機:
WHERE:在聚合之前先篩選記錄,作用於 GROUP BY 和 HAVING 之前。HAVING:在聚合之後對群組記錄進行篩選。SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
查詢會先依 region 將回傳記錄分成多組,再對每組的不同欄位套用聚合函數運算。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area) > 1000000
此處無法使用 WHERE 篩選,因為資料表中不存在「面積超過 1,000,000」這樣的單筆記錄;HAVING 則能直接針對分組後的聚合結果進行過濾。
掌握 GROUP BY 與 HAVING 的運作時機與差異,是撰寫高效彙總查詢的關鍵。