一.什么时候使用视图
- 某一张表(以下把原始表称为基表)里面存放简单数据,需要向外界提供一个简单的入口来获取这些简单数据的复制运算结果。考虑视图。
- 某几张基表具有一些共同特性,需要向外界提供一个简单的入口来获取这几张表所有的数据。强烈建议视图。
二.创建视图
-
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
- 例子
CREATE VIEW `cbms`.person` AS (SELECT * FROM `cbms`.`person_view`)
三.视图类型
- ALGORITHM = MERGE。会将引用视图的sql语句与视图本身的sql语句结合起来,去查询基表。
- ALGORITHM = TEMPTABLE。会将视图的结果置于临时表里面,引用视图的sql语句从临时表里面取数据。
- ALGORITHM = UNDEFINED。创建视图的sql语句没显示的指定ALGORITHM 。如果可能,它倾向于MERGE 而不是TEMPTABLE ,这是因为MERGE 通常更有效,而且如果使用了临时表,视图是不可更新的。
四.视图类型例子
对于ALGORITHM =TEMPTABLE视图,没什么好说的,数据直接从临时表取。下面看看ALGORITHM = MERGE。
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS SELECT c1, c2 FROM t WHERE c3 > 100;
-
SELECT * FROM v_merge; =====> SELECT c1, c2 FROM t WHERE c3 > 100;
-
SELECT * FROM v_merge WHERE vc1 < 100; =====> SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100); 注意:WHERE (基表 WHERE) AND (view WHERE)
五.视图更新
- 如果视图和基表数据是一对一的,那么视图是可以更新的。如二.2的例子。
- 以下情况会造成视图与基表数据不是一对一:
- 聚合函数(sun(),max(),min(),count()等)。
- group by, having, union, union all等情况。
- 其他情况,暂时还没遇到。
- 视图不能更新时候,你去更新它。The target table 视图名 of the UPDATE is not updatable。