视图 view
在查询中,我们常把查询结果当成临时表来看
view可以看作一张虚拟表,是表通过某种运算得到的一个投影
因此,表的变化会影响视图(继承了表中的数据)
创建视图
create view 视图名 as select 语句
创建成功后可当作表来使用
视图用处:
1.简化查询
比如:复杂的统计时,先用视图生成一个中间结果,在查询视图
2.更精细的权限控制
比如某张表,用户表为例
现在呢,两个网站搞合作,可以查询对方网站的用户,需要向对方开放用户表的权限,不开放用户表中的密码字段
create view vuser
as
select user_id,username,emial from user
开放这个视图的权限给对方
3.数据多,分表时可以用到。
比如小说站,article表,1000多万篇
分成article 1,art2,art3,art4,art5 这5张表每张表放200万篇
查询小说时不知道在那张表
create view article as
select title from article1 union select title from article2...
视图时表的一个影子
表与视图,数据变化时的相互影响问题
1.表的变化影响到视图的变化
2.视图一般情况下无法修改,
当视图中的数据和表的数据一一对应时,
表-->推出视图对应的数据,视图-->推出表对应的数据
视图变化会影响表
视图的定义一直存在,但不占用空间
frm表示表的结构
myd表示表的数据
myi表示表的索引
所有创建视图时,只会产生一个frm文件
创建表时,会产生这三个文件
对于一些简单的视图
在发挥作用的过程中,并没有建立临时表,只是吧条件存起来,下次查询时,把条件合并后直接查表。
思考:相比于建临时表,那个快?
建表:查询->临时表->再查询
叠加:合并条件->查询表
到底要不要建临时表还是合并语句:
algorithm = merge 合并查询语句
temptable 临时表
undefined 未定义,由系统判断
复杂语句时,需要创建临时表:
create view v3
as
select *from goods order by shop_price desc;desc为降序,默认为升序
下次再让你查,每个栏目最高的商品价格
select *from v3 group by cat_id;
思考:如何合并这两个语句?
答:合并后出错,不能合并,只能建立临时表
create algorithm=temptable view v3
as
select goods_id,cat_id
from goods
order by cat_id asc,shop_price desc;
这张表,明确制定了生成临时表
如果拿不准用什么,algorithm=undefined,让系统为我们做决定
来源:https://www.cnblogs.com/fbjtcp/p/10914241.html