今天介紹 SQL 的 HAVING 函數和 WHERE 的差異,還有用 HAVING 搭配 COUNT 找出重複的資料。
有使用聚合函數 (例如 SUM) 計算時,假如想要對計算結果做進一步的篩選,這時不能夠使用 WHERE 查詢,而要使用 HAVING。
以計算員工所持有物品的價格為例:
INSERT INTO ItemValue (EmployeeID, ItemName, ItemMoney)
VALUES ('A001', '文具組', 500), ('A001', '白板', 1100), ('B001', '掃地用具', 500), ('B002', '印表機', 2000), ('B003', '資料夾', 100)
SELECT EmployeeID, SUM(ItemMoney)
FROM ItemValue
GROUP BY EmployeeID
WHERE SUM(ItemMoney) > 1500
SELECT EmployeeID, SUM(ItemMoney)
FROM ItemValue
GROUP BY EmployeeID
HAVING SUM(ItemMoney) > 1500
查詢結果為
| EmployeeID | TotalMoney |
|---|---|
| A001 | 1600 |
| B002 | 2000 |
HAVING 通常放在查詢語法的最後方。
WHERE 可用在一般非聚合函數的條件查詢,例如:
SELECT EmployeeID, ItemMoney
FROM ItemValue
WHERE EmployeeID = 'A001'
假如今天在插入資料時,意外地插入重複資料,需要找出哪些重複時,該怎麼辦呢?
INSERT INTO EmployeeTable (EmployeeID, Department)
VALUES ('A001', 'HR'), ('A002', 'HR'), ('B001', 'IT'), ('B002', 'IT'), ('A001', 'HR')
可以用以下語法,以 COUNT 找出人員 ID、部門的重複次數,再透過 HAVING 列出重複次數大於 1 的資料。
SELECT EmployeeID, Department
FROM EmployeeTable
GROUP BY EmployeeID, Department
HAVING COUNT(*) > 1
結果會列出:
| EmployeeID | Department |
|---|---|
| A001 | HR |