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;
 
 
       
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM