视图 view
在查询中,我们经常把查询结果当成临时表来看,
view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影。
表的变化会影响到视图
既然视图只是表的某种查询的投影,所以主要步骤在于查询上,查询的结果命名为视图就可以了。
创建视图的语法
CREATE VIEW 视图 AS SELECT 语句;
mysql> create view stats
-> as
-> select cat_id,avg(shop_price) as pj
-> from goods
-> group by cat_id
-> order by pj;
Query OK, 0 rows affected (0.49 sec)
视图有什么作用?
1 视图可以简化我们的查询,比如,复杂的统计时,先用视图生成一个中间结果,再查询视图
2 更精细的权限控制。
3 数据多,分表时可以用到。
视图是表的一个影子,探讨表与视图,数据变化时相互影响的关系。
表的数据变化,要影响到视图的变化
视图变化了,表如何变?
视图某种情况下,也是可以修改的,视图的数据和表的数据一一对应,就像函数的映射。表可以推出视图的数据,视图可以推出表的数据。
视图没有数据文件和索引文件,视图只是一种关系。
注意
order by limit得到的结果,与表不是一一对应的。一一对应是指,根据select关系,从表中取出的行,只能计算出视图中确定的一行。反之,视图中任意抽一行,能够反推出表中的确定的一行。
对于一些简单视图,他在发挥作用的过程中,并没有建立表,而只是把条件存起来,下次查询,把条件一合并,直接去查表。
思考:相比于建临时表,那个快?
建表:查询->形成临时表->查询寻临时表
叠加:合并条件->查询表
到底要不要建临时表,还是合并语句,有algorithm决定
algorithm = merge 合并查询语句
temptable 临时表
undefined 未定义
mysql> create view v1
-> as
-> select * from goods where shop_price > 300;
Query OK, 0 rows affected (0.75 sec)
mysql> create algorithm = merge view v2
-> as
-> select * from goods where shop_price > 300;
虽然结果上相同,但是v2不是临时表。
如果拿不准是否建表,可以用undefined,让系统自己做判断。