1.什么是子查询
当select语句中嵌套一个select语句时,被嵌套的select语句就是子查询,它可以出现在不同的位置:
select
...(select ...)...
from
...(select ...)...
where
...(select ...)...
为了实例说明,创建三个表:dept、emp和salgrade,分别存储部门信息、员工信息和薪资等级。
2.where语句中嵌套select语句
情景一:我们希望查询员工中高于平均薪资水平的员工信息。
为此,一种很常见的思路是:
但是这种写法是错误的,其原因在于avg函数本应该在where语句之后执行,但我们把avg放在where语句中了,因此会报错。
解决办法是在where语句中嵌套一个select语句,先找到平均薪水,即让avg这个函数先执行,再执行where语句。此时,就可以正常输出员工中高于平均薪资水平的员工信息了。
3.from语句中嵌套select语句
情景二:我们希望找到每个部门平均薪资的薪资等级。
为此,我们首先需要找到每个部门的平均工资(即按照部门编号将平均薪资分别展示出来):SELECT deptno,avg(sal) AS avgsal FROM emp GROUP BY deptno;然后,我们可以将上面得到的结果作为一张新的表t,和薪资等级表s进行连接查询,即:SELECT t.deptno, t.avgsal, s.grade FROM t JOIN s ON t.avgsal BETWEEN s.losal AND s.hisal.综上,我们将两步骤合二为一,即得代码如下:
4.select语句中嵌套select语句
情景三:我们希望找到每个员工所在的部门名,要求显示员工名和部门名。
为此,我们可以首先先找到部门名:SELECT deptno, dname FROM dept;然后再嵌套查询,将部门名和员工名放一起: