本次课程来学习子查询的具体内容。子查询,就是在查询语句里边嵌套其他的查询语句。普通查询语句分为select子句、from子句where子句。这些子句里边都是可以定义子查询的,但是唯独推荐使用from子句的子查询。
接下来咱们看一个例子,要求你查询底薪超过公司平均底薪的员工信息。之前我们用表连接的方式做过这道题。这次咱们看看子查询应该怎么写。下面就是这道题的sql语句,各位同学请看。那么正常情况下,把聚合函数作为判断条件写在where里面是不行的,但是我把这个子查询这个定义出来以后,把这个员工表里边的平均底薪给计算出来。计算出来以后,是一个具体的数据了。所以在where里边做条件判断就没有问题了。where子句里边定义的一个子查询,是查询员工表的平均的底薪。在where子句里面去判断谁的底薪大于等于这个平均底薪,把这样的这个人的信息给打印出来就可以了。

查询底薪超过公司平均底薪的员工信息
where子句的子查询是不推荐使用的,但是他在执行的过程中是没有语法错误的
select
empno,ename,sal
from t_emp
where sal>(select avg(sal) from t_emp)

一、子查询的分类
子查询除了写在where子句里边,他还可以写在from子句和select子句里边。where子查询和select子查询都会执行多次,所以在效率上并不占优势,只有from查询才最为推荐

二、WHERE 子查询(查询效率低)
在书写sql语句的时候,where子查询最符合我们的思考逻辑,但是子查询的效率确实是最低的。
就拿刚才执行过的查询来说,where子查询去拿每条员工的记录与子查询做比较的时候,子查询都要重新执行一次。如果员工表有1万条记录,那么子查询就要执行1万次,效率很低

三、FROM子查询
在查询语句里面from子句只会执行一次,它跟where子句是不同的,where子句在筛选数据的时候,每筛选一条数据,where子句里面的条件就要执行一次。所以我们把子查询写在where子句里边的话,它执行的次数就有很多次了,所以查询的效率非常的低。但是我们把子查询写在from子句里面,那么这个子查询只会执行一次。所以from子查询,不是相关子查询。

查询底薪超过公司平均底薪的员工信息用 FROM 子句写
首先是按照部门编号去分组,然后统计一下每个部门的编号和这个部门对应平均的底薪。把这个查询的结果集作为一张临时表和员工表做连接。连接的条件是员工的部门编号,等于结果集的部门编号,并且员工的底薪要大于他所在部门的平均的底薪。然后select子句里面写上要显示的字段就行了
select
e.empno,e.ename,e.sal,t.avg
from t_emp e join
(select deptno,avg(sal) as avg from t_emp group by deptno) t
on e.deptno=t.deptno and e.sal>t.avg
四、SELECT子查询(查询效率低)
lect子查询的是相关子查询,它也会反复的执行
查询一下每一个员工的部门信息

select
e.empno,
e.ename,
(select dname from t_dept where deptno=e.deptno)
from t_emp e

1554

被折叠的 条评论
为什么被折叠?



