当前位置: 首页 > 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.dtcms.com/a/322690.html

相关文章:

  • Swift 实战:秒算两个数组的交集(LeetCode 349)
  • 一周学会Matplotlib3 Python 数据可视化-标注 (Annotations)
  • 力扣-74.搜索二维矩阵
  • [Oracle] MAX()和MIN()函数
  • 深入理解 Gin 框架的路由机制:从基础使用到核心原理
  • Linux系统之lua 详解
  • 版本控制的详细说明介绍(已有github账号版)
  • 记一次奇异的bug
  • 蓝牙技术概览
  • [Oracle] SUBSTR()函数
  • 轻量化阅读应用实践:21MB无广告电子书阅读器测评
  • Spring Boot 应用测试全指南:从单元测试到集成测试的实战之路
  • 密集遮挡场景识别率↑31%!陌讯轻量化部署方案在智慧零售的实战解析
  • ppt 生成视频的 ai 大模型全面解析
  • ORA-600 kcratr_nab_less_than_odr和ORA-600 4194故障处理---惜分飞
  • 书生浦语第五期-L1G4-InternLM 论文分类微调实践(XTuner 版)
  • 机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)
  • HashTable, HashMap, ConcurrentHashMap
  • SpringBoot 集成 MapStruct
  • 10. 怎么实现深拷贝?
  • 大模型SSE流式输出技术
  • C++ 类模板
  • 使用langchain框架开发一个能调用工具的聊天助手Demo
  • MCU-基于TC397的启动流程
  • SQL基本
  • “自动报社保 + 查询导出 ” 的完整架构图和 Playwright C# 项目初始化模板
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
  • 【阿里巴巴大数据实践之路学习记录】第十章-维度设计
  • 算法_python_学习记录_02
  • Docker大全