----------------------第五章------------------------
-------练习一-------------------------------------
--1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select emp.ename,dept.deptno,dept.dname
from emp join dept on dept.deptno = emp.deptno;
--2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select emp.ename,dept.loc,emp.comm
from emp join dept on dept.deptno = emp.deptno
where emp.comm<>0;
--3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select emp.ename,dept.loc
from emp join dept on dept.deptno= emp.deptno
where emp.ename like '%A%';
------练习二---------------
--1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.loc
from emp join dept on dept.deptno = emp.deptno,salgrade
order by salgrade.grade asc;
-----练习三-------
--1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select e.ename 员工姓名,e.deptno 员工编号,m.ename 经理姓名,m.deptno 经理编号
from emp e left join emp m
on e.mgr = m.empno
where e.job in('NEW YORK','CHICAGO');
--2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
select e.ename 员工姓名,e.deptno 员工编号,m.ename 经理姓名,m.deptno 经理编号
from emp e left join emp m on e.mgr=m.empno
where e.job<>'MANAGER'
order by e.empno;
--3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。
select e.empno 员工编号,e.ename 员工姓名,d.dname 部门名称
from emp e full join dept d
on e.deptno = d.deptno;
-----练习四------------
--使用SQL-99写法,完成如下练习
--1.创建一个员工表和部门表的交叉连接。
select e.empno,e.ename,d.dname
from emp e cross join dept d;
--2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename,d.dname,e.hiredate
from emp e natural join dept d
where e.hiredate>'1-5月-80';
--3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点
select e.ename,d.dname,d.loc
from emp e join dept d using(deptno)
where d.loc='CHICAGO';
--4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
select e.ename 员工姓名,d.dname 部门名称,d.loc 工作地点,s.grade 薪资等级
from emp e join dept d
on d.loc='CHICAGO',salgrade s;
--5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename 员工姓名,m.ename 经理姓名
from emp e left join emp m
on e.mgr = m.empno
where e.job<>'MANAGER';
--6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename 员工姓名,m.ename 经理姓名
from emp m right join emp e
on e.mgr=m.empno;
--------课后练习---------------------
--1.显示员工SMITH的姓名,部门名称,直接上级名称
select e.ename 员工姓名,d.dname 部门名称,m.ename 上级名称
from emp e join dept d on e.deptno=d.deptno
join emp m on e.mgr=m.empno;
--2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
select e.ename 员工姓名,d.dname 部门名称,e.sal 工资,s.grade 工资级别
from emp e join dept d on e.deptno = d.deptno
join salgrade s on s.grade>4;
--3.显示员工KING和FORD管理的员工姓名及其经理姓名。
select e.ename 员工名字,m.ename 经理姓名
from emp e join emp m
on e.mgr = m.empno
and m.ename in ('KING','FORD');
--4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
select e.ename 员工姓名,e.hiredate 参加工作时间,m.ename 经理姓名,m.hiredate 经理参加工作时间
from emp e join emp m
on e.mgr = m.empno
and e.hiredate
------练习一-----------------------------------
--1.查询部门20的员工,每个月的工资总和及平均工资。
select sum(sal) 工资总和,avg(sal) 平均工资
from emp
where deptno=20;
--2.查询工作在CHICAGO的员工人数,最高工资及最低工资。
select count(e.empno) 员工人数,max(e.sal) 最高工资,min(e.sal) 最低工资
from emp e join dept d
on e.deptno = d.deptno
where d.loc='CHICAGO';
--3.查询员工表中一共有几种岗位类型。
select distinct(job) from emp;
------练习二-----------------------------------
--1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select d.deptno 部门编号,d.dname 部门名称,count(e.empno) 部门人数,max(e.sal )最高工资,min(e.sal) 最低工资,sum(e.sal) 工资总和,avg(e.sal) 平均工资
from emp e join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname;
--2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select d.deptno 部门编号,d.dname 部门名称,e.job 岗位名称,count(e.empno) 部门人数,max(e.sal )最高工资,min(e.sal) 最低工资,sum(e.sal) 工资总和,avg(e.sal) 平均工资
from emp e join dept d
on e.deptno=d.deptno
group by d.deptno,d.dname,e.job;
--3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
select count(d.ename) 管理的人数 ,e.empno 经理编号,e.ename 经理名称
from emp e,emp d
where e.empno = d.mgr
or d.mgr is null
group by e.empno,e.ename;
-----练习三----------------------------------
--1.查询部门人数大于2的部门编号,部门名称,部门人数。
select d.deptno,d.dname,count(e.ename)
from dept d join emp e
on d.deptno = e.deptno
group by d.deptno, d.dname
having(count(e.ename)>2);
--2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序。
select d.deptno,d.dname,count(e.ename),avg(e.sal)
from dept d
join emp e on d.deptno = e.deptno
group by d.dname,d.deptno
having(count(e.ename)>2)
order by count(e.ename);
-----课后作业-----------------
--1.查询部门平均工资在2500元以上的部门名称及平均工资。
SELECT dname,avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING avg(sal)>2500;
--2.查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。
SELECT JOB,avg(sal)
FROM emp
WHERE upper(JOB) NOT LIKE 'SA%'
GROUP BY JOB
HAVING avg(sal)>2500
ORDER BY 2 desc;
--3.查询部门人数在2人以上的部门名称、最低工资、最高工资,并对求得的工资进行四舍五入到整数位。
SELECT dname,round(MIN(sal)),round(MAX(sal))
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING count(empno)>2;
--4.查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
SELECT JOB,sum(sal)
FROM emp
WHERE upper(JOB)!='SALESMAN'
GROUP BY JOB
HAVING sum(sal)>=2500;
--5.显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序。
SELECT m.empno,m.ename,min(e.sal)
FROM emp e,emp m
WHERE e.mgr=m.empno(+)
GROUP BY m.empno,m.ename
HAVING MIN(e.sal)>=3000
ORDER BY min(e.sal) desc;
--6.写一个查询,显示每个部门最高工资和最低工资的差额
SELECT deptno,MAX(sal)-MIN(sal)
FROM emp
GROUP BY deptno;
----------------第七章---------------
------练习一-----------
--1.查询入职日期最早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate <= ALL(select hiredate from emp);
--2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
select e.ename,e.sal,d.dname
from emp e,dept d
where e.sal>(select sal
from emp
where ename='SMITH')
and d.loc = 'CHICAGO';
--3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
select e.ename,e.hiredate
from emp e
where e.hiredate <= ALL(select emp.hiredate from emp,dept where dept.deptno=20);
--4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select e.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno
group by e.deptno,d.dname
having count(empno)>(
select avg(count(empno))
from emp
group by emp.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,job
from emp
where job =
ANY(select job from emp where deptno=10)
and deptno<>10;
-----练习三-----------
--1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,不包括10部门员工
select job,mgr
from emp
where(mgr,job)=ANY(select mgr,job from emp where deptno=10)
and deptno<>10;
--2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,不包括10部门员工
select job,mgr 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,x.avgsal
from emp e,dept d,(select job,avg(sal) avgsal
from emp
group by job)x
where e.deptno = d.deptno
AND e.job = x.job
AND e.sal>x.avgsal;
--2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
SELECT ename,job
FROM emp
WHERE (job,mgr) IN (SELECT job,mgr
FROM emp
WHERE upper(ename)
IN('SCOTT','BLAKE'))
AND upper(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,hiredate
FROM (SELECT ename,hiredate FROM emp
ORDER BY hiredate ASC)
WHERE ROWNUM <=5
--2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
SELECT ROWNUM ,hiredate
FROM (SELECT ename,hiredate
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND loc='CHICAGO'
ORDER BY hiredate ASC)
WHERE ROWNUM <=2
----练习六-------------
--1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。
SELECT b.*
FROM (SELECT ROWNUM rn,ename,hiredate,dname
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND
ROWNUM <=1*5)b
WHERE rn>(1-1)*5
SELECT b.*
FROM (SELECT ROWNUM rn,ename,hiredate,dname
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND
ROWNUM <=2*5)b
WHERE rn>(2-1)*5
SELECT b.*
FROM (SELECT ROWNUM rn,ename,hiredate,dname
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND
ROWNUM <=3*5)b
WHERE rn>(3-1)*5
----练习七-------------
--1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称、工资。
SELECT *
FROM
(SELECT ROWNUM rn,b.*
FROM (SELECT ename,hiredate,dname,sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
ORDER BY hiredate DESC) b
WHERE ROWNUM <=1*5)
WHERE rn >(1-1)*5
SELECT *
FROM
(SELECT ROWNUM rn,b.*
FROM (SELECT ename,hiredate,dname,sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
ORDER BY hiredate DESC) b
WHERE ROWNUM <=2*5)
WHERE rn >(2-1)*5
SELECT *
FROM
(SELECT ROWNUM rn,b.*
FROM (SELECT ename,hiredate,dname,sal
FROM emp e,dept d
WHERE e.deptno=d.deptno
ORDER BY hiredate DESC) b
WHERE ROWNUM <=3*5)
WHERE rn >(3-1)*5
----课后作业-----------
--1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
select deptno,ename,sal
from emp
where sal> (select sal from emp where empno=7782)
and job in (select job from emp where empno=7369)
--2.查询工资最高的员工姓名和工资。
select sal,ename
from emp
where sal=(
select max(sal)
from emp
)
--3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
select e1.deptno,d.dname,e1.p
from (
select min(sal) p,deptno from emp group by deptno)e1,
(select min(sal) s from emp where deptno=10)e2,dept d
where e1.deptno=d.deptno and e1.p>e2.s
--4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select deptno,ename,sal
from emp
where sal in (select min(sal) from emp group by deptno )
--5.显示经理是KING的员工姓名,工资。
select ename,sal
from emp
where mgr=(select empno from emp where ename='KING')
--6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
select ename,sal,hiredate
from emp
where hiredate<(select hiredate from emp where ename='SMITH')
--7.使用子查询的方式查询哪些职员在NEW YORK工作。
select ename
from emp e,dept d
where e.deptno=d.deptno and d.loc='NEW YORK'
--8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。
select ename,hiredate
from emp
where deptno in(select deptno from emp where ename='SMITH')
and ename<>'SMITH'
--9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
select ename,empno
from emp
where sal>(select avg(sal) from emp )
--10.写一个查询显示其上级领导是King的员工姓名、工资。
select ename,sal
from emp
where mgr=(select empno from emp where ename='KING')
--11.显示所有工作在RESEARCH部门的员工姓名,职位。
select e.ename,e.job
from emp e,dept d
where e.deptno=d.deptno and d.dname='RESEARCH'
--12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
select deptno,avg(sal)
from emp
where sal>(select avg(sal) from emp where deptno=20 )
group by deptno
--13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。
select e1.ename,e1.sal,e1.sal-e2.b 差额
from emp e1,(select avg(sal) b,deptno from emp group by deptno)e2
where e1.deptno=e2.deptno and e1.sal>e2.b
--14. 列出至少有一个雇员的所有部门
select deptno
from emp
where emp.empno<>0
group by deptno
--15. 列出薪金比"SMITH"多的所有雇员
select *
from emp
where sal>(select sal from emp where ename='SMITH')
--16. 列出入职日期早于其直接上级的所有雇员
select *
from emp e1,emp e2
where e1.mgr=e2.empno and e1.hiredate>e2.hiredate
--17. 找员工姓名和直接上级的名字
select e1.ename,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno
--18. 显示部门名称和人数
select d.dname,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno
group by d.dname
--19. 显示每个部门的最高工资的员工
select max(e.sal),d.dname
from emp e,dept d
where e.deptno=d.deptno
group by d.dname
--20. 显示出和员工号7369部门相同的员工姓名,工资
select ename,sal
from emp
where deptno=(select deptno from emp where empno=7369)
--21. 显示出和姓名中包含"W"的员工相同部门的员工姓名
select ename,deptno
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 e1.ename,e1.sal
from emp e1,(select deptno,avg(sal) p from emp group by deptno) e2
where e1.deptno=e2.deptno and e1.sal>e2.p
--24. 显示每位经理管理员工的最低工资,及最低工资者的姓名
select ename,empno
from emp
where sal in (select min(sal) from emp group by mgr ) and ename is not null
--25. 显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
select ename,hiredate
from emp
where hiredate<(select hiredate from emp where sal=(select max(sal) from emp) )
--26. 显示出平均工资最高的的部门平均工资及部门名称
select d.dname,e.z
from (select max(sal) z,deptno
from emp
group by deptno
order by max(sal) desc) e,dept d
where e.deptno=d.deptno and rownum=1