2018/12/20 oracle-sql練習
--查詢比自己職位平均工資高的員工姓名、職位
--,部門名稱,職位平均工資
select ename,sal,emp.deptno,avgsal
from emp,(select deptno,avg(sal) avgsal
from emp
group by deptno) xb
where emp.deptno=xb.deptno
and sal>avgsal;
--查詢職位和經理同員工scott或blake完全相同的員工姓名、
--職位,不包括scott和blake本人
select ename,job,mgr
from emp
where (job,mgr) in(select job,mgr
from emp
where ename='SCOTT' or ename='BLAKE');
--查詢不是經理的員工姓名
select ename from
emp
where ename not in (select distinct e.ename--子查詢查詢出是經理的員工姓名
from emp e join emp ee
on e.empno=ee.mgr);
--查詢入職日期最早的前五名員工姓名,入職日期。
select ename,hiredate
from (select ename,hiredate
from emp
order by hiredate asc)
where rownum<=5;
--查詢工作在CHICAGO並且入職日期最早的前2名員工姓名,入職日期
select ename,hiredate
from(select ename,hiredate
from emp join dept
on emp.deptno=dept.deptno
where loc='CHICAGO'
order by hiredate asc)
where rownum<=2;
--分頁查詢
--emp總共14行,如果每頁顯示5行,要查詢第三頁
--(介於11行到15行之間,由於emp只有14行只顯示到14行)
select b.*
from (select ename,deptno,rownum rn
from emp
where rownum<=3*5) b
where rn>2*5;
--第二種寫法
select b.*
from (select ename,deptno,rownum rn
from emp) b
where rn <=3*5 and rn>2*5;
--第一種效率更高,如果子查詢中一共有100行,要查詢第三頁,
--第一種方法先查詢出rownum小於等於15的所有行然後在外部查詢出rownum大於10的行
--第二種方法先在子查詢裡查詢出所有的100行,再在外部查詢查詢出rownum大於10小於等於15的行
--按照每頁顯示5條記錄,分別查詢第1頁,第2頁,第3頁資訊,
--要求顯示員工姓名,入職日期、部門名稱
--第1頁
select b.*
from (select ename,hiredate,dname,rownum rn
from emp join dept
on emp.deptno=dept.deptno
where rownum<=1*5) b
where rn>0*5
--第2頁
select b.*
from (select ename,hiredate,dname,rownum rn
from emp join dept
on emp.deptno=dept.deptno
where rownum<=2*5) b
where rn>1*5
--第3頁
select b.*
from (select ename,hiredate,dname,rownum rn
from emp join dept
on emp.deptno=dept.deptno
where rownum<=3*5) b
where rn>2*5
--按照每頁顯示5條記錄,分別查詢工資最高的第1頁,第2頁
--第3頁資訊,要求顯示員工姓名,入職日期、部門名稱、工資
--第1頁
select b.*,rownum
from(select a.*,rownum rn
from (select ename,hiredate,dname,sal
from emp e join dept d
on e.deptno=d.deptno
order by sal desc
) a
where rownum<=1*5
) b
where rn>0*5
--第2頁
select b.*,rownum
from(select a.*,rownum rn
from (select ename,hiredate,dname,sal
from emp e join dept d
on e.deptno=d.deptno
order by sal desc
) a
where rownum<=2*5
) b
where rn>1*5
--第3頁
select b.*,rownum
from(select a.*,rownum rn
from (select ename,hiredate,dname,sal
from emp e join dept d
on e.deptno=d.deptno
order by sal desc
) a
where rownum<=3*5
) b
where rn>2*5
--查詢工資高於編號為7782的員工工資,並且和7369編號的員工
--從事相同工作的員工編號、姓名以及工資
select ename,empno,sal
from emp
where sal>(select sal
from emp
where empno=7782)
and
job=(select job
from emp
where empno=7369)
--查詢工資最高的員工和工資
select ename,sal
from emp
where sal=(select max(sal)
from emp);
--查詢部門最低工資高於10號部門最低工資的部門編號、
--名稱以及部門最低工資
select d.deptno,dname,min(sal)
from emp e join dept d
on d.deptno=e.deptno
group by d.deptno,dname
having min(sal)>(select min(sal)
from emp
where deptno=10)
--查詢員工工資為其他部門最低工資的員工的編號及姓名及工資
select empno,ename,sal
from emp
where sal in (select min(sal)
from emp
group by deptno)
--顯示經理室king的員工姓名,工資
select ename,sal
from emp
where mgr=(select empno
from emp
where ename='KING')
--顯示比SMITH入職時間晚的員工姓名,工資,入職時間
select ename,sal,hiredate
from emp
where hiredate>(select hiredate
from emp
where ename='SMITH');
--使用子查詢的方式查詢那些職員在NEWYORK工作
select ename
from emp e join dept d
on e.deptno=d.deptno
where d.loc=(select loc
from dept
where loc='NEW YORK')
--寫一個查詢 顯示和員工SMITH工作在同一個部門的員工姓名,
--僱傭如期,查詢結果中排出SMITH
select ename,hiredate
from emp e join dept d
on e.deptno=d.deptno
where ename <> 'SMITH' and
loc=(select loc
from emp e join dept d
on e.deptno=d.deptno
where ename='SMITH')
--寫一個查詢顯示其工資比全體職員平均工資高的員工編號、
--姓名
select empno,ename,sal
from emp
where sal>(select avg(sal)
from emp)
--寫一個查詢顯示其上級領導是king的員工姓名,工資
select ename,sal
from emp
where mgr=(select empno
from emp
where ename='KING')
--顯示所有工作在RESEARCH部門的員工姓名,職位
select ename,job
from emp e join dept d
on e.deptno=d.deptno
where dname='RESEARCH'
--查詢每個部門的部門編號、平均工資,要求部門的
--平均工資高於部門20的平均工資
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>(select avg(sal)
from emp
group by deptno
having deptno=20)
--查詢大於自己部門平均工資的員工姓名,工資,所在部門
--平均工資,高於部門平均工資的額度
select ename,sal,dname,d.deptno
from emp e join (select deptno,avg(sal) avgsal
from emp
group by deptno) b
on e.deptno=b.deptno
join dept d
on b.deptno=d.deptno
where sal>avgsal;
--列出至少有一個僱員的所有部門
select deptno,count(*)
from emp
group by deptno
having count(*)>=1
--列出薪金比'SMITH'多的所有僱員
select ename,sal
from emp
where sal>(select sal
from emp
where ename='SMITH')
--找員工姓名和直接上級的名字
select e.ename 上級名字,ee.ename 員工名字
from emp e join emp ee
on e.empno=ee.mgr
--顯示部門名稱和人數
select dname,count(*)
from emp e join dept d
on e.deptno=d.deptno
group by dname;
--顯示每個部門的最高工資的員工
select ename,sal,e.deptno
from emp e,(select deptno,max(sal) maxavg
from emp
group by deptno) b
where e.deptno=b.deptno and e.sal=b.maxavg
--顯示出和員工號7369部門相同的員工姓名,工資
select ename,sal
from emp
where deptno=(select deptno
from emp
where empno=7369)
--顯示出和姓名中包含'W'的員工相同部門的員工姓名
select ename
from emp
where deptno in (select deptno
from emp
where ename like '%W%')
--顯示出工資大於平均工資的員工姓名,工資
select ename,sal
from emp
where sal>(select round(avg(sal),2)
from emp)
--顯示出工資大於本部門平均工資的員工姓名,工資
select e.ename,e.sal
from emp e join (select deptno,avg(sal) avgsal
from emp
group by deptno) b
on e.deptno=b.deptno
where sal>avgsal;
--顯示每位經理管理員工的最低工資,及最低工資的員工姓名
select a.empno,b.salary
from emp a join (select e.empno,min(ee.sal) salary
from emp e join emp ee
on e.empno=ee.mgr
group by e.empno) b
on a.mgr=b.empno
where sal=salary;
--顯示比工資最高的員工入職時間晚的員工姓名,入職時間
select ename,hiredate
from emp
where hiredate>(select hiredate
from emp
where sal=(select max(sal)
from emp))
--顯示出平均工資最高的部門平均工資及部門名稱
select d.dname,avgsal
from(select *
from(select deptno,avg(sal) avgsal
from emp
group by deptno
order by avgsal desc)
where rownum=1) b join dept d
on b.deptno=d.deptno;