视图简介:
视图可以看作定义在SQL Server上的虚拟表。视图正如其名字的含义一样,是另一种查看数据的入口。
常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 。
从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图。
例如查询,插入,修改,删除操作等,但插入、修改、删除等的操作其实对于原始数据表的操作。
视图的作用:
1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
3、从而加强了安全性,使用户只能看到视图所显示的数据。
4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。
列如:
普通视图
--判断用户自定义视图是否存在
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 --使用视图查询
索引视图
--判断用户自定义视图是否存在
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
--在视图 v_Stu_Cou_Index 上建立唯一的聚集索引
create unique clustered index Index_View on v_Stu_Cou_Index(S_StuNo)
select * from v_Stu_Cou_Index --使用视图查询
PS:索引视图涉及的基本表必须ANSI_NULLS设置为ON。索引视图必须设置 ANSI_NULLS 和 QUOTED_INDETIFIER 为 ON。索引视图只能引用基本表。(即不能嵌套视图)必须使用 WITH SCHEMABINDING 绑定架构。
定义索引视图时必须使用 Schema.ViewName 这样的全名。(即需要指定视图的所有者)
定义索引视图的表也必须指定所有者,例如:dbo。在创建索引视图的select语句时,不使用*,必须指定具体的列名
定义索引视图不能使用外连接。(即 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 更新视图数据。
1 exec sp_refreshview 'v_Stu_Cou_Par' -- v_Stu_Cou_Par 视图名称
使用 sql 系统存储过程 sp_helptext 获取自定义视图创建的 T-SQL 文本
1 exec sp_helptext 'v_Stu_Cou_Par' -- v_Stu_Cou_Par 视图名称
PS:视图不能包含 ORDER BY 子句,除非SELECT语句的选择列表中还有一个 TOP 子句。
视图不能使用 INTO 关键字。视图不能包含 OPTION 子句。
视图不能有对临时表或表变量的引用。视图最多可以有 1024 列。