oracle習題集-高級查詢2
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,(selectdeptno,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 * from (select rownum ro, x.* from x) where ro>=2 and ro<=5; 3. 替換x,得到最終結果: Select * from (select rownum ro, x.* from(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) 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 join (Select 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