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

MySQL 单元 6 数据视图学习笔记

一、视图基础概述
1. 视图是什么
视图是虚拟表,本身不存储真实数据,仅保存一条SELECT查询语句;访问视图时,数据库会执行这条 SQL,动态拼接基表数据返回结果。
底层依赖一张 / 多张物理数据表(基表),所有数据源头都来自基表。
2. 视图核心作用
简化复杂多表查询,封装常用查询逻辑,不用重复写长 SQL;
权限隔离:只给用户开放视图,隐藏基表敏感字段(手机号、薪资);
统一数据展示口径,多业务端查询格式一致;
逻辑解耦,业务变更只需修改视图定义,不用改动前端大量查询代码。
二、视图核心操作(创建 / 查询 / 修改 / 删除)VS 数据表操作对比
(一)创建操作对比
1. 创建数据表(物理表,存真实数据)
语法:

CREATE TABLE 表名(

字段1 类型 约束,

字段2 类型 约束 );

特点:
在磁盘分配物理存储空间,插入数据后永久保存;
必须定义字段数据类型、主键、外键、索引、存储引擎;
独立实体,和其他表是并列存储关系。
2. 创建视图(虚拟表,仅存查询逻辑)
语法:

CREATE VIEW 视图名 AS

SELECT 字段 FROM 基表 WHERE 条件;

扩展语法(带校验):

CREATE VIEW 视图名 WITH CHECK OPTION AS SELECT ...;

特点:
无物理存储,只保存查询语句;
不需要定义字段类型,字段直接继承基表;
依赖基表,基表删除则视图失效;
WITH CHECK OPTION限制:通过视图新增 / 修改的数据必须满足视图查询条件。
(二)查询操作对比
1. 查询数据表

SELECT * FROM 数据表 WHERE 条件;

直接读取磁盘存储的完整原始数据,可查询所有字段。
2. 查询视图

SELECT * FROM 视图名 WHERE 条件;

执行流程:先读取视图保存的SELECT语句,查询基表,再过滤返回结果;
只能查询视图定义中包含的字段,基表隐藏字段无法访问。
(三)更新 / 修改操作对比
1. 修改数据表(改结构 / 改数据)
修改表结构:ALTER TABLE

ALTER TABLE 表名 ADD 字段;

ALTER TABLE 表名 MODIFY 字段 新类型;

修改表内数据:UPDATE

UPDATE 表 SET 字段=值 WHERE 条件;

可任意修改所有字段,不受额外限制。
2. 修改视图(两种修改维度)
修改视图定义 SQL:ALTER VIEW

ALTER VIEW 视图名 AS 新SELECT语句;

通过视图更新基表数据:INSERT / UPDATE / DELETE

UPDATE 视图 SET 字段=值;

INSERT INTO 视图(字段) VALUES();

严格限制,以下视图不能更新数据:
包含聚合函数SUM/COUNT/MAX、GROUP BY分组;
使用DISTINCT去重、多表连接JOIN、子查询;
定义中包含UNION合并结果集;
设置WITH CHECK OPTION时,修改后数据不满足视图条件会报错。
(四)删除操作对比
1. 删除数据表

DROP TABLE IF EXISTS 表名;

彻底删除磁盘上的物理数据、表结构、索引、约束;
若存在外键关联其他表,直接删除会报错,需先解除外键。
2. 删除视图

DROP VIEW IF EXISTS 视图名;

仅删除视图的查询定义,完全不影响底层基表和真实数据;
无外键约束干扰,删除操作不会改动任何原始业务数据。
三、视图实操完整案例(Petstore 商业实例)
任务 1:创建与查询视图
基于宠物商品表 pet、分类表 category,创建只展示猫狗商品的视图
-- 创建视图 CREATE VIEW v_pet_dog_cat AS

SELECT p.pet_id,p.name,p.price,c.cate_name

FROM pet p

JOIN category c ON p.cate_id=c.cate_id

WHERE c.cate_name IN ('猫','狗');

-- 查询视图

SELECT * FROM v_pet_dog_cat WHERE price<200;

任务 2:操作视图(更新、删除视图)

-- 通过视图修改基表数据(无聚合可更新)

UPDATE v_pet_dog_cat SET price=150 WHERE pet_id=101;

-- 修改视图定义,新增库存字段

ALTER VIEW v_pet_dog_cat AS

SELECT p.pet_id,p.name,p.price,p.stock,c.cate_name

FROM pet p

JOIN category c ON p.cate_id=c.cate_id

WHERE c.cate_name IN ('猫','狗');

-- 删除视图

DROP VIEW IF EXISTS v_pet_dog_cat;

五、视图 vs 数据表 核心差异汇总表

对比维度数据表(物理表)视图(虚拟表)
存储特性磁盘存储真实数据,占用存储空间仅存储查询 SQL,无真实数据,不占数据空间
依赖关系独立实体,不依赖其他对象依赖底层基表,基表删除视图失效
创建方式定义字段、类型、约束、引擎基于 SELECT 查询语句创建,无字段定义
数据更新无特殊限制,可随意增删改存在大量限制,聚合 / 多表视图无法更新
删除影响删除后数据、结构全部丢失仅删除查询逻辑,基表数据完好无损
核心用途持久化存储业务原始数据封装查询、权限控制、简化复杂 SQL

补充视图拓展知识点

一、视图更新的完整限制清单
满足以下任意一种,视图不支持 INSERT/UPDATE/DELETE:
包含聚合函数:SUM()、COUNT()、MAX()、MIN()、AVG();
使用 GROUP BY、HAVING 分组统计;
使用 DISTINCT 去重;
多表 JOIN 连接查询;
使用 UNION / UNION ALL 合并结果集;
视图字段使用常量、表达式计算(如 age+10 AS new_age);
使用子查询、窗口函数。
二、视图、临时表、派生表三者区分(易混淆对比)
视图:永久存储视图定义,数据库重启仍存在,可重复使用,虚拟无数据;
临时表:物理存储数据,会话结束自动销毁,独立实体,可建索引;
派生表:写在FROM()里的子查询,仅单次查询生效,用完立刻销毁。
三、视图常见使用场景(贴合课本三大案例)
教学库 SchoolDB
创建学生成绩视图,隐藏手机号、家庭住址;只展示学号、姓名、各科分数,分配给授课老师使用。
宠物店 Petstore
创建热销商品视图,自动过滤库存 > 0、销量前 100 商品,运营人员直接调取商品列表。
图书馆 LibraryDB
创建逾期借阅视图,关联读者、图书、借阅表,自动筛选超期未还记录,简化管理员查询。
四、易错坑点补充
删除视图DROP VIEW不会删基表;删除基表DROP TABLE,视图会变成无效视图;
修改视图用ALTER VIEW,不能用ALTER TABLE;视图没有字段结构修改语句;
单表无聚合视图可以更新,但更新的数据会直接同步到原始物理表;
视图不存储数据,基表数据实时更新,视图查询结果会同步变化;
不能给视图添加主键、外键、索引,约束全部依赖底层基表。
五、补充对比:视图 vs 数据表 新增对比维度

对比项数据表视图
索引支持可创建主键、普通、联合索引完全不支持创建索引
约束类型主键、外键、唯一、非空、默认值仅支持WITH CHECK OPTION行校验约束
生命周期永久存在,手动 DROP 才删除永久存储定义,仅查询时动态生成数据
存储占用占用磁盘存储真实行数据仅保存一段 SQL 文本,几乎无存储开销
事务影响DML 操作直接锁原始数据行DML 本质操作基表,锁表逻辑和直接查表一致
http://www.gsyq.cn/news/1643948.html

相关文章:

  • ANI-RSS元数据刮削:3步打造专业级动漫媒体库
  • 社会大洗牌的馈赠的具象化的庖丁解牛
  • SolidWorks_装配体设计14_装配体配置管理
  • Proxmox VE 6.2-4 同机换盘迁移:3步恢复配置与4类启动报错排查
  • SQL Server 2019+ 自定义函数实战:3种类型对比与性能影响分析
  • AI网关Requesty:统一入口、自动兜底与成本可感的大模型调度中枢
  • CHKDSK 与 found.000 深度解析:从文件系统原理到 .chk 文件手动修复
  • 我警告了 329 天
  • 反向传播 3 大常见问题:梯度消失、爆炸与 ReLU 死区排查
  • 所谓异常机制也就是指的语言平台支持异常这种错误处理模式的机制,比如c#里的Exception对象,try{}catch{}finally{}结构,throw抛出异常的语句,等等,均为c#语言里对异常机
  • UGUI Mask 与 RectMask2D 性能对比:基于 2021.2.3f1 源码的 2 种裁剪方案实测
  • Spark Shell 与 PySpark 性能对比:5种常见算子在不同数据量下的执行耗时分析
  • TC78H660FTG与MK60DN512VLQ10的电机驱动系统设计
  • LSTM 与 GRU 门控机制对比:3 种变体参数量与梯度传播效率分析
  • 数据库物理设计实战:MySQL 8.0 索引与存储引擎选择的 3 个性能基准
  • 【硬核脑洞】16位实模式最后的疯狂:我们能否在 640KB 常规内存里手搓一个 MD 模拟器?
  • Linux 进程通信 6 大机制对比:管道、消息队列、共享内存、信号量、信号、Socket
  • 个人系统的RULE和SOP是否有意义?
  • Python如何使用OpenAI调用Llama模型(Llama2/Llama3/Llama3.1通用教程)
  • InnoDB vs MyISAM 存储引擎深度对比:3大场景下的性能与特性抉择
  • Linux 内核日志 ring buffer 大小调整:从 128KB 到 2MB 的 3 种配置方法
  • PyTorch DDP多进程训练:OMP_NUM_THREADS=1 配置详解与4节点性能对比
  • 如何用d3d8to9让老游戏在Windows 10/11上焕发新生:终极兼容性解决方案
  • RL-frenet-trajectory-planning-in-CARLA
  • AI 入局技术圈,所有工程师的工作效率都被改写了
  • apt-get update 与 upgrade:解析Ubuntu 20.04/22.04软件包管理的2个核心命令
  • SEIR 传染病模型 Python 实战:基于 2020 新冠数据拟合与参数灵敏度分析
  • /proc/kmsg 与 /dev/kmsg 深度对比:实时内核日志捕获的 2 种方案与 3 个陷阱
  • 3种人体关键点算法对比:OpenPose vs AlphaPose vs MobilePose 在行为识别中的精度与速度权衡
  • VFX Graph vs. Shuriken 粒子系统:10万火花特效性能与工作流深度对比