当前位置: 首页 > news >正文

MYSQL的视图

目录

一、引言

二、什么是视图

三、创建视图

四、使用视图

五、修改数据

六、删除视图

七、视图的优点

八、总结


一、引言

这一期咱们换个话题,来讲讲MySQL里的视图。和上一期讲的索引、事务一样,视图也是日常开发中可能会用到的基础知识点,不算复杂,但新手容易和表搞混。还是老规矩,不深讲底层原理,只给大家讲清楚“什么是视图、怎么用视图”,保证看完就能上手,咱们废话不多说,进入正题

二、什么是视图

其实视图特别好理解,咱们还是用大白话来讲,不用记专业定义。视图本质上不是一张真实的表,没有自己的物理数据,它更像是一个“虚拟的表”,或者说是一个“查询语句的别名”。

简单说,视图就是把一个复杂的查询语句,保存起来,起个名字,以后再想执行这个查询,不用再写一长串SQL,直接调用这个视图的名字就行。它展示的数据,都是来自于背后的真实数据表,视图本身不存储任何数据,相当于一个“窗口”,我们通过这个窗口,能看到真实表中我们需要的数据。

举个例子:我们有一张user表,里面有id、name、age、phone、address等很多字段,而我们日常查询,只需要name、age、phone这三个字段,每次都写SELECT name,age,phone FROM user;很麻烦,这时候就可以创建一个视图,把这个查询语句保存起来,以后直接查视图,就能得到这三个字段的数据,不用再重复写查询语句。

三、创建视图

创建视图的语法很简单,核心就是“CREATE VIEW 视图名 AS 查询语句”,咱们结合实际例子来讲,新手直接照搬就能用,不用死记语法。

首先,创建视图的基本语法:

CREATE VIEW 视图名 AS SELECT 字段1, 字段2... FROM 表名 [WHERE 条件];

这里有几个小细节,跟大家说一下:视图名建议起得有意义,比如v_user_info(v_开头表示视图,后面跟用途),方便后续区分;查询语句可以是简单的单表查询,也可以是多表关联查询,只要是合法的SELECT语句都可以。

举两个实际例子,大家一看就懂:

1. 单表创建视图:从user表中,只提取name、age、phone三个字段,创建视图v_user_basic:

CREATE VIEW v_user_basic AS SELECT name, age, phone FROM user;

2. 带条件的视图:从user表中,提取age>18的用户,只显示name和phone,创建视图v_user_adult:

CREATE VIEW v_user_adult AS SELECT name, phone FROM user WHERE age > 18;

注意:创建视图的时候,要保证你有创建视图的权限,另外,视图的字段名可以和原表一致,也可以自己重命名,比如SELECT name AS 姓名, age AS 年龄 FROM user,这样视图里的字段名就是“姓名”“年龄”,更直观。

四、使用视图

使用视图比创建视图更简单,因为视图本质上就是一个“虚拟表”,所以使用它的方式,和使用普通的表几乎一样,最常用的就是查询操作。

1. 基本查询:直接查询视图,和查普通表一样,语法:SELECT * FROM 视图名;

比如查询我们刚才创建的v_user_basic视图,直接写:

SELECT * FROM v_user_basic;

执行后,就会显示视图中保存的name、age、phone三个字段的数据,和执行原来的查询语句结果完全一样,但更简洁。

2. 带条件查询:也可以给视图加WHERE条件,筛选需要的数据,比如查询v_user_basic中age=20的用户:

SELECT * FROM v_user_basic WHERE age = 20;

3. 结合排序、分页:和普通表一样,视图也能使用ORDER BY、LIMIT等关键字,比如查询v_user_adult,按name排序,只显示前10条:

SELECT * FROM v_user_adult ORDER BY name LIMIT 10;

这里提醒一句:视图只能用来查询(大部分场景),不能直接用来插入、修改、删除数据(后面会讲特殊情况),核心作用就是简化查询。

五、修改数据

这里要重点说一下:不是所有视图都能修改数据,只有满足一定条件的视图,才能通过视图修改背后真实表的数据,而且修改视图的数据,本质上是修改视图背后真实表的数据,视图本身不会存储数据。

先说说能修改数据的视图要满足的条件(新手记重点就行):

1. 视图是基于单表创建的,没有使用DISTINCT、GROUP BY、HAVING等关键字;

2. 视图的字段,必须对应真实表的字段,不能是计算字段(比如SUM(age)、name||'_'||phone这种)。

满足条件后,修改数据的语法和普通表一样,常用的有UPDATE、INSERT、DELETE三种:

1. 通过视图修改数据(UPDATE):比如修改v_user_basic中name='张三'的用户年龄为22:

UPDATE v_user_basic SET age = 22 WHERE name = '张三';

执行后,真实的user表中,张三的age也会变成22,视图只是一个“窗口”,修改的还是底层数据。

2. 通过视图插入数据(INSERT):比如给v_user_basic插入一条新数据(注意字段要和视图一致):

INSERT INTO v_user_basic (name, age, phone) VALUES ('李四', 25, '13900139000');

3. 通过视图删除数据(DELETE):比如删除v_user_basic中name='李四'的数据:

DELETE FROM v_user_basic WHERE name = '李四';

重点提醒:如果视图是多表关联创建的,或者用了DISTINCT、GROUP BY等关键字,就不能修改数据了,执行UPDATE、INSERT、DELETE会报错,新手一定要注意这一点。

六、删除视图

删除视图很简单,语法比删除索引还简单,而且删除视图不会影响背后的真实表和数据,只是删除了保存的查询语句,不用担心误删数据。

删除视图的基本语法:DROP VIEW 视图名;

举个例子:删除我们刚才创建的v_user_adult视图:

DROP VIEW v_user_adult;

如果想一次性删除多个视图,也可以用逗号分隔:

DROP VIEW v_user_basic, v_user_adult;

注意:删除视图前,确认好视图名,别删错了;另外,删除视图不需要删除底层表,只删视图本身即可,删完之后,就不能再通过这个视图查询数据了,但底层表的数据依然存在。

七、视图的优点

讲完了怎么用,再跟大家说说视图的优点,为什么我们要用到视图?其实核心就是“简化操作、保证安全”,用大白话总结4个最实用的优点,新手一看就懂:

1. 简化查询,提高效率:把复杂的查询语句(比如多表关联、多条件筛选)保存成视图,后续查询不用重复写长SQL,直接调用视图名,节省时间,也减少写错的概率。

2. 隐藏敏感数据,保证数据安全:比如user表中有address、身份证号等敏感字段,我们可以创建视图,只展示name、age等非敏感字段,给其他开发者或用户只开放视图的查询权限,不让他们看到敏感数据,保护数据安全。

3. 统一查询逻辑,减少冗余:如果多个地方都需要用到同一个查询逻辑,不用每个地方都写一遍SQL,只需要创建一个视图,所有地方都调用这个视图,后续如果查询逻辑需要修改,只改视图的查询语句,不用改所有地方,减少冗余,也方便维护。

4. 降低新手门槛:对于刚接触MySQL的新手来说,复杂的多表关联查询很难写,而视图已经封装好了查询逻辑,新手直接查询视图,就能得到需要的数据,不用理解背后复杂的查询语句。

当然,视图也有小缺点,比如不能直接修改复杂视图的数据,查询视图本质上还是执行背后的查询语句,性能和直接写SQL差不多,但日常开发中,优点完全大于缺点,还是很实用的。

八、总结

好了,这一期MySQL视图的基础内容,就全部讲完啦。还是延续咱们的风格,不搞复杂原理,只讲日常能用得上的知识点,新手看完就能上手操作,咱们简单回顾一下核心重点,方便大家记忆:

1. 视图是“虚拟表”,不存储真实数据,本质是保存的查询语句,数据都来自于底层的真实表;

2. 核心操作:创建(CREATE VIEW)、查询(和查普通表一样)、修改(有限制)、删除(DROP VIEW),语法都很简单,重点记创建和查询的用法;

3. 视图的核心优点:简化查询、隐藏敏感数据、统一逻辑、降低新手门槛,适合日常开发中需要重复使用同一查询逻辑的场景;

4. 小提醒:不是所有视图都能修改数据,多表关联、带DISTINCT/GROUP BY的视图,无法修改数据;删除视图不影响底层表数据。

视图和上一期讲的索引、事务,都是MySQL基础且常用的知识点,不用死记硬背,多动手实操一遍,就能熟练掌握。这一期就先讲到这里,后续再跟大家分享更多MySQL基础知识点。

http://www.jsqmd.com/news/774964/

相关文章:

  • Termi AI:基于Electron的智能桌面开发伴侣,集成Vite预览与AI编程助手
  • 第七篇:慢查询分析与SQL优化实战
  • copilot学生认证按键无法点击
  • golang如何实现桌面应用热更新_golang桌面应用热更新实现攻略
  • MyBatis 高频八股文:从 Mapper 到缓存,一篇搞懂常见面试题
  • Python配置管理实战:从环境变量到类型安全,详解Tanuki单文件库设计
  • #81_闲谈语言的分类
  • linux kernel CONFIG_KCMP解析
  • YOLOv11室内地面塑料袋目标检测数据集-30张-Plastic-Bag-1
  • 微信福音:2345清理王微信专清功能介绍
  • 告别GPIO模拟!用STM32的FSMC高效驱动TFT屏,刷图速度提升实测
  • 吃透C++ STL map/set:从入门到实战,新手也能轻松上手
  • 车载诊断架构---解答售后关于Service 19 06疑问带来的反思
  • 3203黄大年茶思屋榜文保姆级全落地解法「32期3题」量子启发式算法|大规模百万节点图平衡最小分割优化
  • 用Python+PuLP搞定钢管运输优化:手把手复现2000年数模国赛B题
  • 大语言模型如何构建创业者认知代理:从特征工程到RAG应用
  • dotnet-skills:让AI助手掌握现代.NET开发最佳实践
  • 欧拉回路(一笔画)
  • “灵语星火”第二阶段团队记录(一)
  • 如何在华为HarmonyOS设备上部署microG服务:解决签名验证的完整技术指南
  • 开源情报实战指南:从工具到体系的OSINT方法论与自动化实践
  • Emacs光标管理库cursory:实现情境感知的自动切换与主题集成
  • 轻量级唤醒词检测:从MFCC特征到CNN模型在边缘设备的实践
  • 基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南
  • 为什么很多人 DFS 写得飞起,一到「矩阵最长递增路径」就彻底懵了?
  • [特殊字符] 数组中的递增三元组:O(n) 时间高效查找,面试必考!
  • “灵语星火”第二阶段团队记录(二)
  • 给Claude Code装个仪表盘 Claude HUD保姆级教程命令行也能直观可控
  • 告别纯寄存器:用STC-ISP工具图形化配置STC8H的PWM,5分钟生成代码
  • CUDA内核优化:从手工调优到AI驱动的自动化实践