oracle一些常見題目

對於嵌套子查詢的練習

–1.求部門中薪水最高的人

select *
  from emp e
  join (select max(e.sal) max from emp e group by e.deptno) m
    on m.max = e.sal;

–2.求部門平均薪水的等級

select m.*, sg.grade
  from (select avg(e.sal) sal, e.deptno from emp e group by e.deptno) m
  join salgrade sg
    on m.sal between sg.losal and sg.hisal;

–3.求部門平均的薪水等級

select m.*, sg.grade
  from (select avg(m.avg) sal
          from (select avg(e.sal) avg, e.deptno dp
                  from emp e
                 group by e.deptno) m) m
  join salgrade sg
    on m.sal between sg.losal and sg.hisal;

–4.僱員中有哪些人是經理人

select *
  from (select distinct e.mgr no from emp e where e.mgr is not null) m
  join emp e
    on e.empno = m.no;

–5.不準用組函數,求薪水的最高值

select e1.* from emp e1 where e1.sal >= all (select e.sal sal from emp e);

–6.求平均薪水最高的部門的部門編號

select e.dp
  from (select max(m.avg) max
          from (select avg(e.sal) avg from emp e group by e.deptno) m) m
  join (select avg(e.sal) avg, e.deptno dp from emp e group by e.deptno) e
    on e.avg = m.max;

–組函數嵌套寫法(對多可以嵌套一次,group by 只對內層函數有效)

–7.求平均薪水最高的部門的部門名稱

select d.dname
  from (select e.dp dp
          from (select max(m.avg) max
                  from (select avg(e.sal) avg from emp e group by e.deptno) m) m
          join (select avg(e.sal) avg, e.deptno dp
                 from emp e
                group by e.deptno) e
            on e.avg = m.max) m
  join dept d
    on d.deptno = m.dp
    ;

–8.求平均薪水的等級最低的部門的部門名稱

select d.dname
  from (select n.dp dp
          from (select max(m.avg) max
                  from (select avg(e.sal) avg from emp e group by e.deptno) m) m
          join (select avg(e.sal) avg, e.deptno dp
                 from emp e
                group by e.deptno) n
            on m.max = n.avg) m
  join dept d
    on d.deptno = m.dp;

–9.求部門經理人中平均薪水最低的部門名稱

select d.dname
  from (select n.dp dp
          from (select min(m.avg) min
                  from (select avg(m.sal) avg
                          from (select e.sal sal,e.deptno dp
                                  from (select distinct e.mgr no
                                          from emp e
                                         where e.mgr is not null) m
                                  join emp e
                                    on e.empno = m.no) m
                         group by m.dp) m) m
          join (select avg(m.sal) avg, m.deptno dp
                 from (select e.sal sal, e.deptno deptno
                         from (select distinct e.mgr no
                                 from emp e
                                where e.mgr is not null) m
                         join emp e
                           on e.empno = m.no) m
                group by m.deptno) n
            on m.min = n.avg) m
  join dept d
    on d.deptno = m.dp;

–10.求比普通員工的最高薪水還要高的經理人名稱(not in)

select e.ename
  from (select m.no no
          from (select e.sal sal, e.empno no
                  from (select distinct e.mgr no
                          from emp e
                         where e.mgr is not null) m
                  join emp e
                    on e.empno = m.no) m
          join (select max(m.sal) max
                 from (select e.sal sal
                         from emp e
                        where e.empno not in
                              (select distinct e.mgr no
                                 from emp e
                                where e.mgr is not null)) m) n
            on m.sal > n.max) m
  join emp e
    on e.empno = m.no;

–11.求薪水最高的前5名僱員

select m.*
  from (select rownum r, m.*
          from (select * from emp e order by e.sal desc) m) m
 where m.r <= 5;

–12.求薪水最高的第6到第10名僱員(important)

select m.*
  from (select rownum r, m.*
          from (select * from emp e order by e.sal desc) m) m
 where m.r > 5
   and m.r <= 10;

–13.求最後入職的5名員工

select m.*
  from (select rownum r, m.*
          from (select * from emp e order by e.hiredate desc) m) m
 where m.r <= 5;

對於以上習題,肯定還有更好和更簡便的實現方式,本人只是練習使用嵌套子查詢的使用,個人覺得這種查詢很基礎。


下面再多寫個行轉列吧

題目:

建表

create table STUDENT_SCORE
(
name VARCHAR2(20),
subject VARCHAR2(20),
score NUMBER(4,1)
)

– 添加數據

insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '語文', 78.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '數學', 88.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '英語', 98.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '語文', 89.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '數學', 76.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '英語', 90.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '語文', 99.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '數學', 66.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '英語', 91.0);

– 希望得到下面的結果
– 姓名 語文 數學 英語
– 王五 89 56 89

使用case when then end

select ss.name,
max(case
  when ss.subject = '語文' then
  ss.score
end) 語文,
max(case
  when ss.subject = '數學' then
  ss.score
end) 數學,
max(case
  when ss.subject = '英語' then
  ss.score
end) 英語
from student_score ss
group by ss.name;

使用decode

select ss.name,
max(decode(ss.subject, '語文', ss.score)) 語文,
max(decode(ss.subject, '數學', ss.score)) 數學,
max(decode(ss.subject, '英語', ss.score)) 英語
from student_score ss
group by ss.name;

使用多條子查詢

select m1.name, m1.sc, m2.sc, m3.sc
from (select ss.name, ss.score sc
    from student_score ss
    where ss.subject = '語文') m1
join (select ss.name, ss.score sc
    from student_score ss
    where ss.subject = '數學') m2
on m1.name = m2.name
join (select ss.name, ss.score sc
    from student_score ss
    where ss.subject = '英語') m3
on m2.name = m3.name;
發佈了37 篇原創文章 · 獲贊 23 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章