2013-02-26 41 views
7

我知道這個問題有很多討論,但是我的研究沒有一個可以讓我相信MySQL中的'where'和'having'子句之間的區別。根據我的理解,我們可以使用'having'來實現'where'子句可以完成的任何事情。例如。 select * from users having username='admin'。那麼爲什麼你需要'where'條款?在哪裏使用任何性能差異?爲什麼在'有'的時候有'where'

+1

還看到:SQL - 有VS哪裏(http://stackoverflow.com/questions/9253244 ); [WHERE VS HAVING](http://stackoverflow.com/questions/2905292) – mellamokb 2013-02-26 13:32:27

回答

6

WHERE子句過濾器數據聚集體之前,而已經施加GROUP BYHAVING子句過濾器的數據。通常這意味着任何非聚合過濾器都可以出現在任何地方,但是如果您的查詢中沒有引用該列,則只能在WHERE子句中對其進行過濾。

例如,如果你有如下表:

| ID | VALUE | 
-------------- 
| 1 | 15 | 
| 2 | 15 | 
| 3 | 20 | 
| 4 | 20 | 
| 5 | 25 | 
| 6 | 30 | 
| 7 | 40 | 

假設你想申請以下查詢:

select value, count(value) 
from Table1 
group by value 

但你只希望包括行,其中ID > 2。如果將它放在HAVING子句中,則會得到error,因爲ID列在聚合後不可用,因爲它不在SELECT子句中。在這種情況下,你將被要求使用WHERE條款改爲:

select value, count(value) 
from Table1 
where id > 2 
group by value 

演示:http://www.sqlfiddle.com/#!2/f6741/16

1

在單行級別評估,而用於按表達式分組。

3

WHERE條款HAVING之間的區別是,HAVING支持合計列,而WHERE不會因爲它僅適用於各行,EG

SELECT ID 
FROM tableName 
GROUP BY ID 
HAVING COUNT(ID) > 1 --- <<== HERE 

從MySQL的文檔,

「如果您使用HAVING而不是WHERE這是兩個子句之間定義的區別之一,您可以使用Alias。具有也較慢並且不會操作但是如果你將這樣的複雜功能放置在你顯然不期待速度的地方。「

+0

謝謝。但是我知道它們之間的區別。爲什麼你需要使用何時可以通過使用子句來實現一切? – Sethunath 2013-02-26 13:33:11

+0

在你的例子中他們做同樣的事情,但如果你是一個很好的SQL開發人員,你應該知道在哪裏使用這兩個關鍵字。 'WHERE'在HAVING'子句之前首先被評估。 – 2013-02-26 13:41:26

+1

從MySQL文檔中,*「如果您使用HAVING而不是WHERE這是兩個子句之間定義的區別之一,您可以使用Alias。速度慢也不會被優化,但如果您將複雜函數這在你明顯不期待速度很快的地方。「* – 2013-02-26 13:42:39

1

隨着HAVING子句,可以指定一個條件來過濾相對於過濾個別 行,這恰好在WHERE相。

HAVING階段僅返回HAVING 子句中的邏輯表達式爲TRUE的組。邏輯表達式求值爲FALSE or UNKNOWN的組被過濾掉。

當不使用GROUP BY時,HAVING表現爲WHERE子句。 關於性能比較請參閱從源此article

相關問題