簡介
使用 HAVING 子句選擇行
HAVING 子句對 GROUP BY 子句設定條件的方式與 WHERE 子句和 SELECT 語句互動的方式類似。WHERE 子句搜尋條件在進行分組操作之前套用;而 HAVING 搜尋條件在進行分組操作之後套用。HAVING 語法與 WHERE 語法類似,但 HAVING 可以包含聚合函式。HAVING 子句可以引用選擇列表中出現的任意項。
下面的查詢得到本年度截止到目前的銷售額超過 $40,000 的出版商:
下面是結果集:
pub_id total
------ -----------
0877 44219
(1 row(s) affected)
為了確保對每個出版商的計算中至少包含六本書,下面示例使用 HAVING COUNT(*) > 5 消除返回的總數小於六本書的出版商:
下面是結果集:
pub_id total
------ -----------
0877 44219
1389 24941
(2 row(s) affected)
理解套用 WHERE、GROUP BY 和 HAVING 子句的正確序列對編寫高效的查詢代碼會有所幫助:
WHERE 子句用來篩選 FROM 子句中指定的操作所產生的行。
GROUP BY 子句用來分組 WHERE 子句的輸出。
HAVING 子句用來從分組的結果中篩選行。
對於可以在分組操作之前套用的搜尋條件,在 WHERE 子句中指定它們更有效。這樣可以減少必須分組的行數。應當在 HAVING 子句中指定的搜尋條件只是那些必須在執行分組操作之後套用的搜尋條件。因為HAVING是在查詢出的結果集中進行篩選,這個操作需要排序、總計等操作。如果先通過WHERE子句限制查詢的記錄數,可以減少這方面的開銷。
Microsoft® SQL Server™ 2000 查詢最佳化器可處理這些條件中的大多數。如果查詢最佳化器確定 HAVING 搜尋條件可以在分組操作之前套用,那么它就會在分組之前套用。查詢最佳化器可能無法識別所有可以在分組操作之前套用的 HAVING 搜尋條件。建議將所有這些搜尋條件放在 WHERE 子句中而不是 HAVING 子句中。
以下查詢顯示包含聚合函式的 HAVING 子句。該子句按類型分組 titles 表中的行,並且消除只包含一本書的組:
下面是結果集:
type
------------------
business
mod_cook
popular_comp
psychology
trad_cook
(5 row(s) affected)
以下是沒有聚合函式的 HAVING 子句的示例。該子句按類型分組 titles 表中的行,並且消除不是以字母 p 開頭的那些類型。
下面是結果集:
type
------------------
popular_comp
psychology
(2 row(s) affected)
如果 HAVING 中包含多個條件,那么這些條件將通過 AND、OR 或 NOT 組合在一起。以下示例顯示如何按出版商分組 titles,只包括那些標識號大於 0800、支付的總預付款已超過 $15,000 且銷售書籍的平均價格小於 $20 的出版商。
ORDER BY 可以用來為 GROUP BY 子句的輸出排序。下面的示例顯示使用 ORDER BY 子句以定義返回 GROUP BY 子句中的行為遞減順序:
雙語例句
1. He will now face a disciplinary hearing for having an affai.他因有外遇而要面臨紀律聽證會的裁決。來自柯林斯例句2. People are having to think hard about their holiday plans. 人們現在得仔細地琢磨自己的度假計畫。來自柯林斯例句3. They identified six plants as having potential for development into pharmaceutical drugs. 他們驗明6種植物有可能提煉出藥物麻醉劑。來自柯林斯例句4. People usually complain about having to deal with too much bureaucracy. 人們經常抱怨不得不應付太多的繁文縟節。來自柯林斯例句5. Having children was the quickest way to lose your street cred. 生孩子是使自己不再年輕時尚的最快方法