萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL GROUP BY 多欄位分組深度解析:組合分組邏輯與實戰

GROUP BY 單欄位分組直觀易懂,但多欄位分組時,其分組邏輯常被誤解。本文通過具體測試數據,深度解析多欄位分組的「組合分組」機制,並說明聚合函數在該場景下的行為。

核心概念:組合分組

GROUP BY col1, col2 的含義是:以每個欄位值的不同組合作為分組依據。即 (col1值, col2值) 元組唯一對應一個分組。

測試數據與結果分析

假設測試表 scores 數據如下(圖片來源保留):

測試數據

查詢語句:

SELECT item, sex, SUM(score) 
FROM scores 
GROUP BY item, sex;

查詢結果(圖片來源保留):

查詢結果

結果解讀

  • item=數學, sex=1 → 分組 A,求和
  • item=數學, sex=2 → 分組 B,求和(雖然 item 相同,但 sex 不同,屬不同組)
  • item=英文, sex=1 → 分組 C,求和
  • 以此類推...

結論:多欄位分組 = 對欄位值元組去重分組,而非先按第一欄分組再按第二欄細分。

常見誤區與正確理解

誤區正確理解
先按 item 分組,再在每組內按 sex 細分直接按 (item, sex) 組合值分組,順序不影響分組結果
SELECT 欄位可包含未分組且未聚合的欄位嚴格 SQL 模式下會報錯,需全部包含於 GROUP BY 或用聚合函數
分組順序影響聚合結果聚合函數(SUM/COUNT/AVG)對順序不敏感,結果一致

實戰應用場景

1. 多維度統計報表

-- 按部門、職級、性別統計薪資平均值
SELECT department, level, gender, AVG(salary) 
FROM employees 
GROUP BY department, level, gender;

2. 去重計數

-- 統計每用戶每天的訪問頁面數(去重)
SELECT user_id, visit_date, COUNT(DISTINCT page_url) 
FROM page_views 
GROUP BY user_id, visit_date;

3. 複合唯一性檢查

-- 找出重複的 (訂單號, 商品ID) 組合
SELECT order_id, product_id, COUNT(*) 
FROM order_items 
GROUP BY order_id, product_id 
HAVING COUNT(*) > 1;

效能優化建議

  • 索引支援:建立複合索引 INDEX (col1, col2) 符合分組順序,可避免臨時表與檔案排序
  • 減少選列:僅選擇分組欄位與聚合欄位,避免 SELECT *
  • 預聚合:超大表考慮物化視圖或定時預計數表
  • 分區表:按時間分區配合分組查詢可大幅減少掃描範圍

MySQL 8.0+ 新特性

支援 GROUPING SETS、ROLLUP、CUBE 進階分組聚合,可單次查詢獲得多層級匯總:

SELECT department, gender, SUM(salary)
FROM employees
GROUP BY ROLLUP (department, gender);

將同時返回:各部門各性別小計、各部門總計、全公司總計。

理解多欄位分組的組合本質,能讓你編寫更精準的統計查詢,避免邏輯錯誤導致的業務數據偏差。

copyright © 萬盛學電腦網 all rights reserved