视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。
和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。
所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。
对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图有很多优点,主要表现在:•视点集中•简化操作•定制数据•合并分割数据•安全性如果你要创建一个视图,为其指定一个名称和一个查询即可。
Microsoft SQL Server只保存视图的元数据(metadata),用于描述这个对象,以及它所包含的列、安全、依赖等。
当你查询视图时,无论是获取数据还是修改数据,查询处理器(query processor)都会用视图定义代替视图引用。
也就是说,查询处理器展开视图定义并生成访问基对象(underlying objects)的执行计划。
视图在数据库中发挥着重要的作用。
视图的重要用途之一便是被用作一个抽象装置(abstraction mechanism)。
例如,在适当时利用视图你可以很容易地为基础数据提供或多或少的规范化映像(normalized picture),这样就不用更改实际数据的规范化(normalization)。
通过应用模块化的方法(逐步解决复杂问题),可以简化解决方案。
可以利用视图访问经过筛选和处理的数据,而不是直接对基表(base table)进行操作(让视图的架构和基对象的架构相同),可以把视图作为一个安全层(security layer)(在一定程度上)。
如果在视图上创建索引,它在提高性能方面也发挥着重要作用。
在视图上创建聚集索引(clustered index)会让它的数据真正地保存在磁盘上,而不再是虚拟的数据。
我会在本章专门用一节介绍索引视图。
现在,我们先来关注没有索引的视图,它们通常没有特定的性能影响,包括消极的或积极的。
与其他的表表达式(如派生表、公用表表达式,或内联表值用户定义函数[inline table-valued user-defined function,UDF])一样,视图的查询定义必须满足3个条件:不能在查询定义中使用ORDER BY,除非定义中包含TOP或FOR XML说明符。
所有的结果列必须有名称。
所有结果列的名称必须是唯一的。
定义视图的查询中在没有TOP或FOR XML说明符的情况下不能包含ORDER BY子句,这是因为视图被认为表示一个表。
表是一个逻辑实体,它的行没有顺序,不同于游标,游标是一个物理对象,它可以对行排序。
表中的所有列必须有名称,且名称必须是唯一的,这一点勿庸置疑。
为视图的目标列指定名称有两种方法,可以在视图名称后面的圆括号内指定,也可以用每个表达式后面的别名作为列名称。
来看一个示例,运行下面的代码创建VcustsWithOrders视图。
SET NOCOUNT ON;USE Northwind;GOIF OBJECT_ID(‘dbo.VcustsWithOrders’) IS NOT NULLDROP VIEW dbo.VcustsWithOrders;GOCREATE VIEW dbo.VcustsWithOrdersASSELECT CustomerID, CompanyName, ContactName, ContactTitle,Address, City, Region, PostalCode, Country, Phone, FaxFROM Customers AS CWHERE EXISTS(SELECT * FROM dbo.Orders AS OWHERE O.CustomerID = C.CustomerID);GO。