您的位置:首页 > 数据库

SQL Server基础概念--视图

2009-01-09 17:56 399 查看
视图可以被看成是虚拟表或存储查询。通过创建、修改和维护视图,可以自定义每位用户从不同的角度使用数据库。可通过视图访问的数据不作为独特的对象存储在数据库内。数据库内存储的是SELECT语句,系统在执行视图查询时,首先把它转换成等价的对基表的查询,然后执行修改了的查询,SELECT语句的结果集构成视图所返回的虚拟表。使用视图可实现下列功能[/b]:

(1)
将用户限定在表中的特定行上。

(2)
将用户限定在特定列上。

(3)
将多个表中的列联接起来,使他们看起来像一个表。

(4)
聚合信息而非提供详细信息



创建视图的语法格式[/b]如下:

CREATE VIEW
VIEW_NAME [ ( COLUMN[ ,[/b]…N ] ) ][/b]

WITH ENCRYPTION[/b]

AS Select_statement[/b]

WITH CHECK OPTION[/b]

其中,WITH ENCRYPTION选项指定加密创建视图的文本;WITH CHECK OPTION选项指定检查通过视图修改数据的操作。当CREATE
VIEW语句中不说明列名表时,列名由SELECT语句确定,但以下情况必须说明视图的列名:

(1)
SELECT的目标表中有内部函数或表达式

(2)
目标表中含有多表连接的连接字段名

(3)
视图中的字段名与导出表不同。



查询和视图的异同[/b]主要表现在以下几个方面:

(1)
存储。视图存储为数据库设计的一部分,而查询则不是。

(2)
更新结果。对视图和查询的结果集更新限制是不同的。

(3)
排序结果。可以排序任何查询结果,但是只有当视图包括TOP子句时才能排序视图。

(4)
生成查询计划。查询计划是内部策略,通过它数据库服务器尝试快速创建结果集。数据库服务器可以在保存视图后立即为视图建立查询计划。但是对于查询,数据库服务器直到查询实际运行时才能建立查询计划。

(5)
参数设置。可以为查询创建参数,但不能为视图创建参数。

(6)
加密。可以加密视图,但不能加密查询。



一般来说,视图的内容[/b]包括以下几个方面:

(1)
基表的列的子集或行的子集,也就是说视图可以是基表的一部分。

(2)
两个或多个基表的联合,也就是说视图是对多个基表进行联合运算检索的SELECT语句。

(3)
两个或多个基表的连接,也就是说视图是通过对若干个基表的连接生成的。

(4)
基表的统计汇总,也就是说视图不仅仅那是基表的投影,还可以是经过对基表的各种复杂运算的结果。

(5)
另外一个视图的子集,也就是说视图可以基于表,也可以基于另一个视图。

(6)
视图和基表的混合,在视图的定义中,视图和基表可以起到同样的作用。



视图的优点[/b]:

(1)
视图对于数据库的重构提供了一定程度的逻辑独立性。当数据库重构时,用户和用户程序都不会受到影响。

(2)
简化了用户观点。把用户的注意力集中到他所关心的数据上,简化了用户的数据结构。

(3)
使用户以不同的方式看待同一数据。

(4)
对机密数据提供了自动的安全保护功能。



视图也是二维表,因此视图定义以后,用户可以如同操作基表那样对视图进行操作,但视图是一个虚拟表。对基表的各种查询形式对视图同样有效,如连接查询、分组、排序和嵌套查询等等。若一个视图是由单个基表导出的,并且只是去掉了基表的某些行和某些列(不包括键),我们称这类视图为行列子集视图[/b]。行列子集视图是可更新的。有些视图虽然不是行列子集视图,但是理论上讲仍是可更新的,而有些视图则是不可更新的。



在关系数据库中,并非所有的视图都是允许更新的[/b],也就是说,有些视图的更新不能唯一地有意义地转换成对基表的更新。一般的数据库管理系统都有如下几种情况:

(1)
若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE,但允许执行DELETE操作

(2)
若视图的字段是来自库函数,则此视图不允许更新

(3)
若视图的定义中有GROUP BY子句,则此视图不允许更新

(4)
若视图的定义中有DISTINCT选项,则此视图不允许更新

(5)
若视图的定义中有嵌套查询,并且嵌套查询的FROM子句中涉及的表也是导出该视图的基表,则此视图不允许更新

(6)
若视图是由两个以上基表导出的,则此视图不允许更新

(7)
一个不允许更新的视图上定义的视图也不允许更新。



视图本身并没有数据,如果满足一些限制条件,那么可以通过视图自由地插入、删除和修改数据。一般地,试图必须定义在一个表上并且不包含统计函数或在SELECT语句中不包含GROUP BY子句。在修改视图时,要注意[/b]以下一些条件:

(1)
不能同时影响两个或两个以上的基表。可以修改由两个或两个以上的基表得到的视图,但每一次修改的数据只能影响一个基表。

(2)
某些列不能修改。不能修改那些通过计算得到结果的列。

(3)
如果影响到表中那些没有默认值的列,那么可能引起错误。

(4)
如果在视图定义中指定了WITH CHECK
OPTION选项,那么系统验证所修改的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: