一、视图 view
在查询中,我们经常把查询结果,当成临时表来看。
view就可以看成是一张虚拟的表。是表通过某种运算得到的一个投影。
1.1、引出视图
场景1:
现要求查询每个栏目下,商品的平均价格,并取平均价前3高的栏目。
解法1:不知道视图的情况下
求得平均价格,然后group_by cat_id ,然后order by avg,然后limit再取前3条。

场景2:
要取平均价格由高到低,第3到第5名的栏目
场景3:
查出前3低的栏目。上面两种情况,都要用到临时的结果集A

对于上面两个场景,为了方便,我们想到把临时的结果集A存储到内存中,方便以后查询。
难点:
如果过一段时间,又添加了几个商品,价格很高或很低,影响到了平均价格。那么A的结果集与前面保存的表的结果就不一样了,这时候应该怎么办?
用视图来解决。
1.2、视图
1.2.1、创建视图
视图中没有真实数据,就是表通过运算得到的投影(表发生变化的时候,视图也就会发生相应的变化)
问:如何创建视图?
问:建立视图的时候,我们需要指定视图的列名与列类型吗?
答:不需要,视图只是表的影子,继承了上面表的字段。
既然视图只是表的某种查询的投影,所以主要步骤在查询表上。
查询的结果命名为视图就可以了。
1.2.2、创建视图语法:
create view 视图名
as
select 语句
1.3、用视图解决上面的问题
1.3.1、创建视图stats
相对于上面的例题,我们创建一个平均价格的视图stats

这时候,show tables ,发现多了一个table,就是stats。然后查看stats中的数据:

就跟我们刚才创建的那个临时结果集A是一样的。(但是这个只是投影,并不是实实在在的数据)
1.3.2、利用视图查询得到结果
视图一旦创建完毕,就可以当做一个表了。比如这里我们查询前3高的平均价格cat_id

1.4、视图的作用:
1、可以简化我们的查询
比如,复杂的统计时,先用视图生成一个中间结果,再查询视图
2、更精细的权限控制
以表为例。
两个网站搞合作,可以查询对方网站的用户,需要向对方开放用户的权限,但是又不想开放用户表中的密码字段。应该怎么解决?
可以创建一个视图,包含所有的字段,但是就不包含密码字段,然后开放视图的权限给对方。
3、数据多,分表时可以用到
比如说,有小说站,小说存储在novel表中,1000多万篇
数据分别存储在novel1,novel2,novel3,novel4,novel5中。
查询小说时,不知道在哪张表,怎么办?
这时候可以用union连接把所有的表都连接起来,并把结果当做一个视图,然后在这个视图中查询。(就不需要在每个表中查询一次了)
1.5、表与视图变化之间的相互影响
1.5.1、表变化,视图会怎样?
比如对于当前视图stats

此时查询15号栏目下的商品,

发现stats中的平均价格是正确的。
此时我们如果改变good的一个价格

发现视图中的平均价格也随之改变了

表变化,视图会随之改变。
1.5.2、视图变了,表会如何?
1.5.3、情况1
对于上面的视图stats1中,cat_id=15的情况,如果我们把平均价格pj改成了90,那么此时表会不会变?
应该不会变,因为视图是根据表good1来的,平均值多了10,反推过去,你是没法确定原来的两个good价格95与65是怎样修改导致平均值增加的。
1.5.4、情况2

这张视图,数据表示的是最贵的5个商品。那么此时视图能不能改呢?
此时,增、删、改也是不能实现的。(详情可以观看p39)
疑问:那么视图到底能否修改呢?
1.5.5、情况3
我们创建一个视图,是cat_id=4的栏目商品的投影,然后试着对视图做修改。

执行删除操作:

我们发现good_id=1的商品被删除掉了,然后表中的商品也被删掉了。
1.5.6、总结
于是,我们得出结论,在某种情况下,视图也是可以修改的。
修改条件:视图的数据跟表的数据一一对应,就像函数的映射。
由表中数据能对应到视图,
由视图能对应到表。
具体能不能修改的情况,可以去看手册。
比如order by limit就不能修改。
1.6、视图占用空间吗
视图的定义是一直存在的,但是视图是不占用空间的,里面并不存储数据。
删除视图,跟删除表的语法是一样的。
网友评论