数据库原理及应用实验报告-实验4-SQL的视图

实验4、SQL的视图

  1. 实验目的

熟悉SQL支持的有关视图的操作,能够熟练使用SQL语句来创建需要的视图,对视图进行查询和删除视图。

    1. 实验内容
    1. 定义常见的视图形式,包括:
  1. 行列子集视图
  2. WITH CHECK OPTION的视图
  3. 基于多个基表的视图
  4. 基于视图的视图
  5. 带表达式的视图
  6. 分组视图
    1. 通过实验考察WITH CHECK OPTION这一语句在视图定义后产生的影响,包括对修改操作、删除操作、插入操作的影响。
    2. 讨论视图的数据更新情况,对子行列视图进行数据更新。
    3. 使用DROP语句删除一个视图,由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除。同样的原因,删除基表时,由该基表导出的所有视图定义都必须显式删除。
    1. 实验步骤
  1. 创建一个行列子集视图xun_CS_View,给出选课成绩合格的学生的编号、教师编号、所选课程号和该课程成绩。
  2. 创建基于多个基本表的视图xun_SCT_View,这个视图由学生姓名和他所选修的课程名及讲授该课程的教师姓名构成。
  3. 创建带表达式的视图xun_EXP_View,由学生姓名及所选课程名和所有课程成绩都比原来多5分这几个属性组成
  4. 创建分组视图xun_Group_View,将学生的学号及他的平均成绩定义为一个视图。
  5. 创建一个基于视图的视图,基于(1)中建立的视图,定义一个包括学生编号、学生所选课程数目和平均成绩的视图VV_View。
  6. 查询所有选修课程“数据库原理及其应用”的学生姓名。
  7. 插入元组(S52,T02,C02,59)到视图xun_CS_View中。若是在视图的定义中存在WITH CHECK OPTION字句对插入操作由什么影响
  8. 将视图xun_CS_View(包括定义WITH CHECK OPTION)中,所有课程编号为C01的课程的成绩都减去5分。这个操作数据库是否会正确执行,为什么?如果加上5分(原来95分以上的不变)呢?
  9. 在视图xun_CS_View(包括定义WITH CHECK OPTION)删除编号S03学生的记录,会产生什么结果?
  10. 删除视图xun_SCT_View和视图xun_CS_View

4.4实验结果

1.代码如下:

create view xun_CS_View
as
select xn_Sno,xn_Tno,xn_Cno,xn_Scroce
from xun_Reports
where xn_Scroce>=60
with  check option

2.代码如下:

create view xun_SCT_View
as 
select xn_Sname,xn_Cname,xn_Tname
from xun_Students,xun_Reports,xun_Courses,xun_Teachers
where xun_Students.xn_Sno=xun_Reports.xn_Sno
and xun_Reports.xn_Cno=xun_Courses.xn_Cno
and xun_Reports.xn_Tno=xun_Teachers.xn_Tno

3.代码如下:

create view xun_EXP_View(xn_Sname,xn_Cname,xn_Scroce)
as
select xn_Sname,xn_Cname,xn_Scroce+5
from xun_Students,xun_Reports,xun_Courses
where xun_Students.xn_Sno=xun_Reports.xn_Sno
and xun_Reports.xn_Cno=xun_Courses.xn_Cno

视图如下:

 

原先的xun_Reports表视图如下,可知成绩xn_Scroce已经加5.

 

4.代码如下:

create view xun_Group_View
as
select xn_Sno,avg(xn_Scroce) avgscore
from xun_Reports
group by xn_Sno

xun_Group_View视图如下:

5.

create view xun_VV_View
as 
select xn_Sno,xn_Cno,avg(xn_Scroce) avgscore
from xun_CS_View
group by xn_Sno,xn_Cno
having avg(xn_Scroce)>=60

6.

select xn_Sname
from xun_Students
where xn_Sno in(
 select xn_Sno
 from xun_Reports
    where xn_Cno in(
    select xn_Cno
    from xun_Courses
    where xn_Cname='数据库原理及其应用'
    )
)

7.

insert into xun_CS_View
values('S52','T02','C02',59)

下会有错误信息弹出,如下:

错误信息:

消息 550,级别 16,状态 1,第 1 行

试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。

语句已终止。

 

因为建立xun_CS_View视图时加了with check option,有限制条件xn_Scroce要大于等于60,但这条记录的成绩不满足要求,所以不能成功插入。

若在建立xun_CS_View视图时不加了with check option,则可以成功插入,但视图不显示。

8.

减5

