聚合函數(SUM、COUNT、MAX、AVG)作用於多行記錄,返回單一值。GROUP BY 讓聚合函數按組計算,HAVING 在分組後篩選組,二者配合解決「統計後再篩選」的經典需求。
| 維度 | WHERE | HAVING |
|---|---|---|
| 執行順序 | 分組前篩選行 | 分組後篩選組 |
| 可用列 | 表中任意列 | 分組列 + 聚合表達式 |
| 典型場景 | 業務條件過濾 | 統計指標達標篩選 |
-- 1. 每個地區總人口、總面積
SELECT region, SUM(population), SUM(area)
FROM bbc GROUP BY region;
-- 2. 僅顯示面積超過 1,000,000 的地區
SELECT region, SUM(population), SUM(area)
FROM bbc GROUP BY region
HAVING SUM(area) > 1000000; -- 不能用 WHERE,因表中無單行面積超百萬的記錄
SELECT name, COUNT(*) FROM t GROUP BY id → name 未在 GROUP BY 中且非聚合(MySQL 嚴格模式報錯,PostgreSQL/Oracle 直接報錯)