oracle 第五章、第六章、第七章练习课后作业

----------------------第五章------------------------
-------练习一-------------------------------------
--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<m.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
 

猜你喜欢

转载自blog.csdn.net/ghhcngc/article/details/81082404