视图 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,让系统自己做判断。