视图是从一个或者几个基本表(或视图)导出的表,是一个虚表,它与基本表不同。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍放在原来的基本表中,因此一旦基本表中的数据发生,从视图中查询出的数据也会改变。
总而言之,视图就像一个窗口,通过它可以看到数据中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一样被查询、被删除,也可以在一个视图之上再定义新的视图,但是对于更新操作有一定的限制。
一、定义视图
1、建立视图
SQL语句为:
CREATE VIEW <视图名>[(<列名>[,<列名>]…)] AS<子查询> [WITH CHECK OPTION];
其中,子查询可以是任意的SELECT语句,是否有ORDER BY和DISTINCT短语取决于具体系统的实现。
WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(子查询中的条件表达式)。
组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名:
1)某个目标列不是单纯的属性名,而是聚集函数或列表达式;
2)多表连接时选出了几个同名列作为视图的字段;
3)需要在视图中为某个列启用新的更合适名字。
备注:关系数据库管理系统执行CREATE VIEW语句的结果只是把视图的定义数据字典,并不执行其中的SELECT语句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。
1)视图可以建立在单个基本表上;
2)视图可以建立在在多个基本表上;
3)视图可以建立在一个或多个已定义好的视图上;
4)视图可以建立在基本表与视图上。
定义表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,也称它们为虚拟列,带虚拟列的视图也称为带表达式的视图。带有聚集函数和GROUP BY子句的查询来定义的视图称为分组视图。
修改基本表之后要删除由该基本表导出的视图,然后重建这个视图,这样会避免基本表与视图的映像关系被破坏。
二、删除视图
格式为:DROP VIEW <视图名> [CASCADE];视图删除后视图的定义将从数据字典中删除,如果该视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由它导出的所有视图一起删除。 基本表删除后,由该基本表导出的所有视图均无法使用,但是视图的定义没有从字典中清楚。删除这些视图定义需要显示地使用DROP VIEW语句。
三、查询视图
视图消解:关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。
定义视图并查询视图与基于派生表的查询的有区别的。视图一旦定义,其定义将用于保存在数据字典中,之后的所有查询都可以直接引用该视图,而派生表只是在语句执行时临时定义,语句执行后该定义即被删除。
四、更新视图
更新视图是指通过视图插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为基本表的更新操作。为防止用户通过视图对数据增加、删除、修改时,有意无意地对不属于视图范围范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件则拒绝执行操作。
在关系数据库中,有些视图的更新不能唯一地有意义地转换成对相应基本表的更新,索引不是所有的视图是可更新的。
一般行列子集视图是可更新的,而且各个系统对视图的更新还有更进一步的规定。
不可更新的视图与不允许更新的视图是两个不同的概念。前者理论上已证明是不可更新的视图。后者指实际系统中不支持其更新,但它本身有可能是可更新的视图。
五、视图的作用
视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作,而且对于非行列子集视图进行查询或更新时还有可能出现问题。合理使用视图能够带来的好处如下:
- 视图能够简化用户的操作,图机制使用户可以将注意力集中在所关心的数据上;
- 视图使用户能以多种角度看待同一数据;
- 视图对重构数据库提供了一定程度的逻辑独立性;
- 视图能够对机密数据提供安全保护;
- 适当利用视图可以更清晰地表达查询。