(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 支持  单个字段分组,也支持多个字段分组