• 数据库原理及应用实验报告-实验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.代码如下:

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

    2.代码如下:

    1. create view xun_SCT_View
    2. as
    3. select xn_Sname,xn_Cname,xn_Tname
    4. from xun_Students,xun_Reports,xun_Courses,xun_Teachers
    5. where xun_Students.xn_Sno=xun_Reports.xn_Sno
    6. and xun_Reports.xn_Cno=xun_Courses.xn_Cno
    7. and xun_Reports.xn_Tno=xun_Teachers.xn_Tno

    3.代码如下:

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

    视图如下:

     

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

     

    4.代码如下:

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

    xun_Group_View视图如下:

    5.

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

    6.

    1. select xn_Sname
    2. from xun_Students
    3. where xn_Sno in(
    4. select xn_Sno
    5. from xun_Reports
    6. where xn_Cno in(
    7. select xn_Cno
    8. from xun_Courses
    9. where xn_Cname='数据库原理及其应用'
    10. )
    11. )

    7.

    1. insert into xun_CS_View
    2. 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

    1. update xun_CS_View
    2. set xn_Scroce-=5
    3. where xn_Cno='C01'

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

    错误信息:

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

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

    语句已终止。

     

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

    加5

    1. update xun_CS_View
    2. set xn_Scroce+=5
    3. where xn_Cno='C01'and xn_Scroce<95

    代码正常执行

     视图变为下图:

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

    9.

    1. delete
    2. from xun_CS_View
    3. 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. 1.
    2. create view xun_CS_View
    3. as
    4. select xn_Sno,xn_Tno,xn_Cno,xn_Scroce
    5. from xun_Reports
    6. where xn_Scroce>=60
    7. with check option
    8. 2.
    9. create view xun_SCT_View
    10. as
    11. select xn_Sname,xn_Cname,xn_Tname
    12. from xun_Students,xun_Reports,xun_Courses,xun_Teachers
    13. where xun_Students.xn_Sno=xun_Reports.xn_Sno
    14. and xun_Reports.xn_Cno=xun_Courses.xn_Cno
    15. and xun_Reports.xn_Tno=xun_Teachers.xn_Tno
    16. 3.
    17. create view xun_EXP_View(xn_Sname,xn_Cname,xn_Scroce)
    18. as
    19. select xn_Sname,xn_Cname,xn_Scroce+5
    20. from xun_Students,xun_Reports,xun_Courses
    21. where xun_Students.xn_Sno=xun_Reports.xn_Sno
    22. and xun_Reports.xn_Cno=xun_Courses.xn_Cno
    23. 4.
    24. create view xun_Group_View
    25. as
    26. select xn_Sno,avg(xn_Scroce) avgscore
    27. from xun_Reports
    28. group by xn_Sno
    29. 5.
    30. create view xun_VV_View
    31. as
    32. select xn_Sno,xn_Cno,avg(xn_Scroce) avgscore
    33. from xun_CS_View
    34. group by xn_Sno,xn_Cno
    35. having avg(xn_Scroce)>=60
    36. 6.
    37. select xn_Sname
    38. from xun_Students
    39. where xn_Sno in(
    40. select xn_Sno
    41. from xun_Reports
    42. where xn_Cno in(
    43. select xn_Cno
    44. from xun_Courses
    45. where xn_Cname='数据库原理及其应用'
    46. )
    47. )
    48. 7.
    49. insert into xun_CS_View
    50. values('S52','T02','C02',59)
    51. 8.
    52. 5
    53. update xun_CS_View
    54. set xn_Scroce-=5
    55. where xn_Cno='C01'
    56. 5
    57. update xun_CS_View
    58. set xn_Scroce+=5
    59. where xn_Cno='C01'and xn_Scroce<95
    60. 9.
    61. delete
    62. from xun_CS_View
    63. where xn_Sno='S03'
    64. 10.
    65. drop view xun_CS_View,xun_SCT_View

  • 相关阅读:
    React基础知识学习-ReactRouter部分
    基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀
    JavaWeb页面初体验
    【机器学习】04. 神经网络模型 MLPClassifier分类算法与MLPRegressor回归算法(代码注释,思路推导)
    数据权限就该这么设计,yyyds!
    LogUtils工具类
    我们为什么需要调用InitCommonControls?
    JVM完整图文学习笔记 (含拓展知识广度学习) 第三章: 类加载与字节码技术
    Ajax无刷新
    【Gradio-Windows-Linux】解决share=True无法创建共享链接,缺少frpc_windows_amd64_v0.2
  • 原文地址:https://blog.csdn.net/cangzhexingxing/article/details/125563064