mysql---视图

视图是一张虚拟的表,并没有实际存储数据,存储的是一种“函数关系”。

语法:

create view 视图名 as select语句;

为什么说视图存储的是一种函数关系?

当引用视图时,它会根据这种关系到创建视图的各个表中去寻找相关字段,并按照这种关系进行运算得到结果。所以视图不需要存储数据,只需要存储这种“函数关系”。

如表1是记录长方形长的表

长(cm)
10

如表2是记录长方形宽的表

宽(cm)
20

现在创建一个视图用来求长方形面积

面积
长*宽
当需要引用视图的时候,视图会按照函数关系“面积=长*宽”到表1和表2中取数据运算得到所需结果。实际上视图并没有存储每个长方形的面积。以上表设计不严谨只是为了说明问题。


表改变会改变视图吗?

因为是函数关系f(x,y),当x或者y有一个变化时,f(x,y)的值一定会变化。x和y相当于创建视图的表,f(x,y)相当于视图。

创建一张学生成绩表

mysql---视图

各个字段分别代表“学生ID”,“数学成绩”,“语文成绩”,“英语成绩”。

mysql---视图

现在创建一个求各个学生平均成绩的视图

mysql---视图

对表做一下改动,看看视图会不会跟着一起变化

mysql---视图

再看看视图的内容

mysql---视图

视图的确变化了,所以表的变化一定会影响视图。


视图改变会改变表吗?

这不一定,如果视图和表是以一个对应的,即f(x,y)可以反得到x,y(类似反函数关系)。这种情况下,视图改变会影响原有表。

对于求平均成绩的视图,无法由平均成绩得到各科的成绩,所以他们不是一一对应关系,这种情况Mysql不允许改变视图

mysql---视图


视图有三种实现方式

merge:引用视图时,将引用时的条件与创建视图时的条件合并。构成新的查询语句去各个表中查询。

以之前的平均分视图为例,红色划线为创建视图的查询语句

mysql---视图

现在要求平均分前三高的学生,可以直接引用视图来查询

mysql---视图

如果algorithm设置为merge

实际的操作是将这两次的查询条件合并相当于

mysql---视图

temptable:引用视图时,先按照创建视图的条件查询各个表,将结果生成临时表,再对临时表进行查询。

undefined:数据库默认undefined由数据库根据情况决定用merge还是temptable。


视图的作用

(1)方便操作:如果要经常用到某个临时表时,比如上面的平均分视图。如果没有定义视图,每次都需要求平均分临时表,再去对临时表进行查询。有视图就很方便,直接查询视图就可以了。

(2)安全考虑:如果两个公司合作,需要开放双方的一些用户信息,但是又不想公布一些涉及隐私或机密的信息(如用户密码),可以生成不包含密码字段的视图给对方。对方直接使用视图即可满足要求。

mysql---视图,布布扣,bubuko.com

mysql---视图

上一篇:[Linux Shell学习系列二]初识Linux Shell


下一篇:phpcms V9实现QQ登陆OAuth2.0