视图是一张虚拟的表,并没有实际存储数据,存储的是一种“函数关系”。
语法:
create view 视图名 as select语句;
为什么说视图存储的是一种函数关系?
当引用视图时,它会根据这种关系到创建视图的各个表中去寻找相关字段,并按照这种关系进行运算得到结果。所以视图不需要存储数据,只需要存储这种“函数关系”。
如表1是记录长方形长的表
长(cm) |
10 |
如表2是记录长方形宽的表
宽(cm) |
20 |
现在创建一个视图用来求长方形面积
面积 |
长*宽 |
表改变会改变视图吗?
因为是函数关系f(x,y),当x或者y有一个变化时,f(x,y)的值一定会变化。x和y相当于创建视图的表,f(x,y)相当于视图。
创建一张学生成绩表
各个字段分别代表“学生ID”,“数学成绩”,“语文成绩”,“英语成绩”。
现在创建一个求各个学生平均成绩的视图
对表做一下改动,看看视图会不会跟着一起变化
再看看视图的内容
视图的确变化了,所以表的变化一定会影响视图。
视图改变会改变表吗?
这不一定,如果视图和表是以一个对应的,即f(x,y)可以反得到x,y(类似反函数关系)。这种情况下,视图改变会影响原有表。
对于求平均成绩的视图,无法由平均成绩得到各科的成绩,所以他们不是一一对应关系,这种情况Mysql不允许改变视图。
视图有三种实现方式
merge:引用视图时,将引用时的条件与创建视图时的条件合并。构成新的查询语句去各个表中查询。
以之前的平均分视图为例,红色划线为创建视图的查询语句
现在要求平均分前三高的学生,可以直接引用视图来查询
如果algorithm设置为merge
实际的操作是将这两次的查询条件合并相当于
temptable:引用视图时,先按照创建视图的条件查询各个表,将结果生成临时表,再对临时表进行查询。
undefined:数据库默认undefined,由数据库根据情况决定用merge还是temptable。
视图的作用
(1)方便操作:如果要经常用到某个临时表时,比如上面的平均分视图。如果没有定义视图,每次都需要求平均分临时表,再去对临时表进行查询。有视图就很方便,直接查询视图就可以了。
(2)安全考虑:如果两个公司合作,需要开放双方的一些用户信息,但是又不想公布一些涉及隐私或机密的信息(如用户密码),可以生成不包含密码字段的视图给对方。对方直接使用视图即可满足要求。