带你学MySQL系列 | 困扰MySQL初学者的分组聚合查询,我终于讲明白了!
1.分组查询的原理图
对上述原始数据,按照DEPARTMENT_ID(员工id)
分组统计SALARY(薪水)
的平均值
。
上述原理写成代码,应该怎么写呢?
select
department_id,avg(salary)
from
test
group by
department_id;
可以清楚地看到,使用department_id
进行分组后,系统默认将department_id
相同的号所在的行,分配在一起,你有几个不同的department_id
,就会分为几组,每个组中的数据行数,不一定都要相同。
当自动分配完成后,会根据你所写的分组函数,进行组内运算
。
也就是说,你使用的是sum()
函数,就会组内求和;当你使用的是avg()
函数,就会组内求平均值;当你使用的是count()
函数,就会进行组内计数;当你使用的是max()
函数,就会进行组内求最大值;你使用的是min()
函数,就会进行组内求最小值。
2.group by关键字语法详解
有些小白在学习MySQL的过程中,很多都是在group by
关键字这个地方卡壳。于是我希望自己能够用白话图文
的方式,让你真正搞明白这个关键字的含义。
group by
是用于分组查询
的关键字,一般是配合sum(),avg(),count(),max(),min()
聚合函数使用的。也就是说SQL语句中只要有group by
,那么在select后面的展示字段中一般会有聚合函数(5个聚合函数
)中的一个或多个函数出现。观察上图,有一点你需要记住,你用表中的字段A进行分组后,一般就需要对表中的其它字段,使用聚合函数,这样意义更大,而不是还对字段A使用聚合函数,没啥太大意义。
我们再思考下面这个问题!
当SQL语句中使用了group by
后,在select后面一定有一个字段使用了聚合函数(5个聚合函数
)。但是除了这个聚合函数,select后面还可以添加其他什么字段吗?
答案肯定是可以的!但是该字段有一定的限制,并不是什么字段都可以。也就是说,当SQL语句中使用了group by
关键字后,select后面除了聚合函数,就只能是group by
后面出现的字段。也就是图中的字段A
,select后面只能存在group by
后面的字段。
3.一个简单的分组查询的案例
案例 :
按照部门编号deptno分组,统计每个部门的平均工资。
select
deptno,avg(sal) avgs
from
emp
group by
deptno
结果如下:
4.分组前筛选和分组后筛选
这个知识点就是要带着大家理解一下,什么使用该用where筛选?什么时候该用having筛选?这个知识点对于学习MySQL的小白来说,也是一个棘手的事儿。不用担心,跟着黄同学学MySQL,没有学不会的。
1)原始表和结果集的概念
原始表
指的是数据库中真正存在
的那个表,使用【select * from 表名】查询出来的就是原始表信息。结果集
指的是在SQL语句中,添加其它任何一个限制条件,最终展示给我们表,都是结果集。添加不同的限制条件,查询出来的结果集也是不同的。原始表
只有一个,结果集
却是各种各样的。
2)黄同学支大招
- 只要是需求中,涉及到聚合函数做条件的情况,一定是分组后的筛选。
- 能用分组前筛选的,就优先考虑分组前的筛选。(考虑到性能问题)
3)案例讲解
原始数据集如下:
① 分组前筛选
习题一:查询姓名中包含S字符的,每个部门的工资之和。
习题二:查询工资大于2000的,不同部门的平均工资。
② 分组后筛选
习题一:查询部门员工个数大于3的部门编号和员工个数。
习题二:查询每个部门最高工资大于3000的部门编号和最高工资。
③ 分组前筛选和分组后筛选合用
习题:查询1981年入职的,不同部门间工资的平均值大于2000的部门编号和平均值。
5.分组查询(按函数分组)
习题:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>3的有哪些?
select length(ename) len,count(*) counts
from emp
group by len
having counts > 3;
结果如下:
6.分组查询(按多个字段分组)
习题:查询每个部门每个工种的员工的平均工资。
7.group by和order by,一对老搭档
习题一:查询每个部门的员工的平均工资,按照平均工资降序。
习题二:查询每个部门的员工的平均工资,按照平均工资升序。
8.分组查询的总结
- 1)分组函数做条件,肯定是放在
having
子句中。 - 2)能用分组前筛选的,就优先考虑使用分组前筛选。(
where
筛选) - 3)
group by
子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),还支持函数分组(用的较少)。
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假