分组查询(重要)
/** 什么是分组查询?
在实际的应用中.可能有这样的需求.需要先进行分组,然后对每一组的数据进行操作
这个时候我们需要使用分组查询,怎么进行分组查询呢?
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;
#执行效率低
#优化策略:WHERE 和 HAVING,优先选择 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