HAVING語句用來篩選聚合函數執行後的結果

為什麼不使用WHERE篩選

使用HAVING而不使用WHERE來篩選聚合函數執行後的結果與SQL語句的執行順序有關,各個SQL語句的執行順序如下:

順序語句
1FROM
2WHERE
3GROUP BY
4HAVING
5SELECT
6ORDER BY
7LIMIT

要拿到聚合函數執行過後的結果,我們必須使用聚合函數進行運算,而要使用聚合函數又必須得使用GROUP BY語句來限定我們要用來分組的條件。

從執行順序表中我們可以看到WHERE會在GROUP BY之前執行,但是聚合函數執行過後的結果會在GROUP BY且執行完聚合函數計算之後才會拿到,在WHERE執行的時候還沒有執行GROUP BY,也還沒有執行聚合函數運算,更不可能拿得到聚合函數執行後的結果,這就是為甚麼我們無法在WHERE執行時就使用聚合函數的結果作為篩選條件的原因。

如何使用HAVING篩選

假設我們有一個員工資料表(Employee),包含編號、姓名及部門欄位,其中財務部有三個人,品管部有三個人,企劃部有四個人。

IndexNameDepartment
1林水珠財務部
2鄭法歡財務部
3葉佩芳財務部
4蔡佩舜品管部
5程桂卿品管部
6王雅筑品管部
7陳秋南企劃部
8趙志偉企劃部
9錢智傑企劃部
10謝敬達企劃部

如果我們想得到部門人數大於3人的部門,我們必須先使用GROUP BY將部門分組,再使用Count()這個聚合函數計算每個部門的人數,接著使用HAVING比較各部門人數是否大於3,挑出大於3人的部門,最後使用SELECT取出部門的名稱以及人數。

SELECT Department, COUNT(Department)
FROM Employee
GROUP BY Department
HAVING COUNT(Department) > 3;
參考資料