SQL数据库开发—1TSQL—第八章视图

SQL数据库开发—1TSQL—第八章视图

8.1 视图概述

视图是一个虚拟表,其内容由查询定义。 同表一样,视图包含一系列带有名称的列和行数据。 视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

注意在默认情况下,视图返回数据要慢。视图并没有真正改变内容。视图存在只有安全或者简化

8.2 视图分类

标准视图:将来自一张表或者多张表的数据整理计算,最后合并成一张虚拟表。标准视图存储在数据库中的是查询语句而不是实际的数据。

索引视图:是被具体化了的视图。 这意味着已经对视图定义进行了计算并且生成的数据像表一样存储。 可以为视图创建索引,即对视图创建一个唯一的聚集索引。 索引视图可以显著提高某些类型查询的性能。 索引视图尤其适于聚合许多行的查询。 但它们不太适于经常更新的基本数据集。因为基表修改时同时需要修改索引视图。

分区视图:在一台或多台服务器间水平连接一组成员表中的分区数据。 这样,数据看上去如同来自于一个表。 联接同一个 SQL Server 实例中的成员表的视图是一个本地分区视图。我的理解就是使用UNION将多个查询结果在一起。

系统视图:公开目录元数据。 您可以使用系统视图返回与 SQL Server 实例或在该实例中定义的对象有关的信息。 例如,你可以查询 sys.databases 目录视图以便返回与实例中提供的用户定义数据库有关的信息。

8.3 使用标准视图

  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 ]      

}  

 

CHECK OPTION:要求对该视图执行的所有数据修改语句都必须符合 select_statement 中所设置的条件。 通过视图修改行时,WITH CHECK OPTION 可确保提交修改后,仍可通过视图看到数据。

VIEW_METADATA:指定为引用视图的查询请求浏览模式的元数据时, SQL Server 实例将向 DB-Library、ODBC 和 OLE DB API 返回有关视图的元数据信息,而不返回基表的元数据信息。 浏览模式元数据是 SQL Server 实例向这些客户端 API 返回的附加元数据。

8.3.1 创建视图

create view send_state

as

SELECT p.TABLE_ID,p.version,a93.increment,a93.CREATION_TIME 入库时间,min(p.sdatetime) 下发开始时间, max(p.sdatetime) 下发结束时间,datediff(minute,min(p.sdatetime), max(p.sdatetime)) as 下发用时,count(*) as 下发数

 ,(select count(*) from A37_Lane_Info where lane_type<3) as 收费节点数 FROM A93_VERSION_STATE_ZH as a93 join PARAM_SEND_LANE as p on p.table_id=a93.table_id and a93.version_id=p.version and  a93.state=5 and a93.table_id>150000

                                                 join A36_ORGAN as a36 on p.plaza_id=a36.verifysuper_id and a36.organ_no=p.LANE_no and a36.organ_character=13

                                                 join A37_Lane_Info as a37 on a37.lane_id=a36.organ_id and a37.lane_type<3

                                                 group by p.TABLE_ID,p.version,a93.CREATION_TIME,a93.increment ;

 

 

select * from send_state;

也可以使用条件

select * from send_state where table_id=151101;

8.3.2 通过视图更改数据

 视图不仅可以作为select结果,也可以修改基表数据。

 有以下限制

  1 任何修改(包括 UPDATE、INSERT 和 DELETE 语句)都只能引用一个基表的列。

  2 无法修改聚合函数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 的计算列

  3 无法修改受 GROUP BY、HAVING 或 DISTINCT 子句的影响。

  4 无法修改经过表达式计算的列

  5 无法修改集合运算(union,等等)

 

create view a70

as

SELECT * FROM A70_USERS_ZH where user_num<15002000

 

update  A70  set user_name='学习'

基表也受影响了。

 

8.4 索引视图

 在视图上创建索引。 对视图创建的第一个索引必须是唯一聚集索引。 创建唯一聚集索引后,可以创建更多非聚集索引。 为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的存储方式相同。 查询优化器可使用索引视图加快执行查询的速度。 要使优化器考虑将该视图作为替换,并不需要在查询中引用该视图。

 创建索引视图必须要加上SCHEMABINDING,级联表。

8.4.1 创建索引视图所需的 SET 选项

SET 选项

必需的值

默认服务器值

 
 

ANSI_NULLS

ON

ON

 

ANSI_PADDING

ON

ON

 

ANSI_WARNINGS1

ON

ON

 

ARITHABORT

ON

ON

 

CONCAT_NULL_YIELDS_NULL

ON

ON

 

NUMERIC_ROUNDABORT

OFF

OFF

 

QUOTED_IDENTIFIER

ON

ON

 

8.4.2 创建索引视图的限制

 1 视图必须使用SCHEMABINDING选项

 2 视图不能引用其他的视图—只能引用表和UDF(用户自定义函数)

 3 视图不能包括任何OUTER  joins

 4 视图和视图引用的对象必须在相同的数据库里面

8.4.3 创建索引视图

建立视图

create view a70

with schemabinding

as

SELECT user_num,user_pwd,user_name,attach_id FROM [dbo].[A70_USERS_ZH];

创建索引

CREATE UNIQUE CLUSTERED INDEX [view-index-a70] ON [dbo].[a70]

(

         [user_num] DESC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

 

 

 

8.5 视图选项

8.5.1  ENCRYPTION 加密选项

    CREATE VIEW 语句文本的项进行加密。

 8.5.2  SCHEMABINDING相当于级联表
    将视图绑定到基础表的架构。 如果指定了 SCHEMABINDING,则不能按照将影响视图定义的方式修改基表或表。 必须首先修改或删除视图定义本身,才能删除将要修改的表的依赖关系。 使用 SCHEMABINDING 时,select_statement 必须包含所引用的表、视图或用户定义函数的两部分名称 (schema.object)。 所有被引用对象都必须在同一个数据库内。

不能删除参与了使用 SCHEMABINDING 子句创建的视图的视图或表,除非该视图已被删除或更改而不再具有架构绑定。 否则, 数据库引擎将引发错误。 另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响视图定义,则这些语句将会失败。

8.5.3 WITH CHECK OPTION 完整性

进行数据修改,以便仅适用于where条件的。以后对该视图插入、修改、删除操作时,会自动加上字段where条件的。

1.对于update,有with check option,要保证update后,数据要被视图查询出来create view a70

with schemabinding

as

 

SELECT user_num,user_pwd,user_name,attach_id FROM [dbo].[A70_USERS_ZH];

 

2.对于delete,有无with check option都一样

4.对于insert,有with check option,要保证insert后,数据要被视图查询出来

5 对于没有where 子句的视图,使用with check option是多余的。

 

 

create view a70

with schemabinding

as

 

SELECT user_num,user_pwd,user_name,attach_id FROM [dbo].[A70_USERS_ZH];

 总结ENCRYPTION选项是对创建视图的语句加密,SCHEMABINDING 的作用是在表结构层面的,WITH CHECK OPTION选项的作用是在数据层的。

发布了37 篇原创文章 · 获赞 0 · 访问量 2425

猜你喜欢

转载自blog.csdn.net/syjhct/article/details/85269959