首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 查詢中 WHERE 與 HAVING 的核心區別:執行順序與適用場景全解析

     編輯:關於SqlServer

WHERE 和 HAVING 都用於設定查詢條件,但它們的 執行時機 和 作用對象 有本質區別。掌握這一點,是編寫高效分組查詢的關鍵。

核心區別:執行優先級

  • WHERE:執行於 聚合函數(SUM, COUNT, AVG 等)之前。它在資料分組前,對原始記錄進行篩選。
  • HAVING:執行於 聚合函數之後。它對 GROUP BY 分組後的結果進行篩選。

經典範例對比

場景 1:WHERE 篩選原始記錄

SELECT SUM(num) AS rmb FROM `order` WHERE id > 10
-- 先找出 id>10 的記錄,再對這些記錄的 num 求和

場景 2:HAVING 篩選分組結果

SELECT reportsto AS manager, COUNT(*) AS reports
FROM employees
GROUP BY reportsto
HAVING COUNT(*) > 4
-- 先按 reportsto 分組,計算每組人數,再篩選人數>4 的組

若將上述 HAVING 改為 WHERE COUNT(*) > 4 會報錯,因為聚合尚未執行,無法在 WHERE 中使用聚合函數。

何時用哪個?決策指南

條件類型使用子句說明
對原始記錄欄位篩選(如 id>10、status='active')WHERE分組前過濾,減少參與聚合的資料量,效率高
對聚合結果篩選(如 COUNT(*)>4、SUM(amount)>10000)HAVING分組後過濾,只能用於聚合函數或 GROUP BY 欄位
無分組查詢WHERE無 GROUP BY 時,HAVING 與 WHERE 效果相同,但語意上首選 WHERE

進階理解:聚合函數與 GROUP BY 的運作機制

  • 聚合函數(SUM, COUNT, MAX, AVG)作用於 多條記錄,返回單一值。
  • GROUP BY region 將相同 region 的記錄分為一組,每組返回一行;非分組欄位必須通過聚合函數返回單一值。
  • HAVING 正是為了彌補 WHERE 無法在分組後篩選的缺口而存在。

實戰範例:地區人口統計

-- 1. 每個地區總人口、總面積
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region

-- 2. 僅顯示面積超過 1,000,000 的地區
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area) > 1000000
-- 此處不能用 WHERE,因表中無單條記錄面積超過 1000000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved