我们上一篇博客也讲到了视图,但是我们今天要学的这个视图并不是上篇博客的视图。
在日常数据库开发中,我们经常遇到这样的需求:多个业务模块需要查询同一份数据,但每个模块关注的字段不同;或者某些敏感字段需要隐藏,不能让所有用户都看到。这时候,视图(View) 就成了一个非常优雅的解决方案。
很多人刚开始接触视图时,会觉得它像一个"虚拟表"或者"保存好的查询语句"。本文将从实际开发的角度,带你全面掌握 MySQL 视图的使用。
一、什么是视图?
视图是一个虚拟表 ,它不存储实际数据,而是存储一条 SELECT 语句。当你查询视图时,MySQL 会执行这条 SELECT 语句并返回结果。
一句话理解:视图就是给一条复杂的查询语句起个名字,然后像操作普通表一样使用它。
视图 vs 普通表
| 特性 | 普通表 | 视图 |
|---|---|---|
| 存储数据 | 存储 | 不存储 |
| 占用空间 | 占用磁盘 | 几乎不占用 |
| 数据实时性 | 静态 | 动态(实时查询基表) |
| 可以建索引 | 可以 | 不可以(但基表索引有效) |
| 可以增删改 | 可以 | 有限制 |
二、视图的基本操作

1.创建视图

2.查询视图

3.查看视图定义

4.修改和删除视图
1.修改

2.删除

三、视图的更新操作
很多人认为视图是只读的,其实部分视图支持更新,但这个更新会直接影响基表。
可更新视图的条件
视图必须满足以下条件才能执行 INSERT、UPDATE、DELETE:
-
视图基于单张表(没有 JOIN)
-
视图中包含基表的所有非空且无默认值的列
-
没有使用聚合函数(
SUM、AVG、COUNT等) -
没有使用
DISTINCT、GROUP BY、HAVING -
没有使用子查询、
UNION


发现主表里面CLARK也变成了clark了
四、性能注意事项
7.1 视图不会提升性能
视图本质是一个宏替换(MERGE 算法)或临时表(TEMPTABLE 算法),不会自动缓存结果。每次查询视图都会重新查询基表。
常见问题 Q&A
Q1:视图能建索引吗?
不能。但基表的索引对视图查询有效。如果视图查询很慢,考虑优化基表的索引或使用物化视图(MySQL 不支持原生物化视图,可用表模拟)。
Q2:视图和存储过程的区别?
| 视图 | 存储过程 | |
|---|---|---|
| 返回结果 | 返回表(结果集) | 可返回多个结果集 |
| 参数 | 不支持 | 支持输入/输出参数 |
| 使用方式 | 像表一样 SELECT |
CALL 调用 |
| 嵌套 | 可在查询中嵌套 | 不能直接在查询中用 |
Q3:视图中的数据会过期吗?
视图总是查询实时数据(除非用 TEMPTABLE 算法,但也不会自动刷新)。想缓存数据快照,需要自己建表并定期刷新。
Q4:MySQL 有物化视图吗?
原生不支持。
视图是 MySQL 中一个轻量而强大的工具,它不能替代表,但在查询简化、权限控制和逻辑抽象方面有着独特的价值。理解它的本质------存储的查询语句------就能更好地把握何时使用、如何使用。
希望这篇文章能帮助你全面掌握 MySQL 视图。如果你在实际项目中遇到了视图相关的有趣问题,欢迎留言交流,可以私信me哦~~~