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

相关推荐
CodexDave10 小时前
PostgreSQL 明明有索引却选了 Nested Loop:从行数误判修正执行计划
数据库·postgresql·执行计划·扩展统计·nestedloop
熊猫钓鱼>_>10 小时前
ArkTS 装饰器总览:V1 / V2 / 通用装饰器完整学习笔记
笔记·学习·华为·交互·harmonyos·arkts·arkweb
高磊200511 小时前
LVS(Linux virual server)
linux·服务器·lvs
shwill12312 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
czhaii12 小时前
STC ai助手单片机工程项目创建实例
数据库·mongodb
山峰哥12 小时前
数据库性能救星:Explain执行计划深度拆解
服务器·开发语言·数据库·sql·启发式算法
执笔画流年呀12 小时前
Linux搭建Java项目部署环境
java·linux·运维
oradh13 小时前
Oracle 11g rac IP地址修改(public ip、vip、scan ip、priviate ip)
数据库·tcp/ip·oracle·rac ip地址修改
Sisphusssss13 小时前
香橙派5plus GPIO
linux·python·ubuntu
YOU OU13 小时前
Redis哨兵 & 集群
数据库·redis·sentinel