範例資料
ID NAME SHU
1 a 3
2 a 4
3 b 5
4 b 7
5 a (NULL)
6 a 20
常見錯誤:WHERE 中直接使用彙總函數
-- 錯誤
SELECT * FROM aaa WHERE COUNT(name) >= 2 GROUP BY name;
-- ORA-00934: group function is not allowed here
正確寫法:HAVING 子句
-- 查詢出現 2 次以上的 name
SELECT * FROM aaa GROUP BY name HAVING COUNT(name) >= 2;
-- 查詢 SHU 總和大於 10 的使用者
SELECT * FROM aaa GROUP BY name HAVING SUM(SHU) > 10;
HAVING vs WHERE
| 特性 | WHERE | HAVING |
| 過濾時機 | 分組前(列級) | 分組後(群組級) |
| 可用彙總函數 | 否 | 是 |
| 可用欄位別名 | 視資料庫而定 | 可 |
| 最大運算式數 | 無限制 | 40 個(Oracle 限制) |
SUM vs COUNT 差異示範
SELECT name, COUNT(shu), SUM(shu)
FROM aaa
GROUP BY name;
結果
NAME COUNT(SHU) SUM(SHU)
a 3 27
b 2 12
解析
COUNT(shu):僅計算 shu IS NOT NULL 的列數(ID=5 為 NULL 不計入)。
SUM(shu):忽略 NULL 值直接相加(3+4+20=27;5+7=12)。
COUNT(*):計算所有列數(含 NULL),a 為 4、b 為 2。
結論
- 求和用 SUM,自動忽略 NULL。
- 求筆數用 COUNT:
COUNT(col) 不計 NULL,COUNT(*) 計總列數。
- 彙總條件必須寫在
HAVING,不可寫在 WHERE。