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

SQL 聚合函數作為篩選條件:HAVING 子句正確用法與常見錯誤

     編輯:關於SqlServer

核心觀念:WHERE vs HAVING

  • WHERE:在 GROUP BY 之前過濾原始列,不可使用聚合函數(COUNT、SUM 等)。
  • HAVING:在 GROUP BY 之後過濾群組結果,專門用於聚合函數條件。

範例資料:user_num 表

user | num
-----|----
A    | 5
A    | 6
B    | 3
B    | 4
B    | 5
C    | 10

例 1:查詢出現 2 次以上的 user


SELECT * FROM user_num WHERE COUNT(user) >= 2 GROUP BY user;


SELECT user, COUNT(*) AS cnt
FROM user_num
GROUP BY user
HAVING COUNT(*) >= 2;

結果:A (2)、B (3)

例 2:查詢 num 總和大於 10 的 user

SELECT user, SUM(num) AS total
FROM user_num
GROUP BY user
HAVING SUM(num) > 10;

結果:A (11)、B (12)

進階:多條件組合

SELECT user, COUNT(*) AS cnt, SUM(num) AS total
FROM user_num
GROUP BY user
HAVING COUNT(*) >= 2 AND SUM(num) > 10;

注意事項

  • 單一 HAVING 子句最多 40 個運算式,可用 AND/OR 串接。
  • HAVING 可搭配非聚合欄位,但該欄位必須出現在 GROUP BY 中。
  • 若無 GROUP BY,整張表視為單一群組,HAVING 仍可使用(等同全表聚合條件)。

效能提示

  1. 先用 WHERE 過濾掉不需要的列,減少進入分組的資料量。
  2. 分組欄位建立索引可加速 GROUP BY 排序/雜湊。
  3. 避免在 HAVING 中使用複雜標量函數,必要時改用 CTE/子查詢預先計算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved