SQL語法中WHERE與HAVING有何差異?

SQL語法中WHERE與HAVING有何差異? 這兩個都是在進行資料的過濾,但是在使用上是有差別的。

在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就會出現錯誤啦。

留言

這個網誌中的熱門文章

如何使用EXCEL連接MYSQL

關聯模式的五大鍵 Super key、Candidate Key、Primary Key、Alternate Key、Foreign Key

SELECT SQL語法總整理