MySQL--视图详解
介绍
视图(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 replacealter 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的视图条件。
代码展示:
-- 创建没有检查选项的视图v1create or replace view `stu_v_1` as select id,name from student where id <= 20;-- 测试插入数据insert into `stu_v_1` values(8,'Tom'); -- 插入成功,id<20insert 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视图中添加则检查,如果没有添加,则不检查。
代码展示:
-- 创建没有检查选项的视图v4create or replace view `stu_v_4` as select id,name from student where id <= 15;-- 测试插入数据insert into `stu_v_4` values(8,'Tom'); -- 插入成功,id<15insert 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;
希望对大家有所帮助!
相关文章:
MySQL--视图详解
介绍 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表(称为基表),并且是在使用视图时动态生成的。 简而言之:视图只保存了查询的…...

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

Docker私有仓库实战:官方registry镜像实战应用
抱歉抱歉,离职后反而更忙了,拖了好久,从4月拖到现在,在学习企业级方案Harbor之前,我们先学习下官方方案registry,话不多说,详情见下文。 注意:下文省略了基本认证 TLS加密ÿ…...
LeetCode 373 查找和最小的 K 对数字题解
LeetCode 373 查找和最小的 K 对数字题解 题目描述 给定两个以升序排列的整数数组 nums1 和 nums2,以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。请找到和最小的 k 个数对。 解题思路 最小堆优化法…...
WebSocket集成方案对比
WebSocket集成方案对比与实战 架构选型全景图 #mermaid-svg-BEuyOkkoP6cFygI0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BEuyOkkoP6cFygI0 .error-icon{fill:#552222;}#mermaid-svg-BEuyOkkoP6cFygI0 .er…...
深入理解 Istio v1.25.2
要深入理解 Istio 的最新版本(截至 2025 年 5 月,最新版本为 1.25.2,发布Iweb:1⁊)源码,我们可以通过分析其核心组件和代码结构来加深对 Istio 的理解。以下是对 Istio 源码的解读,结合其架构和功能&#x…...
使用conda导致无法找到libpython动态库
最近在用 AFL 的时候编译完成后遇到如下的报错: afl-fuzz: error while loading shared libraries: libpython3.9.so.1.0: cannot open shared object file: No such file or directory然后发现是因为编译时用的Python环境是通过miniconda构建的虚拟环境࿰…...

Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存,废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存? 1. 极速访问 2. 减少网络IO 3…...
MyBatis-Plus使用 wrapper.apply() 添加自定义 SQL 片段
在 MyBatis-Plus 中,wrapper.apply() 方法允许你在构建查询条件时插入任意的 SQL 片段。这对于实现一些复杂的查询需求特别有用,比如添加子查询、使用数据库特定函数等; 示例 1: 基本应用 import com.baomidou.mybatisplus.core.conditions…...

【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:以太网、MAC地址、MTU与ARP协议 下篇文章:五种IO模型与阻…...

Python训练打卡Day21
常见的降维算法: # 先运行预处理阶段的代码 import pandas as pd import pandas as pd #用于数据处理和分析,可处理表格数据。 import numpy as np #用于数值计算,提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘…...
【大模型MCP协议】MCP官方文档(Model Context Protocol)一、开始——1. 介绍
https://modelcontextprotocol.io/tutorials/building-mcp-with-llms 文章目录 介绍为什么选择MCP?总体架构 开始使用快速入门示例 教程探索MCP贡献支持和反馈探索 MCP贡献代码支持与反馈 介绍 开始使用模型上下文协议(MCP) C# SDK已发布&…...
三大告警方案解析:从日志监控到流处理的演进之路
引言:告警系统的核心挑战与演进逻辑 在分布式系统中,实时告警是实现业务稳定性的第一道防线。随着系统复杂度提升,告警机制从简单的日志匹配逐步演进到流式处理的秒级响应。本文将基于三大主流方案(日志告警、离线统计、实时流…...

node .js 启动基于express框架的后端服务报错解决
问题: node .js 用npm start 启动基于express框架的后端服务报错如下: /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析: 遇到 /c/Program F…...
互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

并发笔记-信号量(四)
文章目录 背景与动机31.1 信号量:定义 (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 下常用的进程监控工具,它比传统的 top 更友好、更直观,尤其在分析多线程或多进程程序时非常有用。 以下截图就是在运行 Faster-LIO 实时建图时的 htop 状态展示: 🔍 一、颜色说明 白色(或亮色…...

数据同步DataX任务在线演示
数据同步DataX任务在线演示 1. 登录系统 访问系统登录页面,输入账号密码完成身份验证。 2. 环境准备 下载datax安装包,并解压到安装目录 3. 集群创建 点击控制台-多集群管理 计算组件添加DataX 配置DataX引擎,Datax.local.path填写安装目录。 4. …...
The Graph:区块链数据索引的技术架构与创新实践
作为Web3生态的核心基础设施,The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈,还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...

telnetlib源码深入解析
telnetlib 是 Python 标准库中实现 Telnet 客户端协议的模块,其核心是 Telnet 类。以下从 协议实现、核心代码逻辑 和 关键设计思想 三个维度深入解析其源码。 一、Telnet 协议基础 Telnet 协议基于 明文传输,通过 IAC(Interpret As Command…...
【AI提示词】波特五力模型专家
提示说明 具备深入对企业竞争环境分析能力的专业人士。 提示词 # Role:波特五力模型专家## Profile - language:中文 - description:具备深入对企业竞争环境分析能力的专业人士 - background:熟悉经济学基础理论,擅长用五力模型分析行业竞争 - personality…...
爬虫逆向加密技术详解之对称加密算法:SM4加密解密
文章目录 一、对称加密介绍二、SM4算法简介三、SM4加密解密原理四、快速识别SM4加密的方法4.1 密文长度判断4.2 验证密文字符集4.3 代码特征识别 五、代码实现5.1 JavaScript实现SM4加密解密5.2 Python实现SM4加密解密 一、对称加密介绍 SM4属于对称加密算法,不知道…...
React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程
👋 欢迎回到《前端达人 React 播客书单》第 9 期(正文内容为学习笔记摘要,音频内容是详细的解读,方便你理解),请点击下方收听 你是不是常在网上看到 .tsx 项目、Babel、Webpack、tsconfig、Vite、CRA、ESL…...
Android 数据持久化之 文件存储
在 Android 开发中,存储文件是一个常见的需求。文件存储对数据不进行任何格式化处理,原封不动地保存到文件中。适合存储一些简单的文本数据或者二进制数据。 一、存储路径 根据文件的存储位置和访问权限,可以将文件存储分为内部存储(Internal Storage)和外部存储(Exter…...

TAPIP3D:持久3D几何中跟踪任意点
简述 在视频中跟踪一个点(比如一个物体的某个特定位置)听起来简单,但实际上很复杂,尤其是在3D空间中。传统方法通常在2D图像上跟踪像素,但这忽略了物体的3D几何信息和摄像机的运动,导致跟踪不稳定…...
数据分析预备篇---NumPy数组
NumPy是数据分析时常用的库,全称为Numerical Python,是很多数据或科学相关Python包的基础,包括pandas,scipy等等,常常被用于科学及工程领域。NumPy最核心的数据结构是ND array,意思是N维数组。 #以下是一个普通列表的操作示例:arr = [5,17,3,26,31]#打印第一个元素 prin…...

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的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...

AI系列:智能音箱技术简析
AI系列:智能音箱技术简析 智能音箱工作原理详解:从唤醒到执行的AIPipeline-CSDN博客 挑战真实场景对话——小爱同学背后关键技术深度解析 - 知乎 (zhihu.com) AI音箱的原理,小爱同学、天猫精灵、siri。_小爱同学原理-CSDN博客 智能音箱执行步…...
【网络安全】——大端序(Big-Endian)和小端序(Little-Endian)
字节序(Endianness)是计算机系统中多字节数据(如整数、浮点数)在内存中存储或传输时,字节排列顺序的规则。它分为两种类型:大端序(Big-Endian)和小端序…...