【sql语句】实验四 SQL综合练习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40307434/article/details/84574340

(一)、假设已经创建S、C、SC表,并插入下列数据:
学生表S (S#,SNAME,AGE,SEX):(S#)
课程表C (C#, CNAME, TEACHER):(C#)
选课关系表SC (S#, C#, GRADE):(S#,C#)
1、 检索选修课程名为MATHS的学生学号和姓名;

select x.s#,x.sname 
from s x, sc y, c z
where x.s#=y.s# and y.c#=z.c# and z.cname='MATHS';

2、 检索选修课程号为C2或C4的学生学号(区分大小写);

select distinct x.s#
from s x,sc y
where x.s#=y.s# and y.c#='C2' or y.c#='C4';

3、 检索LIU老师教的课程号和课程名;

select c#,cname
from c
where teacher='LIU';

4、 检索不学C2的学生姓名与年龄;

select distinct x.sname, x.age
from s x, sc y
where y.c# not in('C2');

5、 为SC表按学号降序和课程号降序建唯一索引;

create index ind_sc on sc(s# desc, c# desc);

6、 修改S表,增加SDEPT列(SDEPT表示学生所在的系);

alter table sc
add sdept char(30);

7、 创建关于学生学号和平均成绩的视图;

create view s_avg
as select s# sno, avg(grade) avg
from sc
group by s#;

(二)已知公司的三个表信息,向每个表中插入适当的数据。
员工表EMP1(EID, ENAME, BDATE, SEX, CITY),
部门表DEPT1(DID, DNAME, DCITY),
工作表WORK(EID,DID,STARTDATE,SALARY)。各个字段说明如下:
注:EID——员工编号,最多6个字符。例如A00001(主键)
ENAME——员工姓名,最多10个字符。例如SMITH
BDATE——出生日期,日期型
SEX——员工性别,单个字符。F或者M
CITY——员工居住的城市,最多20个字符。例如:上海
DID——部门编号,最多3个字符。例如 A01 (主键)
DNAME——部门名称,最多20个字符。例如:研发部门
DCITY——部门所在的城市,最多20个字符。例如:上海
STARTDATE——员工到部门上班的日期,日期型
SALARY——员工的工资。整型。

请使用ORACLE的sql*plus 完成下列的操作
1、 列出员工编号以字母P至S开头的所有员工的基本信息。

select * from emp1
where eid like 'P%' or eid like 'Q%' or eid like 'R%' or eid like 'S%';

2、 删除年龄超过60岁的员工。

delete from emp1
where months_between( sysdate, bdate)/12>60;

3、 为工龄超过10年的职工增加10%的工资。

update work
set salary=salary*1.1
where months_between(sysdate,startdate)/12>10;

4、 查询拥有最多的员工的部门的基本信息(要求只取出一个部门的信息),如果有多个部门人数一样,那么取出部门编号最小的那个部门的基本信息。

①	create view vw_maxemp(did,empno)
as select did,count(*)
from work
group by did;
②	select * from dept1
where did in(	select min(did)
from vw_maxemp
              	where empno=(select max(empno) from vw_maxemp));

5、 查询部门人数大于5的每个部门的编号,名称,人数。

select * from dept1
where did in( select did
              from vw_maxemp
              where empno>5);

6、 查询部门人数大于5的每个部门的最高工资,最低工资。

①	create view vw_maxemp2(did,empno)
as select did,count(*)
from work
group by did
having count(*)>5;
②	select did,min(salary),max(salary)
from work
group by did
having did in(select did from vw_maxemp2);

猜你喜欢

转载自blog.csdn.net/qq_40307434/article/details/84574340