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

SQL Server 2008 聚合查詢與分組分析完全指南

     編輯:MySQL 綜合教學

SQL Server 2008 聚合查詢與分組分析完全指南

在資料庫操作中,聚合查詢是統計分析的核心工具。本文以 SQL Server 2008 為例,詳細解說聚合函數、GROUP BY 分組、HAVING 條件篩選以及 ORDER BY 排序的實戰應用,並附上完整範例資料與執行結果。

範例資料:商品資訊表

以下為示範用的 Shohin(商品)資料表,包含 8 筆記錄:

+-----------+------------+---------------+--------------+--------------+------------+
| shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka | torokubi   |
+-----------+------------+---------------+--------------+--------------+------------+
| 0001      | T恤        | 衣服          | 1000         | 500          | 2009-09-20 |
| 0002      | 打孔器     | 辦公用品      | 500          | 320          | 2009-09-11 |
| 0003      | 運動T恤    | 衣服          | 4000         | 2800         | NULL       |
| 0004      | 菜刀       | 廚房用具      | 3000         | 2800         | 2009-09-20 |
| 0005      | 高壓鍋     | 廚房用具      | 6800         | 5000         | 2009-01-15 |
| 0006      | 叉子       | 廚房用具      | 500          | NULL         | 2009-09-20 |
| 0007      | 擦菜板     | 廚房用具      | 880          | 790          | 2008-04-28 |
| 0008      | 圓珠筆     | 辦公用品      | 100          | NULL         | 2009-11-11 |
+-----------+------------+---------------+--------------+--------------+------------+

一、聚合函數總覽

聚合函數可對資料行進行統計運算,常用函數如下:

  • COUNT:計算記錄筆數。COUNT(*) 包含 NULL 值;COUNT(欄位名) 排除 NULL。
  • SUM:數值欄位總和。
  • AVG:數值欄位平均值(自動排除 NULL)。
  • MAX / MIN:求最大/最小值,適用於數字、字串、日期等多種型別。

進階用法:在聚合函數中使用 DISTINCT 可去除重複值,例如 COUNT(DISTINCT shohin_bunrui) 計算商品分類種類數。

二、GROUP BY 分組查詢

GROUP BY 子句如同「切割資料表的刀」,依指定欄位將資料分組,再配合聚合函數產生摘要資訊。

基本語法與執行順序

SELECT shohin_bunrui, COUNT(*) 
FROM Shohin 
GROUP BY shohin_bunrui;

結果:

+---------------+----------+
| shohin_bunrui | COUNT(*) |
+---------------+----------+
| 辦公用品      | 2        |
| 廚房用具      | 4        |
| 衣服          | 2        |
+---------------+----------+

子句撰寫順序(不可更動):

SELECT → FROM → WHERE → GROUP BY

DBMS 內部執行順序:

FROM → WHERE → GROUP BY → SELECT

重要限制規則

  • SELECT 清單限制:使用聚合函數時,SELECT 只能包含「常數」、「聚合函數」、「GROUP BY 指定的欄位(分組鍵)」。
  • 別名不可用於 GROUP BY:因 SELECT 執行在 GROUP BY 之後,故 GROUP BY 無法引用 SELECT 定義的別名。
  • NULL 值分組:分組鍵含 NULL 時,會形成一個「不確定」群組(空值群組)。
  • 結果無序:GROUP BY 輸出順序不保證,需搭配 ORDER BY 排序。

三、HAVING 子句:對分組結果篩選

WHERE 篩選「列」,HAVING 篩選「組」。

語法結構

SELECT shohin_bunrui, COUNT(*) 
FROM Shohin 
GROUP BY shohin_bunrui 
HAVING COUNT(*) = 2;

結果: 僅保留筆數等於 2 的分類(辦公用品、衣服)。

進階範例:平均售價 ≥ 2500 的分類

SELECT shohin_bunrui, AVG(hanbai_tanka) 
FROM Shohin 
GROUP BY shohin_bunrui 
HAVING AVG(hanbai_tanka) >= 2500;

結果: 廚房用具 (2795)、衣服 (2500)。

HAVING 可用元素: 常數、聚合函數、GROUP BY 分組鍵。

執行順序: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

四、ORDER BY 排序輸出

ORDER BY 必須寫在 SELECT 陳述式最末端,因排序動作在結果返回前執行。

排序規則

  • 預設 ASC 遞增;DESC 遞減。
  • NULL 值排序位置視 DBMS 而定(MySQL:ASC 置頂,DESC 置底)。
  • 可使用 SELECT 清單未出現的欄位或聚合函數排序。

範例:依商品分類筆數遞增排序

SELECT shohin_bunrui, COUNT(*) 
FROM Shohin 
GROUP BY shohin_bunrui 
ORDER BY COUNT(*);

結果: 辦公用品(2)、衣服(2)、廚房用具(4)。

五、完整子句執行順序總表

撰寫順序實際執行順序
SELECT第 5 項
FROM第 1 項
WHERE第 2 項
GROUP BY第 3 項
HAVING第 4 項
ORDER BY第 6 項

六、實務建議

  1. 先用 WHERE 過濾列,再用 GROUP BY 分組,最後用 HAVING 篩選組,效能最佳。
  2. 避免在 GROUP BY 中使用運算式或函數,影響索引使用。
  3. 大量資料分組時,確保分組鍵上有索引。
  4. SELECT 清單欄位必須符合「單值原則」:每群組僅回傳一值。

掌握聚合查詢與分組邏輯,是撰寫高效率統計報表 SQL 的關鍵基礎。

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