update xun_CS_View
set xn_Scroce-=5
where xn_Cno='C01'

下会有错误信息弹出,如下:

错误信息:

消息 550,级别 16,状态 1,第 1 行

试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。

语句已终止。

 

因为减5后,有些记录的xn_Scroce值会有小于60,不满足约束要求,所以报错。

加5

update xun_CS_View
set xn_Scroce+=5
where xn_Cno='C01'and xn_Scroce<95

代码正常执行

 视图变为下图:

 加5后,不影响约束条件,所以可以正常执行。

9.

delete
from xun_CS_View
where xn_Sno='S03'

正常执行

10.

drop view xun_CS_View,xun_SCT_View

4.5实验体会:

1.with check option会限制视图的更新update,插入insert和删除delete,需要保证满足视图定义中的谓词条件。

2.不使用with check option语句,但是有谓词条件,不满足谓词条件的操作代码可以正常执行,但是这条数据就不会显示在视图中。

3.基于视图建立的视图和基于表建立视图的操作很相似,基本一样的。

4.使用DROP语句删除一个视图,由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除。

4.6附件:

1.
create view xun_CS_View
as
select xn_Sno,xn_Tno,xn_Cno,xn_Scroce
from xun_Reports
where xn_Scroce>=60
with  check option

2.
create view xun_SCT_View
as 
select xn_Sname,xn_Cname,xn_Tname
from xun_Students,xun_Reports,xun_Courses,xun_Teachers
where xun_Students.xn_Sno=xun_Reports.xn_Sno
and xun_Reports.xn_Cno=xun_Courses.xn_Cno
and xun_Reports.xn_Tno=xun_Teachers.xn_Tno

3.
create view xun_EXP_View(xn_Sname,xn_Cname,xn_Scroce)
as
select xn_Sname,xn_Cname,xn_Scroce+5
from xun_Students,xun_Reports,xun_Courses
where xun_Students.xn_Sno=xun_Reports.xn_Sno
and xun_Reports.xn_Cno=xun_Courses.xn_Cno

4.
create view xun_Group_View
as
select xn_Sno,avg(xn_Scroce) avgscore
from xun_Reports
group by xn_Sno

5.
create view xun_VV_View
as 
select xn_Sno,xn_Cno,avg(xn_Scroce) avgscore
from xun_CS_View
group by xn_Sno,xn_Cno
having avg(xn_Scroce)>=60

6.
select xn_Sname
from xun_Students
where xn_Sno in(
 select xn_Sno
 from xun_Reports
    where xn_Cno in(
    select xn_Cno
    from xun_Courses
    where xn_Cname='数据库原理及其应用'
    )
)


7.
insert into xun_CS_View
values('S52','T02','C02',59)

8.
减5
update xun_CS_View
set xn_Scroce-=5
where xn_Cno='C01'
加5
update xun_CS_View
set xn_Scroce+=5
where xn_Cno='C01'and xn_Scroce<95

9.
delete
from xun_CS_View
where xn_Sno='S03'

10.
drop view xun_CS_View,xun_SCT_View

一、建立以下五个表: 教师表:Teacher,学生表:Student, 课程表:Course,选课表:SC,授课表:TC 二、完成以下查询: 1.查询成绩在80-90之间的记录。 2.查询至少4个同学选修的课程名。 3.查询其他系中比“信息系”所有学生年龄都大的学生名单及年龄,按年龄降序输出: 4.查询与学生张建国同岁的所有学生的学号。姓名和系别。 5.查询选修了2门以上课程的学生名单。 6.查询至少有一门与“张建国”选课相同的学生的姓名,课程号,系别 7.查询成绩比该课程平均成绩高的学生的成绩表。 8.查询选课号为01001课程且成绩高于课程01002学生的姓名,此两门课的课程名和成绩。 9.查询所有没选修01001号课程的学生名单 10、查询每个同学各门课程的平均成绩和最高成绩,按降序输出姓名、平均成绩、最高成绩; 11、查询所有学生都选修了的课程号和课程名; 12、查询选修了991102号学生选修了的课程的学生学号和姓名。 三、使用SQL创建视图,修改记录 1.创建成绩视图SCORE_VIEW,包含学号sno,姓名sn,课程名cn,成绩score; 2.创建一个计算机系学生名单视图S_VIEW,包含学号sno,姓名sn,性别sex; 3.通过上面的视图,修改学号为991102,课程号01001的成绩记录; 4创建一个视图,计算机系学生的成绩单score_view_CDEPT,包含学号sno,姓名sn,课程名cn,成绩score
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值