一.视图的含义和作用
视图的结构和表一样,由一系列字段和记录构成。表代表物理介质上存储的数据,而视图并没有真正保存数据,视图的数据在屋里上并不存在。视图是按照一个查询的规定从一个或多个表(或视图)中导出的,是表的过滤器。数据库中只存储视图的定义,而不存放视图对应的数据。因此,视图只是逻辑上存在的“虚表”,视图的数据随着表的更新而保持与表的同步,保证数据的一致性。
视图提供了对于数据库中的数据重新组织的功能,通过查询定义,视图使得数据库可以用不同的组合呈现在不同用户面前,以满足不同用户的需要。另外,视图可以进一步作为其他查询的数据源,这样,可以分步完成复杂的查询。
在数据库体系结构中,数据库分为三级模式,分别是内模式,模式,外模式。用户一般只需要数据库中的部分数据,由于不同用户的应用需求,看待数据的方式及对数据保密的要求等存在差异,其所要求的外模式各不相同,外模式通常是模式的子集,一个数据库可以多个外模式,而实现外模式的对象就是视图。
视图具有以下优点和用途:
(1) 对用户隐藏数据库复杂性,集中用户数据。数据库特别是大型应用,都非常复杂。而用户一般只需要数据库局部数据或加工的数据,无须了解数据库全貌。使用视图可以最直接的满足用户要求。
(2) 实现外模式,增强数据库应用的灵活性和独立性。使用视图可以使开发者专注用户关注的数据。当数据库更改设计时,若不涉及特定用户视图,则无须修改应用。
(3) 简化管理,增强查询能力。视图可以对数据库实现在组织,并可针对视图设计查询,从而实现一些复杂的查询。
(4) 可在视图上创建索引,从而提高数据库应用的性能。
(5) 增强数据库安全性。视图是架构对象,可独立授权。由于视图基于表,对视图的操作最终都转化为表的操作,但视图更方便控制。因此,使用视图可极大地提高数据使用的安全性。
二.视图使用的限制
视图是一张表,所以对表的插入,删除,更新和查询操作原则上都可以在视图上进行。但是视图是基于表的,对视图的操作要转化为对表的操作,这样,视图在使用上有诸多规定和限制。此处主要讲述DB2和SQL server的规定,其它的数据库系统规定用户可以查阅相关资料。
DB2更新视图的规定主要有一下九点:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自聚集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
(7) 一个不允许更新的视图上定义的视图也不允许更新。
SQL server视图的限制有:
(1) 视图定义的命令不能包括ORDER BY(有TOP子句除外),INTO,COMPUTE等子句以及使用临时表,且只有具有相应权限的用户才能创建视图。
(2) 一般查询可以在任何视图上进行,但多数的INSERT,DELETE,和UPDATE操作只能在行列子集视图(对单个表仅进行投影和选择操作定义的视图)上进行。
(3) 如果在创建时使用了DISTINCT子句,那么将不能插入或更新这个视图中的记录。
(4) 除非基表的所有非空列都出现在行列子集视图中,否则不能在视图中插入数据。
(5) 基于多表的视图不能执行INSERT,DELETE命令操作数据
(6) 使用了聚集函数的视图不能进行INSERT,DELETE和UPDATE操作。
(7) 不能更新视图中的虚拟列(即从表达式或者常量派生得到的,或者通过计算字段得到的)。
(8) 视图可以建立在其他视图之上,最多可以嵌套32层。一个视图中最多可以引用1024个字段。
三.创建与管理视图
(1)视图的创建,视图是数据库中的架构对象,创建视图的基本语法如下:
CREATE VIEW [架构名.] 视图名 [ (列名1[, …n] ) ]
[ WITH<视图属性>[1, …n] ]
AS<子查询>
[ WITH CHECK OPTION ]
其中,子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则取决于具体的数据库系统的实现。
WITH CHECK OPTION表示对视图进行UPDATE,INSERT和DELETE操作时要保证更新,插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。
组成视图的属性列名或者全部省略或者全部指定,如果省略了视图的各个属性列名,则隐含该视图由子查询SELECT子句目标列中的诸字段组成。
(2)删除视图,如果不在需要某个视图,或想清除视图定义及与之相关的权限,可以删除该视图,基本语法如下:
DROP VIEW [架构名.] 视图名 [CASCADE];
视图删除后视图的定义将从数据字典中删除,表和视图所基于的数据并不受影响,而如何基于已删除视图的SQL语句将会失败。如果该视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由它导出的所有视图一起删除。
视图的查询语句和表的查询语句基本相同,只需要做相应的字段名修改,且遵循相应的数据库系统规定即可,此处不再赘述。关系数据库系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表,视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询集合起来,转换成等价的对基表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(View Resolution)。
(3)视图的修改,对视图记录进行修改,实际上是通过视图修改表的数据,其基本语法如下:
UPDATE 视图名SET 表达式 WHERE 条件表达式;
一般地,行列子集视图是可更新的。除行列子集视图外,有些视图需要满足系统的相关规定即可更新。
扫描下方二维码,关注公众号,及时了解相关更新: