您的位置:首页 > 数据库 > MySQL

mysql视图

2015-08-22 05:37 681 查看

1.简介

视图是由查询结果形成的一张虚拟表。

2.使用场景

1、如果某个查询结果出现的非常频繁,也就是,要经常拿这个查询结果来做子查询。

2、需要隐藏某些数据而展现其他数据时。

3.创建视图

create view 视图名 as select 语句;


4.更新视图

update 视图名 set 语句;


5.修改视图

alter view 视图名 as select 语句;

6.查看视图

6.1使用desc语句

desc 视图名;


6.2 show table status语句查询视图基本信息

show table status like '视图名';


6.3 show create view语句查看视图信息

show create view 视图名;


6.4 在view表中查看视图的详细信息

select * from 视图名;


7.删除视图

Drop view 视图名


8.视图的优点

8.1 简化查询语句

比如:有一张商品表,我们经常要查每个栏目下商品的平均价格

select cat_id,avg(shop_price) from goods gropy by cat_id;


这时候我们就可以创建一张视图:

create view avgPrice as select cat_id,avg(shop_price) from goods gropy by cat_id;


创建完,以后我们要查每个栏目的平均价格时,只要这么写

select * from avgPrice;


8.2可以进行权限控制

比如goods商品表,一个id字段一个价格字段一个商品名称字段

我们不想让人看见价格 可以这样写

create view showGoods as select id,name from goods;


8.3大数据分表时可以用到

比如表的行数据超过200万行时,速度就会变慢,可以把一张表的数据拆成4张表来存放到News表

newsid 1,2,3,4…

news1,news2,news3,news4表

把一张表的数据分散到4张表里,分散的方法有很多,最常用的是id取模来计算

id%4+1=[1,2,3,4]



还可以用视图,把四张表形成一张视图

create view news as select * from news1 union select * from news2 union ...


9.视图于表的关系

视图是表的查询结果,自然表的数据变了,会影响视图的结果。

视图的增删改也会影响表;

但视图并不总是能增删改的;

视图的数据与表的数据一一对应时可以修改;

对于视图的insert还应注意:视图必须包含表中没有默认值的列。

10.视图的algorithm(运算规则)

algorithm = merge/temptable/undefined


10.1 merge

merge:当引用视图时,引用视图的语句与定义视图的语句合并。

意味着视图只是一个规则,语句规则,当查询视图时,

把查询视图的语句比如:where…那些与创建时的语句where子句等合并,分析,形成一条select语句。

举个列子:

我们先创建一张视图查询所有商品价格大于3000的商品

create view g2 as select goods_id,goods_name,shop_price from goods where shop_price > 3000;


然后我们再查询视图的时候,再加上一个where条件<5000

select * from g2 where shop_price < 5000;


这时候它就会把两条语句合并分析最终形成这样一条select语句

select goods_id,goods_name,shop_price from goods where shop_price > 3000 and shop_price < 5000;


10.2 temptable

temptable:是根据创建语句瞬间创建一张临时表,然后查询视图的语句从该临时表查数据。

10.3 merge和temptable区别

merge 和 temptalbe 有一个显著的区别,

merge最终去查的还是goods表,而temptable去查的是虚拟表。

举个例子:我们要得到每个栏目下最贵的商品

首先我们创建一张视图查出每个栏目的商品按价格降序排序

create view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;


这时候我们在查询这张视图的时候再对cat_id进行分组是不是就能得到我们想要的结果呢?

select * from lmj group by cat_id;


答案是不能的,因为它把我们的创建视图的语句和查询视图的语句合并成

select cat_id,goods_id,goods_name,shop_price from goods group by cat_id order by cat_id,shop_price desc;


而如果我们在创建视图的时候指定了它的运算规则为:temptable

create algorithm=temptable view lmj as select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;


然后我们再查询视图:

select * frm lmj group by cat_id;


就能得到我们想要的结果了。它会先把

elect cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc;


这句sql语句取到的结果放到一张临时表,然后我们再从这张临时表查自然能得到我们想要的结果了,而不是合并了再去查。

undefined:未定义,自动,让系统帮你选。

本文来自:http://www.cnblogs.com/blueoverflow/p/4732852.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息