博客
关于我
带你学MySQL系列 | 困扰MySQL初学者的分组聚合查询,我终于讲明白了!
阅读量:80 次
发布时间:2019-02-26

本文共 1779 字,大约阅读时间需要 5 分钟。

分组查询的原理与实践

1. 分组查询的原理图

在进行分组查询时,通常会使用 group by 关键字。例如,按照 DEPARTMENT_ID 分组统计 SALARY 的平均值时,SQL 语句可以写成:

select department_id, avg(salary) from test group by department_id;

这意味着 group by 关键字会将 DEPARTMENT_ID 相同的记录分组在一起,然后对每个组内的 SALARY 进行平均值计算。如果没有指定具体的聚合函数,默认会对所有列进行聚合(通常是 SUM)。

2. group by 关键字的语法详解

group by 是用于分组查询的关键字,常用于与聚合函数(如 SUMAVGCOUNT 等)配合使用。它的作用是将数据按指定字段进行分组。

注意事项:

  • select 列表中,只能出现 group by 关键字后面的字段。
  • 如果需要对多个字段进行分组,可以在 group by 后面用逗号分隔多个字段。
  • group by 后面的字段可以是数字段,也可以是字符串字段,具体取决于数据库类型。

示例:

select deptno, avg(sal) as avgs from emp group by deptno;

3. 分组查询案例

案例1:按部门编号分组,统计每个部门的平均工资

select deptno, avg(sal) as avgs from emp group by deptno;

案例2:按部门编号和职位分组,统计每个部门每个职位的平均工资

select deptno, job_title, avg(sal) as avgs from emp group by deptno, job_title;

4. 分组前和分组后的筛选

在实际应用中,通常需要结合 WHEREHAVING 两种筛选方式。

分组前筛选:

使用 WHERE 子句对原始数据进行筛选,然后再进行分组查询。

select deptno, avg(sal) as avgs from empwhere deptno = '10' group by deptno;

分组后筛选:

如果需要在分组后再对结果集进行筛选,可以使用 HAVING 子句。

select deptno, avg(sal) as avgs from empgroup by deptnohaving avg(sal) > 2000;

示例:

如果需要同时使用分组前和分组后的筛选,可以结合使用。

select deptno, count(*) as emp_count from empwhere year(hire_date) = '1981'group by deptnohaving count(*) > 3;

5. 按员工姓名长度分组

select length(ename) as len, count(*) as counts from empgroup by lenhaving counts > 3;

6. 按多个字段分组

select deptno, job_title, avg(sal) as avgs from empgroup by deptno, job_title;

7. group byorder by 的结合

示例1:按平均工资降序排序

select deptno, avg(sal) as avgs from empgroup by deptnoorder by avgs desc;

示例2:按平均工资升序排序

select deptno, avg(sal) as avgs from empgroup by deptnoorder by avgs asc;

8. 分组查询的总结

  • 分组函数作为条件时,必须放在 HAVING 子句中。
  • 在需要的时候,可以使用 WHERE 子句进行分组前的筛选,这对于性能优化很重要。
  • GROUP BY 支持单个字段分组、多个字段分组以及基于函数的分组。

通过以上方法,可以灵活地进行分组查询,满足不同场景下的需求。如果需要更深入的学习,可以关注数据分析与统计学的相关内容,或者加入相关的微信公众号,获取更多实用的学习资源。

转载地址:http://ntzz.baihongyu.com/

你可能感兴趣的文章
Python 最强 IDE 详细使用指南!
查看>>
Python 有一个不可变的列表吗?
查看>>
Python 机器学习入门之 pandas 的使用
查看>>
Python 机器学习实战
查看>>
python 杀死子进程_subprocess.popen.kill杀死所有子进程
查看>>
Python 条件语句与循环结构详解
查看>>
Python 条件运算符解决方法如何工作?
查看>>
python 枚举类型
查看>>
Python 查询 Mongodb数据库
查看>>
python 查询Neo4j多节点的多层关系
查看>>
Python多处理导致许多僵尸进程
查看>>
Python多处理对象引用
查看>>
Python多处理安全地写入文件
查看>>
python多处理参数:深拷贝?
查看>>
Python多处理使用队列写入同一个文件
查看>>
Python多处理.Process:从局部变量开始
查看>>
Python多处理-进程数
查看>>
python多个定时器_python单线程实现多个定时器示例
查看>>
python处理文本_Python - Tokenization
查看>>
Python处理数据方向之OpenCV
查看>>