1、安全:使用视图用户只能访问到他们有权限访问的数据(具体到每一列),对表的权限管理不能具体到每一列。 2、简单:使用视图不用关心表的结构、关联条件和筛选条件,因为它是动态生成的,在定义视图的时候已经对相关语句进行了定义。 3、数据独立:视图可以屏蔽表结构变化对用户的影响,当表结构变化时,修改视图就好,不用修改业务代码,前提是业务代码查询的是视图,不是对表进行直接查询。
PS:[with [cascaded | local] check option]可以没有,默认是with cascaded check option
create or replace view user_view as select * from user;(1)、select语句中包含子查询 如果视图某列数据是从子查询语句中from后的表的表获得的,则无法修改,其他列就可以修改。 解决办法:将子查询内容先定义成一个视图,然后对该视图再创建视图。 例子:
创建视图语句:create view add_user_view as select u.id as uid,u.name, a.name as add_name from user u,address a where a.id in(select add_id from user where user.id=1);在此视图中,name列不可修改,因为它是从user中取得的,而user正是后面子查询语句中所查询的表。结果如图:
(2)、SQL语句中包含以下关键字:聚合函数(SUM、MIN、MAX、COUNT等)、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL。 例子:
(3)、常量视图 例子:
(4)SQL中含JOIN语句的视图(《深入浅出MySQL中》说MySQL5.0不可更新,但是我在MySQL5.5中操作可以更新) MySQL5.5例子:
(5)from一个不可更新的视图 例子:
LOCAL:满足本视图的条件就可以更新 CASCADED(默认):必须满足所有针对该视图的所有视图条件才可以更新。 LOCAL例子:
my_view1要求age>15;my_view2是根据my_view1建立的,约束条件是age<23,当my_view2的age设置为一个<15的数时,修改成功,也就是my_view2的约束不依赖于my_view1。
CASCADED例子:
这里更新时,满足my_view3的条件,不满足my_view1的条件,所以不能更新。
从MySQL5.1开始,show tables同时显示视图的名字和表的名字,不存在单独显示师徒的show views命令。