1、什么是子查询:
select语句中嵌套select语句,被嵌套的select语句称为子查询。
2、子查询都可以出现在什么地方:
select
..(select) #子查询可以出在select后面
from
..(select) #子查询可以出在from后面
where
..(select) #子查询可以出在where后面
group by
...
having
..(select) #子查询可以出在having后面
order by
...
limit
…
3、where子句中的子查询:(子查询可以出现在where后面)
案例:
需求:找出比平均薪资高的员工姓名及工资
分析:select ename,sal from emp where agv(sal); #这种写法是错误的,因为分组函数不能出现在where后面
上面的写法不行,我们尝试分步完成任务
第一步:查询平均薪资
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);
4、from子句中的子查询:(子查询可以出现在from子句中)
案例:找出每个部门平均薪水的等级。
第一步:查出每个部门的平均薪资
select deptno,avg(sal) avgsal from emp group by deptno;
第二步:以上一步的查询结果作为临时表t与表salgrade as s进行连接查询,就可以得到想要的结果。
select
t.deptno,t.avgsal,s.grade
from
(select deptno,avg(sal) avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between losal and hisal;
5、select 后面出现的子查询(了解内容,我们知道这里允许出现子查询就可以了,这样的方式使用不多)
6、having子句中的子查询(子查询可以出现在having子句中)
案例:查询部门平均工资高于公司平均工资的部门
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > (select avg(sal) from emp);