国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-09 13:30:09
字體:
來源:轉載
供稿:網友

1.取得每個部門最高薪水的人員名稱

      第一步:取得每個部門的最高薪水

      select max(sal) from emp group by deptno;

第二步:根據第一步的結果和員工表進行關聯,獲取人員名稱

select a.empno,a.ename,a.sal,a.deptno from emp a join (select deptno, max(sal) max_sal from emp group by deptno ) b on a.deptno= b.deptno and a.sal = b.max_sal;

2.哪些人的薪水在部門的平均薪水之上

      第一步:獲取每個部門的平均薪水

      Select deptno, avg(sal) avgSal from emp group bydeptno

      第二步:根據第一步的結果和員工表進行關聯。獲取人員名稱

3.取得部門中(所有人的)平均的薪水等級

第一步:獲得所有人的薪水等級

select e.empno,e.ename,e.deptno,g.grade from emp e join salgrade g on e.sal  between g.losal and g.hisal 

第二步:將第一步的結果用部門進行分組。然后獲取等級的平均值

select s.deptno ,avg(grade) from (select e.empno,e.ename,e.deptno,g.grade from emp e join salgrade g on e.sal  between g.losal and g.hisal ) s group by s.deptno

4.不準用組函數(Max),取得最高薪水

第一種方法:

第一步:將員工薪水降序排列

select empno,ename,sal from emp order by sal desc

第二步:取得第一條數據

select a.empno,a.ename,a.sal from (select empno,ename,sal from emp order by sal desc) a where rownum < = 1;

第二種方法:

第一步:將emp表當做2張表來處理。使用的笛卡爾乘積的方法進行比較。得到最大值以外的值。select distinct a.sal from emp a join emp b on a.sal < b.sal 第二步:獲得最大值select a.sal,a.empno,a.ename from emp a where sal not in (select distinct a.sal from emp a join emp b on a.sal < b.sal );第三種方法:第一步:將emp表當做2張表來處理。使用的笛卡爾乘積的方法進行比較。從大到小排序select distinct a.sal from  emp a join emp b on a.sal > b.sal 第二步:取得第一條數據select  sal from (select distinct a.sal from  emp a join emp b on a.sal > b.sal ) where rownum <= 1

5,取得平均薪水最高的部門的部門編號。第一種方法:第一步:取得各部門的平均薪水。按desc排序。取得最大值select e.deptno, avg(e.sal) avg_sal from emp e group by e.deptno  order by avg_sal desc ;第二步:取得第一條數據select a.deptno, a.avg_sal from (select e.deptno, avg(e.sal) avg_sal from emp e group by e.deptno  order by avg_sal desc ) a where rownum < =1;第二種方法:第一步:取得各部門的平均薪水select avg(sal) avg_sal,e.deptno from emp e group by deptno;第二步:使用聚合函數獲得平均薪水最大值select max(avg_sal) from (select  avg(sal) avg_sal,e.deptno from emp e group by deptno)第三步:將第一步和第二步獲取的結果進行關聯select m.deptno from (select  avg(sal) avg_sal,e.deptno from emp e group by deptno) m right join (select max(avg_sal) max_sal from (select  avg(sal) avg_sal,e.deptno from emp e group by deptno)) non m.avg_sal = n.max_sal第三種方法:第一步:獲得各部門的最大值select max(avg(sal)) from emp m group by deptno;第二步:使用having過濾。獲得最大值select a.deptno,avg(sal) avg_sal from emp a group by deptno   having avg(sal)  = (select max(avg(sal)) from emp m group by deptno);6.取得平均薪水最高的部門的部門名稱

第一種方法:

第一步:取得各部門的平均薪水

select e.deptno ,avg(sal) avg_sal from emp e group by deptno order by avg_sal desc;

第二步:取得各部門的平均薪水最大值

select m.deptno, avg_sal from (select e.deptno ,avg(sal) avg_sal from emp e group by deptno order by avg_sal desc) m where rownum <=1 ;

