当前位置:Gxlcms > 数据库问题 > SQL入门经典(六) 之视图

SQL入门经典(六) 之视图

时间:2021-07-01 10:21:17 帮助过:2人阅读

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

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

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

使用过滤器视图:

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

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

技术分享
  1. USE AdventureWorks
  2. GO
  3. CREATE VIEW vw_CustomerOrders
  4. AS
  5. SELECT sc.AccountNumber,soh.SalesOrderID,soh.OrderDate,sod.ProductID,pp.Name,sod.OrderQty,sod.UnitPrice,(sod.UnitPriceDiscount*sod.UnitPrice*sod.OrderQty) AS TatolDisCount,sod.LineTotal
  6. FROM Sales.Customer AS sc
  7. inner join Sales.SalesOrderHeader AS soh on sc.CustomerID=soh.CustomerID
  8. Inner join Sales.SalesOrderDetail AS sod on soh.SalesOrderID=sod.SalesOrderID
  9. inner join Production.Product as pp on sod.ProductID=pp.ProductID
技术分享

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

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

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

技术分享
  1. USE panda
  2. go
  3. CREATE VIEW vw_test003
  4. AS
  5. select ID,OrderDate,name FROM dbo.test003
  6. where test002ID between 4 and 6
  7. with check option--命令已成功完成。where一定要,表示insert,delete,update 要满足的条件才能执行命令不会终止
  8. --在测试下添加数据和更新数据会怎么样
  9. select name from dbo.test003 where ID=7 --查询数据name=test
  10. update vw_test003 set name=‘panda_test‘ where ID=7 --(1 行受影响,test002ID=4)表示修改成功因为test002ID满足test002ID between 4 and 6
  11. update vw_test003 set name=‘panda_test2‘ where ID=8 --(0条受影响)条件不满足where。
  12. 后面delete,insert看看
  13. insert vw_test003 values(getdate(),‘221‘);--消息 550,级别 16,状态 1,第 1 行
  14. 试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了 WITH CHECK OPTION,而该操作的一个或多个结果行又不符合 CHECK OPTION 约束。
  15. 语句已终止。为什么呢?因为外键约束。我们改下视图。
  16. ALTER VIEW vw_test003
  17. AS
  18. select ID,OrderDate,name,test002ID FROM dbo.test003
  19. where test002ID between 4 and 6
  20. with check option --修改完成
  21. 在添加数据,
  22. insert vw_test003 values(‘2016-6-25‘,‘221‘,4);--(1条收影响表示成功)
  23. DELETE 需要条件,并且满足条件
技术分享

第一次查询的数据

技术分享

 

执行几次后的数据

技术分享

 

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

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

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

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

技术分享
  1. CREATE VIEW vw_ContactPhoneEncry --创建一个加密引返回用户手机的视图
  2. WITH ENCRYPTION
  3. AS
  4. SELECT (FirstName+‘.‘+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。。
  5. GO
  6. exec sp_helptext vw_ContactPhoneEncry --对象 ‘vw_ContactPhoneEncry‘ 的文本已加密。
技术分享

 

SQL入门经典(六) 之视图

标签:

人气教程排行