今天介紹 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 |