標籤: 暫無標籤

  使用 HAVING 子句選擇行

  HAVING 子句對 GROUP BY 子句設置條件的方式與 where 子句和 SELECT 語句交互的方式類似。WHERE 子句搜索條件在進行分組操作之前應用;而 HAVING 搜索條件在進行分組操作之後應用。HAVING 語法與 WHERE 語法類似,但 HAVING 可以包含聚合函數。HAVING 子句可以引用選擇列表中出現的任意項。

  下面的查詢得到本年度截止到目前的銷售額超過 $40,000 的出版商:

  USE pubs

  SELECT pub_id, total = SUM(ytd_sales)

  FROM titles

  GROUP BY pub_id

  HAVING SUM(ytd_sales) > 40000

  下面是結果集:

  pub_id total

  ------ -----------

  0877 44219

  (1 row(s) affected)

  為了確保對每個出版商的計算中至少包含六本書,下面示例使用 HAVING COUNT(*) > 5 消除返回的總數小於六本書的出版商:

  USE pubs

  SELECT pub_id, total = SUM(ytd_sales)

  FROM titles

  GROUP BY pub_id

  HAVING COUNT(pub_id) > 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 表中的行,並且消除只包含一本書的組:

  USE pubs

  SELECT type

  FROM titles

  GROUP BY type

  HAVING COUNT(type) > 1

  下面是結果集:

  type

  ------------------

  business

  mod_cook

  popular_comp

  psychology

  trad_cook

  (5 row(s) affected)

  以下是沒有聚合函數的 HAVING 子句的示例。該子句按類型分組 titles 表中的行,並且消除不是以字母 p 開頭的那些類型。

  USE pubs

  SELECT type

  FROM titles

  GROUP BY type

  HAVING type = 'p%'

  下面是結果集:

  type

  ------------------

  popular_comp

  psychology

  (2 row(s) affected)

  如果 HAVING 中包含多個條件,那麼這些條件將通過 AND、OR 或 NOT 組合在一起。以下示例顯示如何按出版商分組 titles,只包括那些標識號大於 0800、支付的總預付款已超過 $15,000 且銷售書籍的平均價格小於 $20 的出版商。

  SELECT pub_id, SUM(advance) AS AmountAdvanced,

  AVG(price) AS AveragePrice

  FROM pubs.dbo.titles

  WHERE pub_id > '0800'

  GROUP BY pub_id

  HAVING SUM(advance) > 15000

  AND AVG(price) < 20

  ORDER BY 可以用來為 GROUP BY 子句的輸出排序。下面的示例顯示使用 ORDER BY 子句以定義返回 GROUP BY 子句中的行為遞減順序:

  SELECT pub_id, SUM(advance) AS AmountAdvanced,

  AVG(price) AS AveragePrice

  FROM pubs.dbo.titles

  WHERE pub_id > '0800'

  AND price >= 5

  GROUP BY pub_id

  HAVING SUM(advance) > 15000

  AND AVG(price) < 20

  ORDER BY pub_id DESC

相關評論

同義詞:暫無同義詞