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

本文共 1792 字,大约阅读时间需要 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 emp
where deptno = '10'
group by deptno;

分组后筛选:

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

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

示例:

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

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

5. 按员工姓名长度分组

select length(ename) as len, count(*) as counts from emp
group by len
having counts > 3;

6. 按多个字段分组

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

7. group byorder by 的结合

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

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

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

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

8. 分组查询的总结

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

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

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

你可能感兴趣的文章
Oracle中序列的操作以及使用前对序列的初始化
查看>>
oracle中新建用户和赋予权限
查看>>
Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
查看>>
Oracle中的rownum 和rowid的用法和区别
查看>>
oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
查看>>
Oracle修改字段类型
查看>>
oracle典型安装失败,安装oracle 10失败
查看>>
Oracle分析函数之LEAD和LAG
查看>>
Oracle和SQL server的数据类型比较
查看>>
Oracle用游标删除重复数据
查看>>
Oracle监听配置、数据库实例配置等
查看>>
Oracle系列:安装Oracle RAC数据库(二)
查看>>
oracle系统 介绍,ORACLE数据库管理系统介绍
查看>>
oracle获取数据库表、字段、注释、约束等
查看>>
Oracle计划将ZGC项目提交给OpenJDK
查看>>
Oracle闪回技术(Flashback)
查看>>
oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
查看>>
oracle零碎要点---oracle em的web访问地址忘了
查看>>
Oracle零碎要点---多表联合查询,收集数据库基本资料
查看>>
Oracle静默安装
查看>>