mysql 视图

视图 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,让系统为我们做决定

 

posted @ 2019-05-23 20:16  FAJ  阅读(301)  评论(0编辑  收藏  举报