关系数据库操作基础.ppt
关系数据库操作基础,4.5 视图,本人所售课程学生名单,本学期为自己的课程安排,教师开课的情况,教室使用的情况,学生的平均成绩,最高成绩,最低成绩等,理解视图,视图的特点虚拟表,是从一个或几个基本表(或视图)导出的表只存放视图的定义,不会出现数据冗余基表中的数据发生变化,从视图中查询出的数据也随之改变,基于视图的操作,基于视图的操作 查询 删除 受限更新定义基于该视图的新视图,创建视图,DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。在对视图查询时,按视图的定义从基本表中将数据查出。,Create view AS,创建视图举例,CREATE VIEW HBstudentASSELECT sno,sname,sex,ageFROM studentWHERE place LIKE 湖北,例1建立一个湖北考籍的学生信息视图,创建视图举例,CREATE VIEW C_stud_info(sno,sname,sex,place)ASSELECT sno,sname,sex,placeFROM studentWHERE sno IN(SELECT snoFROM studyWHERE cno IN(SELECT cnoFROM courseWHERE cname LIKE C语言),例2建立一个学习了C语言的所有学生信息的视图,创建视图(续),WITH CHECK OPTION强制视图上执行的所有数据修改语句都必须符合由 设置的准则。通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到修改的数据。,创建视图举例,CREATE VIEW HBstudent_1ASSELECT sno,sname,sex,age,placeFROM studentWHERE place LIKE 湖北WITH CHECK OPTION;,例1建立一个湖北考籍的学生信息视图,更新 WITH CHECK OPTION的视图举例,update HBstudent_1set place=河北 where sno=1,基于多个基表的视图,CREATE VIEW Student_Study AS SELECT student.sno,cno,gradeFROM student,studyWHERE student.sno=study.sno AND place LIKE%湖北%,基于视图的视图,例4 CREATE VIEW HBstudent_2 AS SELECT sno,sname,age FROM HBstudent WHERE sex=女,带表达式的视图,例5CREATE VIEW HBstudent_3ASSELECT sno,sname,sex,year(getdate()-year,placeFROM studentWHERE place LIKE 湖北,设置一些派生属性列,也称为虚拟列距今年份带表达式的视图必须明确定义组成视图的各个属性列名,删除视图,DROP VIEW;该语句从数据字典中删除指定的视图定义由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除删除基表时,由该基表导出的所有视图定义都必须显式删除,删除视图(续),例7 删除视图HBstudent_3 DROP VIEW HBstudent_3,视图的查询,SELECT.FROM 视图或者表WHERE.,查询视图的工作原理,从用户角度:查询视图与查询基本表相同DBMS实现视图查询的方法实体化视图(View Materialization)有效性检查:检查所查询的视图是否存在执行视图定义,将视图临时实体化,生成临时表查询视图转换为查询临时表查询完毕删除被实体化的视图(临时表),查询视图的工作原理(续),视图消解法(View Resolution)进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询执行修正后的查询,视图HBstudent中查找年龄大于20岁的学生基本信息SELECT sno,sname,sex,ageFROM HBstudentWHERE age 20,查询视图(续),用视图消解法解释查询的执行过程转换后的查询语句为:SELECT sno,sname,sex,ageFROM HBstudentWHERE age 20,查询视图(续),视图消解法的局限有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。,查询视图(续),已知视图:CREATE VIEW avg_score(课程号,平均分)AS SELECT CourseNo,AVG(grade)FROM study GROUP BY CNo,预对视图进行如下查询:select*from avg_score where平均分=90如果采用视图消减法,则极有可能转化为下面的语句:SELECT CourseNo,AVG(grade)FROM studyWHERE AVG(grade)=90GROUP BY CNo,而实际上,这是一条错误的转换。正确的转换应该是:SELECT CourseNo,AVG(grade)FROM studyGROUP BY CNoHAVING AVG(grade)=90,更新视图,用户角度:更新视图与更新基本表相同DBMS实现视图更新的方法视图实体化法(View Materialization)视图消解法(View Resolution)指定WITH CHECK OPTION子句后,DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新,更新视图通过视图添加数据,insert into part_movie(title,year,length,incolor)values(M9,2005,102,1),在湖北考籍的学生视图HBstudent中插入一湖北考生信息,该学生信息为:(04031,戴敏,女,21)INSERT INTO HBstudentVALUES(04031,戴敏,女,21)该语句执行时将转换成对student表的插入:INSERT INTO studentVALUES(04031,戴敏,女,21,湖北),更新视图修改数据,将视图HBstudent中学号为03061的同学年龄改为20岁。UPDATE HBstudentSET age=20WHERE sno LIKE 03061该语句执行时将转换成对student表的修改:UPDATE studentSET age=20WHERE sno LIKE 03061 AND place LIKE 湖北,更新视图的限制,一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新(对两类方法均如此)例:CREATE VIEW avg_score(课程号,平均分)AS SELECT CNo,AVG(grade)FROM study GROUP BY CNo,视图的可更新性,SQL-Server规定可以按下列方式通过视图修改数据:视图在视图定义的 FROM 子句中包含至少一个表;视图不能只基于一个表达式。在选择列表中没有使用聚合函数(AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR、VARP)或 GROUP BY、UNION、DISTINCT 或 TOP 子句。但是,可以在 FROM 子句定义的子查询范围内使用聚合函数,前提条件是聚合函数生成的派生值没有修改过。在选择列表中不使用派生列。派生列是由除简单列引用以外的一切构成的结果集列。如果在视图中删除数据,在视图定义的 FROM 子句中只能列出一个表。,1.视图能够简化用户的操作,当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作基于多张表连接形成的视图基于复杂嵌套查询的视图含导出属性的视图,2.视图使用户能以多种角度看待同一数据,视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要,3.视图对重构数据库提供了一定程度的逻辑独立性,通过建立一个视图使用户的外模式保持不变程序员对数据库逻辑结构的修改不会影响到用户的视觉与操作.,视图在一定程度上保证了数据的逻辑独立性,4.视图能够对机密数据提供安全保护,对不同用户定义不同视图,使每个用户只能看到他有权看到的数据通过WITH CHECK OPTION对关键数据定义操作时限制,