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

视图是什么?有什么用?什么时候用?MySQL中的视图

面试被问到视图相关的了,直接就是没听过,那么这会来了解一下什么是视图

  • mysql的视图是什么?什么时候会用到?怎么使用?什么时候出来的功能?现在还在用嘛?被什么技术替代了?优缺点是什么?
  1. MySQL 的视图是什么? 就是一段SQL语句,只不过是存到MySQL中去了,并给他给了个类型叫视图,存的时候也给他起了个别名,方便后续使用。用的时候就是通过视图名字拿到视图对应的SQL来执行,所以视图存的只是SQL,而不是SQL执行之后的数据,也因此视图所占的空间很小
  2. 什么时候会用到视图? ①简化复杂查询(把复杂的SQL封装成视图,这有点像Java封装方法,只暴露方法名,入参出参那些,至于方法的细节不用操心) ②数据安全:对外提供视图而不是直接访问真实表,可以隐藏敏感字段(如手机号、身份证号)。 ③统一数据口径:把统计逻辑放到视图里,保证所有人取到的数据一致。 ④跨团队协作:DBA/数据开发定义好视图,业务只需要调用,不需要关心底层数据结构。
  1. 怎么使用视图?
  2. 创建视图:

create view view_name as select colume1,colume2, ... from table_name where condition

使用视图:

select * from view_name

修改视图:

alert view view_name as select ……

删除视图:

drop view view_name

  1. 什么时候出来的功能? 视图是在MySQL5.0版本中出来的功能
  2. 现在还在用嘛?被什么技术替代了? 应用层被一些新的技术替代了,比如MyBatis中的Mapper,还有Spring Data JPA中的Repository,这些技术都是基于视图的思想,只是实现方式不同,但是都是简化复杂查询,统一数据口径,跨团队协作 在大数据/OLAP 场景中:用 物化视图(Materialized View)、ETL 生成中间表来替代,减少实时计算压力。 在权限控制上:用 数据权限控制框架 代替仅依赖视图隐藏敏感字段
  3. 缺点是什么? 性能问题:每次查询视图都会执行底层 SQL,复杂视图可能很慢。 不利于调优:优化 SQL 时可能需要分析多层嵌套视图,复杂度高。 有些视图是只读的,不方便写操作。 维护成本高:表结构变化可能导致视图失效。
  • 那么我平常在这个navicate软件工具里面写一个查询语句,下面展示出来的数据就是视图? 以及Mybatis和jpa是怎么对视图做处理的?
  1. navicate软件工具里面写一个查询语句,下面展示出来的数据就是视图? 不是的,那个数据只是指临时查询的结果,并没有在数据库中保存成对象,而试图是把这个SQL保存下来,可以作为虚拟表来使用
  2. Mybatis和jpa是怎么对视图做处理的? MyBatis MyBatis 把视图当成普通的表看待,只要数据库里存在这个视图,就可以直接在 mapper 里写: 视图查询返回的列,必须和 resultType 或 resultMap 对应的字段匹配,否则会映射失败。 MyBatis 不关心你这个对象是表还是视图,只要数据库能查出来,它就能映射。

<select id="selectAdults" resultType="User"> SELECT * FROM adult_user </select>

JPA JPA 也可以把视图映射成实体类,做法和映射表是一样的: 如果视图是只读的,JPA 的 save()、update() 会报错,因为底层数据库视图不支持写操作。 对于可更新视图(单表、无聚合、无 DISTINCT 等限制),JPA 的写操作也可以生效,但要小心触发数据库限制。

@Entity @Table(name = "adult_user") // 对应视图名 public class AdultUser { private String name; private Integer age; }

  • 哦哦我懂了,也就是视图其实就是一个SQL的查询语句是吧,是保存到MySQL中的SQL语句是不,然后买次调用视图的时候,都是在实行这个SQL语句,然后作为对应的视图名,以表格的形式返回出来, 然后dba就是把那些复杂的SQL封装成视图存到MySQL中去,然后把对应的视图名称给开发,让他们去使用是不? 那这么看视图还挺好用的,他有什么弊端嘛,以及生成的视图存到数据库的那个地方了?存储过程是不是跟视图有点类似啊
  1. 你理解的流程没错 ✅ 视图本质 就是一个保存到 MySQL 里的 SELECT 查询语句,数据库给它起了个名字(视图名)。 每次查询视图时,MySQL 会 实时执行这个 SQL,然后把结果当作“表”一样返回。 ✅ 使用方式 DBA 负责写复杂 SQL → 存成视图(CREATE VIEW) → 给开发一个视图名。 开发就可以直接 SELECT * FROM 视图,像查表一样简单。
  2. 视图存在哪? 视图定义存放在数据库的 元数据(data dictionary) 里,而不是存数据的 .ibd 文件。 在 MySQL 的物理文件结构中: .frm / 数据字典记录了视图的列结构 .view 文件里保存了视图的 SQL 定义 也可以在 information_schema.VIEWS 表中看到视图的定义:

SELECT * FROM information_schema.VIEWS WHERE TABLE_NAME = 'your_view_name';

  1. 存储过程和视图的区别 视图更像是“保存的 SQL 查询模板”。 存储过程更像是“数据库里的一个小程序”,可以包含条件判断、循环、事务处理。
  • 聚合、DISTINCT、UNION 等会让视图无法更新这个不太懂为什么 另一个就是表结构有变化了,跟这个表有关的视图就会被删掉? 另外我了解到的就是这个存储过程容易导致锁行、锁表的问题,但是这些问题是的原因我不清楚,另外是不是视图也会导致这些问题,那么现在市场中视图这个东西被用的多嘛?以及出现了这种行锁、表锁怎么处理解决,并调整这个视图或是别的来解决这个问题? 为什么用视图不用存储过程,这两个在MySQL中的差别是什么?
  1. 为什么聚合、DISTINCT、UNION 会让视图无法更新? 视图要支持 UPDATE/DELETE/INSERT,MySQL 必须能确定: 这个视图的每一行数据,对应到底层表中的唯一一行。 一旦存在聚合函数(SUM、COUNT、MAX...)、DISTINCT、GROUP BY、UNION 等,行与行之间已经是“汇总后的结果”,底层表的唯一对应行就消失了。 举例: sql

CREATE VIEW v_sales AS SELECT product_id, SUM(price) AS total FROM orders GROUP BY product_id;

