在SQL語法中,我們可以使用WHERE給予條件,進行資料的過濾,例如有如下資料表:
我們使用 SELECT * FROM mymoney WHERE mamount>1000;
如下,資料只顯示出金額大於1000的資料列。
但是如果我們使用
SELECT * FROM mymoney HAVING mamount>1000; 雖然沒有錯誤,但是就不是好的語法了。
為何呢?
因為HAVING只能用在aggregate (合計) 情況下 ,也就是有GROUP BY的時候,並且HAVING要過濾的條件,要跟GROUP BY的合計函數有關。
例如我們來看以下範例:
SELECT SUM(mamount) FROM mymoney WHERE SUBSTR(mdate,1,6)='201401';
列出符合201401條件的金額加總,如上列出75500。
SELECT SUM(mamount) FROM mymoney WHERE SUBSTR(mdate,1,6)='201401' GROUP BY mperson;
以mperson為群組,列出符合201401條件的金額加總。
如上列出三筆,每筆為符合201401條件的每個人的金額加總。
SELECT SUM(mamount) as s FROM mymoney WHERE SUBSTR(mdate,1,6)='201401' GROUP BY mperson HAVING s>200;
以mperson為群組,列出符合201401條件的金額加總,並且只列出總金額大於200的資料。如上列出二筆,每筆為符合201401條件的每個人的金額加總。
所以如果你使用WHERE來進行總金額條件的過濾,或是使用HAVING在普通欄位的條件過濾,就不太適合,或是會出現語法錯誤。
因此WHERE與HAVING有何差異呢?
(1) 沒有GROUP BY的時候,只使用WHERE而不使用HAVING。
例如:
SELECT * FROM mymoney WHERE mperson='0'; (O 正確)
SELECT * FROM mymoney HAVING mperson='0'; (X 雖然也正確,但不建議使用)
(2) 有GROUP BY的時候,WHERE在GROUP BY前面,HAVING在GROUP BY後面。
也就是WHERE條件跟GROUP BY沒有關係,而HAVING是跟GROUP BY有關係的,例如:
SELECT SUM(mamount) as s FROM mymoney WHERE SUBSTR(mdate,1,6)='201401' GROUP BY mperson HAVING s>200;
(3) 使用HAVING的時候,只用在跟GROUP BY相關函數有關的條件上。
如上例,HAVING指定SUM(mamount) >200。
如果你使用WHERE SUM(mamount) >200就會出現錯誤啦。
0 留言