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

相关文章:

  • 力扣 hot100 Day49
  • day25 力扣90.子集II 力扣46.全排列 力扣47.全排列 II
  • 二、环境搭建之CentOS安装Docker
  • GitHub:只支持 Git 作为唯一的版本库格式进行托管
  • 二分查找-69.x的平方根-力扣(LeetCode)
  • 安装单机版本Redis
  • 电商商品综合排序:从需求分析到实时计算的全方位指南
  • 初识Redis---Redis的特性介绍
  • GM-3568JHF vs 普通 RK3568 开发板 — 工业应用对比文案
  • 学习 Python 爬虫需要哪些基础知识?
  • 3516cv610 npu 开发典型功能点的介绍
  • Azure Bicep 是什么?
  • leetcode_121 买卖股票的最佳时期
  • AWS Partner: Accreditation (Technical)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 57(题目+回答)
  • QT动态加载动态库 QLibrary
  • 从车险理赔到快递签收:打通区块链与现实世界的“最后一公里”——解密预言机(Oracle)
  • aws(学习笔记第四十九课) ECS集中练习(1)
  • 基于深度学习的推荐系统:从协同过滤到神经网络
  • Java机考题:815. 公交路线 图论BFS
  • OpenCV 官翻7 - 对象检测
  • 用户中心——比如:腾讯的QQ账号可以登录到很多应用当中 02
  • Vue 3 中导出 Excel 文件
  • github上传代码
  • window、DOM、document、html 他们之间的关系是什么?
  • springboot基础-demo
  • Java中缓存的使用浅讲
  • Netty集群方案详解与实战(Zookeeper + Redis + RabbitMQ)
  • 深入理解设计模式:策略模式的艺术与实践
  • 云端成本治理利器:亚马逊云科技智能仪表盘(AWS Cost Intelligence Dashboard)深度解析