• oracle复杂查询的练习题


    练习一、列出薪金高于在部门30工作的所有员工的薪金的员工的姓名、薪金、部门名称、部门人数
    思考步骤:
    1、确定需要使用的数据表
            一、emp:员工的姓名、薪金
            二、dept : 部门表:部门名称
            三、emp: 部门人数:需要使用统计字段
    2、确定已知的关联字段
            关联字段:emp.deptno=dept.deptno
     
    1、查询出部门30工作的所有员工的薪金
          select sal from emp where deptno=30;   ---查询出来的数据为多行单列数据,需要大于这里面的所有数据,需要  all
     
    2、找出大于以上条件的所有的人员信息
    select ename ,sal
    from emp
    where sal >all(select sal from emp where deptno=30)    ---重点:>all   where 子句嵌套
     
    3、显示部门名称---需要关联dept表
    select e.ename ,e.sal ,d.dname
    from emp e,dept d
    where e.sal >all(
    select sal from emp where deptno=30 )
           and e.deptno=d.deptno;                                -----注意,在from后面的逗号,不能多加逗号
     
    4、统计部门人数:
    select e.ename ,e.sal ,d.dname, temp.count
    from emp e,dept d,(
    select deptno,count(empno)count  from emp group by deptno) temp
    where e.sal >all(
    select sal from emp where deptno=30 )
           and e.deptno=d.deptno
        and e.deptno=temp.deptno;
     
    ----注意两点:如果需要统计人数,则需要进行分组
                           但是在使用分组的时候,select子句中只能出现分组的字段与统计函数,而不能出现其他我们需要的字段,因此,我们采用from的子句进行操作,现将其分组后作为一个临时表再进行关联操作
           注意,有几个关联的动作就需要做几次字段关联来消除笛卡尔积
     
     
     
    练习二:列出与‘Scott’从事相同工作的所有员工及部门名称、部门人数、领导姓名。
         确定要使用的数据表:
          1、emp:确定工作、员工姓名、领导姓名需要根据编码显示出来
          2、dept:确定部门的名称
           3、部门人数
     
        确定已知的关联字段:
           emp.deptno=dept.deptno
     
    二、列出与‘Scott’从事相同工作的所有员工及部门名称、部门人数、领导姓名。
     
       确定要使用的数据表:
          1、emp:确定工作、员工姓名、领导姓名需要根据编码显示出来
          2、dept:确定部门的名称
           3、部门人数
     
        确定已知的关联字段:
           emp.deptno=dept.deptno
           emp.mgr=emp.empno ---自身关联很重要
     
    1.试下怎样找出该员工的领导,找出scott的领导
     
    select mgr from emp where ename='SCOTT';
     
    SELECT ename FROM EMP where empno=(select mgr from emp where ename='SCOTT');
     
    2、找出与scott工作相同的同事
    select job from emp where ename ='SCOTT';
     
     
    SELECT ename FROM EMP WHERE JOB =(select job from emp where ename ='SCOTT');
     
    SELECT ename mgrname FROM EMP where empno=(select MGR from emp where ename ='SCOTT');
     
    3、部门名称,需要关联另一张表
    SELECT e.empno, e.ename ,d.dname
    FROM EMP e,dept d
    WHERE JOB =(select job from emp where ename ='SCOTT')
           and e.deptno=d.deptno;
     
    4.部门人数,部门人数需要将数据进行分组,分组后统计
     
    select count(empno) from emp group by deptno; ---将其分组后作为一个新的函数进行关联
     
     
    SELECT e.empno, e.ename ,d.dname, temp.count ,ename mgrname
    FROM EMP e,dept d,(
    select deptno,count(empno) count from emp group by deptno) temp
    WHERE JOB =(select job from emp where ename ='SCOTT')
           and e.deptno=d.deptno
           and e.deptno=temp.deptno;   
     
    ----在select取值的时候,你必须要把你需要使用的字段取出来
     
    5、显示领导,与自身关联
    SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname
    FROM EMP e,dept d,(
    select deptno,count(empno) count from emp group by deptno) temp,emp c
    WHERE e.JOB =(select job from emp where ename ='SCOTT')
           and e.deptno=d.deptno
           and e.deptno=temp.deptno
           and e.mgr=c.empno;   
     
     
    6、去掉重复的信息:
    SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname
    FROM EMP e,dept d,(
    select deptno,count(empno) count from emp group by deptno) temp,emp c
    WHERE e.JOB =(select job from emp where ename ='SCOTT')
           and e.deptno=d.deptno
           and e.deptno=temp.deptno
           and e.mgr=c.empno
           and e.ename!='SCOTT';   
     
     
     
    三、列出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名、部门名称、领导名称、部门人数、平均工资、最高工资、最低工资
             确定要使用的数据表:
                       1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来
                      2、dept:确定部门的名称
                       3、部门人数,根据分组后计算出来
     
        确定已知的关联字段:
           emp.deptno=dept.deptno   
           emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称
           count、max、min 、avg  ----用于计算最高、最低、平均工资
     
     
    练习三:
    列出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名、部门名称、领导名称、部门人数、平均工资、最高工资、最低工资
             确定要使用的数据表:
                       1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来
                      2、dept:确定部门的名称
                       3、部门人数,根据分组后计算出来
     
        确定已知的关联字段:
           emp.deptno=dept.deptno   
           emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称
           count、max、min 、avg  ----用于计算最高、最低、平均工资
     
    1、找出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名
     
     
    select sal from emp where ename='SMITH' or ename ='ALLEN' ;  ----  >any 大于他们中的最小值就可以了
     
     
    select empno ,ename ,sal
    from emp
    where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN');
     
    2、显示部门名称,需要关联dept表
     
    select e.empno ,e.ename ,e.sal ,d.dname
    from emp e, dept d
    where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
        and e.deptno=d.deptno;
     
    3、计算部门人数,需要按照部门分组,显示计算最高工资、最低工资、平均工资
    select deptno, count(empno) from emp group by deptno;
     
    select e.empno ,e.ename ,e.sal ,d.dname ,temp.count, temp.AVG , temp.MAX, temp.MIN
    from emp e, dept d ,(
    select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp
    where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
        and e.deptno=d.deptno
        and e.deptno=temp.deptno;
        
     
    4.显示领导名称
     
    select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN
    from emp e, dept d ,(
    select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c
    where e.sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
        and e.deptno=d.deptno
        and e.deptno=temp.deptno
        and e.mgr=c.empno;
     
    5.去掉重复数据并进行检查
    select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN
    from emp e, dept d ,(
    select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c   ----这边是统计的数据,是不可以直接放在select语句中的,否则会造成其他类型的字段不可以显示
    where e.sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
        and e.deptno=d.deptno
        and e.deptno=temp.deptno
        and e.mgr=c.empno(+)   ---为了将没有领导的员工信息显示出来
        and e.ename not in('SMITH','ALLEN');   ---为了排除题中已涉及的数据(去掉重复)
     
     
     
    练习四:列出受雇佣日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数
        确定要使用的数据表:
                       1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来,及雇佣日期
                      2、dept:确定部门的名称、部门位置
                       3、部门人数,根据分组后计算出来
     
        确定已知的关联字段:
           emp.deptno=dept.deptno   
           emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称
           count、max、min 、avg  ----用于计算最高、最低、平均工资
     
     
    练习四:列出受雇佣日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数
        确定要使用的数据表:
                       1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来,及雇佣日期
                      2、dept:确定部门的名称、部门位置
                       3、部门人数,根据分组后计算出来
     
        确定已知的关联字段:
           emp.deptno=dept.deptno   
           emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称
           count、max、min 、avg  ----用于计算最高、最低、平均工资
     
    1、对雇佣日期进行计算   hiredate  关联自己可以直接使用关系: emp.mgr=emp.empno
     
    select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间
    from emp e,emp c
    where e.hiredate<c.hiredate
        and e.mgr=c.empno;
     
     
    2、显示部门名称与部门位置,需要关联dept表
    select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间 ,d.dname ,d.loc
    from emp e,emp c ,dept d
    where e.hiredate<c.hiredate
        and e.mgr=c.empno
        and e.deptno=d.deptno;
     
    3、计算部门的人数,需要用group by 进行分组
     
    select deptno ,count(empno) count
    from emp
    group by deptno;
     
    select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间 ,d.dname ,d.loc ,temp.count
    from emp e,emp c ,dept d ,(select deptno ,count(empno) count
    from emp
    group by deptno
    ) temp
    where e.hiredate<c.hiredate
        and e.mgr=c.empno
        and e.deptno=d.deptno
        and e.deptno=temp.deptno;
     
     
     
     
     
    练习五:列出所有‘CLERK(办事员)’的姓名及部门名称、部门人数、工资等级
      确定要使用的数据表:
              1、emp:确定员工姓名及工作
              2、dept:确定部门的名称
              3、emp:部门人数,根据分组后计算出来
          4、salgrade:工资等级  grade
     
        确定已知的关联字段:
           emp.deptno=dept.deptno   
           emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称
     
    1、找出所有job为‘CLERK’的员工信息
    select ename , sal
    from emp
    where job='CLERK';
     
    2、显示部门名称,关联dept表
    select e.ename , e.sal ,d.dname
    from emp e ,dept d
    where job='CLERK'
        and e.deptno=d.deptno;
     
    3、计算部门人数,使用group by分组
    select deptno ,count(empno) count
    from emp
    group by deptno
     
    select e.ename , e.sal ,d.dname, temp.count
    from emp e ,dept d ,(
    select deptno ,count(empno) count
    from emp
    group by deptno) temp
    where job='CLERK'
        and e.deptno=d.deptno
        and e.deptno=temp.deptno;
     
     
    4、计算薪资等级
    查询一下scott的工资在几级?
    select s.grade ,e.ename,e.sal
    from salgrade s, emp e
    where  e.sal between s.losal and s.hisal;
     
     
     
    select e.ename , e.sal ,d.dname, temp.count, s.grade
    from emp e ,dept d ,(
    select deptno ,count(empno) count
    from emp
    group by deptno) temp ,salgrade s
    where job='CLERK'
        and e.deptno=d.deptno
        and e.deptno=temp.deptno
        and e.sal between s.losal and s.hisal;
     
     
           
     
     
     
     
     
  • 相关阅读:
    eclipse code templates 设置(eclipse注释模版配置)
    kettle 程序调用执行ktr转换示例代码
    JQuery学习笔记
    获取工程路径(jar和普通文件结构通用) java
    java 获取jar包路径,遍历jar包
    百度跨域ajax
    eclipse Wtp在线安装
    PropertiesHelper
    java base64/jQuery Base64
    Eclipse中,打开文件所在文件夹的插件,及设置
  • 原文地址:https://www.cnblogs.com/Etude/p/9275439.html
Copyright © 2020-2023  润新知