你要 UPDATE v_sales SET total = 100 时,数据库懵了: 这个 total = 100 应该更新 orders 表的哪一行? 有可能是 1 行、10 行甚至 100 行,所以 MySQL 直接禁止更新。 简单说:视图只有是“单表 + 主键可唯一定位 + 没有复杂聚合”时才可更新。

  1. 表结构变化会怎样影响视图? 字段被删除:视图引用了这个字段,查询会报错(Unknown column),但视图对象本身可能还在,只是不可用。 字段改名:同上,视图报错。 表被删除:视图变成“孤儿”,查询直接报错(Table doesn't exist)。 表新增字段:视图不受影响,除非是 SELECT * 创建的视图,新增字段不会自动加进来(因为视图在创建时已经定死了字段列表)。
  2. 存储过程为什么容易导致锁行、锁表? 原因不是“存储过程”本身,而是存储过程里的 SQL 逻辑可能引发锁: 事务范围大:存储过程可能在一次调用中执行多条 DML(INSERT/UPDATE/DELETE)并开启事务,期间行或表会保持锁定。 大批量更新:一次更新大量行,如果走全表扫描,可能会升级为表锁。 无索引条件更新:UPDATE table SET ... WHERE 非索引字段=xxx,会锁更多行甚至全表。 📌 行锁、表锁在视图中也可能出现 因为视图只是 SQL 的别名,如果你对视图执行更新,而底层 SQL 没有走索引、或涉及多表 join,本质还是会锁大量数据。
  1. 出现行锁/表锁怎么解决? 常见优化思路: 加索引 确保 WHERE 条件走索引,减少锁的范围。 减少事务持有锁时间 不要在事务中夹杂大量逻辑或等待用户输入。 拆分大事务为多个小事务。 避免大批量一次更新 用 LIMIT + 循环更新(分批更新)。 用合适的事务隔离级别 有些场景从 REPEATABLE READ 改为 READ COMMITTED 可以减少锁等待。 必要时用物化表替代视图 把复杂 SQL 结果提前计算好存到临时表,减少实时大范围锁。
  1. 现在市场中视图用得多吗? 互联网高并发业务系统:用得少(性能和维护成本高),更多用缓存、物化表、应用层聚合。 BI 报表、数据分析:用得多,尤其是在数据仓库里,因为能统一口径、降低重复 SQL 编写。 小中型企业业务系统:可能会用来做权限隔离或简化开发。
  • 视图如何实现传参?怎么查看现有的这些视图,通过命令查看(就是表数据我可以通过navicate直接查看里面的东西,那么我现在想查看现有的所有的这个视图,该用什么命令?)修改视图中用到了这个alert命令,这个命令在MySQL中是什么作用?
  1. 视图如何实现传参? 视图不支持传参
  2. 怎么查看现有的这些视图,通过命令查看(就是表数据我可以通过navicate直接查看里面的东西,那么我现在想查看现有的所有的这个视图,该用什么命令?) 会列出当前数据库下所有视图:

SHOW FULL TABLES WHERE TABLE_TYPE = 'VIEW';

查视图的内部SQL的定义

SELECT TABLE_NAME, VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = '你的数据库名';

  1. 修改视图中用到了这个alert命令,这个命令在MySQL中是什么作用? ALTER 在 MySQL 里就是“修改”的意思,对不同对象作用不同: ALTER TABLE:修改表结构(加列、删列、改数据类型等) ALTER VIEW:修改视图定义

ALTER VIEW adult_user AS SELECT name, age FROM user WHERE age >= 21;

注意:ALTER VIEW 其实等价于重新创建一次视图(MySQL 会替换原定义)。 所以总结: CREATE VIEW:第一次创建 ALTER VIEW:修改已有视图 DROP VIEW:删除视图

http://www.lryc.cn/news/615227.html

相关文章:

  • 深入理解强化学习:近端策略优化(PPO)算法详解
  • 阿里云 ECS 怎么用 nginx 部署80端口多个网站
  • 组件通信的方式
  • Docker容器部署Tomcat线上商城
  • Leetcode——556. 下一个更大元素 III
  • 八、《DaaS(设备即服务):企业轻资产化新路径》--从97.4%首期投入削减到AI算力高效迭代的范式革命
  • Spring 框架中提供Aware接口,实现感知容器对象
  • spring.config.import 不存在
  • “高大上“的SpringCloud?(微服务体系入门)
  • ELK常见的问题
  • 智能机票助手-接入Ollama本地模型-Spring-AI-Alibaba
  • 在ubuntu服务器下安装cuda和cudnn(笔记)
  • 揭秘MyBatis核心类MappedStatement
  • 多模态RAG赛题实战--Datawhale AI夏令营
  • 如何分析需求的可行性
  • 生产环境某业务服务JVM调优总结
  • 避免在微信小程序中频繁使用setData方法
  • 扩散LLM推理新范式:打破生成长度限制,实现动态自适应调节
  • 机器学习——09 聚类算法
  • BGP 协议笔记
  • 使用qemu运行与GDB调试内核
  • 微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式
  • 用天气预测理解分类算法-从出门看天气到逻辑回归
  • Kubernetes(K8s)不同行业的典型应用场景及价值分析 原创
  • windows、linux应急响应入侵排查
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 【2025】Datawhale AI夏令营-多模态RAG-Task1、Task2笔记-任务理解与Baseline代码解读
  • 金融通用智能体(Financial General Agent, FGA)的端到端解决方案
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • C语言:构造类型