– 练习
练习一
-- 1.查询入职日期最早的员工姓名,入职日期
select ename 员工姓名, hiredate 入职日期
from emp
where hiredate = (select min(hiredate) from emp);
-- 2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
select e.ename 员工姓名, e.sal 工资, d.dname 部门名称
from emp e, dept d
where e.deptno = d.deptno
and e.sal > (select e.sal from emp e where e.ename = 'SMITH')
and d.loc = 'CHICAGO';
-- 3.查询入职日期比10部门入职日期最早的员工还要早的员工姓名,入职日期
select ename 员工姓名, hiredate 入职日期
from emp
where hiredate < (select min(hiredate) from emp where deptno = 10);
-- 4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select d.deptno 部门编号, d.dname 部门名称, count(e.ename) 部门人数
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno, d.dname
having count(e.ename) > (select avg(count(e.ename))
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno);
练习二
-- 1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
select ename 员工姓名, hiredate 入职日期
from emp
where hiredate > any(select hiredate from emp where deptno = 10)
and deptno <> 10;
-- 2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
select ename 员工姓名, hiredate 入职日期
from emp
where hiredate > all(select hiredate from emp where deptno = 10)
and deptno <> 10;
-- 3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
select ename 员工姓名, hiredate 入职日期
from emp
where job = any(select job from emp where deptno = 10)
and deptno <> 10;
练习三
-- 1.查询职位及经理和10部门任意一个员工职位 !及! 经理相同的员工姓名,职位,
-> 不包括10部门员工
select ename 员工姓名, job 职位
from emp
where (job, mgr) in
(select job, mgr from emp where deptno = 10)
and deptno <> 10;
-- 2.查询职位及经理和10部门任意一个员工职位 !或! 经理相同的员工姓名,职位,
-> 不包括10部门员工
select ename 员工姓名, job 职位
from emp
where (job in
(select job from emp where deptno = 10)
or mgr in
(select mgr from emp where deptno = 10))
and deptno <> 10;
练习四
-- 1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
select e.ename 员工姓名,
e.job 职位,
d.dname 部门名称,
a.avgsal 职位平均工资
from emp e,
dept d,
(select e.job, avg(sal) avgsal from emp e group by e.job) a
where e.deptno = d.deptno
and e.job = a.job
and e.sal > a.avgsal;
-- 2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT
-> 和BLAKE本人。
select *
from emp e
where (e.job, e.mgr) in
(select e.job, e.mgr from emp e where e.ename in ('SCOTT', 'BLAKE'))
and e.ename not in ('SCOTT', 'BLAKE');
-- 3.查询不是经理的员工姓名。
select ename 员工姓名
from emp
where empno not in
(select distinct mgr from emp where mgr is not null);
练习五
-- 1.查询入职日期最早的前5名员工姓名,入职日期。
select rownum,e.ename 员工姓名, e.hiredate 入职日期
from (select ename,hiredate from emp order by hiredate asc) e
where rownum <= 5;
-- 2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
select rownum, e.ename 员工姓名, e.hiredate 入职日期, e.loc
from (select e.*,d.*
from emp e, dept d
where e.deptno = d.deptno
and d.loc = 'CHICAGO'
order by hiredate asc) e
where rownum <= 2;
练习六
-- 1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、
-> 入职日期、部门名称。
select e.rn 第1页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称
from (select rownum rn, e.*, d.*
from emp e, dept d
where e.deptno = d.deptno) e
where e.rn <= 5;
select e.rn 第2页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称
from (select rownum rn, e.*, d.*
from emp e, dept d
where e.deptno = d.deptno) e
where e.rn > 5
and rn <= 10;
select e.rn 第3页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称
from (select rownum rn, e.*, d.*
from emp e, dept d
where e.deptno = d.deptno) e
where e.rn > 10
and rn <= 15;
练习七
-- 1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,
-> 要求显示员工姓名、入职日期、部门名称、工资。
select e.rn 第1页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称,
e.sal 工资
from (select rownum rn, ed.*
from (select e.ename, e.hiredate, d.dname, e.sal
from emp e, dept d
where e.deptno = d.deptno
order by e.sal desc) ed
where rownum <= 5) e;
-- 方法一,效率低
select e.rn 第2页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称,
e.sal 工资
from (select rownum rn, ed.*
from (select e.ename, e.hiredate, d.dname, e.sal
from emp e, dept d
where e.deptno = d.deptno
order by e.sal desc) ed) e
where e.rn > 5 and e.rn <= 10;
-- 方法二 ,效率高
select e.rn 第2页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称,
e.sal 工资
from (select rownum rn, ed.*
from (select e.ename,
e.hiredate,
d.dname,
e.sal
from emp e, dept d
where e.deptno = d.deptno
order by e.sal desc) ed
where rownum <= 10) e
where e.rn > 5;
select e.rn 第3页,
e.ename 员工姓名,
e.hiredate 入职日期,
e.dname 部门名称,
e.sal 工资
from (select rownum rn, ed.*
from (select e.ename,
e.hiredate,
d.dname,
e.sal
from emp e, dept d
where e.deptno = d.deptno
order by e.sal desc) ed
where rownum <= 15) e
where e.rn > 10;
– 课后作业
-- 1.查询工资高于编号为7782的员工工资,并且和7566号员工从事相同工作的员工的编号、
-> 姓名及工资。
select empno 员工编号, ename 姓名, sal 工资
from emp
where sal > (select sal from emp where empno = 7782)
and job = (select job from emp where empno = 7566)
and empno <> 7566;
-- 2.查询工资最高的员工姓名和工资。
select ename 员工姓名, sal 工资
from emp
where sal = (select max(sal) from emp);
-- 3.查询部门最低工资高于20号部门最低工资的部门的编号、名称及部门最低工资。
select d.deptno 部门编号,
d.dname 部门名称,
nvl(min(e.sal), 0) 部门最低工资
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno, d.dname
having nvl(min(e.sal), 0) > (select nvl(min(e.sal), 0)
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno
having d.deptno = 20);
-- 4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select e.empno 员工编号, e.ename 姓名, e.sal 工资
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno, e.empno, e.ename, e.sal
having(e.sal, d.deptno) in (select min(e.sal), e.deptno
from emp e
group by e.deptno);
-- 5.显示经理是KING的员工姓名,工资。
select e.ename 员工姓名, e.sal 工资
from emp e, emp mgr
where e.mgr = mgr.empno
and mgr.ename = 'KING';
-- 6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
select e.ename 员工姓名, e.sal 工资, e.hiredate 参加工作时间
from emp e
where e.hiredate >
(select hiredate from emp where ename = 'SMITH');
-- 7.使用子查询的方式查询哪些职员在NEW YORK工作。
select e.ename 员工姓名, d.loc 工作地点
from emp e, dept d
where e.deptno = d.deptno
and d.loc = (select loc from dept where loc = 'NEW YORK');
-- 8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。
select ename 员工姓名, hiredate 雇佣日期
from emp
where deptno = (select deptno from emp where ename = 'SMITH')
and ename <> 'SMITH';
-- 9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
select empno 员工编号, ename 姓名
from emp
where sal > (select avg(sal) from emp);
-- 10.写一个查询显示其上级领导是King的员工姓名、工资。
select e.ename 员工姓名, e.sal 工资
from emp e join emp mgr
on (e.mgr = mgr.empno)
where mgr.ename = 'KING';
-- 11.显示所有工作在RESEARCH部门的员工姓名,职位。
select e.ename 员工姓名, e.job 职位
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'RESEARCH';
-- 12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门10的平均工资。
select d.deptno 部门编号, nvl(avg(e.sal), 0) 平均工资
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno
having avg(e.sal) > (select avg(sal) from emp where deptno = 10);
-- 13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。
select e.ename 员工姓名,
e.sal 工资,
ed.avgsal 所在部门平均工资,
(e.sal - ed.avgsal) 高与平均工资额度
from emp e,
(select deptno, avg(sal) avgsal from emp group by deptno) ed
where e.deptno = ed.deptno
and e.sal > ed.avgsal;
-- 14.列出至少有一个雇员的所有部门
select d.deptno 部门, count(e.ename) 部门人数
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno
having count(e.ename) >= 1;
-- 15.列出薪金比"SMITH"多的所有雇员
select ename 雇员姓名
from emp
where sal > (select sal from emp where ename = 'SMITH');
-- 16.列出入职日期早于其直接上级的所有雇员
select e.ename 雇员姓名,
e.mgr 雇员经理,
e.hiredate 雇员入职日期,
mgr.hiredate 经理入职日期
from emp e, emp mgr
where e.mgr = mgr.empno(+)
and e.hiredate < mgr.hiredate;
-- 17.找员工姓名和直接上级的名字
select e.ename 员工姓名, mgr.ename 上级名字
from emp e, emp mgr
where e.mgr = mgr.empno;
-- 18.显示部门名称和人数
select d.deptno 部门名称, count(e.ename) 部门人数
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno;
-- 19.显示每个部门的最高工资的员工
select deptno 部门, ename 员工姓名
from emp
where sal in (select max(sal) from emp group by deptno);
-- 20.显示出和员工号7369部门相同的员工姓名,工资
select ename 员工姓名, sal 工资
from emp
where deptno = (select deptno from emp where empno = 7369)
and empno <> 7369;
-- 21.显示出和姓名中包含"W"的员工相同部门的员工姓名
select ename 员工姓名
from emp
where deptno = (select deptno from emp where ename like '%W%');
-- 22.显示出工资大于平均工资的员工姓名,工资
select ename 员工姓名, sal 工资
from emp
where sal > (select avg(sal) from emp);
-- 23.显示出工资大于本部门平均工资的员工姓名,工资
select e.ename 员工姓名, e.sal 工资,a.avgsal
from emp e,
(select deptno,avg(sal) avgsal from emp group by deptno) a
where e.deptno = a.deptno
and e.sal > a.avgsal;
-- 24.显示每位经理管理员工的最低工资,及最低工资者的姓名
select e.sal 最低工资, e.ename 姓名,e.mgr
from emp e
where (e.mgr,e.sal) in (select e.mgr, min(e.sal)
from emp e
group by e.mgr);
-- 25.显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
select ename 员工姓名, hiredate 参加工作时间
from emp
where hiredate <
(select hiredate
from emp
where sal = (select max(sal) from emp));
-- 26.显示出平均工资最高的的部门平均工资及部门名称
select avg(e.sal) 部门平均工资, d.dname 部门名称
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno,d.dname
having avg(e.sal) = (select max(avg(sal)) from emp group by deptno);