第五章多表连接练习和课后作业

– 练习

  • 练习一

    --  1.写一个查询,显示所有员工姓名,部门编号,部门名称。
        select e.ename 员工姓名, e.deptno 部门编号, d.dname 部门名称
          from emp e, dept d
         where e.deptno = d.deptno;
    
    --  2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,
    ->  工作地点,奖金
        select e.ename 员工姓名, d.loc 工作地点, e.comm 奖金
          from emp e, dept d
         where e.deptno = d.deptno
           and e.comm is not null;
    
    --  3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
        select e.ename 员工姓名, d.loc 工作地点
          from emp e, dept d
         where e.deptno = d.deptno
           and e.ename like '%A%';
    
  • 练习二

    --  1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,
    ->  按照工资等级进行升序排序。
        select e.empno 员工编号,
               e.ename 员工姓名,
               e.sal   工资,
               s.grade 工资等级,
               d.loc   工作城市
          from emp e, dept d, salgrade s
         where e.deptno = d.deptno
           and e.sal between s.losal and s.hisal
         order by s.grade;
    
  • 练习三

    --  1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,
    ->  以及他们的经理姓名,经理编号。
        select e.ename   员工姓名,
               e.empno   员工编号,
               mgr.ename 经理姓名,
               e.mgr     经理编号
          from emp e, dept d, emp mgr
         where e.deptno = d.deptno
           and e.mgr = mgr.empno
           and d.loc in ('NEW YORK', 'CHICAGO');
    
    --  2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
        select e.ename   员工姓名,
               e.empno   员工编号,
               mgr.ename 经理姓名,
               e.mgr     经理编号
          from emp e, dept d, emp mgr
         where e.deptno = d.deptno
           and e.mgr = mgr.empno(+)
           and d.loc in ('NEW YORK', 'CHICAGO')
         order by e.empno; 
    
    --  3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来
        select e.empno 员工编号,
               e.ename 员工姓名,
               d.dname 部门名称
          from emp e, dept d
         where e.deptno = d.deptno(+);
    
  • 练习四

    --  使用SQL-99写法,完成如下练习
    --  1.创建一个员工表和部门表的交叉连接。
        select * from emp cross join dept;
    
    --  2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,
    ->  部门名称,入职日期
        select e.ename 员工姓名, d.dname 部门名称, e.hiredate 入职日期
          from emp e natural
          join dept d;
    
    --  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 (e.deptno = d.deptno)
          join salgrade s
            on (e.sal between s.losal and s.hisal)
         where d.loc = 'CHICAGO';
    
    --  5.使用左连接,查询每个员工的姓名,经理姓名,
    ->  没有经理的King也要显示出来。
        select e.ename 员工姓名, mgr.ename 经理姓名
          from emp e
          left outer join emp mgr
            on (e.mgr = mgr.empno);
    
    --  6.使用右连接,查询每个员工的姓名,经理姓名,
    ->  没有经理的King也要显示出来。
        select e.ename 员工姓名, mgr.ename 经理姓名
          from emp mgr
          right outer join emp e
            on (e.mgr = mgr.empno);
    

– 课后作业

--  1.显示员工SMITH的姓名,部门名称,直接上级名称
    select e.ename 员工姓名, d.dname 部门名称, mgr.ename 直接上级名称
      from emp e, dept d, emp mgr
     where e.deptno = d.deptno
       and e.mgr = mgr.empno
       and e.ename = 'SMITH';

--  2.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
    select e.ename 员工姓名,
           d.dname 部门名称,
           e.sal   工资,
           s.grade 工资级别
      from emp e, dept d, salgrade s
     where e.deptno = d.deptno
       and e.sal between s.losal and s.hisal
       and s.grade > 4;

--  3.显示员工KING和FORD管理的员工姓名及其经理姓名。
    select e.ename 员工姓名, mgr.ename 经理姓名
      from emp e, emp mgr
     where e.mgr = mgr.empno(+)
       and (mgr.ename in ('KING', 'FORD') or
           e.ename in ('KING', 'FORD'));

    select e.ename 员工姓名, 
      case 
      when mgr.ename is null then
           'No Mgr' 
      else mgr.ename
      end 经理姓名
      from emp e 
      full outer join emp mgr 
        on (e.mgr = mgr.empno) 
     where mgr.ename in ('KING', 'FORD')
        or e.ename in ('KING', 'FORD');

--  4.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早
    select e.ename      员工姓名,
           e.hiredate   参加工作时间,
           mgr.ename    经理姓名,
           mgr.hiredate 参加工作时间
      from emp e, emp mgr
     where e.mgr = mgr.empno
       and e.hiredate < mgr.hiredate;

你可能感兴趣的:(Oracle数据库学习笔记)