MySQL视图

来源:互联网 发布:深圳gdp首超广州 知乎 编辑:程序博客网 时间:2024/06/05 03:35

MySQL视图

一、什么是视图

    视图是一种虚拟存在的表,它并不在数据库中实际存在,而是在使用中动态生成的。

二、视图的作用

1、安全:使用视图用户只能访问到他们有权限访问的数据(具体到每一列),对表的权限管理不能具体到每一列。
2、简单:使用视图不用关心表的结构、关联条件和筛选条件,因为它是动态生成的,在定义视图的时候已经对相关语句进行了定义。
3、数据独立:视图可以屏蔽表结构变化对用户的影响,当表结构变化时,修改视图就好,不用修改业务代码,前提是业务代码查询的是视图,不是对表进行直接查询。

三、创建或修改视图

1、语法:

create  view 视图名 as 查询语句 [with [cascaded | local] check option]

PS:[with [cascaded | local] check option]可以没有,默认是with cascaded check option

create or replace view user_view as select * from user;

2、不可更新视图

    首先,我们来阐释一下视图更新。视图更新是指对视图中的数据进行修改,当视图中某个数据更新时,实质上就是对对应表上的数据进行修改,因为视图在物理中并不存在,而是根据表和试图创建语句动态生成的。视图修改则是对原有视图进行修改,实质上是创建一个同名的视图替换掉之前的视图。

(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一个不可更新的视图
例子:
这里写图片描述

3、with语句解析

    with [cascaded | local] check option决定了是否允许更新数据使记录不再满足视图条件

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的条件,所以不能更新。

四、删除视图

语句:drop view [if exists] 视图名1[,视图名2...]
drop view my_view3

五、查看视图

1、查看数据库中的所有视图(包括表)

show tables;

从MySQL5.1开始,show tables同时显示视图的名字和表的名字,不存在单独显示师徒的show views命令。

2、查看视图状态(包括表)

show table status [from 数据库名] [like 'pattern']

这里写图片描述

3、查看某个视图的定义

show create view 视图名
show create view my_view1;

这里写图片描述

1 0
原创粉丝点击