一、 实验目的
熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。
二、 实验内容和要求
在实验一所创建的学生数据库中,
1 写出创建满足下述要求的视图的SQL语句,并执行所写代码。
(1)包含学生的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
create VIEW Student1(学号,姓名,所在系,年龄,课程号,课程名,课程学分)
AS
select Student.Sno, Sname,Sdept, Sage,SC.Cno, Cname, Credit
from Student, Course,SC
where Student.Sno = SC.Sno AND SC.Cno = Course.Cno
with check option ;
(2)包含学生的学号、姓名、选修的课程名和考试成绩的视图。
create VIEW Student2(学号,姓名,选修课程名,考试成绩)
AS
select Student.Sno, Sname,Cname, Grade
from Student, Course,SC
where Student.Sno = SC.Sno AND SC.Cno = Course.Cno
with check option ;
(3)统计每个学生的选课门数,要求列出学生学号和选课门数的视图。
create VIEW Student3 (学号,选课门数)
AS
select Sno, COUNT(Cno)
from SC
group by Sno
with check option ;
(4)统计每个学生的修课总学分,要求列出学生学号和总学分的视图(说明:考试成绩大于等于60才可获得此门课程的学分)。
create VIEW Student4(学号,总学分)
AS
select Sno, SUM(Credit)
from SC, Course
where SC.Cno = Course.Cno AND Grade >= 60
group by Sno
with check option ;
2 利用第1题建立的视图,完成如下查询。
(1)查询考试成绩大于等于90分的学生的姓名、课程名和成绩。
select 姓名, 选修课程名,考试成绩
from Student2
where 考试成绩 >= 90 ;
(2)查询选课门数超过3门的学生的学号和选课门数。
select 学号, 选课门数
from Student3
where 选课门数 > 3 ;
(3)查询计算机系选课门数超过3门的学生的姓名和选课门数。
select Student3.学号, 选课门数
from Student3, Student1
where Student3.学号 = Student1.学号 AND 选课门数 > 3 AND 所在系 = '计算机系' ;
(4)查询修课总学分超过10分的学生的学号、姓名、所在系和修课总学分。
select Student4.学号,姓名,所在系,总学分
from Student1 , Student4
where Student1.学号 = Student4.学号 AND 总学分 > 10 ;
(5)查询年龄大于等于20岁的学生中,修课总学分超过10分的学生的姓名、年龄、所在系和修课总学分。
select 姓名,年龄,所在系,总学分
from Student1 , Student4
where Student1.学号 = Student4.学号 AND 总学分 > 10 AND 年龄 >= 20 ;
3.使用WITH CHECK OPTION,在第1题建立的视图(1)的基础上,再创建一个“计算机系”同学的学号、姓名、所在系、年龄,课程号、课程名、课程学分的视图。
(1)增加一条记录,
0841101 张新 计算机系 20 C001 高等数学 4
(2)修改这条记录为
0841101 张新 物理系 20 C001 高等数学 4
以上两个操作是否能够实现?为什么?可以实现的,写出SQL语句。
create VIEW computer(学号,姓名,所在系,年龄,课程号,课程名,课程学分)
AS
select 学号,姓名,所在系,年龄,课程号,课程名,课程学分
from Student1
where 所在系 = '计算机系'
with check option ;
不能实现,视图或函数’computer’ 不可更新,因为修改会影响多个基表。如果computer视图是独立的,使用with check option则第一条语句可以正常插入,第二条语句不可以,因为不是计算机系,不允许插入。
insert
into computer
values('0841101','张新','计算机系',20, 'C001', '高等数学', 4) ;
insert
into computer
values('0841101','张新','物理系',20, 'C001', '高等数学', 4) ;
4.以下操作能否实现,如果能实现,给出相应的SQL语句,否则,解释不能实现的原因。
(1)对Student表,创建一个只包含男生信息的视图。对此视图执行将“李勇”的年龄更新为22岁。
create VIEW BoyInformation(学号,姓名,年龄,所在系)
AS
select Sno, Sname, Sage, Sdept
from Student
where Ssex = '男' ;
update BoyInformation
set 年龄 = 22
where 姓名 = '李勇' ;
(2)在上题创建的视图中。删除“刘晨”同学的记录。
delete
from BoyInformation
where 姓名 = '刘晨' ;
(3)第3题建立的“计算机系”同学的视图,对此视图执行将“李勇”的年龄更新为22岁。
update computer
set 年龄 = 22
where 姓名 = '李勇' ;
(4)第3题建立的“计算机系”同学的视图,对此视图执行删除“刘晨”同学的记录。
delete
from computer
where 姓名 = '刘晨' ;
视图或函数’computer’ 不可更新,因为修改会影响多个基表。
上述诸题,如果能够实现,请给出SQL语句,并对结果截图,如果不能实现,说明原因。
视图设计器的使用: