MySQL GROUP BY 语句详细说明
目录
MySQL GROUP BY 语句详细说明
1. 基本语法
2. 核心功能
(1) 单列分组
(2) 多列分组
3. 与聚合函数结合
4. HAVING 子句
5. 特殊用法
(1) 按表达式分组
(2) 与 WITH ROLLUP 结合
6. 注意事项
7. 典型应用场景
MySQL GROUP BY
语句详细说明
GROUP BY
是 SQL 中用于对查询结果进行分组的核心语句,通常与聚合函数配合使用,实现数据的分组统计和分析。
1. 基本语法
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;
GROUP BY
:指定分组的列- 聚合函数:如
COUNT()
,SUM()
,AVG()
,MAX()
,MIN()
等 - 执行顺序:
WHERE
→GROUP BY
→SELECT
2. 核心功能
(1) 单列分组
统计每个部门的员工数量:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
结果示例:
department | employee_count |
---|---|
HR | 5 |
IT | 8 |
Finance | 6 |
(2) 多列分组
统计每个部门+职级的平均工资:
SELECT department, job_level, AVG(salary) AS avg_salary
FROM employees
GROUP BY department, job_level;
3. 与聚合函数结合
函数 | 作用 | 示例 |
---|---|---|
COUNT() | 统计行数 | COUNT(employee_id) |
SUM() | 求和 | SUM(sales_amount) |
AVG() | 求平均值 | AVG(age) |
MAX() /MIN | 最大/最小值 | MAX(salary) |
4. HAVING
子句
用于过滤分组后的结果(注意与WHERE
区别):
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000; -- 筛选平均工资>1万的部门
WHERE
:在分组前过滤行HAVING
:在分组后过滤组
5. 特殊用法
(1) 按表达式分组
按年份统计订单量:
SELECT YEAR(order_date), COUNT(*)
FROM orders
GROUP BY YEAR(order_date);
(2) 与 WITH ROLLUP
结合
生成分组小计(需 MySQL 8.0+):
SELECT department, job_level, SUM(salary)
FROM employees
GROUP BY department, job_level WITH ROLLUP;
结果包含:
- 每个
(department, job_level)
的薪资和 - 每个
department
的小计 - 最终总计
6. 注意事项
-
SELECT 列限制:
GROUP BY
后的列必须出现在 SELECT 中- 非聚合列必须包含在
GROUP BY
中
-- 错误示例(name 未参与分组) SELECT name, department, AVG(salary) FROM employees GROUP BY department;
-
索引优化:
- 对
GROUP BY
列建立索引可加速分组 - 避免对大文本列分组
- 对
-
NULL 值处理:
- 所有
NULL
值会被分到同一组
- 所有
7. 典型应用场景
- 统计报表(如月度销售总额)
- 数据去重统计
- 多维度数据分析(部门+职级+年龄段的薪资分布)
- 漏斗分析(用户行为步骤转化率)
通过合理使用
GROUP BY
,可显著提升复杂数据统计的效率和准确性。实际应用中建议结合EXPLAIN
分析查询性能。