设为首页 收藏本站
查看: 1286|回复: 0

[经验分享] SQL入门经典(六)之视图

[复制链接]

尚未签到

发表于 2017-7-14 15:54:58 | 显示全部楼层 |阅读模式
  视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用。可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略其他行或列,或者也可以创建一个复杂查询。连接几个表查询,使得这些连接查询看起来更像一个表。
  对视图的使用往往不是过多或者就是不够-很少是正好的。学完视图应当可以使用视图达到以下的目的:
  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 --创建一个返回用户手机的视图
AS
SELECT (FirstName+'.'+LastName) AS UserName,Phone  FROM Person.Contact --命令已成功完成。
SELECT * FROM vw_ContactPhone --使用视图(看起来和查询表差不多)
  创建视图没有真正的改变任何内容。只是通过了所访问数据过滤,这样做的好处是为终端用户减少数据复杂性,在现在的这个时代有大量工具是用户变得更简单。这看起来没有了不起的,但对于用户来说,的确减少减少复杂性。
  注意:要意识到,在默认情况下,对于视图而言没有特别要做事情。视图就像命令行执行查询命令那样云信。没有任何预先优化的过程。这意味着在数据的请求和所交付数据之间提供额外一层系统开销,视图运行速度总是比直接运行内部的SELECT 语句要满。也就是说视图,视图的存在有一个理由,即对于用户而言是安全和简化的 。因此在需求和系统开销之间寻求平衡以适合特定的情况
  使用过滤器视图:



SELECT * FROM vw_ContactPhone WHERE Phone LIKE '334%' --用上一个创建视图,查询区号开始是 %334的号码(10条结果)
  使用更复杂的视图:管理人员希望简单查询了解客户订购了那些订单,这些订单订单顶过那些零件。以及那个帐号订购的。下面是创建一个执行非常简单查询的视图。



USE AdventureWorks
GO
CREATE VIEW vw_CustomerOrders
AS
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
FROM Sales.Customer AS sc
inner join Sales.SalesOrderHeader AS soh on sc.CustomerID=soh.CustomerID
Inner join Sales.SalesOrderDetail AS sod on soh.SalesOrderID=sod.SalesOrderID
inner join Production.Product as pp on sod.ProductID=pp.ProductID
  不需要过多培训,管理人员都可以获取他们想要的数据了。
  通过WITH CHECK OPTION 限制插入到视图中的内容。
  WITH CHECK OPTION是sql server中鲜为人知功能之一。规则很简单-为了使用视图更新或者插入数据。结果必须符合以显示在视图结果中。重申一下,插入或者更新的行必须满足视图中SELECT 语句中使用WHERE 条件。不会针对到到基表限制。



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

  执行几次后的数据
DSC0001.png

  删除视图:DROP VIEW <view name>,[<view name>,<......,n>];
  让视图和表一样,创建索引。只需要在AS前面加上:WITH SCHEMABINDING



CREATE VIEW vw_ContactPhoneIndex --创建一个可以建立索引返回用户手机的视图
WITH SCHEMABINDING
AS
SELECT (FirstName+'.'+LastName) AS UserName,Phone FROM Person.Contact --命令已成功完成。
  保护代码加密:只需要在AS前面加上:WITH ENCRYPTION,记得备份自己的数据。



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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393851-1-1.html 上篇帖子: 安装sql server 2005时出现“安装汇编”错误的解决办法 下篇帖子: 高级SQL运用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表