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 本质操作基表,锁表逻辑和直接查表一致