2013-03-12 53 views
4

我想了解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

+0

要麼是有效的,但WHERE子句對我實際上更標準的用法。 – 2013-03-12 20:34:41

+0

@JasonWhisman - 所以你說我甚至不需要使用HAVING子句,並且可以用WHERE完成所有語句? – 2013-03-12 20:35:22

+0

對,除了聚合子句之外的所有東西。所以你仍然必須做'HAVING SUM(child_id)> 0',否則你很好。 – 2013-03-12 20:37:33

回答

6

WHERE子句在分組過程發生之前執行,只能訪問輸入表中的字段。 HAVING是在分組過程發生後執行的,並且可以根據分組過程中計算的聚合值的值過濾結果。

+0

因此,要看看我是否理解,WHERE條件基本上適用於過濾普通字段,而如果要過濾所選的聚合,則應用HAVING子句? – 2013-03-12 20:49:50

+1

@DNET:確實如此。 – 2013-03-12 20:50:26

+0

感謝您的幫助,+1 :) – 2013-03-12 20:51:41

2

即使正在使用HAVING,也可以使用WHERE子句。他們的意思非常不同。想想它的方式如下:

  • WHERE子句作爲過濾器,在創紀錄的水平
  • 凡是通過再裝入你GROUP組指定BY
  • 得到之後, HAVING子句過濾掉組的基礎上,彙總(SUM,COUNT,MIN 等)條件

所以,如果我有一個表(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或以下的商店。]

+0

@DotNET:的確如此。還有一種情況是,您可以在不使用GROUP BY的情況下使用HAVING。如果您將所有內容聚合到一個輸出行中,您仍然可以過濾到獲取該行或不獲取任何內容,從而:從MyTable中選擇Sum(銷售)> 50000 – 2013-03-12 20:57:25

+0

感謝您的幫助! +1 :) – 2013-03-12 21:04:57