mysql怎么创建视图 mysql创建视图( 三 )


Query OK, 0 rows affected (0.00 sec)
mysql SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| latin1| latin1_swedish_ci|
+-------------------+---------------------+
1 row in set (0.00 sec)
mysql SET NAMES 'utf8';
Query OK, 0 rows affected (0.00 sec)
mysql SELECT * FROM v;
+-------------------+---------------------+
| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |
+-------------------+---------------------+
| utf8| utf8_general_ci|
+-------------------+---------------------+
1 row in set (0.00 sec)
可选的ALGORITHM子句是对标准SQL的MySQL扩展 。ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED 。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的) 。算法会影响MySQL处理视图的方式 。
对于MERGE , 会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分 。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句 。
对于UNDEFINED,MySQL将选择所要使用的算法 。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效 , 而且如果使用了临时表,视图是不可更新的 。
明确选择TEMPTABLE的1个原因在于 , 创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定 。与MERGE算法相比,锁定释放的速度更快,这样 , 使用视图的其他客户端不会被屏蔽过长时间 。
视图算法可以是UNDEFINED , 有三种方式:
·在CREATE VIEW语句中没有ALGORITHM子句 。
·CREATE VIEW语句有1个显式ALGORITHM = UNDEFINED子句 。
·为仅能用临时表处理的视图指定ALGORITHM = MERGE 。在这种情况下 , MySQL将生成告警,并将算法设置为UNDEFINED 。
正如前面所介绍的那样,通过将视图定义中的对应部分合并到引用视图的语句中 , 对MERGE进行处理 。在下面的示例中,简要介绍了MERGE的工作方式 。在该示例中,假定有1个具有下述定义的视图v_merge:
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t WHERE c3100;
示例1:假定发出了下述语句:
SELECT * FROM v_merge;
MySQL以下述方式处理语句:
·v_merge成为t
·*成为vc1、vc2,与c1、c2对应
·增加视图WHERE子句
所产生的将执行的语句为:
SELECT c1, c2 FROM t WHERE c3100;
示例2:假定发出了下述语句:
SELECT * FROM v_merge WHERE vc1100;
该语句的处理方式与前面介绍的类似,但vc1100变为c1100,并使用AND连接词将视图的WHERE子句添加到语句的WHERE子句中(增加了圆括号以确保以正确的优先顺序执行子句部分) 。所得的将要执行的语句变为:
SELECT c1, c2 FROM t WHERE (c3100) AND (c1100);
事实上,将要执行的语句是具有下述形式的WHERE子句:
WHERE (select WHERE) AND (view WHERE)
MERGE算法要求视图中的行和基表中的行具有一对一的关系 。如果不具有该关系 。必须使用临时表取而代之 。如果视图包含下述结构中的任何一种,将失去一对一的关系:
·聚合函数(SUM(), MIN(), MAX(), COUNT()等) 。
·DISTINCT
·GROUP BY
·HAVING
·UNION或UNION ALL
·仅引用文字值(在该情况下,没有基本表) 。
某些视图是可更新的 。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容 。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系 。还有一些特定的其他结构,这类结构会使得视图不可更新 。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

推荐阅读