首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 排序、分組與統計查詢核心語法全解析

     編輯:MySQL 資料庫相關知識

掌握 ORDER BY、GROUP BY、聚合函數與進階分組統計(ROLLUP、CUBE、GROUPING)是 SQL 資料分析的基石。本文系統整理十大核心場景,附帶標準語法與實務範例,助您撰寫高效、精確的分析查詢。

1. 排序:ORDER BY 讓資料有序呈現

SELECT col1, col2 FROM table_name ORDER BY col1 ASC, col2 DESC;
  • 預設 ASC 遞增,DESC 遞減
  • 可排序多欄位,依序應用
  • 不改變資料分組,僅改變輸出順序

2. 分組去重:GROUP BY 回傳唯一值組合

SELECT ZIP FROM Customers GROUP BY ZIP;
  • 相同分組鍵值只回傳一列
  • SELECT 清單需包含分組欄位或聚合函數
  • 不保證輸出順序,需搭配 ORDER BY
  • 不可在 GROUP BY 中使用別名

3. 分組前篩選:WHERE 先過濾再分組

SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ZIP;
  • WHERE 在 GROUP BY 前執行
  • 不可使用聚合函數
  • 僅保留符合條件的原始列參與分組

4. 保留所有分組:GROUP BY ALL(SQL Server/Access 支援)

SELECT ZIP, COUNT(ZIP) AS KYCustomersByZIP
FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP;
  • 結果包含所有 ZIP 分組,不符合 WHERE 的分組聚合值為 0
  • 遠端查詢不支援
  • 現代標準建議改用 LEFT JOIN 子查詢達成同樣效果

5. 分組後篩選:HAVING 針對聚合結果條件

SELECT ZIP, COUNT(ZIP) AS CustomersByZIP
FROM Customers GROUP BY ZIP HAVING COUNT(ZIP) = 1;
  • HAVING 在 GROUP BY 後執行,可使用聚合函數
  • 核心差異:WHERE 過濾列,HAVING 過濾組
  • 可同時使用 WHERE(列級)與 HAVING(組級)

6. WHERE vs HAVING 執行順序口訣

  1. FROM / JOIN
  2. WHERE(列過濾)
  3. GROUP BY(分組)
  4. 聚合函數(計算)
  5. HAVING(組過濾)
  6. SELECT(投影)
  7. ORDER BY(排序)

7. 聚合函數統計分組資料

SELECT OrderID, SUM(Cost * Quantity) AS OrderTotal
FROM Orders GROUP BY OrderID;

常用聚合:COUNT、SUM、AVG、MIN、MAX、STDDEV。

8. 階層小計:WITH ROLLUP 產生超級彙總列

SELECT Customer, OrderNumber, SUM(Cost * Quantity) AS OrderTotal
FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP;
  • 結果最後一列為全域總計(所有分組加總)
  • 中間插入各層級小計列
  • 不支援 DISTINCT 聚合與 GROUP BY ALL

9. 多維交叉統計:WITH CUBE 產生所有維度組合

SELECT Customer, OrderNumber, SUM(Cost * Quantity) AS OrderTotal
FROM Orders GROUP BY Customer, OrderNumber WITH CUBE;
  • 包含 ROLLUP 所有列,另加每維度獨立小計
  • 結果列數 = (n+1) × (m+1) ... 維度組合爆炸,慎用於高基數欄位
  • 不支援 GROUP BY ALL

10. 識別統計列來源:GROUPING() 函數

SELECT GROUPING(Customer) AS IsCustTotal, OrderNumber,
       SUM(Cost * Quantity) AS OrderTotal
FROM Orders GROUP BY Customer, OrderNumber WITH CUBE;
  • 回傳 1 表示該列為 ROLLUP/CUBE 產生的統計列
  • 回傳 0 表示為原始明細列
  • 便於前端格式化區分「明細」與「小計/總計」

實務效能提示

  • 分組欄位建立索引可大幅加速 GROUP BY
  • 大資料量優先用 WHERE 縮減輸入列再分組
  • CUBE 易產生龐大結果集,考慮物化視圖或 OLAP 引擎
  • MySQL 8.0+ 完整支援 ROLLUP,CUBE 需 8.0.1+;PostgreSQL、SQL Server、Oracle 早已支援

熟練運用這十大模式,即能應對從簡單報表到複雜多維分析的大多數 SQL 統計需求,奠定資料分析師與後端工程師的核心查詢能力。

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