本文共 1800 字,大约阅读时间需要 6 分钟。
子查询就是嵌套的select语句,可以理解为子查询是一张表,
select语句当中嵌套select语句,被嵌套的select语句是子查询。 子查询可以出现在哪里?select ..(select). from ..(select). where ..(select).
举例1: 找出高于平均薪资的员工信息。
第一步:找出平均薪资select avg(sal) from emp;
第二步:where过滤
select * from emp where sal > 2073.214286;
第一步和第二步合并:
select * from emp where sal > (select avg(sal) from emp);
举例2: 查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
1、首先取得管理者的编号,去除重复的select distinct mgr from emp where mgr is not null;
2、查询员工编号包含管理者编号的
select empno, ename from emp where empno in(select mgr from emp where mgr is not null);
案例1:找出每个部门平均薪水的等级。
第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)select deptno,avg(sal) as avgsal from emp group by deptno;
第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal
select t.*,s.gradefrom (select deptno,avg(sal) as avgsal from emp group by deptno) tjoin salgrade son t.avgsal between s.losal and s.hisal;
案例2:找出每个部门的薪水等级的平均值。
第一步:找出每个员工的薪水等级。select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
第二步:基于以上结果,继续按照deptno分组,求grade平均值。
select e.deptno,avg(s.grade)from emp e join salgrade s on e.sal between s.losal and s.hisalgroup by e.deptno;
案例3:查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名
首先取得管理者的编号,去除重复的select distinct mgr from emp where mgr is not null;
将以上查询作为一张表,放到from语句的后面
使用92语法:select e.empno, e.ename from emp e, (select distinct mgr from emp where mgr is not null) m where e.empno=m.mgr;
使用99语法:
select e.empno, e.ename from emp e join (select distinct mgr from emp where mgr is not null) m on e.empno=m.mgr;
案例:找出每个员工所在的部门名称,要求显示员工名和部门名。 方法一:
select e.ename,d.dnamefrom emp ejoin dept don e.deptno = d.deptno;
方法二:
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
转载地址:http://yxuki.baihongyu.com/