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

SQL 進階必修課:GROUP BY 與 HAVING 深度解析

     編輯:關於SqlServer

聚合函數(SUM、COUNT、MAX、AVG)作用於多行記錄,返回單一值。GROUP BY 讓聚合函數按組計算,HAVING 在分組後篩選組,二者配合解決「統計後再篩選」的經典需求。

核心區別:WHERE vs HAVING

維度WHEREHAVING
執行順序分組前篩選行分組後篩選組
可用列表中任意列分組列 + 聚合表達式
典型場景業務條件過濾統計指標達標篩選

實戰案例:BBC 國家表

-- 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,因表中無單行面積超百萬的記錄

執行順序口訣

  1. FROM / JOIN
  2. WHERE
  3. GROUP BY
  4. 聚合函數計算
  5. HAVING
  6. SELECT
  7. ORDER BY

常見錯誤

  • SELECT name, COUNT(*) FROM t GROUP BY id → name 未在 GROUP BY 中且非聚合(MySQL 嚴格模式報錯,PostgreSQL/Oracle 直接報錯)
  • 在 HAVING 中引用別名 → 標準 SQL 不支持,需重寫聚合表達式

最佳實踐

  • 先寫 WHERE 減少參與分組的行數,提升性能
  • 複雜報表可用 CTE/子查詢分步:先聚合,外層再 HAVING
  • 大數據量考慮物化視圖或預聚合表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved