2010-03-10 64 views
2

可能重複的區別:
SQL: What’s the difference between HAVING and WHERE?是什麼WHERE和HAVING

我正在學習SQL語法,我無法理解這一點。

問題的後半部分更具技術性。 WHERE和HAVING之間的數據庫幕後究竟發生了什麼?哪一個使用更多資源?它們只是適用於不同的數據集的算法是相同的嗎?

謝謝!

+0

重複的問題。我想了很多遍。例如:http://stackoverflow.com/questions/287474/sql-whats-the-difference-between-having-and-where – mjv 2010-03-10 00:30:10

+3

我們不是'擁有'更多!這是'WHERE'你需要看看:http://stackoverflow.com/questions/287474/sql-whats-the-difference-between-having-and-where ;-) – mjv 2010-03-10 00:33:25

回答

2

其中在大多數查詢中,並限制了查詢關心的記錄。

中使用「集團通過」查詢,並呼籲分組結果的行爲。

認爲Where條款首先發生。如果數據庫中有1000條記錄,那麼where子句可能使它只有80個問題。假設Group By子句將這80個數據庫記錄分組到(例如)15個聚合記錄集行中。如果沒有Having子句,則會返回所有這15個聚合行。 Having子句if用於過濾這15個聚合行。

假設你想要一個來自德克薩斯州去年超過5份訂單的客戶名單。

  • Where子句從得克薩斯州獲得所有從去年的訂單被人們
  • Group By子句組中的所有訂單由客戶(在你的SELECT子句一個Count(OrderID) As OrderCount
  • 那份Having條款將列出的客戶限制爲擁有5個或更多訂單的客戶。
1

其中用於直接在表格中過濾行。 用於在聚合行被分組之後對其進行過濾。

1

它們都是條件運算符,但HAVING只涉及GROUP BY語句上的聚合函數。

例如,

SELECT * 
FROM users 
WHERE username = 'bob' 

將返回使用用戶名'bob'的所有用戶。

SELECT username, COUNT(*) 
FROM users 
GROUP BY username 
HAVING COUNT(*) > 1 

將返回哪些用戶名已被多次使用。

1

WHERE用於過濾和ANSI-89語法 - 連接表。您可以而不是WHERE子句中使用集合函數(MIN,MAX,COUNT等)。 IE:

WHERE x.col = 1 -- valid 
WHERE COUNT(*) > 1 -- invalid 

HAVING子句也用於過濾,但您只能使用聚合函數進行過濾。 IE:

HAVING COUNT(*) > 1 -- valid 
HAVING x.col = 1 -- invalid 

HAVING子句只能定義如果GROUP BY條款已被定義 - 您可以使用,如果既DISTINCTOVER(解析函數)不使用HAVING條款。 HAVING子句總是在GROUP BY之後定義。

1

我一直認爲它是:HAVING是將哪些行分組到哪裏。