分组查询

分组查询(重要)

/** 什么是分组查询?
在实际的应用中.可能有这样的需求.需要先进行分组,然后对每一组的数据进行操作
这个时候我们需要使用分组查询,怎么进行分组查询呢?
SELECT 
    ...
FROM
  ...
GROUP BY
    ...
    计算每个部门的工资和?
    计算每个工作岗位的平均薪资?
    计算每个工作岗位的最高薪资?
    ....
*/

/**将之前的关键字全部组合在一起,来看一下他们的执行顺序?
SELECT
    ...
FROM
    ...
WHERE
    ...
GROUP BY
    ...
ORDER BY
    ...
    
以上关键字的顺序不能颠倒,需要记忆。
执行顺序是什么?
     1.FROM
         2.WHERE
         3.GROUP BY
         4.SELECT
         5.ORDER BY
         
         为什么分组函数不能直接使用在 WHERE后面
         SELECT ename,sal FROM emp WHERE sal > MIN(sal);
         因为分组函数在使用的时候必须先分组之后才能使用。
         WHERE执行的时候,还没分组,所以 WHERE后面不能出现分组函数
         
         SELECT sum(sal) FROM emp;
         这个没有分组,为什么sum()可以执行
         因为 SELECT在 GROUP BY 后面执行
*/

#找出每个工作岗位的工资和?
    #实现思路:按照工作岗位分组,然后对工资求和。
    SELECT
        job,SUM(sal)
    FROM
        emp
 GROUP BY
      job;
/**以上这个语句的执行顺序
            先从emp表中查询数据。
            根据job字段进行分组。
            然后对每一组的数据进行sum(sal)
*/
SELECT ename,job,sum(sal) FROM emp GROUP BY job;
#以上语句在mysql中可以执行,但是毫无意义
#以上语句在oracle中执行报错。
#oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)

#重点结论:
    #在一条 SELECT语句当中,如果有 GROUP  BY语句的话,SELECT后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟。


#使用having 可以对分完组之后的数据进行一步过滤
# having不能单独使用,having不能代替where,having必须和 GROUP BY联合使用

#找出每个部门的最高薪资;
#按照部门编号分组,求每一组的最大值
SELECT deptno,max(sal) FROM emp GROUP BY deptno;
#SELECT 后面添加ename 字段没有意义 oracle会报错
SELECT ename,deptno,max(sal) FROM emp GROUP BY deptno;

#找出每个部门,不同工作岗位的最高薪资?
#技巧: 两个字段联合成一个字段看
SELECT job,deptno,max(sal) FROM emp GROUP BY deptno,job;

#找出每个部门的最高薪资,要求显示最高薪资大于3000?
#第一步
SELECT deptno,max(sal) FROM emp GROUP BY deptno;
#第二步
SELECT
    deptno,max(sal)
FROM
    emp
GROUP BY
    deptno
HAVING
  max(sal) > 3000;
#执行效率低

#优化策略:WHEREHAVING,优先选择 WHERE, WHERE实在完成不了再选择 HAVING.
SELECT 
    deptno,max(sal) 
FROM 
    emp 
WHERE 
    sal > 3000 
GROUP BY 
    deptno;
    
#WHERE没办法的?
#找出每个部门的平均薪资,要求显示平均薪资高于2500的。
SELECT 
    deptno,round(avg(sal)) 
FROM 
    emp 
GROUP BY 
    DEPTNO
HAVING
    round(avg(sal)) > 2500

 

分组查询

上一篇:leetcode 用栈实现队列 简单


下一篇:二.Go微服务--令牌桶