1. 程式人生 > >2018/12/20 oracle-sql練習

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;