我想了解HAVING和WHERE之間的區別。我知道HAVING
與GROUP BY語句一起使用。然而,我不明白爲什麼接受以下聲明:無法理解爲什麼WHERE子句被接受
select SUM(child_id) from children WHERE child_ID = 5 GROUP BY Child_ID
不應該正確的語句是select SUM(child_id) from children GROUP BY Child_ID HAVING child_ID = 5
?
我想了解HAVING和WHERE之間的區別。我知道HAVING
與GROUP BY語句一起使用。然而,我不明白爲什麼接受以下聲明:無法理解爲什麼WHERE子句被接受
select SUM(child_id) from children WHERE child_ID = 5 GROUP BY Child_ID
不應該正確的語句是select SUM(child_id) from children GROUP BY Child_ID HAVING child_ID = 5
?
WHERE子句在分組過程發生之前執行,只能訪問輸入表中的字段。 HAVING是在分組過程發生後執行的,並且可以根據分組過程中計算的聚合值的值過濾結果。
因此,要看看我是否理解,WHERE條件基本上適用於過濾普通字段,而如果要過濾所選的聚合,則應用HAVING子句? – 2013-03-12 20:49:50
@DNET:確實如此。 – 2013-03-12 20:50:26
感謝您的幫助,+1 :) – 2013-03-12 20:51:41
即使正在使用HAVING,也可以使用WHERE子句。他們的意思非常不同。想想它的方式如下:
所以,如果我有一個表(STORE_ID,STATE_CODE,SALES)
Select STATE, SUM(SALES)
from MyTable
Where SALES > 100
Group By STATE
Having Sum(Sales) > 1000
這將首先篩選爲只讀取銷售額超過100的商店記錄。對於每個組(按州),它將僅銷售銷售額爲100或更多的商店的銷售額。然後,除非國家級別的總和超過1000,否則它將放棄任何州。[注意:州總和不包括任何銷售額在100或以下的商店。]
@DotNET:的確如此。還有一種情況是,您可以在不使用GROUP BY的情況下使用HAVING。如果您將所有內容聚合到一個輸出行中,您仍然可以過濾到獲取該行或不獲取任何內容,從而:從MyTable中選擇Sum(銷售)> 50000 – 2013-03-12 20:57:25
感謝您的幫助! +1 :) – 2013-03-12 21:04:57
要麼是有效的,但WHERE子句對我實際上更標準的用法。 – 2013-03-12 20:34:41
@JasonWhisman - 所以你說我甚至不需要使用HAVING子句,並且可以用WHERE完成所有語句? – 2013-03-12 20:35:22
對,除了聚合子句之外的所有東西。所以你仍然必須做'HAVING SUM(child_id)> 0',否則你很好。 – 2013-03-12 20:37:33