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
和聚合函数,可以高效实现复杂的数据统计分析需求。
到此这篇关于mysql的group by函数怎么使用的文章就介绍到这了,更多相关mysql group by函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论