1、视图语法
(1)创建视图
create view 视图名称 as select ...
(2)删除视图
drop view 视图名称
(3)更新视图
alter view 视图名称 as select ...
2、视图与表的关系
视图是表的查询结果。
表的数据改变了,视图的数据也改变;
视图的数据改变,表的数据不一定改变。
当视图的数据与表的数据一一对应时,表数据随视图数据改变而改变;当视图数据与表数据不一一对应时,表的数据不随视图的数据的改变而改变,甚至不能(执行update视图数据时)改变视会报错图的数据,因为多个表数据构成视图的数据,如果改变视图数据,mysql不知道要怎样改变的数据,所以会报错,不让改变视图数据。
注:对于视图insert应注意,视图insert时必须包含表中没有默认值的列,否则视图不知给没有默认值的列取什么值。
3、视图的算法(algorithm)
视图的algorithm有merge、temptable和undefined三种。
merge:当引用视图时,引用视图的语句与定义视图的语句合并,引用视图的操作对象是原表;
temptable:当引用视图时,根据视图的创建语句建立一个临时表,引用视图的操作对象是临时表;
undefined:未定义,让系统选。
4、merge使用案例:
创建视图的语句
create view algorithm=merge g1 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id,shop_price desc;
查询视图的语句
select * from g1 group by cat_id;
上述查询视图语句相当于执行了如下的sql
select good_id,cat_id,goods_name,shop_price from goods group by cat_id order by cat_id,shop_price desc;
5、temptable使用案例
创建视图语句
create view algorithm=temptable g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id,shop_price desc;
查询视图语句
select * from g2 group by cat_id;
上述查询视图语句相当于 先创建了一个临时表g2,g2里面存放的是从goods表中查询出来的数据,该数据是按照cat_id升序,shop_price降序排列后的goods_id,cat_id,goods_name,shop_price。然后从临时表g2中按cat_id group查询出数据goods_id,cat_id,goods_name,shop_price。这样能够实现从商品表中查询出每个cat的最高shop_price的商品信息。使用merge算法的视图没有实现此功能。