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

[经验分享] SQL Server创建视图——视图的作用

[复制链接]

尚未签到

发表于 2017-7-13 19:04:23 | 显示全部楼层 |阅读模式
  视图简介:
  视图可以看作定义在SQL Server上的虚拟表。视图正如其名字的含义一样,是另一种查看数据的入口。
  常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表。
  从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图。
  例如查询,插入,修改,删除操作等,但插入、修改、删除等的操作其实对于原始数据表的操作。
  视图的作用:
  1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
  2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
  3、从而加强了安全性,使用户只能看到视图所显示的数据。
  4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。
  语法:



CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]   
[ WITH <view_attribute> [ ,...n ] ]   
AS select_statement   
[ WITH CHECK OPTION ]   
[ ; ]  
<view_attribute> ::=   
{  
     [ ENCRYPTION ]  
     [ SCHEMABINDING ]  
     [ VIEW_METADATA ]      
}   
<select_statement> ::=  
     [ WITH <common_table_expression> [ ,...n ] ]  
     SELECT <select_criteria>  
  参数:
  schema_name:是视图所有者的名称,一般为 dbo。(指定视图所有者名称是可选的。)
  view_name:是视图的名称。
  column:是视图中用于列的名称。仅当列从算术表达式,函数或常数派生时,才需要列名称; 当两个或多个列可能具有相同的名称时,通常是因为连接; 或者当视图中的列被指定与其派生的列的名称不同的名称时。列名也可以在 SELECT 语句中分配。如果列未指定,则视图列获得相同的名称作为 SELECT 语句中的列。
  AS:指定视图要执行的操作。
  select_statement:是定义视图的 SELECT 语句。该语句可以使用多个表和其他视图。需要适当的权限才能从创建的视图的 SELECT 子句中引用的对象进行选择。
  ENCRYPTION:对加密进行加密,加密之后不可修改。使用 WITH ENCRYPTION 可以防止将视图作为 SQL Server 复制的一部分进行发布。
  SCHEMABINDING:将视图绑定到底层所应用到的表。指定 SCHEMABINDING 时,不能以影响视图定义的方式修改表。必须首先修改或删除视图定义,以删除要修改的表的依赖关系。使用 SCHEMABINDING 子句创建的视图的视图或表不能删除,除非该视图被删除或更改,以使其不再具有绑定。
  VIEW_METADATA:当使用 WITH VIEW_METADATA 创建视图时,返回的是视图的元数据,否则返回的元数据是视图所引用表的元数据。
  普通视图:




if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou        
go
create view dbo.v_Stu_Cou   
as
select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
from Student s
left join Course c on s.C_S_Id=c.C_Id
where s.C_S_Id is not null
go

select * from v_Stu_Cou        
DSC0000.png

DSC0001.png

  索引视图:




if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Index') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou_Index        
go
create view dbo.v_Stu_Cou_Index      
with schemabinding        
as
     select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
     from dbo.Student s
     inner join dbo.Course c on s.C_S_Id=c.C_Id
     where s.C_S_Id is not null
go

create unique clustered index Index_View on v_Stu_Cou_Index(S_StuNo)

select * from v_Stu_Cou_Index        
DSC0002.png

DSC0003.png

  PS:索引视图涉及的基本表必须ANSI_NULLS设置为ON。索引视图必须设置 ANSI_NULLS 和 QUOTED_INDETIFIER 为 ON。索引视图只能引用基本表。(即不能嵌套视图)
  必须使用 WITH SCHEMABINDING 绑定架构。定义索引视图时必须使用 Schema.ViewName 这样的全名。(即需要指定视图的所有者)
  定义索引视图的表也必须指定所有者,例如:dbo。
  定义索引视图不能使用外连接。(即 left join/left outer join、right join/right outer join、outer join/full outer join)
  分区视图:
  分区视图是由 UNION ALL 的所有成员表定义的视图,即拥有相同的表结构、字段、数据类型等,不相同的数据集。
  分区视图又分为 本地式分区视图和分布式分区视图,我的理解就是本地式分区视图就是同一个数据库存在相同的表结构、字段、数据类型等的表使用  UNION ALL 创建的视图;
  分布式分区视图就是数据源存在于不同的数据库或不同的数据库服务器使用 UNION ALL 创建的视图。




if exists(select * from sysobjects where id=OBJECT_ID(N'v_Stu_Cou_Par') and objectproperty(id,N'IsView')=1)
drop view v_Stu_Cou_Par        
go
create view dbo.v_Stu_Cou_Par      
as
     select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
     from Student s1
     left join Course c on s1.C_S_Id=c.C_Id
     where s1.C_S_Id is not null
     union all
     select S_Id,S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate,c.C_Id,c.C_Name
     from Student_back s2
     left join Course c on s2.C_S_Id=c.C_Id
     where s2.C_S_Id is not null
go
select * from v_Stu_Cou_Par        
  当底层表的数据发生改变是,使用 sql 系统存储过程 sp_refreshview 更新视图数据。



exec sp_refreshview 'v_Stu_Cou_Par'        
  使用 sql 系统存储过程 sp_helptext 获取自定义视图创建的 T-SQL 文本。



exec sp_helptext 'v_Stu_Cou_Par'   
  PS:视图不能包含 ORDER BY 子句,除非SELECT语句的选择列表中还有一个 TOP 子句。
  视图不能使用 INTO 关键字。视图不能包含 OPTION 子句。
  视图不能有对临时表或表变量的引用。视图最多可以有 1024 列。
  参考:
  http://www.cnblogs.com/CareySon/archive/2011/12/07/2279522.html
  https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql

运维网声明 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-393534-1-1.html 上篇帖子: SQL Server 2012 案例教程(贾祥素)——学习笔记 下篇帖子: 新手入门《eclipse链接sql server数据库实现增删改查功能代码分享》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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