1. 程式人生 > >Oracle之複雜查詢

Oracle之複雜查詢

例項1:列出薪資高於在部門30工作的所有員工的薪資的員工姓名和薪資,部門名稱,部門人數。
-emp 表:姓名,薪資,部門人數;
-dept 表:部門名稱;

第一步:找出30部門的所有僱員的工資,返回多行單列

select sal from emp where deptno=30

第二步:返回多行單列,只能在where子句裡面使用子查詢(in,any, all),應該使用>all ,找到員工的姓名,薪資;

select e.ename, e.sal
from emp e
where sal>all(
  select sal 
  from emp
  where
deptno=30 );

第三步:還需查詢到部門資訊,,在from子句之後引入dept表(一定存在關聯欄位或關聯條件);

select e.ename, e.sal ,d.dname
from emp e, dept d
where sal>all(
    select sal 
    from emp
    where deptno=30 ) 
    AND e.deptno=d.deptno ;

第四步:隨後要統計部門人數

select deptno dno , count(empno) count
from emp
group by deptno;

第五步:以上查詢返回的是多行多列的資料,按照使用原則應該在from子句中使用。

select e.ename, e.sal ,d.dname, temp.count
from emp e, dept d, (
    select deptno dno , count(empno) count
    from emp
    group by deptno ) temp
where sal>all(
    select sal 
    from emp
    where deptno=30 )
    AND e.deptno=d.deptno 
    AND temp.dno=d.deptno ;

例項2:列出與“SCOTT”從事相同工作的所有員工及部門名稱,部門人數,領導姓名。

第一步:找到scott的工作,返回單行單列,一般用於where或having 上,此處沒有統計需要,所以只在where子句上使用;

 select job from  emp where ename='SCOTT';

第二步:找到符合此要求的僱員資訊;

select e.ename, e.job ,e.sal
from emp e
where e.job=(
    select job from  emp where ename='SCOTT');

第三步:查詢到對應的部門名稱資訊,並消除笛卡爾積;

select e.ename, e.job ,e.sal, d.dname
from emp e, dept d
where e.job=(
    select job from  emp where ename='SCOTT')
    AND e.deptno=d.deptno;

第四步:部門人數單獨進行統計操作;

select e.ename, e.job ,e.sal, d.dname ,temp.count
from emp e, dept d,(
     select deptno dno,count(empno) count
     from emp
     group by deptno) temp
where e.job=(
    select job from  emp where ename='SCOTT')
    AND e.deptno=d.deptno
    AND d.deptno=temp.dno;

第五步:查找出僱員對應的領導資訊,使用emp,自身關聯操作;

select e.ename, e.job ,e.sal, d.dname ,temp.count, m.ename
from emp e, dept d,(
    select deptno dno,count(empno) count
    from emp
    group by deptno) temp ,emp m
where e.job=(
    select job from  emp where ename='SCOTT')
    AND e.deptno=d.deptno
    AND d.deptno=temp.dno
    AND e.mgr=m.empno;

第六步:消除掉scott資料

 select e.ename, e.job ,e.sal, d.dname ,temp.count, m.ename
 from emp e, dept d,(
     select deptno dno,count(empno) count
     from emp
     group by deptno) temp ,emp m
 where e.job=(
     select job from  emp where ename='SCOTT')
     AND e.deptno=d.deptno
     AND d.deptno=temp.dno
     AND e.mgr=m.empno
     AND e.ename<>'SCOTT'

例項3:列出所有“CLERK”(辦事員)的姓名及其部門名稱。部門人數,工資等級。

第一步:找到所有辦事員的姓名;

select e.ename from emp e where e.job='CLERK';

第二步:找到部門名稱;

select e.ename,d.dname
from emp e ,dept d
where e.job='CLERK'
    AND e.edptno=d.deptno;

第三步:統計部門人數;

select e.ename,d.dname,temp.count
from emp e ,dept d,(
    select deptnno dno,count(empno) count
    from emp
    group by deptno) temp
where e.job='CLERK'
    AND e.edptno=d.deptno
    AND d.deptno=temp.dno;

第四步:查詢工資等級;

select e.ename,d.dname,temp.count,s.grade
from emp e ,dept d,(
    select deptnno dno,count(empno) count
    from emp
    group by deptno) temp,salgrade s
where e.job='CLERK'
    AND e.edptno=d.deptno
    AND d.deptno=temp.dno
    AND e.sal BETWEEN s.losal AND s.hisal;