视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
通俗的讲,视图只保存了查询的 SQL 逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条 SQL 查询语句上。
1、视图的基础语法
创建:
-- 创建视图
create [or replace] view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];
查询:
-- 查看创建视图语句
show create view 视图名称;
-- 查看视图数据
select * from 视图名称 [where ...];
修改:
-- 方式一:和创建视图语法相同,但是主要关注的是 or replace 部分,因为是要修改
create or replace view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];
-- 方式二
alter view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];
删除:
drop view [if exists] 视图名称 [, 视图名称...];
2、检查选项
检查选项有两种:cascaded 和 local。下面通过一个案例来分析检查选项的用处。
假设现在有一个 user 表。里面有两个字段,id 和 name。存储了三条数据
id----------name
1-----------张三
2-----------李四
3-----------王五
现在给这个表创建一个视图
-- 给表 user 创建一个视图,select 语句为查询 id < 10 的所有数据
create view user_v as select * from user where id < 10;
这时操作 user_v 视图,插入一条 id 为4的数据。
-- 插入一条 id 为4的数据
insert into user_v values(4, '李六');
-- 再通过查询语句查询视图 user_v 数据,能够查询到所有数据
select * from user_v;
-- 通过查询语句查询表 user 的数据,发现数据也成功插入到表中
select * from user;
再向视图 user_v 中插入一条 id 为11的数据。
-- 向视图 user_v 插入一条 id 为11的数据
insert into user_v values(11, '王麻子');
-- 通过查询语句查询视图 user_v 数据,发现查询不到 id 为11的数据。
-- 这是因为在创建视图 user_v 时,select 语句指定了过滤条件 where id < 10,因此,id 为11的数据并不会出现在视图 user_v 中
select * from user_v;
-- 但是数据还是会成功插入到 user 表中。通过查询语句可以查看到
select * from user;
通过上面的案例可以发现,通过向视图插入数据,发现视图中没有成功插入,但是原表中成功插入了。为了避免这种现象,MySQL 在创建视图时提供了 cascaded 检查选项,可以将创建视图的 sql 修改为:
create view user_v as select * from user where id < 10 with cascaded check option;
在上面的案例中,检查选项 cascaded 的作用是,在向视图插入数据时,满足创建视图条件的数据才能被成功插入,而不满足条件的数据插入时会报错。在上述案例中创建的视图只允许 id < 10 的数据,增加了检查选项 cascaded 后,再向视图插入 id 大于10的数据则会报错,无法成功插入。
视图检查选项的作用:
当使用 with check option 子句创建视图时,MySQL 会通过视图检查正在更改的每个行,例如插入、更新、删除,以使其符合视图的定义。MySQL 允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围, MySQL 提供了两个选项:cascaded 和 local,默认值为 cascaded。
cascaded:当前视图及其依赖的视图的创建条件都要满足
-- 创建视图 user_1,此视图没加检查选项,那么在操作该视图时,是不会去检查是否满足 id < 20
create view user_1 as select * from user where id < 20;
-- 基于视图 user_1 再创建一个视图 user-2
-- 给视图 user_2 增加了检查选项 cascaded。此时再要操作视图 user_2,不仅要满足 user_2 的创建条件,还要满足 user_1 的创建条件
create view user_2 as select * from user_1 where id > 10 with cascaded check option;
local:需满足当前视图的创建条件,同时会递归查看所依赖的视图是否有检查选项,如果有检查选项也需要满足依赖的视图的创建条件,如果没有检查选项则忽略。
3、视图的更新
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(sum()、min()、max()、count()等)
- distinct
- group by
- having
- union 或者 union all
4、视图的作用
- 简单
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后得操作每次指定全部的条件。 - 安全
数据库可以授权、但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。 - 数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。