视图

来源:互联网 发布:淘宝产品视频拍摄 编辑:程序博客网 时间:2024/05/25 23:58

视图是从一个或多个基本表中导出的表。是一个虚表。数据库中只存放视图的定义,不存放视图中相应的数据。一旦数据发生了变化,视图中的数据也会发生相应的变化。
视图一经定义,就同基本表一样可以查询,删除,更改。视图不仅可以建立在一个或多个基本表上,也可以建立在多个视图上或多个视图和多个基本表上,也可以在视图上定义一个新的视图对新的视图进行CURD操作。

一、定义视图
SQL语句建立视图的一般格式

Create View <视图名>[(<列名>[,<列名>]...)]As <子查询>[With Check Option];

With Check Option表示对视图进行Update、Insert、Delete操作时要保证插入、更新或删除的行满足视图定义的谓词条件(即子查询中的条件表达式)。

:组成视图的属性列名或者全部指定或者全部省略,如果省略了视图的各个属性列名,则隐含该视图由子查询中Select子句目标列中的诸字段组成。

例:建立信息系学生的视图

Create View IS_StudentAs Select Sno,Sname,SageFrom StudentWhere Sdept='IS';

关系型数据库系统执行Create View语句时只是在数据字典中建立视图的定义,并不执行Select语句。只有在对视图进行查询操作时,才从视图的基本表中取出相应的数据。

几种特殊的视图
(1)行列子集视图:从基本表中导出,将基本表中某些行或某些列删除,但保留了主码的视图。

(2)定义视图的时候为了减少数据库中的冗余数据,一般数据库只存储基本数据,不存储经过运算后得到的数据。

(3)带有聚集函数Group By子句的查询定义的视图被称作分组视图
例:带表达式的视图

Create View S_G(Sno,Gavg)AsSelect Sno,AVG(Grade)From SCGroup By Sno;

: (4)定义视图的时候有时需要定义一些派生属性列,这些派生属性列在基本表中并不实际存储,因此这些列又被称作虚拟列。带有虚拟列的视图一般被称作带表达式的视图
例:带表达式的视图

Create View BT_S(Sno,Sname,Sbirth)AsSelect Sno,Sname,2014-SageFrom Student;

:在多个基本表导出的视图中,如果修改了一个视图的基本结构就会导致视图的映像被破坏,视图就无法正常的工作了。因此在需要修改链接的多个基本表的时候,最好先将原视图删除再将基本表修改,在修改的基本表的基础上创建新的视图。

二、删除视图
删除视图的格式语句为

Drop View <视图名>[CASCADE];

执行删除视图的语句后,视图在数据字典中的定义将会被删除。如果该视图还导出了其它视图,使用CASCADE语句可以一并删除。

基本表被删除后,由该基本表所导出的视图也将无法使用,但这些视图在数据字典中的定义仍然存在。应当使用Drop View语句将这些视图的定义显示的删除。

三、查询视图
视图在查询的时候首先进行有效性检查,先检查该视图的定义与基本表是否存在。若存在,将视图的定义从数据字典中取出,将子查询和系统查询结合起来,执行子句中的查询语句,转价为对基本表的查询操作,返回结果集。此过程被称为视图消解

视图消解实例:

Select Sno,AVG(Grade)From SCGroup By SnoHaving AVG(Grade)>=90;

:Where子句是无法使用聚集函数作为条件表达式的,应当使用Having子句。

基于视图查询和基于派生表查询的区别:视图一经定义就存储在数据字典中,之后的所有查询都可以直接使用该视图。而派生表只是在语句执行时暂时定义,语句执行结束之后派生表将被自动删除。

注:派生表是SQL语句在执行子查询操作时定义的临时的表。

四、更新视图
由于视图是一个虚表,因此对视图的更新操作应当转化为对基本表的更新操作。

若想更新视图应当在视图定义时加上With Check Option子句,这样在执行视图的更新操作时关系型数据库会查询视图定义的条件,若不满足该条件,更新操作将拒绝执行。

更新视图实例:

Update IS_StudentSet Sname='Eric'Where Sno='201307249';//转换为对基本表操作的更新语句为Update StudentSet Sname='Eric'Where Sno='201307249' AND Sdept='IS';

:不是所有视图都是可以更新的,因为有些视图的更新不能有意义的转换为对基本表的更新。除此之外,一个不允许更新的视图上定义的视图也是不允许更新的。

例:

Create View S_G(Sno,Gavg)As Select Sno,AVG(Grade)From SCGroup By Sno;//更新操作Update S_GSet Gavg=90Where Sno='201307249';

对此视图的更新操作无法完成,因为改变了平均成绩之后,该学生的各个成绩依然不变。从数学角度来说这显然是不合理的。

五、视图的作用
(1)视图可以简化用户的操作。
(2)视图可以使用户从多个角度看待同一个问题。
(3)视图对重构数据库提供了一定的逻辑独立性
(4)视图可以为机密数据提供安全保护。
(5)适当的利用视图可以清除的表达查询。

注:数据库的物理独立性是用户的应用程序不依赖于数据库的物理结构。数据库的逻辑独立性指的是当数据库的重新构造时,用户程序不受影响。

0 0
原创粉丝点击