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哦~~~

相关推荐
2401_898717661 小时前
如何在 SvelteKit 中为动态加载的图片正确实现悬停显示覆盖层
jvm·数据库·python
m0_702036531 小时前
如何在MongoDB中实现按时间跨度的分片路由_时间序列范围分片与冷热节点架构.txt
jvm·数据库·python
2301_808414381 小时前
MySQL表的增删查改
数据库·mysql
2401_884454151 小时前
golang如何使用Fiber高性能框架_golang Fiber框架入门教程
jvm·数据库·python
ㄟ留恋さ寂寞1 小时前
Golang怎么读取和修改图片EXIF信息_Golang如何用goexif提取照片的拍摄时间和GPS位置【方法】
jvm·数据库·python
zhoutongsheng1 小时前
如何在 SvelteKit 中为动态加载的图片正确实现悬停显示覆盖层
jvm·数据库·python
IMPYLH1 小时前
Linux 的 truncate 命令
linux·运维·服务器·前端·bash
a7963lin1 小时前
Go语言怎么做分布式缓存_Go语言分布式缓存教程【经典】
jvm·数据库·python
zh1570231 小时前
golang如何生成和验证JWT Token_golang JWT Token生成验证步骤
jvm·数据库·python