1. 程式人生 > >oracle習題集-高級查詢2

oracle習題集-高級查詢2

isa 技術 not in 年齡 職位 cname arch null value

1.列出員工表中每個部門的員工數和部門編號

Select deptno,count(*) from emp group by deptno;

2.列出員工表中,員工人數大於3的部門編號和員工人數

Select deptno,count(*) from emp group by deptno having count(*)>3;

3.列出員工表中,員工人數大於3的部門的部門編號,部門名稱和部門位置

答案1
1
. Select deptno,count(*) from emp group by deptno having count(*)>3;--x 2
. select d.* from dept d ,(Select deptno,count(*) from emp group by deptno having count(*)>3)x where x.deptno=d.deptno;
答案2:
select * from dept
where deptno in (select deptno from emp group by deptno having count(*)>3);

4.列出員工表中,員工人數大於3的部門的部門編號,名稱,位置和員工人數

Select d.*,x.co 
from dept d,(select
deptno,count(*) co from emp group by deptno having count(*)>3)x
where d.deptno=x.deptno;
(註意看聚合函數的處理方式)

5. 列出員工表中每個部門的員工數(員工數必須大於3),和部門名稱

select * from dept d,(select deptno,count(*) from emp group by deptno having count(*)>3)x where d.deptno=x.deptno;

6. 找出工資比JONES多的員工

Select
* from emp where sal>(select sal from emp where ename=’JONES’);

7.列出所有員工的姓名和其上級的姓名(表的自連接)

Select w.ename,m.ename from emp w,emp m where w.mgr=m.empno;

8.以職位分組,找出平均工資最高的兩種職位

select * 
from (select job,avg(sal) from emp group by job order by avg(sal) desc)
where rownum<=2;

9.查找出不在部門20,且比部門20中任何一個人工資都高的員工的姓名、部門名稱

(1)    
select e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.deptno<>20 and e.sal>all(select sal from emp where deptno=20); (2)
(1)
select e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.deptno<>20 and e.sal>(select max(sal) from emp where deptno=20);

10.得到平均工資大於2000的工作職種

select job,avg(sal) 
from emp 
group by job 
having avg(sal)>2000;

11. 分部門得到工資大於2000的所有員工的平均工資,並且平均工資還要大於2500

Select deptno,avg(sal) from emp where sal>2000 group by deptno having avg(sal)>2500
select deptno ,avg (sal) avg 
from emp 
where sal>2000---x

group by deptno ; 
select * from x where x.avg>2500;

12.得到每個月工資總數最少的那個部門的部門編號,部門名稱,部門位置

--拿著最低工資和去找編號,拿到編號在去到編號部門,部門名稱,部門位置
select
min(sum(sal)) from emp3 group by deptno;---x select deptno from emp3 group by deptno having sum(sal)=(select min(sum(sal)) from emp3 group by deptno)x;--w select * from dept where deptno in(select deptno from emp3 group by deptno having sum(sal)=(select min(sum(sal)) from emp3 group by deptno));

13. 分部門得到平均工資等級為3級(等級表)的部門編號

select deptno ,avg(sal) from emp group by deptno --e

select e.* ,s.grade 
from salgrade s,(select deptno ,avg(sal)avg_sal from emp group by deptno)e
where e.avg_sal between s.losal and s.hisal and s.grade=3;

14. 查找出部門10和部門20中,工資最高第3名到第5名的員工的員工名字,部門名字,部門位置

select emp.*from emp order by sal desc;---排序--x

select rownum ro,x.* from (select emp.*from emp order by sal desc)x-- rownum加入--w

select * 
from (select rownum ro,x.* from (select emp.*from emp order by sal desc)x)w 
where ro >=3 and ro<=5; --取3-5行 --e

-- 表連接
select e.ename ,d.dname,d.loc
from dept d ,(select * 
from (select rownum ro,x.* from (select emp.*from emp order by sal desc)x)w 
where ro >=3 and ro<=5)e
where e.deptno=d.deptno;

15.查找出收入(工資加上獎金),下級比自己上級還高的員工編號,員工名字,員工收入

1
select
w.* from emp w,emp m where w.mgr = m.empno and w.sal+nvl(w.comm,0) > m.sal+nvl(m.comm,0);
2
Select ename,sal+nvl(comm,0) from emp w where (sal+nvl(comm,0))>(select sal+nvl(comm,0) from emp m where w.mgr=m.empno);

16 .查找出工資等級不為4級的員工的員工名字,部門名字,部門位置

1
select
e.deptno,e.ename,s.grade from emp e ,salgrade s where e.sal between s.losal and s.hisal;--x select x.ename,d.dname,d.loc,x.grade from (select e.deptno,e.ename,s.grade from emp e ,salgrade s where e.sal between s.losal and s.hisal)x,dept d where x.deptno=d.deptno and x.grade <> 4; 2 Select e.ename,d.dname,d.loc,s.grade
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal and s.grade<>4;

17. 查找出職位和‘MARTIN’或者‘SMITH’一樣的員工的平均工資

select job from emp where ename in(MARTIN,SMITH);

select avg(sal) from emp 
where job in(select job from emp where ename in(MARTIN,SMITH))

18.查找出不屬於任何部門的員工

Select * from emp where deptno is null;

19. 按照部門統計員工數,查出員工數最多的部門的第二名到第五名(列出部門名字,部門位置)

思路:子查詢—行內視圖
1. 列出每個部門的員工人數,並且按照員工人數進行降序排列   ---x
Select deptno,count(*) cou from emp group by deptno order by count(*) desc;
2. 將x與dept表做表連接    ---m
Select x.cou dept.* from x,dept where x.deptno=dept.deptno;
3.取出結果集的第二條到第五條記錄
Select * from (select rownum ro,m.* from m) where m.ro>=2 and m.ro<=5;
4.替換,得到最終的結果。
Select * 
from (select rownum ro,m.*
    from (Select x.cou dept.* from (Select deptno,count(*) cou from emp group by deptno order by count(*) desc)x,dept
    where.deptno=dept.deptno)m)
where m.ro>=2 and m.ro<=5;
select deptno,count(*)
from emp
group by deptno
order by count(*) desc --x

select rownum ro,x.*
from (select deptno,count(*)
from emp
group by deptno
order by count(*) desc)x --e

select d.deptno,d.loc
from (select rownum ro,x.*
    from (select deptno,count(*)
    from emp
    group by deptno
    order by count(*) desc)x)e,dept d
where e.deptno=d.deptno and (ro between 2 and 2)
思路2:
1.  先做表連接,表連接之後分組,求count(*),最後安裝count(*)進行降序排列,得到視圖X
Select e.deptno,count(*),d.dname,d.loc 
from emp e,dept d 
where d.deptno=e.deptno 
group by e.deptno,d.dname,d.loc 
order by count(*) desc;
2.    取出視圖x的第二到第五行
Select * 
fromselect rownum ro, x.* from x)
where ro>=2 and ro<=5;
3.    替換x,得到最終結果:
Select * 
fromselect rownum ro, x.* 
       fromSelect e.deptno,count(*),d.dname,d.loc 
             from emp e,dept d 
             where d.deptno=e.deptno 
             group by e.deptno,d.dname,d.loc 
             order by count(*) desc) x
             )
where ro>=2 and ro<=5;

20. 查出KING所在部門的工作年限最大的員工名字

select * 
from emp
where deptno =(select deptno from emp where ename=KING)
order by hiredate  -- x

select x.*,rownum ro
from (select * 
     from emp
     where deptno =(select deptno from emp where ename=KING)
     order by hiredate)x   --w
     
select w.ename
from (select x.*,rownum ro
      from (select * 
           from emp
           where deptno =(select deptno from emp where ename=KING)
           order by hiredate)x)w
where ro=1;

21 查出工資成本最高的部門的部門號和部門名稱

select deptno,sum(sal)
from emp 
group by deptno
order by sum(sal) desc --x

select x.deptno,d.dname
from (select deptno,sum(sal)
      from emp 
      group by deptno
      order by sum(sal) desc)x,dept d
where x.deptno=d.deptno and rownum=1

22. 顯示與Blake在同一部門工作的雇員的工作和受雇日期,Blake不包含在內

Select ename,job,hiredate 
from emp 
where deptno=(select deptno from emp where ename=’BLAKE’) and ename<>’BLAKE’;

23.顯示被King直接管理的雇員的姓名以及工資

select ENAME,SAL 
from EMP 
where MGR=(SELECT EMPNO FROM EMP WHERE ENAME=’KING’);

24.顯示能獲得與Scott一樣工資和獎金的其他雇員的姓名、受雇日期以及工資。

SELECT ENAME,JOB,SAL 
FROM EMP 
WHERE (SAL,nvl(COMM,0))=select sal,nvl(comm,0) 
                             from emp 
                             where ename=’SCOTT’)AND ENAME<>’SCOTT’;

面試題1

技術分享圖片

create table emp5(
id number(2),
name varchar2(5)
)


create table sext(
id number(2),
sex varchar(2)
)

insert into emp5 
select 1,A from dual union
select 2,B from dual union
select 3,C from dual union
select 4,D from dual ;

insert into sext 
select 1, from dual union
select 4, from dual union
select 5, from dual 
 ;

1. 找出忘記填寫性別的員工(用兩種方法)

(1)
select
e.*,s.sex from emp5 e left join sext s on e.id=s.id --x select id ,name from (select e.*,s.sex from emp5 e left join sext s on e.id=s.id)x where x.sex is null (2) select * from emp1 where id not in(select id from sext); (3) select id from emp1 minus select id from sext;

面試題2

技術分享圖片

create table AAA(
mc varchar2(3),
sl number(3)
)
create table BBB(
mc varchar(3),
sl number(3)
)


insert into AAA
select A,100 from dual union
select B,120 from dual
  
  
  
insert into BBB
select A,10 from dual union
select A,20 from dual union
select B,10 from dual union
select B,20 from dual union
select B,30 from dual ;

1.用一條SQL語句計算出商品A,B目前還剩多少

用一條SQL語句計算出商品A,B目前還剩多少

select mc,sum(sl) sum_sl
from BBB 
group by mc --x

select a.mc,a.sl-x.sum_sl 
from AAA a,(select mc,sum(sl) sum_sl
            from BBB 
            group by mc)x
where a.mc=x.mc;

面試題三

人員情況表(employee)中字段包括:員工號(ID),姓名(name),年齡(age),文化程度(wh):包括四種情況(本科以上,大專,高中,初中以下),
現在我要根據年齡字段查詢統計出:表中文化程度為本科以上,大專,高中,初中以下,各有多少人,占總人數多少。結過如下: 學歷 年齡 人數 百分比 本科以上
20 34 14 大專 20 33 13 高中 20 33 13 初中以下 20 100 40 本科以上 21 50 20

Select wh as 學歷,age as 年齡,count(*) as 人數,round(count(*)/(select count(*) from employee)*100) as 百分比 
from employee 
group by  age,wh;

面試題 四

四張表:學生表student(sid, sname),教師表teacher(tid, tname),課程表course(cid,cname,ctype),選課表choose_course(ccid,sid,tid,cid)

創建表

create table  student(
sid number(2),
sname varchar2(5)
)

create table teacher(
tid number(2),
tname varchar2(5)
)

create table course(
cid number(2),
cname varchar2(5),
ctype varchar2(5)
)
create table choose_course( ccid number(2), sid number(2), tid number(2), cid number(2) )

插入記錄

Insert into student values(1, ‘小明‘);
Insert into student values(2, ‘小花‘);

Insert into teacher values(1, ‘陳紅‘);
Insert into teacher values(2, ‘陳白‘);

Insert into course values(1, ‘語文‘ ,‘文科‘);
Insert into course values(2, ‘數學‘,‘理科‘);

--小明選了陳紅老師的語文
Insert into choose_course values(1,1,1,1);
--小明選了陳紅老師的數學
Insert into choose_course values(2,1,1,2);
--小花選了陳紅老師的數學
Insert into choose_course values(3,2,1,2);
--小明選了陳白老師的語文
Insert into choose_course values(4,1,2,1);
--小花選了陳紅老師的語文
Insert into choose_course values(5,2,1,1);

  

1.查找陳紅老師教的學生是哪些?

1
select
distinct ch.sid from teacher t,choose_course ch where t.tid=ch.tid and t.tname=陳紅 --x select s.sid,s.sname from student s where sid in(select distinct ch.sid from teacher t,choose_course ch where t.tid=ch.tid and t.tname=陳紅 )
2
Select s.sid,s.sname from student s,choose_course cc,teacher t where s.sid=cc.sid and cc.tid=t.tid and t.tname=’陳紅’;

2.找學生小明所有的文科老師

1
1)學生表和選課表相連---x select s.*,cc.* from student s,choose_course cc where s.sid=cc.sid; (2) 將(1)的結果與course表相連---m Select c.*,x.* from course c,x where c.cid=x.cid; (3) 將(2)的結果與teacher表相連 Select t.*,m.* from course teacher,m where t.tid =m.tid; (4) 替換,得到最終結果: Select t.* from teacher inner joinSelect c.*,x.* from course c,(select s.*,cc.* from student s,choose_course cc where s.sid=cc.sid)x where c.cid=x.cid)m on t.tid=m.tid where m.sname=’小明’,m.type=’文科’; 2 Select * from student s,choose_course cc, teacher t, course c where s.sid=cc.sid and cc.tid=t.tid and cc.cid=c.cid and s.name=‘小明’and c.type=’文科’;

3.教的學生最少的老師是哪位?

最少的老師可以大於兩個
教學生最少的個數-匹配的老師的id-找老師的姓名

select min(count(*))
from choose_course 
group by tid  --x


select tid 
from choose_course
group by tid
having count(*) = (select min(count(*))
                from choose_course 
                group by tid
                );--w

select * 
from teacher
where tid in (select tid 
              from choose_course
              group by tid
              having count(*) = (select min(count(*))
                              from choose_course 
                              group by tid
                              ))

面試題五

用一條SQL語句,查詢出每門課都大於80分的學生姓名
Name        kecheng        fenshu
張三        語文        81
張三        數學        75
李四        語文        76
李四        數學        90
王五        語文        81
王五        數學        100
王五        英語        90

Select name from stu where name not in(select name from stu where fenshu<80);

華為面試題

一個表中的id有多條記錄,把所有這個id的記錄查出來,並顯示共有多少條記錄?

Select id,count(*) from 表名 group by id

oracle習題集-高級查詢2