我知道這個問題有很多討論,但是我的研究沒有一個可以讓我相信MySQL中的'where
'和'having
'子句之間的區別。根據我的理解,我們可以使用'having
'來實現'where'子句可以完成的任何事情。例如。 select * from users having username='admin'
。那麼爲什麼你需要'where
'條款?在哪裏使用任何性能差異?爲什麼在'有'的時候有'where'
回答
的WHERE
子句過濾器數據聚集體之前,而已經施加GROUP BY
後HAVING
子句過濾器的數據。通常這意味着任何非聚合過濾器都可以出現在任何地方,但是如果您的查詢中沒有引用該列,則只能在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
在單行級別評估,而用於按表達式分組。
從WHERE
條款HAVING
之間的區別是,HAVING
支持合計列,而WHERE
不會因爲它僅適用於各行,EG
SELECT ID
FROM tableName
GROUP BY ID
HAVING COUNT(ID) > 1 --- <<== HERE
從MySQL的文檔,
「如果您使用HAVING而不是WHERE這是兩個子句之間定義的區別之一,您可以使用Alias。具有也較慢並且不會操作但是如果你將這樣的複雜功能放置在你顯然不期待速度的地方。「
謝謝。但是我知道它們之間的區別。爲什麼你需要使用何時可以通過使用子句來實現一切? – Sethunath 2013-02-26 13:33:11
在你的例子中他們做同樣的事情,但如果你是一個很好的SQL開發人員,你應該知道在哪裏使用這兩個關鍵字。 'WHERE'在HAVING'子句之前首先被評估。 – 2013-02-26 13:41:26
從MySQL文檔中,*「如果您使用HAVING而不是WHERE這是兩個子句之間定義的區別之一,您可以使用Alias。速度慢也不會被優化,但如果您將複雜函數這在你明顯不期待速度很快的地方。「* – 2013-02-26 13:42:39
隨着HAVING
子句,可以指定一個條件來過濾基相對於過濾個別 行,這恰好在WHERE
相。 HAVING
階段僅返回HAVING
子句中的邏輯表達式爲TRUE的組。邏輯表達式求值爲FALSE or UNKNOWN
的組被過濾掉。
當不使用GROUP BY
時,HAVING
表現爲WHERE
子句。 關於性能比較請參閱從源此article
- 1. 什麼時候File.join有用?
- 2. 什麼時候InputStream.available()有用?
- 3. 什麼時候__proto__有用?
- 4. 爲什麼有時候viewDidLoad首先被調用,有時候被稱爲後者?
- 5. phpunit:什麼時候有用預計任何()?,爲什麼存在?
- 6. QTreeWidget :: currentItem什麼時候沒有選擇什麼時候返回?
- 7. ThisTime&TotalTime有什麼區別?爲什麼有時候兩個值是相等的,有時候會不一樣?
- 8. 什麼時候在桌子上沒有索引是有意義的,爲什麼?
- 9. 什麼時候sys.stdin在Python中沒有?
- 10. 爲什麼UISearchDisplayController有時會工作,有時候不行?
- 11. 爲什麼有時候我的對象屬性沒有更新?
- 12. 什麼時候創建了app.config,什麼時候app.exe.config和有什麼區別
- 13. 什麼時候和爲什麼沒有實現(java.lang.reflect.InvocationTargetException)發生?
- 14. 塊變量使用__weak爲什麼有時候有值,有時爲零
- 15. 爲什麼在進行文件比較的時候有「ï¿¿」
- 16. 在序列化BST的時候爲什麼有序?
- 17. 爲什麼有時候SSL徽章上有名字?
- 18. 爲什麼`VECTOR`和`[...]`有時候行爲不同的Clojure?
- 19. LINQ語句沒有where子句時爲什麼沒有intellisense?
- 20. dynamic_cast <void*>什麼時候有用?
- 21. 什麼時候放棄MVVM有意義?
- 22. 變量變量:什麼時候有用?
- 23. 守護線程什麼時候有用?
- 24. 什麼時候ASP.NET Expression Builders最有用?
- 25. 測試什麼時候沒有屬性
- 26. 匿名類型,什麼時候有用?
- 27. 什麼時候是SqlConnection.RetrieveStatistics()有用?
- 28. 什麼時候循環有用?
- 29. DatePicker沒有什麼時候點擊
- 30. 什麼時候有人關注 - Twitter API
還看到:SQL - 有VS哪裏(http://stackoverflow.com/questions/9253244 ); [WHERE VS HAVING](http://stackoverflow.com/questions/2905292) – mellamokb 2013-02-26 13:32:27