Oracle之複雜查詢
阿新 • • 發佈:2019-01-02
例項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;