group by 是 mysql 中用于對數據進行分組統計的關鍵字,通常配合聚合函數使用。其核心作用是將相同字段值的多條記錄歸為一組并進行統計分析,基本用法包括按一個字段或多個字段分組,例如按部門或按部門和職位組合分組。注意事項包括:1. select 中的非聚合字段必須全部出現在 group by 中,否則會報錯;2. group by 字段順序影響結果展示但不影響性能;3. 使用 having 來過濾分組后的數據,而不能使用 where;實際應用中應合理選擇分組字段、注意 NULL 值處理,并結合索引提升查詢性能。掌握這些要點有助于寫出高效準確的 sql 查詢語句。
GROUP BY 是 mysql 中用于對數據進行分組統計的關鍵字,通常配合聚合函數(如 count()、SUM()、AVG() 等)一起使用。它的核心作用是將相同字段值的多條記錄歸為一組,然后對每組進行統計分析。
基本用法:按某一列或多個列分組
最簡單的用法是根據一個字段進行分組。例如:
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
這個語句的意思是:把 employees 表中的數據按照 department 字段分組,并統計每個部門的人數。
你也可以按多個字段分組,比如先按部門再按職位分組:
SELECT department, job_title, COUNT(*) AS count FROM employees GROUP BY department, job_title;
這樣可以更細粒度地統計不同職位在不同部門的數量。
注意事項:別踩這些坑
1. SELECT 后非聚合字段必須出現在 GROUP BY 中
這是最常見的錯誤之一。MySQL 要求,在 SELECT 中出現的非聚合字段,必須全部寫在 GROUP BY 子句中。
比如下面這個寫法會報錯:
SELECT department, name, COUNT(*) FROM employees GROUP BY department;
因為 name 沒有出現在 GROUP BY 中,而它也不是聚合函數的一部分。這時候數據庫不知道該顯示哪個 name,所以不允許這種寫法。
2. GROUP BY 的順序影響結果但不影響性能
雖然 GROUP BY a, b 和 GROUP BY b, a 分組結果一樣,但如果你后面加了排序或者做了一些依賴順序的操作,順序還是會影響最終展示效果。不過從執行效率上來說,差別不大。
3. 配合 HAVING 過濾分組后的數據
有時候我們想篩選出某些特定的分組,比如只看人數超過 5 的部門。這時候不能用 WHERE,要用 HAVING:
SELECT department, COUNT(*) AS count FROM employees GROUP BY department HAVING count > 5;
因為 WHERE 是在分組前過濾數據,而 HAVING 是在分組后才起作用。
實際應用建議
- 合理選擇分組字段:盡量避免使用唯一性強的字段(比如用戶 ID)作為分組依據,否則可能達不到“匯總”的目的。
- 注意 NULL 值處理:如果分組字段中有 NULL,它們會被視為同一組。這一點在實際分析時要特別注意。
- 結合索引提升性能:如果經常對某幾個字段做 GROUP BY,可以考慮給這些字段加聯合索引,能顯著加快查詢速度。
基本上就這些。GROUP BY 本身不復雜,但在實際使用中很容易因為理解不到位寫出有問題的 SQL,特別是初學者容易忽略字段和分組之間的對應關系。只要記住:所有出現在 SELECT 中的非聚合字段,都必須出現在 GROUP BY 中,就能避免大多數錯誤。