2011-09-16 39 views
5

我基礎上有一個觀點(viewX)連接的某些表:MySQL查詢中的HAVING和WHERE有什麼區別?

當我使用WHERE,查詢被延遲,處理器使用去50%,最後我需要關閉mysqld.exe服務並重新啓動,以嘗試解決問題再次出現。

當我使用HAVING時,查詢執行得非常快速,我得到結果並且一切就緒。

查詢與此類似:

SELECT * FROM viewX WHERE column_of_view = 'foo' 

SELECT * FROM viewX HAVING column_of_view = 'foo' 

這是怎麼回事?

我找到解決的辦法是做這樣的事情:

SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo' 

SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo' 

兩個查詢工作正常,但我覺得這是不好的! (SELECT * FROM(... viewX)????)

+0

你可以發佈一些執行計劃嗎? – Thilo

+0

我最好的猜測是,通過使用HAVING,您就像混淆了我一樣混淆了查詢優化器,並且這種混淆導致了不同的執行計劃(不同的連接順序和方法),在這種情況下可能實際上是有益的許多聯接,潛在的次優連接順序是巨大的)。它是否只是更快地返回前幾行,還是所有行的整個選擇也更快? – Thilo

+0

如果指定兩者,會發生什麼情況? – Thilo

回答

0

這取決於視圖的定義 - having子句應只適用於彙總查詢和應用的分組之後。你看了兩個查詢計劃(解釋)嗎?

0

同時上市,沒有別名是產品尚未

所以別名產生

應該有一個問題,同時在線過濾行列出所有可能的行後HAVING過濾器行,其中使用。

1

已用於聚合函數,如sum,avg等等,它只能用在select語句中.where子句不會在聚合條件下工作 例如:其中sum(mark)> 300 //它不是true