【MySQL学习笔记】视图View

视图View

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

通俗的讲,视图只保存了查询的 SQL 逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条 SQL 查询语句上。

1、视图的基础语法

创建:

sql 复制代码
-- 创建视图
create [or replace] view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];

查询:

sql 复制代码
-- 查看创建视图语句
show create view 视图名称;

-- 查看视图数据
select * from 视图名称 [where ...];

修改:

sql 复制代码
-- 方式一:和创建视图语法相同,但是主要关注的是 or replace 部分,因为是要修改
create or replace view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];

-- 方式二
alter view 视图名称[(列名列表)] as select语句 [with [cascaded | local] check option];

删除:

sql 复制代码
drop view [if exists] 视图名称 [, 视图名称...];

2、检查选项

检查选项有两种:cascaded 和 local。下面通过一个案例来分析检查选项的用处。

假设现在有一个 user 表。里面有两个字段,id 和 name。存储了三条数据

id----------name

1-----------张三

2-----------李四

3-----------王五

现在给这个表创建一个视图

sql 复制代码
-- 给表 user 创建一个视图,select 语句为查询 id < 10 的所有数据
create view user_v as select * from user where id < 10;

这时操作 user_v 视图,插入一条 id 为4的数据。

sql 复制代码
-- 插入一条 id 为4的数据
insert into user_v values(4, '李六');
-- 再通过查询语句查询视图 user_v 数据,能够查询到所有数据
select * from user_v;
-- 通过查询语句查询表 user 的数据,发现数据也成功插入到表中
select * from user;

再向视图 user_v 中插入一条 id 为11的数据。

sql 复制代码
-- 向视图 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 修改为:

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:当前视图及其依赖的视图的创建条件都要满足

sql 复制代码
-- 创建视图 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、视图的更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(sum()、min()、max()、count()等)
  2. distinct
  3. group by
  4. having
  5. union 或者 union all

4、视图的作用

  1. 简单
    视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后得操作每次指定全部的条件。
  2. 安全
    数据库可以授权、但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。
  3. 数据独立
    视图可帮助用户屏蔽真实表结构变化带来的影响。
相关推荐
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
汇能感知3 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun3 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao3 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
jakeswang4 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
DKPT4 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa4 小时前
HTML和CSS学习
前端·css·学习·html
ST.J5 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记