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;