1. 程式人生 > >oracle筆記(9)---- 史上最全oracle練習題

oracle筆記(9)---- 史上最全oracle練習題

13.列出所有員工及直接上級的姓名
Select e.ename, nvl (m.ename, '沒有上級') mname from emp e left join emp m on e.mgr = m.empno


14.列出受僱日期早於其直接上級的所有員工的編號,姓名,部門名稱
select e.empno,e.ename,t.dname from emp e join emp a on e.hiredate < a.hiredate and e.mgr = a.empno join dept  t on e.deptno = t.deptno;


15.列出部門名稱和這些部門的員工資訊,同時列出那些沒有員工的部門.
select a.*,t.dname  from emp a right join dept t on t.deptno = a.deptno;


16.列出至少有一個員工的所有部門
Select dname, count(*) from emp e join dept d on e.deptno = d.deptno group by dname


17.列出薪金比"SMITH"多的所有員工資訊.
select * from emp where sal > (select sal from emp where ename = 'SMITH');


18.列出所有"CLERK"(辦事員)的姓名及其部門名稱,部門的人數.
1.首先獲得"CLERK"(辦事員)的姓名、部門編號
select e.deptno,e.ename,e.job from emp e where e.job = 'CLERK';
2.其次獲得相對應部門名稱
select t.deptno,t.dname,n.job,n.ename from dept t right join (select e.deptno,e.ename,e.job from emp e where e.job = 'CLERK') n on  n.deptno = t.deptno
3.其次各部門的人數
select count(*) tt ,j.dname from emp v join dept j on v.deptno = j.deptno group by j.dname
4.最後查詢出結果
select t1.ename,t1.deptno,t1.dname, t2.tt from
(select t.deptno,t.dname,n.job,n.ename from dept t join (select e.deptno,e.ename,e.job from emp e where e.job = 'CLERK') n on  n.deptno = t.deptno) t1
 join 
(select count(*) tt ,j.dname from emp v join dept j on v.deptno = j.deptno group by j.dname ) t2
on
t1.dname = t2.dname;


19.列出最低薪金大於1500的各種工作及從事此工作的全部僱員人數.
1.獲得薪水大於1500 的工作名稱 
select e.job from emp e group by e.job having min(sal) > 1500
2.獲得每個員工的工作人數
select count(*) cc from emp group by job 
3.獲得結果
select t1.job,t2.cc from (select e.job from emp e group by e.job having min(sal) > 1500) t1 join (select count(*) cc ,job from emp group by job 
) t2 on t1.job = t2.job


20.列出在部門"SALES"<銷售部>工作的員工的姓名,假定不知道銷售部的部門編號.
1.首先要獲得銷售部的部門編號
select deptno from dept where dname = 'SALES'
2.根員工表關聯。獲得員工的姓名
select * from emp where deptno = (select deptno from dept where dname = 'SALES')


21.列出與"SCOTT"從事相同工作的所有員工及部門名稱.
第一種方法:逐步分析
1.列出所有"SCOTT"的部門編號及從事的工作
select job from emp where ename = 'SCOTT'
2.列出從事‘SCOTT’的工作一樣的員工
select * from emp  where job = (select job from emp where ename = 'SCOTT') and ename != 'SCOTT'
3.關聯部門表。獲得部門名稱.並且排除SCOTT
select dname,t1.* from dept t  right join (select * from emp  where job = (select job from emp where ename = 'SCOTT') and ename != 'SCOTT') t1 on t.deptno = t1.deptno 


第二種方法:比較簡潔(推薦使用)
Select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno and e.job = (Select job from emp where ename = 'SCOTT') and e.ename != 'SCOTT'


22.列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金.
Select ename, sal from emp where sal in (Select distinct sal from emp where deptno = 30)


23.列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金.部門名稱.
第一種方法:
1.首先獲得部門30工作的所有員工的薪水.獲得最大值
select max(sal) from emp where deptno = '30'
2.獲得結果
select e.ename,e.sal,t.dname from emp e,dept t where e.sal > (select max(sal) from emp where deptno = '30') and e.deptno =t.deptno
第二種方法:
Select ename, sal from emp where sal > (Select max(sal) maxSal from emp where deptno = 30) and deptno != 30


第三種方法:
Select e.ename, e.sal, d.dname from emp e join dept d on e.deptno = d.deptno where e.sal > (Select max(sal) maxSal from emp where deptno = 30) and e.deptno != 30