第三步:跟部門表關聯。獲得部門名稱

select t.deptno,t.dname from dept t 

right join  (select m.deptno, avg_sal from (select e.deptno ,avg(sal) avg_sal from emp e group by deptno order by avg_sal desc) m where rownum <=1) non t.deptno = n.deptno;

第二種方法:

第一步:獲得最高部門編號。和平均值最大值

select max(avg(sal)) from emp e  group by deptno;

第二步:關聯部門表

select  t.dname,a.sal from dept t right join emp a on t.deptno = a.deptno where a.sal = (select max(avg(sal)) max_sal from emp e  group by deptno);

第三種方法:

第一步:獲取平均薪水最高的部門編號

select e.deptno from emp e group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno);

第二步:跟部門表關聯

select t.dname,t.deptno from dept t where t.deptno = (select e.deptno from emp e group by deptno having avg(sal) = (select max(avg(sal)) from emp group by deptno));

7.求平均薪水的等級最低的部門的部門名稱。

第一種方法:

第一步:獲得平均薪水最低的部門編號,升序排列

select m.deptno from (   select e.deptno, avg(sal) avg_sal from emp e group by deptno order by avg_sal asc) m where rownum <= 1;

第二步:獲得平均薪水級別最低的 部門編號 及平均薪水 及等級 

select s.grade,m.deptno,avg_sal from salgrade s

right join 

( select e.deptno, avg(sal) avg_sal from emp e group by deptno order by avg_sal asc) m on avg_sal 

between s.losal and s.hisal

where rownum < = 1

第三步:跟部門表關聯。獲得部門名稱

select t.dname ,t.deptno ,avg_sal from dept t right join   ( select s.grade,m.deptno,avg_sal from salgrade s right join ( select e.deptno, avg(sal) avg_sal from emp e group by deptno order by avg_sal asc) m on avg_sal

between s.losal and s.hisal where rownum < = 1)  n on t.deptno = n.deptno;

8.取得比普通員工(員工代碼沒有在mgr字段上出現的)的最高薪水還要要的經理人姓名

第一步:獲得經理人編號

select distinct mgr from emp  where mgr is not null;

第二步:普通員工薪水不在mgr字段里邊的

select max(sal) max_sal from emp e where e.empno not in (select distinct mgr from emp  where mgr is not null);

第三步:獲得還要高的薪水經理人的姓名

select sal ,ename from emp s where  s.sal >(select max(sal) max_sal from emp e where e.empno not in (select distinct mgr from emp  where mgr is not null))

9.取得薪水最高的前五名員工

第一種方法:使用rownum排序

select * from (

select rownum r, t.*

from

  (

   select ename, sal from emp order by sal desc

  )    t

  where rownum <=5

)wherer>  0

第二種方法:

第一步:取得員工的最高薪水

select sal from emp order by sal desc ;

第二步:獲得前5名薪水

select sal from (select sal from emp order by sal desc ) where rownum <= 5;

第三步:跟員工表自關聯 獲得名稱

select e.ename,e.sal from emp e where e.sal in (select sal from (select sal from emp order by sal desc ) where rownum <= 5) order by sal desc;

10.取得薪水最高的第六到第十名員工

第一步:取得全部薪水

select sal,ename from emp order by sal desc

第二步:獲得薪水第1名到第10名的員工薪水和姓名

select rownum r , ename ,sal from (select sal,ename from emp order by sal desc)where rownum <= 10

第三步:排除前5個

select t.* from (select rownum r , ename ,sal from (select sal,ename from emp order by sal desc)where rownum <= 10) t where r>5

11.取得最后入職的5名員工

第一步:降序排序最后入職

select ename,hiredate from emp order by hiredate desc;

第二步:獲得最后5名員工

select ename,hiredate from (select ename,hiredate from emp order by hiredate desc) where rownum <= 5;

