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)對順序不敏感,結果一致 |
-- 按部門、職級、性別統計薪資平均值
SELECT department, level, gender, AVG(salary)
FROM employees
GROUP BY department, level, gender;
-- 統計每用戶每天的訪問頁面數(去重)
SELECT user_id, visit_date, COUNT(DISTINCT page_url)
FROM page_views
GROUP BY user_id, visit_date;
-- 找出重複的 (訂單號, 商品ID) 組合
SELECT order_id, product_id, COUNT(*)
FROM order_items
GROUP BY order_id, product_id
HAVING COUNT(*) > 1;
INDEX (col1, col2) 符合分組順序,可避免臨時表與檔案排序SELECT *支援 GROUPING SETS、ROLLUP、CUBE 進階分組聚合,可單次查詢獲得多層級匯總:
SELECT department, gender, SUM(salary)
FROM employees
GROUP BY ROLLUP (department, gender);
將同時返回:各部門各性別小計、各部門總計、全公司總計。
理解多欄位分組的組合本質,能讓你編寫更精準的統計查詢,避免邏輯錯誤導致的業務數據偏差。