您的位置:首页 > 数据库 > Oracle

Oracle数据库上机练习2

2019-04-27 12:57 363 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NSJim/article/details/89600370

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;

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: