视图
概念:
一个没有索引的视图其实只是一个虚拟表,没有任何物理的数据,它就是一段代码组成的东西,包含了描述它的元数据,如结构,依赖性等.
1.它可以对基础数据做些聚合之类的操作后提供使用.
2.它可以筛选数据,让客户只能访问视图以达到保护原表的目的.
3.同样,视图不能包含单独的ORDER BY .因为它被认为是一个表,表是逻辑实体,本身里面的数据时随便放的,并米有刻意按照某个顺序存储数据.
说几点关于视图的东西
1.视图中的ORDER BY
视图中的ORDER BY 绝非它本意--它不起排序的作用。
平时我们用 select top n * from tb order by col1 这里的order by 不仅排序还确定要返回哪几行
视图我们用 select top n * from tb order by col1 这里的ORDER BY 只能用来确定希望返回哪几行.
因为我们的视图最后出来的东西本质上是个表,这个时候你去查询这个视图的时候 出来的结果可不一定是按照COL1排序的
因为视图它就是个表 表是逻辑实体,本身里面的数据时随便放的
.看实例:
-------结果并没有按照你期待的B排序 这就说明视图里的order by 是没有起到排序作用的----------------
2.视图刷新的问题 sp_refreshview
有时候你会发现当你修改基础表的结构后,视图并没有跟着变,解决的方法就是修改后立即进行视图的刷新.特别是你试图出现select *的时候
------------这里分享个一次刷新所有视图的代码(书上)-----------
--刷新所有视图
3.视图的模块化解题
如果一个题目解题思路写成一个语句比较长 比较难读 可以尝试用视图分开它 依次攻破 --(书上的例子,懒了下,盗用数据说明问题)
-----目标结果-----根据本月于上个月差来判断销售趋势
--VSalesRN视图给每个月上编号
--VGrp视图根据对标识的分组,取出最后标定范围的分组因子grp
--VTrends视图 根据sgn 和 grp分组 求出自己范围内的最大最小值 并且标识出对应的中文表示
----------检索视图------------
5.视图的更新 update
视图不仅可以修改,而且可以更新.因为对它操作时会影响基础表的。
这里我就说一个注意点:当你的视图是由2个表链接查询出来的,而你做的操作是更新的时候,要注意了:会出现状况:
--显示数据
--更新:我们想把订单号为1001的那个公司名cname 改个名字,初期是只想改这么个订单(这是本来想做的)
------其实这里很好理解,修改的是表Customers 而不是视图 所以改了再查视图 视图又是从表那边链接过来 当然三个就一起变了----
6.视图的一些选项
a.ENCRYPTION
对触犯器 视图 UDF 存储过程的创建文本可以加密.
不过听说已经找到解密的方法http://www.360doc.com/content/050909/13/717_11438.html
b.SCHEMABINDING
把视图绑定到一个基对象的框架上,SQL将不允许删除基对象或者修改视图里引用的列
c.check option
使用了这个选项的视图会防止与视图的查询筛选器有冲突的INSERT 和 UPDATE 操作.举个例子:
4.索引视图 indexed_view
一个没有索引的视图只不过是一个虚拟的表,拥有了索引,视图等于获得新生,他所包含的数据将要物理化,就要变成真正的表。
它会同步于基础表,就是说你修改基础表会同时更新索引视图,这里修改的性能会降低的.
但是索引视图同样提高了一些聚合查询和高成本的链接性能.
创建索引的限制:
a.第一个索引必须是唯一聚集索引.
b.视图必须用SCHEMABINDING,要求看上面;
c.如果对视图的查询进行了聚合操作,它的SELECT列表必须包含COUNT_BIG(*)这个聚合函数
---上面这个视图就是一个典型的索引视图---
---索引视图有个好处,比如你在外部基础表上查询,注意基础表上是没索引的,但是你可以再查询时候用到视图的索引.
--这个查询就是用到了视图上的聚集索引,而且AVG(OD.Quantity)这个视图里不包含的聚合函数也用到了-----
d.还有几个SQL2005用到索引视图的情况:
1.当外部查询的where 条件或者ON 条件的筛选区间是试图筛选器的子区间的时候,查询可以用到索引视图.
比如:外部查询n<100 视图查询n<200
2.外部查询使用一个与视图查询等价的逻辑筛选条件
比如:外部 n=100 视图100=n
3.关于NULL值插入
你使用UNIQUE约束想约束表中非NULL值要唯一,但是NULL值可以多次插入,但是UNIQUE约束认为NULL值是相等的,所以你在表中该列
已经存在NULL值情况下是不能再次插入的.这个时候你就可以使用索引视图解决这个问题
----视图索引保证不准插入重复值,但是因为WHERE keycol IS NOT NULL 所以它没有限定NULL的重复性.
------这里也再次说明对基础表的操作又一次牵动了视图索引------------