网站地图    收藏   

主页 > 后端 > mysql数据库 >

mysql---视图 - mysql数据库栏目 - 自学php

来源:自学PHP网    时间:2015-04-16 10:51 作者: 阅读:

[导读] 视图是一张虚拟的表,并没有实际存储数据,存储的是一种函数关系。语法:create view 视图名 as select语句;为什么说视图存储的是一种函数关系?当引用视图时,它会根据这种关系到创...

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

语法:

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)相当于视图。

创建一张学生成绩表

\

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

\

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

\

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

\

再看看视图的内容

\

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

视图改变会改变表吗?

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

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

\

视图有三种实现方式

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

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

\

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

\

如果algorithm设置为merge

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

\

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

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

视图的作用

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

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论