【MySQL基础】聚合函数从基础使用到高级分组过滤

作为运维工程师,熟练掌握聚合函数是进行数据分析和报表生成的基础技能。本文将系统讲解MySQL聚合函数的使用方法,包含大量实用示例和运维场景中的应用技巧。

1 常用聚合函数详解

1.1 基础聚合函数

1.1.1 SUM():求和计算

复制代码
# 计算所有员工的工资总和 
select sum(salary) from emp; 
# 计算销售部门的加班费总额 
select sum(overtime_pay) from test where department = 'sales';

1.1.2 AVG():平均值

复制代码
# 计算公司平均薪资 
select avg(salary) from epm; 
# 计算技术部平均工龄(保留2位小数) 
select round(avg(years_of_service), 2) from epm where department = 'technology';

1.1.3 MAX()/MIN():极值查询

复制代码
# 查询最高和最低工资 
select max(salary), min(salary) from epm; 
# 找出最近和最早上架的商品 
select max(create_time), min(create_time) from products;

1.1.4 COUNT():计数统计

复制代码
# 统计员工总数 
select count(*) from epm; 
# 统计有邮箱的员工数量(不统计NULL) 
select count(email) from epm; 
# 统计不同部门的数量 
select count(distinct department) from epm;

1.2 运维场景应用案例

示例:监控表空间使用

复制代码
# 统计各数据库占用空间(MB)
select table_schema, 
       round(sum(data_length)/1024/1024, 2) as size_mb
from information_schema.tables 
group by table_schema;

2 聚合函数与GROUP BY分组

2.1 基础分组统计

复制代码
# 按部门统计员工
select department, 
       count(*) as employee_count,
       avg(salary) as avg_salary
from epm
group by department;

# 商品分类统计
select category,
       count(*) as product_count,
       min(price) as min_price,
       max(price) as max_price,
       avg(price) as avg_price
from products
group by category;

2.2 多列分组

复制代码
# 按部门和职位统计
select department, 
       job_title,
       count(*) as headcount,
       sum(salary) as total_salary
from epm
group by department, job_title;

2.3. 运维实战案例

复制代码
# 分析慢查询日志,按查询类型统计平均执行时间
select query_type,
       count(*) as query_count,
       avg(execution_time) as avg_time_ms
from slow_query_log
where log_date = curdate()
group by query_type;

3 HAVING子句过滤聚合结果

3.1 基础用法

复制代码
# 筛选销售额大于1000的部门
select department, 
       sum(sales) as total_sales
from sales_records
group by department
having sum(sales) > 1000;

3.2 复杂过滤条件

复制代码
# 筛选平均工资高于公司平均的部门
select department,
       avg(salary) as dept_avg_salary
from epm
group by department
having avg(salary) > (select avg(salary) from epm);

3.3 运维监控应用

复制代码
# 找出表空间超过1GB的数据库
select table_schema,
       round(sum(data_length)/1024/1024, 2) as size_mb
from information_schema.tables
group by table_schema
having size_mb > 1024
order by size_mb desc;

4 高级技巧与性能优化

4.1 WITH ROLLUP小计功能

复制代码
select department,
       job_title,
       count(*) as headcount
from epm
group by department, job_title with rollup;

4.2 聚合函数性能优化

  • 为GROUP BY列添加索引

    alter table epm add index idx_department (department);

  • 避免在WHERE中使用聚合函数

    错误写法

    select department, avg(salary)
    from epm
    where avg(salary) > 5000 # 这里会报错
    group by department;

    正确写法

    select department, avg(salary)
    from epm
    group by department
    having avg(salary) > 5000;

4.3 聚合函数执行计划分析

复制代码
explain 
select department, count(*) 
from epm 
group by department;

5 常见问题解决方案

5.1 问题1:GROUP BY与SELECT列不一致

复制代码
# 错误示例
select employee_name, department, count(*)
from epm
group by department;

# 正确写法
select department, count(*)
from epm
group by department;

# 或者包含所有非聚合列
select employee_name, department, count(*) over (partition by department)
from epm;

5.2 问题2:NULL值处理

复制代码
# COUNT(列名)会忽略NULL,COUNT(*)不会
select count(commission), count(*) 
from epm 
where department = 'sales';

# 使用IFNULL处理
select department, avg(ifnull(commission, 0)) 
from epm
group by department;

6 总结

希望这篇指南能帮助您更好了解聚合函数以及更好地在MySQL运维工作中运用聚合函数!

相关推荐
SelectDB2 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶3 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶5 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风5 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio5 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲9 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋10 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子10 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T11 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡12 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql