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

【MySQL笔记】视图

目录

    • 一、什么是视图?
    • 二、使用视图的优势
    • 三、视图的创建与使用
    • 四、不能更新视图的场景
    • 五、删除视图
    • 六、总结

一、什么是视图?

视图(View)是一种虚拟表,不存储实际数据,而是通过执行预定义的查询动态生成数据。用户可以像操作普通表一样对视图进行查询、更新和管理,但其数据完全依赖于基础表。视图的核心价值在于:

  • 封装复杂查询,简化数据访问。
  • 隐藏敏感字段(如密码、余额)。
  • 对外提供一致的列名和结构,避免业务代码频繁修改。
-- 示例:创建学生成绩视图
create view v_student_score as
selects.id, s.name, s.sno, cls.name as class_name, c.name as course_name, sco.score
from
student s, 
class cls, 
score sco, 
course c
where s.class_id = cls.id, 
and sco.student_id = s.id, 
and sco.course_id = c.id;

二、使用视图的优势

  1. 隐藏敏感字段
    例如账户表 account(id, name, balance, password) 中,通过视图仅暴露非敏感字段,将敏感字段balance,password隐藏:
create view v_account as 
select id, name from account;
  1. 统一访问规范
    当表结构变更时,假如 DBA 修改了 student 表,将列 sno 重命名为 number,如果不使用视图,那么就需要大量改动业务代码,将列 sno 重命名为 number,但是如果使用视图,则只需调整视图定义,业务代码不需要改动,只需要将查询语句的 sno 改为 number 即可,对外访问的“接口”依旧是 sno:
-- 旧视图
create view v_student (id, name, sno) as
select id, name, sno from student;-- 新视图(适应列名变更)
create view v_student (id, name, sno) as
select id, name, number from student;

三、视图的创建与使用

  1. 创建语法
create view view_name [(列别名1, 列别名2, ...)] as
select 语句; // 任意的查询语句都可以
  1. 视图与表连接查询
    视图可像普通表一样参与连接操作:
select * from v_student2 s 
join class c on s.class_id = c.id;
  1. 通过视图更新数据
    注意:更新视图会影响基础表,但需满足特定条件:
-- 更新视图(会影响基础表score)
update v_student_score1 set score = 95 where id = 1;

四、不能更新视图的场景

以下类型的视图不支持更新操作:

  • 使用聚合函数(如 SUM(), COUNT())。
  • 使用 distinct 或 group by / having。
  • 使用 union 或 union all。
  • 包含子查询的 select 列表。
  • from 子句中引用不可更新视图。
  • 包含 order by 子句,可能导致更新失败。

五、删除视图

-- 可以删除单个视图
drop view v_student;-- 可以批量删除视图
drop view v_student2, v_student_score;

六、总结

特性说明
存储不存储数据,依赖基础表动态生成
核心用途简化复杂查询、隐藏敏感字段、统一数据接口
更新限制避免聚合、分组、排序等场景
性能影响查询性能与底层SQL复杂度相关,无额外存储开销
维护建议视图嵌套不超过两层,避免过度封装
http://www.xdnf.cn/news/1148761.html

相关文章:

  • Spring AI 项目实战(十九):Spring Boot + AI + Vue3 + OSS + DashScope 构建多模态视觉理解平台(附完整源码)
  • mac 配置svn
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(上)
  • xss-labs1-8题
  • 浏览器渲染原理——计算属性和布局过程常考内容
  • 基于单片机病床呼叫系统/床位呼叫系统
  • ChatGPT Agent深度解析:告别单纯问答,一个指令搞定复杂任务?
  • 目标检测中的标签分配算法总结
  • 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)解题报告 | 珂学家
  • RS485转Profibus网关助力涡街液体流量计与300PLC高效通讯
  • Python高级数据类型:字典(Dictionary)
  • 模型的评估与选择
  • 基于springboot的考研互助小程序
  • 408数据结构强化(自用)
  • Java中缓存的使用浅讲
  • 【Linux驱动-快速回顾】简单了解一下PinCtrl子系统:设备树如何被接解析与匹配
  • 标准文件和系统文件I/O
  • CSS篇——第一章 六十五项关键技能(上篇)
  • 配置华为交换机接口链路聚合-支持服务器多网卡Bind
  • 解决Maven版本不兼容问题的终极方案
  • 定时器中BDTR死区时间和刹车功能配置
  • 低代码平台ToolJet实战总结
  • Flutter基础(前端教程①③-单例)
  • java内存图
  • 【Linux服务器】-MySQL数据库参数调优
  • Ubuntu 22.04.3 LTS 安装 MySQL
  • Kubernetes常用命令总结
  • 【逻辑回归】MAP - Charting Student Math Misunderstandings
  • 自由学习记录(70)
  • 《汇编语言:基于X86处理器》第8章 高级过程(3)