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