1.count(*)和count(具体的某个字段),他们有什么区别?

    count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)

    count(comm):表示统计comm字段中不为NULL的数据总数。

 

分组函数也能组合起来用:

  select count (*),sum(sal),avg(sal),max(sal),min(sal) from emp;

 

2.group by 和 having

 

group by: 按照某个字段或者某个字段进行分组

having: having是对分组之后的数据进行再次过滤。

 

案例:找出每个工作岗位的最高薪资。

select max(sal) from emp group by job;

 

注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。

并且任何一个分组函数(count sum avg max min)都是在 group by语句执行结束之后才会执行的。

当一条SQL语句没有group by的话,整张表的数据会自成一组。

 

select ename,sal from emp where sal>avg(sal);//ERROR 1111(HY000):Invalid use of group function

思考以上的错误信息:无效的使用了分组函数?

  原因:SQL语句中有一个语法规则,分组函数不可直接使用在where子句中。

    怎么解释?

      因为group by是在where执行之后才会执行的。

    还没有分组!!!!

  select               5

   ..

  from                 1

   ..

  where              2

          ..

  group by          3

    ..

  having             4

         ..

  order by           6

   ..

 

所以应该先查询然后用查询到的数据,例如select ename,sal from emp where sal>(select avg(sal) from emp);

 

案例:找出每个工作岗位的最高薪资。

select max(sal),job from emp group by job;

select ename max(sal),job from emp group by job;//oracle会报错,mysql可以执行但是毫无意义。oracle的语法比MYSQL语法严谨。

切记!!! 

当一条语句中有group by的时候,select后面只能跟分组函数和参与分组的字段。

 

每个岗位的平均薪资?

  select job,avg(sal) from emp group by job;

 

多个字段能不能联合起来一块分组?

案例:  找出每个部分不同工作岗位的最高薪资

  select 

    deptno,job,max(sal)

  from 

    emp

  group by

    deptno,job;

 

找出每个部分的最高薪资,要求显示薪资大于2900的数据。

第一步:找出每个部门的最高薪资

select max(sal),deptno from emp group by deptno 

第二步:找出薪资大于2900的

select max(sal),deptno from emp group by deptno having max(sal)>2900;//这种效率低!!!

用以下这种,效率高!!

select max(sal),deptno from emp where sal>2900 group by deptno;//效率高,如果能使用where过滤尽量用where

 

找出每个部门的平均薪资,要求显示薪资大于2000的数据。

第一步:找出每个部门的平均薪资

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

第二步:要求显示薪资大于2000的数据

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

如果使用where筛选会报错,无效的使用了分组函数。

切记,很重要。这种情况只能使用having过滤