MySQL--视图详解

news2025/5/13 5:47:34

介绍

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

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

语法:

  • 创建

 create [or replace] view 视图名称[(列表名称)] as select [with [cascaded | local] check option]
 
  • 查询

 查看创建视图语句: show create view 视图名称;
 查询视图数据: select * from 视图名称
  • 修改

 方式一: create [or replace] view 视图名称[(列表名称)] as select [with [cascaded | local] check option]
 方式二: alter view 视图名称[(列表名称)] as select [with [cascaded | local] check option]
  • 删除

 drop view [if exists] 视图名称 [视图名称]

代码展示:

 -- 创建视图
 create or replace view `stu_v_1` as select id,name from student where id <= 10; -- or replace 在创建视图时可以不加
 -- 查看创建视图语句
 show create view `stu_v_1`;
 -- CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_v_1`
 -- AS select `student`.`id` AS `id`,`student`.`name` AS `name` from `student` where (`student`.`id` <= 10)
 -- 查看视图数据
 select * from stu_v_1;
 select * from stu_v_1 where id < 3;
 -- 修改视图
 create or replace view `stu_v_1` as select id,name,no from student where id < 10;  -- 修改视图时必须有 or replace
 alter view `stu_v_1` as select id,name from student where id < 10; -- 第二种方式
 -- 删除视图
 drop view if exists `stu_v_1`;

注意事项:

虽然创建视图和修改视图的语句一样,但是创建视图时 or replace可以不加,修改视图主要在于or replace

检查选项

当使用with check option子句创建视图时,MySQL会通过视图检查正在更改的每一行,例如插入、更新、删除,使其符合视图的定义。MySQL允许基于另一个视图创建视图,他还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,MySQL提供了两个选项:

... with cascaded check option 
... with local check option 

默认为cascade

代码展示:

 create or replace view `stu_v_1` as select id,name from student where id <= 20;
 -- 添加数据
 insert into `stu_v_1` values(6,'Tom'); -- 视图是虚拟存在的表,在视图上添加数据实际上是在视图的基表中添加数据
 -- 查询数据
 select * from `stu_v_1`;

如果添加的数据不符合创建视图时的语法会怎样?

代码展示:

-- 再次添加数据
insert into `stu_v_1` values(21,'Tom'); -- 插入id>20的数据
-- 再次查询
select * from `stu_v_1`;-- 无法查询到id为21的值,原因:在创建视图时添加了条件 id <= 20;
-- 为了防止这种情况的发生,在视图创建时添加检查选项。

无法查询到id为21的值,原因:在创建视图时添加了条件 id <= 20; 为了防止这种情况的发生,我们可以在视图创建时添加检查选项。

-- 修改视图
create or replace view `stu_v_1` as select id,name from student where id <= 20 with cascaded check option ;
-- 再次测试
insert into `stu_v_1` values(21,'Tom'); -- 报错 [HY000][1369] CHECK OPTION failed 'demo.stu_v_1'
选项区别
  • cascade(级联):

举例说明:

首先创建v1视图,不添加检查选项。

create or replace view `v1` as select id,name from student where id <= 20;

此时,对该视图进行增删改操作不会去检查视图默认条件的。会出现视图不允许的情况

再添加一个基于v1视图的v2视图并在后面添加检查选项。

create or replace view `v2` as select id,name from v1 where id >= 10 with cascade check option;

此时,在操作v2视图时,底层会先去检查操作语句是否满足v2的条件(id>= 10),由于检查选项为cascade,数据库底层不仅要满足v2的条件,还要满足v1的条件。就相当于在v1后面添加了检查选项

create or replace view `v1` as select id,name from student where id <= 20 with cascade check option;

假如说v1又关联了某一个视图,也就是在v1关联的视图后面添加了检查选项。

在创建一个v3视图基于v2视图,不添加检查选项

create or replace view `v3` as select id,name from v2 where id <= 15;

则操作v3视图时,不会检查v3的视图条件,会去检查v2和v1的视图条件。

代码展示:

 -- 创建没有检查选项的视图v1
 create or replace view `stu_v_1` as select id,name from student where id <= 20;
 -- 测试插入数据
 insert into `stu_v_1` values(8,'Tom'); -- 插入成功,id<20
 insert into `stu_v_1` values(25,'Tom'); -- 插入成功,id>20,但没有添加检查选项,因此成功
 ​
 -- 创建基于v1的视图v2,并添加检查选项
 create or replace view `stu_v_2` as select id,name from `stu_v_1` where id >= 10 with cascaded check option ;
 -- 测试插入数据
 insert into `stu_v_2` values(7,'Tom'); -- 插入失败,不满足v2视图条件 [HY000][1369] CHECK OPTION failed 'demo.stu_v_2'
 insert into `stu_v_2` values(26,'Tom'); -- 插入失败,不满足v1视图条件 ,因为检查选项也需要去检查当前视图所依赖的底层的所有视图。[HY000][1369] CHECK OPTION failed 'demo.stu_v_2'
 insert into `stu_v_2` values(15,'Tom'); -- 插入成功,满足v1,v2视图条件。
 ​
 -- 在创建一个v3视图基于v2视图,不添加检查选项
 create or replace view `stu_v_3` as select id,name from `stu_v_2` where id <= 15 ;
 -- 测试插入数据
 insert into `stu_v_3` values(11,'Tom'); -- 执行成功 满足v1,v2,v3视图条件
 insert into `stu_v_3` values(17,'Tom'); -- 执行成功 因为v3视图没有添加选项,就没有检查该视图的条件,直接去检查v3关联视图v2的视图条件,v2添加了检查选项,而又顺着v2关联的视图v1,检查v1的视图条件
 insert into `stu_v_3` values(28,'Tom'); -- 执行失败 [HY000][1369] CHECK OPTION failed 'demo.stu_v_3' 满足v2视图条件,但没有满足v1视图条件,因此报错。
  • local(本地)

举例说明

首先创建v4视图,不添加检查选项。

create or replace view `v4` as select id,name from student where id <= 15;

此时,对该视图进行增删改操作不会去检查视图默认条件的。会出现视图不允许的情况

再添加一个基于v4视图的v5视图并在后面添加检查选项。

create or replace view `v5` as select id,name from v4 where id >= 10 with local check option;

此时,在操作v5视图时,底层会先去检查操作语句是否满足v5的条件(id>= 10),由于检查选项为local,数据库底层不仅要满足v5的条件,还要检查v4是否添加了检查选项。如果v4视图中添加则检查,如果没有添加,则不检查。

在创建一个v6视图基于v5视图,不添加检查选项

create or replace view `v6` as select id,name from v5 where id < 20;

则操作v6视图时,不会检查v6的视图条件,会去检查v5的视图条件,再去检查v4是否添加了检查选项。如果v4视图中添加则检查,如果没有添加,则不检查。

代码展示:

 -- 创建没有检查选项的视图v4
 create or replace view `stu_v_4` as select id,name from student where id <= 15;
 -- 测试插入数据
 insert into `stu_v_4` values(8,'Tom'); -- 插入成功,id<15
 insert into `stu_v_4` values(25,'Tom'); -- 插入成功,id>15,但没有添加检查选项,因此成功
 -- 创建基于v4的视图v5,并添加检查选项
 create or replace view `stu_v_5` as select id,name from `stu_v_4` where id >= 10 with local check option ;
 -- 测试插入数据
 insert into `stu_v_5` values(13,'Tom'); -- 执行成功,id>10且id<15,满足v5条件v5会递归到关联视图v4,去检查v4是否添加了检查选项,如果添加了,则满足v4条件,如果没有,则不检查
 insert into `stu_v_5` values(17,'Tom'); -- 执行成功 id>10 id>15,满足v5条件,不满足v4条件,但v4没有检查选项,所以可以执行
 -- 在创建一个v6视图基于v5视图,不添加检查选项
 create or replace view `stu_v_6` as select id,name from `stu_v_5` where id < 20 ;
 -- 测试插入数据
 insert into `stu_v_6` values(14,'Tom'); -- 执行成功
 insert into `stu_v_6` values(9,'Tom'); -- 执行失败 不满足v5条件。
 -- 修改v4视图 添加检查选项
 create or replace view `stu_v_4` as select id,name from student where id <= 15 with local check option ;
 -- 测试插入数据
 insert into `stu_v_5` values(18,'Tom');
 -- 执行失败,id>10 id>15,满足v5条件v5会递归到关联视图v4,去检查v4是否添加了检查选项,如果添加了,则满足v4条件,如果没有,则不检查,
 -- 此时v4视图有检查选项,所以需要满足v4视图条件,且插入语句不满足v4视图条件,所以插入失败
 -- [HY000][1369] CHECK OPTION failed 'demo.stu_v_5'

区别:

  • cascaded 比 local更加严格,前者只要是上级关联的都会检查,后者是上级关联的要看有没有规则再决定检查

  • CASCADED 加的限制会向上辐射,而LOCAL只限制当前视图

更新

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

    • 聚合函数或者窗口函数(sum(),min(),max(),count()等)

    • distinct关键字(去重)

    • group by(分组操作)

    • having(分组之后的过滤)

    • union 或者union all

    代码展示(依聚合函数为例):

     -- 创建视图,使用聚合函数
     create view `stu_v_count` as select count(*) from student;
     -- 插入数据
     insert into stu_v_count values (10); -- 插入失败 [HY000][1471] The target table stu_v_count of the INSERT is not insertable-into
     -- 原因:视图使用聚合函数,导致视图中的行数据与表中的行数据不是一一对应的关系,因此,视图不被允许更新。

作用

  • 操作简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作,那些经常被使用的查询可以被定义为视图,从而使客户不必为以后的操作每次都要指定全部的条件。

  • 保证数据安全:对于数据库当中的操作,我们可以做到用户授权,通过数据库的用户授权来决定,每一个用户登上MySQL后能看到和操作的数据库或者表,但是对于MySQL系统的授权,只能操作到表,不能够在精细了。无法控制到表中的字段,但是我们可以通过视图做到,比如我们只想让某一个用户只看到哪张表中的部分字段,此时我们就可以创建一个以该表为基表只有部分字段的视图,对于查看该视图的用户而言,其他字段不可见,这样就保证了一些敏感数据的安全性 。

  • 数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响。

    视图只是一张虚拟表,当该视图的基表的字段发生修改时,视图可以通过起别名来杜绝基表字段的改变对业务的影响

总结案例

案例需求:

  • 为了保证数据库表的安全性,开发人员在操作user表时,只能看到用户的基本字段,屏蔽手机号和邮箱两个字段

  • 查询每个学生所选修的课程(三张表联查),这个功能很多业务都会用到,为了简化操作,定义一个视图。

代码展示:

 -- ======综合案例=====
 create view `user_view_operation` as select id,name,phone,profession,age,gender,status,createTime from user;
 create view `s_sc_c_view` as select s.name '学生姓名',c.name '课程姓名' from student s,student_course sc,course c where s.id = sc.studentid && sc.courseid = c.id;
 create or replace view `s_sc_c_view` as select s.name '学生姓名',s.no '学生学号',c.name '课程姓名' from student s left join student_course sc on s.id = sc.studentid  inner join course c on sc.courseid = c.id;

希望对大家有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习手册:客户端负载均衡

一、客户端负载均衡的概念 客户端负载均衡是指在客户端应用程序中&#xff0c;根据一定的算法和策略&#xff0c;将请求分发到多个服务实例上。与服务端负载均衡不同&#xff0c;客户端负载均衡不需要通过专门的负载均衡设备或服务&#xff0c;而是直接在客户端进行请求的分发…

Docker私有仓库实战:官方registry镜像实战应用

抱歉抱歉&#xff0c;离职后反而更忙了&#xff0c;拖了好久&#xff0c;从4月拖到现在&#xff0c;在学习企业级方案Harbor之前&#xff0c;我们先学习下官方方案registry&#xff0c;话不多说&#xff0c;详情见下文。 注意&#xff1a;下文省略了基本认证 TLS加密&#xff…

Redis+Caffeine构建高性能二级缓存

大家好&#xff0c;我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存&#xff0c;废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存&#xff1f; 1. 极速访问 2. 减少网络IO 3…

【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;以太网、MAC地址、MTU与ARP协议 下篇文章&#xff1a;五种IO模型与阻…

Python训练打卡Day21

常见的降维算法&#xff1a; # 先运行预处理阶段的代码 import pandas as pd import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数据。 import numpy as np #用于数值计算&#xff0c;提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘…

node .js 启动基于express框架的后端服务报错解决

问题&#xff1a; node .js 用npm start 启动基于express框架的后端服务报错如下&#xff1a; /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析&#xff1a; 遇到 /c/Program F…

并发笔记-信号量(四)

文章目录 背景与动机31.1 信号量&#xff1a;定义 (Semaphores: A Definition)31.2 二元信号量 (用作锁) (Binary Semaphores - Locks)31.3 用于排序的信号量 (Semaphores For Ordering)31.4 生产者/消费者问题 (The Producer/Consumer (Bounded Buffer) Problem)31.5 读写锁 (…

【HTOP 使用指南】:如何理解主从线程?(以 Faster-LIO 为例)

htop 是 Linux 下常用的进程监控工具&#xff0c;它比传统的 top 更友好、更直观&#xff0c;尤其在分析多线程或多进程程序时非常有用。 以下截图就是在运行 Faster-LIO 实时建图时的 htop 状态展示&#xff1a; &#x1f50d; 一、颜色说明 白色&#xff08;或亮色&#xf…

数据同步DataX任务在线演示

数据同步DataX任务在线演示 1. 登录系统 访问系统登录页面&#xff0c;输入账号密码完成身份验证。 2. 环境准备 下载datax安装包&#xff0c;并解压到安装目录 3. 集群创建 点击控制台-多集群管理 计算组件添加DataX 配置DataX引擎,Datax.local.path填写安装目录。 4. …

telnetlib源码深入解析

telnetlib 是 Python 标准库中实现 Telnet 客户端协议的模块&#xff0c;其核心是 Telnet 类。以下从 协议实现、核心代码逻辑 和 关键设计思想 三个维度深入解析其源码。 一、Telnet 协议基础 Telnet 协议基于 明文传输&#xff0c;通过 IAC&#xff08;Interpret As Command…

TAPIP3D:持久3D几何中跟踪任意点

简述 在视频中跟踪一个点&#xff08;比如一个物体的某个特定位置&#xff09;听起来简单&#xff0c;但实际上很复杂&#xff0c;尤其是在3D空间中。传统方法通常在2D图像上跟踪像素&#xff0c;但这忽略了物体的3D几何信息和摄像机的运动&#xff0c;导致跟踪不稳定&#xf…

uniapp 生成海报二维码 (微信小程序)

先下载qrcodenpm install qrcode 调用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物业推广码" placeholder autoBack></uv-navbar><view class"community-info"><text clas…

16.Excel:数据收集

一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用&#xff0c;而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候&#xff0c;会制作表头给填写人&#xff0c;最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…

AI系列:智能音箱技术简析

AI系列&#xff1a;智能音箱技术简析 智能音箱工作原理详解&#xff1a;从唤醒到执行的AIPipeline-CSDN博客 挑战真实场景对话——小爱同学背后关键技术深度解析 - 知乎 (zhihu.com) AI音箱的原理&#xff0c;小爱同学、天猫精灵、siri。_小爱同学原理-CSDN博客 智能音箱执行步…

BUUCTF——Ezpop

BUUCTF——Ezpop 进入靶场 给了php代码 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $v…

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…

PDF2zh插件在zotero中安装并使用

1、首先根据PDF2zh说明文档&#xff0c;安装PDF2zh https://github.com/guaguastandup/zotero-pdf2zh/tree/v2.4.0 我没有使用conda&#xff0c;直接使用pip安装pdf2zh &#xff08;Python版本要求3.10 < version <3.12&#xff09; pip install pdf2zh1.9.6 flask pypd…

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户密码

大致分为这三步 首先在usercontroller中增加updatePwd方法 PatchMapping ("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params){//1.校验参数String oldPwd params.get("old_pwd");String newPwd params.get("n…

C++GO语言socket套接字

目录 01 06-socket-client-server通信过程分析 02 07-socket-server-单次处理 03 08-socket-client 01 09-socket-server-多连接建立 02 10-socket-client多次发送数据 01 -socket-client-server通信过程分析 ### - Server Demo接收一个链接&#xff0c;而且只能发送一次数…

WebSocket:实时通信的新时代

在现代Web应用中&#xff0c;实时通信变得越来越重要。传统的HTTP协议虽然能够满足基本的请求-响应模式&#xff0c;但在需要频繁更新数据的场景下&#xff0c;其效率和性能显得捉襟见肘。WebSocket协议应运而生&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的机制&a…