概述
- 什么是子查询?
select语句当中嵌套select语句,被嵌套的select语句是子查询。 - 子查询可以出现在哪里?
select
...(select)
from
...(select)
where
... (select)
where后面嵌套子查询
- 例子
找出高于平均薪资的员工信息。 - 错误写法:
SELECT * FROM emp
where sal>avg(sal);
原因:where后面不能使用分组函数。
- 分步查询
先找出平均薪资:SELECT avg(sal) FROM emp;
(2073.214286)
再过滤:
SELECT * FROM emp
where sal>2073.214286;
- 合并:
SELECT * FROM emp
where sal > (
SELECT * FROM emp
where sal>avg(sal)
);
from后面嵌套子查询
- 例子
找出每个部门平均薪水的薪资等级。 - 解答:
1、找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
SELECT deptno, avg(sal) as avgsal
from emp
group by deptno;
2、将以上的查询结果当做临时表t,让t表和salgrade s表连接。
SELECT t.*, s.grade
FROM (SELECT deptno, avg(sal) as avgsal
from emp
group by deptno) t
join salgrade s
on
t.avgsal between s.losal and s.hisal;
- 例子
找出每个部门的薪水等级的平均值
1、找出每个员工的薪资等级
SELECT e.ename, e.sal, e.deptno, s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;
2、看似会用到子查询,但是不会(因为需要的数据都有)。
SELECT e.deptno, avg(s.grade)
FROM emp e
join salgrade s
on
e.sal between s.losal and s.hisal
group by e.deptno;
select后面嵌套子查询
- 例子
找出每个员工所在的部门名称,要求显示员工名和部门名。
(用嵌套的方法,不用连接)
SELECT e.ename,
(
select d.dname
from dept d
where e.deptno = d.deptno
) as dname
from emp e;