SQLServer之视图简介

视图定义

视图是一个虚拟表,其内容由查询定义。 同表同样,视图包含一系列带有名称的列和行数据。 视图在数据库中并非以数据值存储集形式存在,除非是索引视图。 行和列数据来自由定义视图的查询所引用的表,而且在引用视图时动态生成。sql

对其中所引用的基础表来讲,视图的做用相似于筛选。 定义视图的筛选能够来自当前或其余数据库的一个或多个表,或者其余视图。 分布式查询也可用于定义使用多个异类源数据的视图。 例如,若是有多台不一样的服务器分别存储您的单位在不一样地区的数据,而您须要将这些服务器上结构类似的数据组合起来,这种方式就颇有用。数据库

视图一般用来集中、简化和自定义每一个用户对数据库的不一样认识。 视图可用做安全机制,方法是容许用户经过视图访问数据,而不授予用户直接访问视图基础表的权限。 视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。 还能够在向 SQL Server 复制数据和从其中复制数据时使用视图,以便提升性能并对数据进行分区。express

视图类型

除了基本用户定义视图的标准角色之外, SQL Server 还提供了下列类型的视图,这些视图在数据库中起着特殊的做用:安全

索引视图
索引视图是被具体化了的视图。 这意味着已经对视图定义进行了计算而且生成的数据像表同样存储。 能够为视图建立索引,即对视图建立一个惟一的汇集索引。 索引视图能够显著提升某些类型查询的性能。 索引视图尤为适于聚合许多行的查询。 但它们不太适于常常更新的基本数据集。服务器

分区视图
分区视图在一台或多台服务器间水平链接一组成员表中的分区数据。 这样,数据看上去如同来自于一个表。 联接同一个 SQL Server 实例中的成员表的视图是一个本地分区视图。架构

系统视图
系统视图公开目录元数据。 您可使用系统视图返回与 SQL Server 实例或在该实例中定义的对象有关的信息。 例如,你能够查询 sys.databases 目录视图以便返回与实例中提供的用户定义数据库有关的信息。 有关详细信息,请参阅系统视图 (Transact-SQL)。分布式

视图应用场景

能够将视图用于如下用途:函数

集中、简化和自定义每一个用户对数据库的认识。性能

用做安全机制,方法是容许用户经过视图访问数据,而不授予用户直接访问底层基表的权限。加密

提供向后兼容接口来模拟架构已更改的表。

为最终用户减小数据库呈现的复杂性,客户端只要对视图写简单的代码,就能返回所须要的数据,一些复杂的逻辑操做,放在了视图中来完成。

对视图添加一些额外的索引,来提升查询的效率。
能够合并分离的数据,建立分区视图。

视图建立注意事项

只能在当前数据库中建立视图。 CREATE VIEW 必须是查询批处理中的第一条语句。 视图最多能够包含 1024 列。

建立视图时,有关该视图的信息将存储在下列目录视图中:sys.views、sys.columns 和 sys.sql_expression_dependencies。CREATE VIEW 语句的文本将存储在 sys.sql_modules 目录视图中。

建立视图时, 数据库引擎将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。 使用视图时,将使用这些原始设置来分析视图。 所以,访问视图时,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的任何客户端会话设置都不会影响视图定义。

视图定义中的 SELECT 子句不能包括下列内容:

ORDER BY 子句,除非在 SELECT 语句的选择列表中也有一个 TOP 子句。ORDER BY 子句仅用于肯定视图定义中的 TOP 或 OFFSET 子句返回的行。 ORDER BY 不保证在查询视图时获得有序结果,除非在查询自己中也指定了 ORDER BY。

INTO 关键字。

OPTION 子句。

引用临时表或表变量:

由于 select_statement 使用 SELECT 语句,因此按照 FROM 子句的指定,使用 <join_hint> 和 <table_hint> 提示是有效的。有关详细信息,请参阅 FROM (Transact-SQL) 和 SELECT (Transact-SQL)。

UNION 或 UNION ALL 分隔的函数和多个 SELECT 语句可在 select_statement 中使用。

CHECK OPTION
要求对该视图执行的全部数据修改语句都必须符合 select_statement 中所设置的条件。 经过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可经过视图看到数据。

视图更新

只要知足下列条件,便可经过视图修改基础基表的数据:

任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。

视图中被修改的列必须直接引用表列中的基础数据。 不能经过任何其余方式对这些列进行派生,如经过如下方式:

聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。

计算。 不能从使用其余列的表达式中计算该列。 使用集合运算符 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 造成的列将计入计算结果,且不可更新。

被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影响。

TOP 在视图的 select_statement 中的任何位置都不会与 WITH CHECK OPTION 子句一块儿使用。

上述限制应用于视图的 FROM 子句中的任何子查询,就像其应用于视图自己同样。 一般状况下, 数据库引擎必须可以明确跟踪从视图定义到一个基表的修改。 有关详细信息,请参阅经过视图修改数据。

若是上述限制妨碍直接经过视图修改数据,则能够考虑如下选项:

INSTEAD OF 触发器

能够对视图建立 INSTEAD OF 触发器,以使视图可更新。 将执行 INSTEAD OF 触发器,而不是执行对其定义了触发器的数据修改语句。 此触发器容许用户指定必须发生以处理数据修改语句的操做集合。 所以,若是存在给定的数据修改语句(INSERT、UPDATE 或 DELETE)的视图的 INSTEAD OF 触发器,则可经过该语句更新相应的视图。 有关 INSTEAD OF 触发器的详细信息,请参阅 DML 触发器。

分区视图

若是视图为分区视图,则可遵循某些限制对其进行更新。 必要时, 数据库引擎将本地分区视图辨别为全部参与表和视图都在同一 SQL Server 实例上的视图,而将分布式分区视图辨别为视图中至少有一个表驻留在其余或远程服务器上的视图。

视图优缺点

优势:

一、向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也能够提交数据,就像这些来自于某个单一的表。

二、数据安全。

三、能够给视图加密。

四、视图还能够被嵌套,一个视图中能够嵌套另外一个视图。

缺点:

一、性能:SQL Server必须把视图的查询转化成对基本表的查询,若是这个视图是由一个复杂的多表查询所定义,那么,即便是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,须要花费必定的时间。

二、修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来讲,这是很方便的,可是,对于比较复杂的视图,多是不可修改的。

三、数据库表结构的修改可能须要修改相应的视图,维护和迁移麻烦。