12.取得每個薪水等級有多少員工

第一步:取得每個員工的薪水等級

select s.grade,t.ename,t.sal from salgrade s join (select ename,sal from emp) t on t.sal between s.losal and s.hisal

第二步:獲得每個薪水等級的員工個數

select count(*),m.grade from (select s.grade,t.ename,t.sal from salgrade s join (select ename,sal from emp) t on t.sal between s.losal and s.hisal) m group by m.grade

13.列出所有員工及直接上級的姓名Select e.ename, nvl (m.ename, '沒有上級') mname from emp e left join emp m on e.mgr = m.empno14.列出受雇日期早于其直接上級的所有員工的編號,姓名,部門名稱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 dname17.列出薪金比"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.deptno3.其次各部門的人數select count(*) tt ,j.dname from emp v join dept j on v.deptno = j.deptno group by j.dname4.最后查詢出結果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 ) t2ont1.dname = t2.dname;19.列出最低薪金大于1500的各種工作及從事此工作的全部雇員人數.1.獲得薪水大于1500 的工作名稱 select e.job from emp e group by e.job having min(sal) > 15002.獲得每個員工的工作人數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.job20.列出在部門"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.關聯部門表。獲得部門名稱.并且排除SCOTTselect 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

24.列出在每個部門工作的員工數量,平均工資和平均服務期限.Select d.dname 部門名稱, count(e.empno) 員工數量, avg(e.sal) 平均工資 from  emp e, dept d where e.deptno = d.deptno group by d.dnameSelect d.dname 部門名稱, count(e.empno) 員工數量, round(avg(e.sal),2) 平均工資,  round (avg( (sysdate-hiredate)/365), 0) 平均服務期限 from  emp e, dept d where e.deptno = d.deptno group by d.dname25.列出所有員工的姓名、部門名稱和工資。select e.ename , t.dname , e.sal  from emp e , dept t where e.deptno = t.deptno 26.列出所有部門的詳細信息和人數select t.* , (select count(e.empno) from emp e where e.deptno =t.deptno ) 人數  from dept t27.列出各種工作的最低工資及從事此工作的雇員姓名select job, min(sal) minsal from emp a group by jobselect e.* from emp e join (select job, min(sal) minsal from emp a group by job) mon e.job = m.job and e.sal = m.minsal28。列出各個部門的MANAGER(經理)的最低薪金select  min(e.sal) 最低薪水 ,e.deptno from emp e ,emp k where e.mgr = k.empno group by e.deptno29.列出所有員工的年工資,按年薪從低到高排序select ename,(sal+nvl(comm,0))*12 sal_year from emp order by sal_year 30.查出某個員工的上級主管,并要求出這些主管中的薪水超過3000.select e.ename,e.empno,e.mgr,e.sal,f.ename,f.sal from emp e left join emp f on e.mgr = f.empno where f.sal>300031.求出部門名稱中,帶'S'字符的部門員工的工資合計、部門人數.第一種方法:1.求出部門員工的工資合計和部門人數select sum(e.sal),count(e.empno) from emp e group by e.deptno2.跟部門表關聯select t.dname 部門名稱 ,sumsal 工資合計 ,tt 部門人數 from dept t left join (select e.deptno, sum(e.sal) sumsal ,count(e.empno) tt from emp e group by e.deptno) non t.deptno =n.deptno where t.dname like '%S%';第二種方法:Select d.dname, sum(e.sal), count(e.empno) from emp e right join dept d on e.deptno = d.deptno where d.dname like '%S%' group by d.dname32.給任職日期超過25年的員工加薪10%.Select * from emp where months_between(sysdate, hiredate)/12 > 25Update emp set sal = sal*1.1 where months_between(sysdate, hiredate)/12 > 25

33.選擇部門30中的所有員工select * from emp where deptno = '30'34.列出所有辦事員(CLERK)的姓名,編號和部門編號select e.empno, e.ename, e.deptno from emp e join dept t on e.deptno =t.deptno where e.job = 'CLERK'35.找出傭金高于薪金的員工.select empno,ename from emp where comm > sal36.找出傭金高于薪金的60%的員工.select empno,ename from emp where comm > sal*0.637.找出部門10中所有經理(MANAGER)和部門20中所有辦事員(CLERK)的詳細資料.select * from emp where (deptno = '10' and job = 'MANAGER') or(deptno = '20' and job='CLERK')38.找出部門10中所有經理(MANAGER),部門20中所有辦事員(CLERK),既不是經理又不是辦事員但其薪金大于或等于2000的所有員工的詳細資料.select * from emp where (( deptno = '10' or deptno = '20')  and (job <> 'MANAGER' and job <>'CLERK') ) and (sal >= 2000)39.找出收取傭金的員工的不同工作,按降序排列select distinct * from  emp where nvl(comm,0) > 0 order by comm desc40.找出不收取傭金或收取的傭金低于100的員工select * from emp where nvl(comm,0) < 10041.找出各月倒數第3天受雇的所有員工.并且按月降序排序select empno,ename,last_day(hiredate)-3 from emp order by  to_char(hiredate,'mm') desc42。找出早于12年前受雇的員工. 并且按年來分組,倒序排序select * from emp where months_between(sysdate,hiredate)/12 >12 order by to_char(hiredate,'yyyy') desc43.以首字母大寫的方式顯示所有員工的姓名.select empno, initcap(ename) from emp44.顯示正好為5個字符的員工的姓名select ename from emp where length(ename) = 545.顯示不帶有"R"的員工的姓名.select ename from emp where ename not like '%R%';46.顯示所有員工姓名的前三個字符.select substr(ename,1,3) from emp;47.顯示所有員工的姓名,用a替換所有"A"select replace(ename,'A','a') from emp 48.顯示滿10年服務年限的員工的姓名和受雇日期.select ename, hiredate from emp where months_between(sysdate,hiredate)/12 >= 1049.顯示員工的詳細資料,按姓名排序.select * from emp order by ename 50.顯示員工的姓名和受雇日期,根據其服務年限,將最老的員工排在最前面.select ename,hiredate from emp order by months_between(sysdate,hiredate)/12 desc51.顯示所有員工的姓名、工作和薪金,按工作的降序排序,若工作相同則按薪金排序.select ename ,job,sal from emp order by job,sal asc52.顯示所有員工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同則將最早年份的員工排在最前面.select ename ,to_char(hiredate,'yyyy') year , to_char(hiredate,'mm') months from emp order by months , year asc ;53.顯示在一個月為30天的情況所有員工的日薪金,保留2位小數.select ename,round(sal/30,2 )dailysal from emp54.找出在(任何年份的)2月受聘的所有員工。select * from emp where to_char(hiredate,'mm') = 255.對于每個員工,顯示其加入公司的天數,不帶余數select ename,round(sysdate-hiredate,0) 天數 from emp56.顯示姓名字段的任何位置包含"A"的所有員工的姓名,如果相同位置的按名字排序select ename from emp where ename like '%A%'order by ename57.以年月日的方式顯示所有員工的服務年限.select ename,to_char(hiredate,'yyyy/mm/dd') from emp
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 木兰县| 夹江县| 巴彦县| 大丰市| 香格里拉县| 沂南县| 宜宾县| 慈利县| 谷城县| 周宁县| 墨玉县| 常德市| 新巴尔虎左旗| 南丹县| 个旧市| 合川市| 云林县| 同心县| 荣昌县| 呼伦贝尔市| 彭水| 滨州市| 成都市| 高平市| 乐至县| 黔西| 晋州市| 繁昌县| 昭觉县| 荣成市| 红原县| 河间市| 蚌埠市| 普定县| 彰武县| 英山县| 安岳县| 新乡县| 泸西县| 长寿区| 安岳县|