嵌套视图:定义在另一个视图的上面的视图-
mysql> create view v_ear_veterans
-> as
-> select * from v_veterans
-> where JOINED < 1980;
使用WITH CHECK OPTION约束时,(不指定选项则默认是CASCADED)
可以使用CASCADED或者 LOCAL选项指定检查的程度:
WITH CASCADED CHECK OPTION:检查所有的视图.例如:嵌套视图及其底层的视图
WITH LOCAL CHECK OPTION:只检查将要更新的视图本身,对嵌套视图不检查其底层的视图
五、定义视图时的其他选项
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
1、ALGORITHM选项:选择在处理定义视图的select语句中使用的方法
UNDEFINED:MySQL将自动选择所要使用的算法
MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
缺省ALGORITHM选项等同于ALGORITHM = UNDEFINED
2、DEFINER选项:指出谁是视图的创建者或定义者
definer= '用户名'@'登录主机'
如果不指定该选项,则创建视图的用户就是定义者,指定关键字CURRENT_USER(当前用户)和不指定该选项效果相同
3、SQL SECURITY选项:要查询一个视图,首先必须要具有对视图的select权限.但是,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?
SQL SECURITY选项决定执行的结果:
SQL SECURITY DEFINER:定义(创建)视图的用户必须对视图所访问的表具有select权限,也就是说将来其他用户访问表的时候以定义者的身份,此时其他用户并没有访问权限.
SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限.
缺省SQL SECURITY选项等同于SQL SECURITY DEFINER
视图权限总结:
使用root用户定义一个视图(推荐使用第一种):u1、u2
u1作为定义者定义一个视图,u1对基表有select权限,u2对视图有访问权限:u2是以定义者的身份访问可以查询到基表的内容;
u1作为定义者定义一个视图,u1对基表没有select权限,u2对视图有访问权限,u2对基表有select权限:u2访问视图的时候是以调用者的身份,此时调用者是u2,可以查询到基表的内容.
六、视图查询语句的处理
示例:所有有罚款的球员的信息
创建视图:
mysql> create view cost_raisers
-> as
-> select * from PLAYERS
-> where playerno in (select playerno from PENALTIES);
查询视图:
mysql> select playerno from cost_raisers
-> where town='Stratford';
1、替代方法:
先把select语句中的视图名使用定义视图的select语句来替代;
再处理所得到的select语句.
2、具体化方法:
先处理定义视图的select语句,这会生成一个中间的结果集;
然后,再在中间结果上执行select查询.
mysql> select from ;
以上就是