HAVING
語句用來篩選聚合函數執行後的結果
為什麼不使用WHERE篩選
使用HAVING
而不使用WHERE
來篩選聚合函數執行後的結果與SQL語句的執行順序有關,各個SQL語句的執行順序如下:
順序 | 語句 |
---|---|
1 | FROM |
2 | WHERE |
3 | GROUP BY |
4 | HAVING |
5 | SELECT |
6 | ORDER BY |
7 | LIMIT |
要拿到聚合函數執行過後的結果,我們必須使用聚合函數進行運算,而要使用聚合函數又必須得使用GROUP BY
語句來限定我們要用來分組的條件。
從執行順序表中我們可以看到WHERE
會在GROUP BY
之前執行,但是聚合函數執行過後的結果會在GROUP BY
且執行完聚合函數計算之後才會拿到,在WHERE
執行的時候還沒有執行GROUP BY
,也還沒有執行聚合函數運算,更不可能拿得到聚合函數執行後的結果,這就是為甚麼我們無法在WHERE
執行時就使用聚合函數的結果作為篩選條件的原因。
如何使用HAVING篩選
假設我們有一個員工資料表(Employee),包含編號、姓名及部門欄位,其中財務部有三個人,品管部有三個人,企劃部有四個人。
Index | Name | Department |
---|---|---|
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;