
5.1 视图概述
视图是一个虚拟表,其内容由查询定义。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。分布式查询也可用于定义使用多个异类源数据的视图。例如,如果有多台不同的服务器分别存储不同地区的数据,而我们需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。
视图的结构和内容是通过SQL查询获得的,也称之为视图名,可以永久地保存在数据库中。用户通过SQL查询语句,可以像其他普通关系表一样,对视图中的数据进行查询。视图可以被看成是虚拟表或存储查询,可通过视图访问的数据不作为独特的对象存储在数据库内。
视图在数据库内存储的是SELECT语句,即数据库内并没有存储视图这个表,而存储的是视图的定义。SELECT语句的结果集构成视图所返回的虚拟表。用户可以用引用表时所使用的方法在SQL语句中通过引用视图名称来使用虚拟表。使用视图可以实现下列任一或所有功能:
(1)将用户限定在表中的特定行上。例如,只允许雇员看见工作跟踪表内记录其工作的行。
(2)将用户限定在特定列上。例如,对于那些不负责处理工资单的雇员,只允许其看见雇员表中的姓名列、办公室列、工作电话列和部门列,而不能看见任何包含工资信息或个人信息的列。
(3)将多个表中的列连接起来,使它们看起来像一个表。
(4)聚合信息而非提供详细信息。例如,显示一个列的和,或列的最大值和最小值。
当数据库管理系统DBMS在SQL语句中遇到视图引用时,会从数据库中找出所存储的相应视图的定义,然后把对视图的引用转换成对构成视图源表的等价请求,并且执行这个等价请求。利用这种方法,DBMS在保持源表数据完整性的同时也保持了视图的“可见性”。
对于简单视图,DBMS通过快速查询直接从源表中提取并构造出视图的每一行。而对于一些比较复杂的视图,DBMS则要根据该视图定义中的查询语句进行查询操作,并将结果存储到一个临时表中。然后DBMS再从这个临时表中提取数据以满足对视图操作的需要,并在不需要的时候抛弃所生成的临时表。但不论DBMS如何操作,对用户来讲,其结果都是相同的,即这个视图能够在SQL语句中引用,就好像其是一张真正的关系表一样。
通过定义SELECT语句以检索将在视图中显示的数据来创建视图。SELECT语句引用的数据表称为视图的基表。视图通常用来集中、简化和自定义每个用户对数据库的不同认识。视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。还可以在向SQL Server复制数据和从其中复制数据时使用视图,以便提高性能并对数据进行分区。
5.1.1 视图的类型
除了基本用户定义视图的标准角色以外,SQL Server 2016还提供了下列类型的视图,这些视图在数据库中起着特殊的作用。
(1)索引视图
索引视图是被具体化了的视图。这意味着已经对视图定义进行了计算并且生成的数据像表一样存储,用户可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能,尤其适于聚合许多行的查询,但不太适于经常更新的基本数据集。
(2)分区视图
分区视图在一台或多台服务器间水平连接一组成员表中的分区数据,使数据看上去如同来自于一个表。需要注意的是,连接同一个SQL Server 2016实例中成员表的视图就是一个本地分区视图。
(3)系统视图
系统视图包含目录元数据,可以使用系统视图返回与SQL Server实例或在该实例中定义的对象有关的信息。例如,可以查询sys.databases目录视图以便返回实例中提供的用户定义数据库有关的信息。
5.1.2 视图的优缺点
在数据库中使用视图有很多优点,尤其是在定义用户使用的数据库结构和增强数据库的安全保密性方面,视图起了准则作用。使用视图的主要优点是:
(1)安全保密性。通过视图,用户只能查询和修改他们所能见到的数据,数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
(2)查询简单性。视图能够从几个不同的关系表中提取数据,并且用一个单表表示出来,利用视图将多表查询转换成视图的单表查询。
(3)结构简单性。视图能够给用户一个“个人化”的数据库结构外观,用一组用户感兴趣的可见表来代表这个数据库的内容。
(4)隔离变化。视图能够代表一个个一致的、非变化的数据。即使是在作为视图基础的源表被分隔、重新构造或者重新命名的情况下,也是如此。
(5)数据完整性。如果数据被存取,并通过视图来输入,DBMS就能够自动地校验这个数据,以便确保数据满足所规定的完整性约束。
(6)逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而使程序与数据库表被视图分隔开来。
虽然视图存在上述的优点,但是在定义数据库对象时不能不加选择地来定义视图,因为视图也存在一些缺点,主要如下:
(1)性能。数据库管理系统必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义的,那么即使是对视图的一个简单查询,数据库管理系统也会将其变成一个复杂的结合体,需要花费一定的时间。
(2)修改限制。当用户试图修改视图的某些记录行时,数据库管理系统必须将其转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是对于比较复杂的视图,可能是不可修改的。
在实际应用中,应该根据实际情况权衡视图的优点和缺点,合理地定义视图。