Oracle上機練習題(二)
試卷總分:100
答題時間:240分鐘
一、根據scott賬號的下各個表,完成如下SQL語句題
1.
列出至少有一個僱員的所有部門[3分]
select distinct dname from dept where deptno in(select distinct deptno from emp);
2.
列出薪金比"SMITH"多的所有僱員[3分]
select ename, sal from emp where sal>(select sal from emp where ename = 'SMITH');
3.
列出入職日期早於其直接上級的所有僱員[3分]
select ename from emp where hiredate<(select hiredate from emp where empno = E.MGR);
4.
找員工姓名和直接上級的名字[3分]
select emp,ename as 員工姓名,MGR,ename as 經理姓名 from emp,(select ename,empno from emp) MGR where emp.MGR=MGR.EMPNO(+);
5.
顯示部門名稱和人數[3分]
select dname 部門名稱, cou 人數 from dept d,(select deptno,count(empno) cou from emp group by deptno) e where d.deptno=e.deptno;
6.
顯示每個部門的最高工資的員工[3分]
select * from emp where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);
7.
顯示每個部門的工資前2名的員工[3分]
select ename,sal,deptno from emp e where (select count(empno) from emp where deptno=e.deptno and sal>e.sal)<=1;
8.
顯示出和員工號7369部門相同的員工姓名,工資[3分]
select ename,sal from emp where deptno=(select deptno from emp where empno=7369);
9.
顯示出和姓名中包含"W"的員工相同部門的員工姓名[3分]
select ename from emp where deptno=(select deptno from emp where ename like '%W%');
10.
顯示出工資大於平均工資的員工姓名,工資[3分]
select ename,sal from emp where sal>(select avg(sal) from emp);
11.
顯示出工資大於本部門平均工資的員工姓名,工資[3分]
select ename,sal from emp e where sal>(select avg(sal) from emp where deptno=e.deptno);
12.
顯示員工"KING"所管理的員工姓名[3分]
select ename from emp where mgr=(select empno from emp where ename='KING');
13.
顯示每位經理管理員工的最低工資,及最低工資者的姓名[3分]
select sal,ename from emp where(mgr,sal) in (select mgr,min(sal) from emp group by mgr);
14.
顯示比工資最高的員工參加工作時間晚的員工姓名,參加工作時間[3分]
select ename,hiredate from emp where hiredate>(select hiredate from emp where sal=(select max(sal) from emp));
15.
顯示出平均工資最高的的部門平均工資及部門名稱[3分]
select avg(sal),dname from emp e,dept d where e.deptno=d.deptno group by e.deptno,dname having avg(sal)=(select max(avg(sal)) from emp group by deptno);
16.
顯示平均工資爲>2000的職位[3分]
select job,avg(sal) from emp group by job having avg(sal)>2000;
17.
計算工資在2000以上,各種職位的平均工資大於3000的職位及平均工資[3分]
select job,avg(sal) from emp where sal>2000 group by job having avg(sal)>3000;
18.
找每個部門的最高和最低的工資[3分]
select deptno,max(sal),min(sal) from emp group by deptno;
19.
找每個部門中每種職位的最高和最低的工資[3分]
select deptno,job,max(sal),min(sal) from emp group by deptno,job;
20.
顯示出工作名稱(job)中包含"MAN"的員工平均工資,最高工資,最低工資及工資的和[3分]
select avg(sal),max(sal),min(sal),sum(sal) from emp where job like '%MAN%';
21.
顯示出20號部門的員工人數[3分]
select count(1) from emp where deptno=20;
22.
顯示出平均工資大於2000的部門名稱及平均工資[3分]
select dname,avg(sal) from emp,dept where emp.deptno=dept.deptno group by dname having avg(sal)>2000;
23.
顯示每個部門每種工作平均工資大於2500的部門及工作[3分]
select deptno,job from emp group by deptno,job having avg(sal)>2500;
24.
顯示出工作名稱中包含"MAN",並且平均工資大於1000的工作名稱及平均工資[3分]
select job,avg(sal) from emp where job like '%MAN%' group by job having avg(sal)>1000;
25.
顯示出平均工資最高的的部門平均工資[3分]
select max(avg(sal)) from emp group by deptno;
26.
列出最低工資大於1500的各種工作[3分]
select job,min(sal) from emp group by job having min(sal)>1500;
27.
列出各部門的員工數量及平均工作年限[3分]
select count(empno),avg(months_between(sysdate,hiredate)/12) from emp group by deptno;
二、按照以下題意完成操作。
請按照如下表格式,按照要求操作數據:
student --學生表
xh char(4), --學號
xm varchar2(10), --姓名
sex char(2), --性別
birthday date, --日期
sal number(7,2) --獎學金
studentcid number(2) --學生班級號
班級class
classid number(2), --班級編號
cname varchar2(20) --班級名字
ccount number(3) --班級人數
1.
添加三個班級信息爲:
1,JAVA1班,null
2,JAVA2班,null
3,JAVA3班,null[1分]
insert into class values(1,'Java1班',null);
insert into class values(2,'Java2班',null);
insert into class values(3,'Java3班',null);
2.
添加學生信息'A001','張三','男','01-5月-05',100,Java1班[1分]
insert into student values('A001','張三','男','01-5月-05',10,1);
3.
修改ORACLE的默認時間格式爲:'yyyy-mm-dd'
添加學生信息如下:'A002','MIKE','男','1905-05-06',10[1分]
alter session set nls_date_format='yyyy-mm-dd';
insert into student values('A002','MIKE','男','1905-05-06',10,1);
4.
插入部分學生信息:'A003','JOHN','女'[1分]
insert into student(xh,xm,sex) values('A003','JOHN','女');
5.
將A001學生性別修改爲‘女’[1分]
update student set sex='女' where xh='A001';
6.
將A001學生信息修改如下:性別爲男,生日設置爲1980-04-01[1分]
update student set sex='男',birthday='1980-04-01' where xh='A001';
7.
將生日爲空的學生班級修改爲Java3班[1分]
update student set classid=3 where birthday is null;
8.
請使用一條SQL語句,使用子查詢,更新班級表中每個班級的人數字段[3分]
update class set ccount=(select count(1) from student where ccount=class.studentcid);
三、按照以下題意,完成SQL語句操作。
建立以下表
CREATE TABLE copy_emp (
empno number(4),
ename varchar2(20),
hiredate date default sysdate ,
deptno number(2),
sal number(8,2));
1.
表copy_emp中插入數據,要求sal字段插入空值,部門號50,參加工作時間爲2000年1月1日,其他字段隨意[1分]
insert into copy_emp(empno,ename,hiredate,deptno,sal) values(1,'a','01-1月-00',50,null);
2.
表copy_emp中插入數據,要求把emp表中部門號爲10號部門的員工信息插入[1分]
insert into copy_emp(empno,ename,hiredate,deptno,sal) select empno,ename,hiredate,deptno,sal where deptno=10;
3.
修改copy_emp表中數據,要求10號部門所有員工漲20%的工資[1分]
update copy_emp set sal=sal*1.2 where deptno=10;
4.
修改copy_emp表中sal爲空的記錄,工資修改爲平均工資[1分]
update copy_emp set sal=(select avg(sal) from copy_emp) where sal is null;
5.
工資爲平均工資的員工,工資修改爲空,參加工作時間修改爲默認值[1分]
update copy_emp set='',hiredate=default where sal=(select avg(sal) from copy_emp);
6.
另外打開窗口2查看以上修改[1分]
sqlplus;
7.
執行commit,窗口2中再次查看以上信息[1分]
commit;
8.
刪除工資爲空的員工信息[1分]
delete from copy_emp where sal is null;
9.
執行rollback[1分]
rollback;