码迷,mamicode.com
首页 > 数据库 > 详细

mysql---视图

时间:2014-06-27 08:23:00      阅读:360      评论:0      收藏:0      [点我收藏+]

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

创建一张学生成绩表

bubuko.com,布布扣

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

bubuko.com,布布扣

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

bubuko.com,布布扣

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

bubuko.com,布布扣

再看看视图的内容

bubuko.com,布布扣

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


视图改变会改变表吗?

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

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

bubuko.com,布布扣


视图有三种实现方式

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

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

bubuko.com,布布扣

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

bubuko.com,布布扣

如果algorithm设置为merge

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

bubuko.com,布布扣

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

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


视图的作用

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

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

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

mysql---视图

标签:mysql

原文地址:http://blog.csdn.net/my_mao/article/details/32710479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!