MySQL视图

我们上一篇博客也讲到了视图,但是我们今天要学的这个视图并不是上篇博客的视图。

在日常数据库开发中,我们经常遇到这样的需求:多个业务模块需要查询同一份数据,但每个模块关注的字段不同;或者某些敏感字段需要隐藏,不能让所有用户都看到。这时候,视图(View) 就成了一个非常优雅的解决方案。

很多人刚开始接触视图时,会觉得它像一个"虚拟表"或者"保存好的查询语句"。本文将从实际开发的角度,带你全面掌握 MySQL 视图的使用。

一、什么是视图?

视图是一个虚拟表 ,它不存储实际数据,而是存储一条 SELECT 语句。当你查询视图时,MySQL 会执行这条 SELECT 语句并返回结果。

一句话理解:视图就是给一条复杂的查询语句起个名字,然后像操作普通表一样使用它。

视图 vs 普通表

特性 普通表 视图
存储数据 存储 不存储
占用空间 占用磁盘 几乎不占用
数据实时性 静态 动态(实时查询基表)
可以建索引 可以 不可以(但基表索引有效)
可以增删改 可以 有限制

二、视图的基本操作

1.创建视图

2.查询视图

3.查看视图定义

4.修改和删除视图

1.修改
2.删除

三、视图的更新操作

很多人认为视图是只读的,其实部分视图支持更新,但这个更新会直接影响基表。

可更新视图的条件

视图必须满足以下条件才能执行 INSERTUPDATEDELETE

  1. 视图基于单张表(没有 JOIN)

  2. 视图中包含基表的所有非空且无默认值的列

  3. 没有使用聚合函数(SUMAVGCOUNT 等)

  4. 没有使用 DISTINCTGROUP BYHAVING

  5. 没有使用子查询、UNION

发现主表里面CLARK也变成了clark了

四、性能注意事项

7.1 视图不会提升性能

视图本质是一个宏替换(MERGE 算法)或临时表(TEMPTABLE 算法),不会自动缓存结果。每次查询视图都会重新查询基表。

常见问题 Q&A

Q1:视图能建索引吗?

不能。但基表的索引对视图查询有效。如果视图查询很慢,考虑优化基表的索引或使用物化视图(MySQL 不支持原生物化视图,可用表模拟)。

Q2:视图和存储过程的区别?

视图 存储过程
返回结果 返回表(结果集) 可返回多个结果集
参数 不支持 支持输入/输出参数
使用方式 像表一样 SELECT CALL 调用
嵌套 可在查询中嵌套 不能直接在查询中用

Q3:视图中的数据会过期吗?

视图总是查询实时数据(除非用 TEMPTABLE 算法,但也不会自动刷新)。想缓存数据快照,需要自己建表并定期刷新。

Q4:MySQL 有物化视图吗?

原生不支持。

视图是 MySQL 中一个轻量而强大的工具,它不能替代表,但在查询简化、权限控制和逻辑抽象方面有着独特的价值。理解它的本质------存储的查询语句------就能更好地把握何时使用、如何使用。

希望这篇文章能帮助你全面掌握 MySQL 视图。如果你在实际项目中遇到了视图相关的有趣问题,欢迎留言交流,可以私信me哦~~~

相关推荐
AlfredZhao3 小时前
进程都杀了,为什么 `netstat` 还能看到端口?
linux
YOLO数据集集合3 小时前
红外热成像人员检测数据集 |红外检测 白热模式 人员检测 夜间监控 目标检测 YOLO格式 深度学习数据集 计算机视觉9067期
数据库·深度学习·yolo·目标检测·计算机视觉·红外人员·红外数据
BUG指挥官3 小时前
Redis已接入AI
数据库·人工智能·spring boot·redis·spring cloud
一条泥憨鱼3 小时前
【从0开始学习计算机网络】| 邮件协议入门:SMTP、POP3、IMAP
linux·运维·计算机网络·github
春风解人意11 小时前
从零开始学习嵌入式P32----网络基础之TCP
c语言·网络·学习·tcp/ip
SkyWalking中文站11 小时前
BanyanDB 0.11.0:新特性与升级指南
数据库
传奇开心果编程13 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
水巷石子13 小时前
备考系统架构设计师第一天
学习·架构·软考·设计·考试
₍˄·͈༝·͈˄*₎◞ ̑̑码13 小时前
MyBatis操作数据库
数据库·mybatis
Johny_Zhao13 小时前
网络安全等级保护测评实施方案
linux·网络·人工智能·网络安全·信息安全·云计算·等保测评·系统运维·itsm