全部博文(471)
分类: Mysql/postgreSQL
2012-03-19 15:39:21
l OR REPLACE:给定了OR REPLACE子句,语句能够替换已有的同名视图。
l ALGORITHM:可选的mysql算法扩展,算法会影响MySQL处理视图的方式。有以下三个值:
UNDEFINED--MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
MERGE--会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
TEMPTABLE--视图的结果将被置于临时表中,然后使用它执行语句。
l veiw_name:视图名。
l column_list:要想为视图的列定义明确的名称,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list。
l select_statement: 用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制:
1. 定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;
2. 在定义中引用的表或视图必须存在;
l WITH [cascaded|local] CHECK OPTION: 在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。WITH CHECK OPTION指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。
l 视图定义服从下述限制:
ü SELECT语句不能包含FROM子句中的子查询。
ü SELECT语句不能引用系统或用户变量。
ü SELECT语句不能引用预处理语句参数。
ü 在存储子程序内,定义不能引用子程序参数或局部变量。
ü 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
ü 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。
ü 在视图定义中命名的表必须已存在。
ü 不能将触发程序与视图关联在一起。
nba76ers2012-03-19 16:58:30
ALGORITHM有三个参数分别是:merge、TEMPTABLE、UNDEFINED
看mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:
因为临时表中的数据不可更新。所以,如果使用参数是TEMPTABLE,无法进行更新。
当你的参数定义是UNDEFINED(没有定义ALGORITHM参数)。mysql更倾向于选择合并方式。是因为它更加有效。
换方式理解,视图名直接使用视图的公式替换掉了。针对上面视图teams,mysql会使用该视图的公式进行替换,视图公式合并到了select中。结果就是变成了如下sql语句:
select * from (SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。
也就是最后提交给mysql处理该sql语句。
具体化方式理解,mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中。之