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

SQL HAVING 子句完整指南:分組後篩選與 WHERE 差異詳解

     編輯:關於SqlServer

HAVING 專門用於分組後對彙總結果進行篩選,是 GROUP BY 的必要伴侶,與行級篩選的 WHERE 本質不同。

語法結構

SELECT 欄位1, 聚合函數(欄位2)
FROM 資料表
[WHERE 行級條件]
GROUP BY 欄位1
HAVING 聚合條件
[ORDER BY ...];

核心差異:WHERE vs HAVING

維度WHEREHAVING
作用階段分組前(行級)分組後(組級)
可用運算元資料欄位、常數、函數聚合函數(SUM, COUNT, AVG...)+ 分組欄位
執行順序FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
典型用途過濾來源資料過濾彙總結果

實戰範例

情境:Store_Information 表含 store_name, sales,查詢總銷售額超過 1500 的店舖。

SELECT store_name, SUM(sales) AS TotalSales
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500;

結果:

store_nameTotalSales
Los Angeles$1800

進階用法

  • 多重彙總條件:HAVING SUM(sales) > 1000 AND COUNT(*) > 5
  • 搭配 WHERE 預過濾:WHERE sales_date > '2023-01-01' GROUP BY store_name HAVING SUM(sales) > 5000(先縮小資料集再分組,效能更好)。
  • 無 GROUP BY 時:整張表視為單一群組,HAVING COUNT(*) > 100 等同檢查總列數。

常見錯誤

-- 錯誤:WHERE 不能用聚合函數
SELECT store_name, SUM(sales)
FROM Store_Information
WHERE SUM(sales) > 1500  -- Msg 147, Level 15
GROUP BY store_name;

-- 正確:移至 HAVING
SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500;

記憶口訣

WHERE 過濾列,HAVING 過濾組;聚合函數找 HAVING,行級條件用 WHERE。

掌握 HAVING,輕鬆實現「各類別前 N 名」、「異常群組偵測」、「KPI 達標統計」等進階分析需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved