(一)、假设已经创建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);