| 特性 | WHERE | HAVING |
|---|---|---|
| 執行階段 | 分組前,過濾輸入行 | 分組後,過濾分組結果 |
| 可用聚合函數 | 不可 | 可(如 SUM、COUNT) |
| 典型位置 | GROUP BY 之前 | GROUP BY 之後 |
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region;
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area) > 1000000;
此處無法用 WHERE,因表中無單行面積超百萬的記錄,需先分組聚合後再篩選。
SELECT uid, email, COUNT(*) AS ct
FROM edm_user081217
GROUP BY email
HAVING ct > 1;
先按 email 分組,再用 HAVING 過濾計數 > 1 的組,精準定位重複郵箱。
SELECT home_page FROM aaa
WHERE CHAR_LENGTH(TRIM(home_page)) > 1;
HAVING 是分組後的篩選器,配合聚合函數解決 WHERE 無法處理的「組級」過濾問題。記住:WHERE 過濾行,HAVING 過濾組。