GROUP BY 之前過濾原始列,不可使用聚合函數(COUNT、SUM 等)。GROUP BY 之後過濾群組結果,專門用於聚合函數條件。user | num
-----|----
A | 5
A | 6
B | 3
B | 4
B | 5
C | 10
SELECT * FROM user_num WHERE COUNT(user) >= 2 GROUP BY user;
SELECT user, COUNT(*) AS cnt
FROM user_num
GROUP BY user
HAVING COUNT(*) >= 2;
結果:A (2)、B (3)
SELECT user, SUM(num) AS total
FROM user_num
GROUP BY user
HAVING SUM(num) > 10;
結果:A (11)、B (12)
SELECT user, COUNT(*) AS cnt, SUM(num) AS total
FROM user_num
GROUP BY user
HAVING COUNT(*) >= 2 AND SUM(num) > 10;
HAVING 子句最多 40 個運算式,可用 AND/OR 串接。HAVING 可搭配非聚合欄位,但該欄位必須出現在 GROUP BY 中。GROUP BY,整張表視為單一群組,HAVING 仍可使用(等同全表聚合條件)。WHERE 過濾掉不需要的列,減少進入分組的資料量。GROUP BY 排序/雜湊。HAVING 中使用複雜標量函數,必要時改用 CTE/子查詢預先計算。