准备工作:脚本文件xkgl.sql下载:xkgl脚本.sql
1、新建一个视图V1记录1998年出生的女生信息,包括学号,姓名,性别,出生日期,并且要求透过该视图进行的更新操作只涉及1998年出生的女生。
提示:更新操作只涉及1998年出生的女生, 即检查视图!with check optin
代码:
create view v1 as select StudentID,StudentName,Sex,Birth from student where year(Birth)=1998 with local check option;
结果截图:
2、新建一个视图V2记录副教授的授课情况。
代码:
create view V3 as select CourseName,max(grade),min(grade),avg(grade) from grade join course on grade.CourseID=course.CourseID
group by CourseName;
结果截图:
3、新建一个视图V3记录各个选修课程的最高分,最低分和平均分。
代码:
create view V3
as
select CourseName,max(grade),min(grade),avg(grade)
from grade join course on grade.CourseID=course.CourseID
group by CourseName;
结果截图:
4、修改第2题中的视图定义改为记录讲师的授课情况
代码:
create or replace view V2 as select
CourseName,BookNmae,credit,Teachername,ClassName from teacher join schedule on teacher.TeacherID=schedule.TeacherID
join course on course.CourseID=schedule.CourseID join class
on
class.ClassID=schedule.ClassID where Profession='讲师';
结果截图:
5、通过第1题中的视图向student表中插入一条记录(St0109020005,zhangsan,女,1998-09-09)。
代码:
insert into V1 values('St0109020005','zhangsan','女','1998-09-09');
结果截图:
6、通过第1题中的视图将student表中的St0109020005号学生的姓名改为刘晨。
代码:
update V1 set StudentName='刘晨'
where StudentID='St0109020005';
结果截图:
7、通过第1题中的视图删除student表中的St0109020005号学生记录。
代码:
delete from V1 where StudentID='St0109020005';
结果截图:
8、利用SQL同时删除第2题和3题中的视图。
代码:
drop view V2,V3;
结果截图:
【分析与思考】
1、 通过视图中插入的数据能进入到基本表中去吗?
答:会的,对DBMS而言,对视图的操作最终都会转化为对基本表的操作
2、with check option能起什么作用?
答:WITH CHECK OPTION 表示对UPDATE、INSERT和DELETE操作时保持更新、插入或删除的行满足视图定义的谓词条件(即子查询中的条件表达式);
3、修改基本表的数据会自动反映到相应的视图中去吗?
答:如果视图中数据是来自于一个表时,修改视图中的数据,表数据会更新。而且修改表中数据时,对应视图也会更新。但是如果视图数据来源于两个表时,修改视图数据时会报错,无法修改。
4、哪些视图中的数据不可以增删改操作?
答:(1)视图中的select语句包含聚合函数、列的运算、 group by 子句或distinct选项;
(2)from 子句中包含多个表或者union运算符;
(3)指定了with check option,修改后的数据不满足视 图定义的范围;
(4)执行update、delete命令时,所删除与更新的数据 未包含在视图的结果集中。