你的位置:首页 > 数据库

[数据库]SQL入门经典(六)之视图


视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用。可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略其他行或列,或者也可以创建一个复杂查询。连接几个表查询,使得这些连接查询看起来更像一个表。

对视图的使用往往不是过多或者就是不够-很少是正好的。学完视图应当可以使用视图达到以下的目的:

1.为终端用户减少明显的数据复杂性。

2.防止敏感列被选择,但是仍然提供对其他数据访问。

3.给数据库添加额外的索引提高查询性能-甚至在没有使用索引所基于的视图也是如此。

视图基本语法:CREATE VIEW <view name> AS <select statement>.是不是看起来很简单。当然这上面的语法代表最简化的语法,对于大多数来说。已经够用了。扩展的语法如下:CREATE VIEW <view name> [WITH [ENCRYPTION][,] SCHMABINDING ][[,] VIEW_METADATA] AS <SELETE statement> [WITH CHECK OPTION][;]

下面将分别讲述上面代码每一分,但是先看下最简单的视图。极其简单视图。

use AdventureWorks --我们接着用AdventureWorks这个数据库CREATE VIEW vw_ContactPhone --创建一个返回用户手机的视图ASSELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。SELECT * FROM vw_ContactPhone --使用视图(看起来和查询表差不多)

创建视图没有真正的改变任何内容。只是通过了所访问数据过滤,这样做的好处是为终端用户减少数据复杂性,在现在的这个时代有大量工具是用户变得更简单。这看起来没有了不起的,但对于用户来说,的确减少减少复杂性。

注意:要意识到,在默认情况下,对于视图而言没有特别要做事情。视图就像命令行执行查询命令那样云信。没有任何预先优化的过程。这意味着在数据的请求和所交付数据之间提供额外一层系统开销,视图运行速度总是比直接运行内部的SELECT 语句要满。也就是说视图,视图的存在有一个理由,即对于用户而言是安全和简化的 。因此在需求和系统开销之间寻求平衡以适合特定的情况

使用过滤器视图:

SELECT * FROM vw_ContactPhone WHERE Phone LIKE '334%' --用上一个创建视图,查询区号开始是 %334的号码(10条结果)

使用更复杂的视图:管理人员希望简单查询了解客户订购了那些订单,这些订单订单顶过那些零件。以及那个帐号订购的。下面是创建一个执行非常简单查询的视图。

USE AdventureWorksGOCREATE VIEW vw_CustomerOrdersASSELECT sc.AccountNumber,soh.SalesOrderID,soh.OrderDate,sod.ProductID,pp.Name,sod.OrderQty,sod.UnitPrice,(sod.UnitPriceDiscount*sod.UnitPrice*sod.OrderQty) AS TatolDisCount,sod.LineTotalFROM Sales.Customer AS scinner join Sales.SalesOrderHeader AS soh on sc.CustomerID=soh.CustomerIDInner join Sales.SalesOrderDetail AS sod on soh.SalesOrderID=sod.SalesOrderIDinner join Production.Product as pp on sod.ProductID=pp.ProductID

不需要过多培训,管理人员都可以获取他们想要的数据了。

通过WITH CHECK OPTION 限制插入到视图中的内容。

WITH CHECK OPTION是sql server中鲜为人知功能之一。规则很简单-为了使用视图更新或者插入数据。结果必须符合以显示在视图结果中。重申一下,插入或者更新的行必须满足视图中SELECT 语句中使用WHERE 条件。不会针对到到基表限制。

删除视图:DROP VIEW <view name>,[<view name>,<......,n>];

让视图和表一样,创建索引。只需要在AS前面加上:WITH SCHEMABINDING

CREATE VIEW vw_ContactPhoneIndex --创建一个可以建立索引返回用户手机的视图WITH SCHEMABINDINGASSELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。

保护代码加密:只需要在AS前面加上:WITH ENCRYPTION,记得备份自己的数据。

CREATE VIEW vw_ContactPhoneEncry --创建一个加密引返回用户手机的视图WITH ENCRYPTIONASSELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。。GOexec sp_helptext vw_ContactPhoneEncry --对象 'vw_ContactPhoneEncry' 的文本已加密。