由于和前面的内容先关联,不懂的可回顾前面的内容数据库之查看表内容
11.1 子查询:select里嵌套select语句
找出工资高于平均工资的员工?
第一步,找出平均工资
select avg(sal) from emp;
第二步,找出高于平均工资的员工
select ename,sal from emp where sal>2073.214286;
select ename,sal from emp where sal>(select avg(sal) from emp);
11.2 group by 和 having
group by :按照某个字段或者某些字段进行分组。
having:对分组之后的数据进行再次过滤
案例:找出某个工资岗位的最高工资。
select max(sal) from emp group by job;
注意:分组函数一般会与group by联合使用
并且每一个分组函数都是在group by语句执行结束之后才会执行的
当一条sql语句没有group by的话,整张表的数据会自成一组。
11.3 select ename,max(sal) from emp group by job;
以上代码在mysql有结果但没有意义,但在Oracle中会出现语法错误,Oracle比musql的语法规则严谨
注意:当一条语句有group by时,select 后只能跟分组函数和参与分组的字段,不可出现无关字段(比如上述代码的ename)。
11.4 每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
11.5 多个字段能否联合起来一起分组?
案例:找出每个部门不同工作岗位的最高薪资
首先分析下数据
分析数据可知,题目意思即找出10部门,20部门,30部门这三个部门不同岗位的最高工资。
结构:
select deptno,job,max(sal) from emp group by deptno,job;
答案就是我们想要的结构
11.6 对DQL语句的总结:
select
…
from
…
where
…
group by
…
having
…
order by
…
以上语句的执行顺序:
1.首先执行where进行原始过滤
2.执行group by进行分组
3.执行having对分组数据进行再次过滤
4.执行select选出数据
5.执行order by进行排序
原则:能在where中过滤的尽量在where中过滤,效率较高,having过滤只要是对分组之后的数据进行过滤的。