MySQL中的GROUP BY
子句用于将查询结果按一个或多个列进行分组,通常与聚合函数(如COUNT
, SUM
, AVG
, MAX
, MIN
等)配合使用,实现数据的分组统计。以下是详细使用方法:
1. 基础语法
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1
ORDER BY column1;
2. 核心功能
(1) 单列分组
统计每个部门的员工数量:
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
(2) 多列分组
统计每个部门+职位的平均工资:
SELECT department, job_title, AVG(salary) AS avg_salary
FROM employees
GROUP BY department, job_title;
(3) 结合聚合函数
COUNT()
:计数SUM()
:求和AVG()
:平均值MAX()/MIN()
:极值GROUP_CONCAT()
:合并分组内的字符串
3. 过滤分组:HAVING
WHERE
过滤行,HAVING
过滤分组:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING avg_salary > 5000; -- 筛选平均工资>5000的部门
4. 常见错误
(1) SELECT非聚合列未分组
❌ 错误写法:
SELECT department, employee_name, COUNT(*)
FROM employees
GROUP BY department;
✅ 正确写法:
SELECT department, GROUP_CONCAT(employee_name), COUNT(*)
FROM employees
GROUP BY department;
(2) HAVING与WHERE混淆
WHERE
在分组前过滤(如过滤原始数据)HAVING
在分组后过滤(如过滤统计结果)
5. 高级用法
(1) WITH ROLLUP(生成小计/总计)
SELECT department, SUM(salary)
FROM employees
GROUP BY department WITH ROLLUP;
结果会多出一行NULL
,表示所有部门的总计。
(2) 分组后排序
SELECT department, COUNT(*)
FROM employees
GROUP BY department
ORDER BY COUNT(*) DESC; -- 按员工数量降序排列
6. 注意事项
- MySQL 5.7+默认启用
ONLY_FULL_GROUP_BY
模式,要求SELECT
中的非聚合列必须出现在GROUP BY
中。 - 可通过
ANY_VALUE()
函数绕过严格模式:SELECT ANY_VALUE(employee_name), department, COUNT(*) FROM employees GROUP BY department;
示例场景
统计2023年每月销售额及订单数:
SELECT
MONTH(order_date) AS month,
SUM(amount) AS total_sales,
COUNT(order_id) AS order_count
FROM orders
WHERE YEAR(order_date) = 2023
GROUP BY MONTH(order_date)
ORDER BY month;
通过灵活组合GROUP BY
和聚合函数,可以高效实现复杂的数据统计分析需求。