(1)分组函数:用作统计使用,又称为聚合函数或者统计函数或者组函数
分类:sum 求和,avg 求平均值,max 最大值,count 计算个数
1,简单的使用:select sum(salary) from emp;
2,参数支持哪些类型:
sum,avg 一般用于处理数值类型,max,min,count 可以处理任何类型。
是否忽略null值:sum avg 都忽略null值,求值的时候会减少除数个数。
以上分组函数都忽略null值
3,可以和distinct搭配使用。
一,count的具体介绍
(1)select count(salary)from emp;
(2)select count(*) from emp;
效率:myisam(存储引擎下,count(*)的效率高)
innodb存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些。
一般count(*)用来统计行数。
2,和分组函数同一查询的字段有限制。和分组函数同一查询的字段要求是group by 后的字段。
select avg(salary) , empname from emp; empname毫无意义。
案例一:查询最大入职时间和最小入职时间的相差天数(DATEDIFF)看相差天数
select DATEDIFF(max(hirdate),min(hirdate)) AS 相差天数 from emp;
案例二:查询部门编号为90的员工个数
select count(*)from where deptno=90;
3,分组查询的介绍:
语法:
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by 字句】
注意:查询列表比较特殊,要求是分组函数和group by 出现的字段。
(group by)
案例一,查询每个部门的平均工资
select avg(salary),deptno from emp group by deptno;
案例二,查询每个部门的最高工资
select max(salary),deptno from emp group by deptno;
2,添加筛选条件:
案例一,查询邮箱中包含a字符的,每个部门的平均工资
select AVG(salary),deptno from emp where email like ‘%a%’ group by deptno;
,查询有奖金的每个领导手下的最高工资
select max(salary),mannerid from emp where comm is not null group by mannerid
3,添加复杂的筛选条件
案例一,查询哪个员工部门的员工个数>2? (having)
(1)查询每个部门的员工个数,再根据(1)的结果进行筛选,查询哪个部门的员工个数>2
SELECT COUNT(*) AS number, deptno FROM emp GROUP BY deptno having number>2 ;
执行分组查询之后再进行筛选,要使用having having的用法就是在分组之后的筛选。
where是在分组之前进行筛选。
案例二,查询每个部门有奖金的员工的最高工资>1200的部门编号和最高工资
select deptno,max(salary) from emp where commission is not null group by deptno
having max(salary)>12000;
案例三,查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资。
select mannerid,min(salary) from emp where mannerid>102 group by mannerid having min(salary)>5000
总结:分组前筛选,原始表中有的字段,放在group by之前,用where
分组后筛选 ,是生成临时表中的字段,放在group by之后,用having
分组函数做条件肯定是放在having字句中。
4,按表达式,函数进行分组
案例一,按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些?
select count(*),length(empname) len_name from emp group by length(empname) having count(*)>5
5,按多个字段进行分组
案例一,查询每个部门每个部门的员工的平均工资
select avg(salary),deptno, empno from emp group by deptno,empno
案例二,添加排序:查询每个部门每个部门的员工的平均工资,并且按平均工资的高低显示
select avg(salary),deptno, empno from emp group by deptno,empno order by avg(salary) desc
分组查询总结:group by 支持 单个字段分组,也支持多个字段分组