分组查询(非常重要)

19,分组查询

  19.1、分组查询?

    先进行分组,再对每一组的数据操作

    select.. from... group by...

    计算每个部门的工资和?

    计算每个岗位的平均薪资?

    计算每个工作岗位的最高薪资?

  19.2、将之前的关键字全部组合在一起,看一下执行顺序?

    select...from....where....group by...order by...

    执行顺序:1from 2where 3group by 4select 5order by

    为什么分组函数不能直接使用where后

    分组函数在使用时必须先分组才能使用,where执行时还没分组,where后不能出现分组函数

    select sum(sal) from emp; 因为select在group by之后执行

  19.3、找出每个工作岗位的工资和?

    思路:按照工作岗位分组,然后对工资求和

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

    先从emp表查询,根据job字段分组,对每一组数据进行sum(sal)

    select ename,job,sum(sal) from emp group by job;该条语句在mysql中可以执行,但毫无意义ename有14条,job只有5条

    在oracle中执行报错,oracle语法要严格一些

    重点结论:在一条select语句中,如果有group by 语句的话,select后面只能跟:参加分组的字段,以及分组函数。

          其它的一律不能跟

  19.4、找出每个部门的最高薪资?

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

  19.5、找出每个部门,不同工作岗位的最高薪资?

    select ename,job,sal,deptno from emp;

    技巧:两个字段联合成1个字段看(两个字段联合分组)

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

  19.6、找出每个部门最高薪资,要求显示最高薪资大于3000的?

    使用having可以对分完组之后的数据进一步过滤。

   注意:having不能单独使用,having不能代替where,having必须和group by联合使用

    第一步:select deptno,max(sal) from emp group by deptno;

    第二步:select deptno,max(sal) from emp group by deptno having max(sal) > 3000;

  以上sql语句执行效率低

    select deptno,max(sal) from emp where sal > 3000 group by deptno;

    先将大于3000找出,再分组。

    优化策略:where和having,优先选择where,where实在完成不了再用having

  19.7、where没办法的??

    找出每个部门平均薪资,要求显示平均薪资高于2500的。

    第一步:select deptno,avg(sal) from emp group by deptno;

    第二步:select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;

 

posted @ 2022-01-21 21:07  doremi429  阅读(281)  评论(0编辑  收藏  举报