视图
概念
像是虚拟的表,是包含根据需要检索数据的查询(创建视图后,它的定义就保存在数据库中,但是视图返回的真实数据不会从底层表分离出来)
视图是持久的,而不是临时的,一旦创建了视图,可以持续的引用视图,直到删除它为止
用途(优点)-增加了访问数据的灵活行
- 可以用以简化数据访问,减少关联查询的复杂性
- 可以增加可复用性(将经常需要连接表的查询创建视图)
- 可以正确的格式化数据(将需要的列转换成正确的格式,之后使用时引用视图即可)
- 可以创建计算的列(将需要计算的列的计算结果创建为视图,需要时直接引用视图)
- 可以用来重新命名列的名称(对不好理解的列名进行重命名)
- 可以创建数据子集(将经常需要查询范围的数据查询创建为视图)
- 可以用来加强安全性限制(对视图授予执行权限,限制最终用户直接访问表的权限,通过在视图定义中仅仅包含必要的列,暴露那些仅仅希望被最终用户看到的列)
需注意的点(缺点)
- 像select查询一样要对视图进行性能调优,因为普通视图从本质上说是一个“已存储的”查询,性能更糟糕的视图会严重影响服务器的性能
- 不要嵌套视图超过一级。具体来说,不要定义一个调用另外一个视图的是视图。当希望对性能地下的查询进行调优时,这么做会因此混乱,而且会降低每个嵌套级别的性能-+
- 如果可能的话,使用存储过程而不用视图。因为存储过程能重用执行计划,性能会有提升。存储过程也能减少网络流量,并可以实现更复杂的业务逻辑,而且比视图有更少的编码设置
- select允许一个试图定义最多包含1024个列。
- 不可以在视图定义中使用某些select元素,包括into、option、compute、compute by或者对表或临时表的引用
分类
普通视图
描述
由T-SQL查询定义。在数据苦衷不保存实际数据,只是视图定义
创建视图
--判断View1视图是否已经存在
if exists (select * from sys.views where name='View1')
drop view View1;
go
--创建View1视图
create view View1
AS
select a.gdsid,a.gdscde,a.gdsname,a.clsid,b.clscd,b.clsname
from info_goods a
inner join info_cls b on a.clsid=b.clsid
go
修改视图
--修改视图名称
alter view View1 As selectView
--修改视图内容
alter view selectView
AS
select a.gdsid,a.gdscde,a.gdsname,a.clsid,b.clscd,b.clsname
from info_goods a
inner join info_cls b on a.clsid=b.clsid and b.clscd not in('01','02')
删除视图
drop view selectView
分区视图
- 是对于分表的一个方案,允许将大型表中的数据拆分成较小的成员表。
- 可以允许分布在不同Sql server实例的两个或多个水平分区表创建单个逻辑表现(视图)
- 是通过对成员表使用 UNION ALL 所定义的视图,这些成员表的表结构相同,但作为多个表分别存储在同一个 SQL Server实例或称为联合数据库服务器的自主 SQL Server 服务器实例组中。
创建分区视图:
要创建一个分区视图,需要根据Check约束中定义一组值吧达标分割成更小的表。Check约束确保每一个更小的表保存的数据唯一。然后使用union all创建分布式分区视图,把所有小表联结成单独的结果集。
--声明使用数据库
use test
go
--判断doodsView视图是否已经存在
if exists (select * from sys.views where name='goodsView')
drop view goodsView;
go
--创建分区视图
create view
dbo.goodsView -- dbo ==> 视图所属架构的名称
(gdsid,gdscd,gdsname) --视图制定的列,如果未指定 column,则视图列将获得与 SELECT 语句中的列相同的名称
with
encryption, --使用范围, encryption可以防止SQL server在复制过程中发布视图
view_metadata --view_metadata创建的视图,浏览模式的元数据在描述结果集内视图中的列时,将返回视图名,而不返回基表名。
as
select a.billdate,a.tid,a.bcd,a.rebillno,a.rebcd from tcmis_test.dbo.b_flow_1811 As a
union all
select b.billdate,b.tid,b.bcd,b.rebillno,b.rebcd from tcmis_test.dbo.b_flow_1812 As b
go