单行函数主要是对数据表中某一具体字段对应操作,而分组函数往往用于实现将一组数据进行统计计算,最终得到一个值,又称为聚合函数或统计函数,其简介及具体用法如下:
一、分组函数
分组函数清单:
案例1:
count的补充介绍
1.count(*) 统计结果集的行数
count(*) 在统计结果集的时候,只要这行有数据,即使个别字段为空也会被统计到;count(1)和count(*)等同,count(1)相当于在表中加了一个常量列,该列的所有字段都是1,最后统计有多少个1。
推荐使用count(*)。
区分:count(具体字段名)的使用场景是要统计指定字段不为空的行数,count(*)只要有一个字段不为空,都会统计。
、
2.搭配distinct实现去重的统计
查询所有员工及其对应的部门id
员工表里涉及到了这个部门,就说明这个部门有员工
因为有一个员工是最高领导人,没有部门,所以是106
加入了 distinct就可以看有多少个部门
二、分组查询
分组查询的逻辑是先分组,再统计,其逻辑图如下:
分组查询的语法如下:
1.分组查询的查询列表往往是分组函数和被分组的字段
案例1:求每个部门的总工资
案例2:查询每个工种员工平均工资
案例3: 查询每个领导的手下人数
案例4:查询邮箱中包含a字符的 每个部门的最高工资
案例5:查询每个领导下有奖金的员工的平均工资
2.分组后的筛选:
在group by前面添加where count(*) > 5 限定员工人数大于五,由于此时还没有分组完成,系统不知道count(*)的具体指代对象,所以我们要在GROUP BY后,使用HAVING来对分组函数值进行限定;分组函数(比如COUNT(*))做条件,只可能放在having后面。
分组前使用where来限定,分组后用having来限定。
案例1:查询哪个部门的员工人数>5
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
分析需求:
需要:job_id和MAX(salary)
限定:奖金不为空(判断奖金不为空,不是分组函数,所以放在WHERE后,GROUP BY之前)和最高工资大于12000(MAX为分组函数,所以在HAVING后)
所以我们的SQL语句如下:
案例3:领导编号>102的,每个领导手下的最低工资大于5000的最低工资
案例4:查询有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
案例5: 查询每个工种每个部门的最低工资,并按最低工资降序
工种和部门都一样,才是一组