🎬 个人主页:艾莉丝努力练剑
❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- 0 ~> 前置概念辨析
-
- 0.1 两个 “视图” 的本质区分
- 1 ~> 视图基础概念
-
- 1.1 核心定义
-
- 1.1.1 易错问题
- 1.2 基表与视图的联动关系
-
- 1.2.1 纠正
- 2 ~> 视图基本操作
-
- 2.1 创建视图
-
- 2.1.1 标准语法
- 2.1.2 示例
- 2.2 查询视图
- 2.3 视图数据修改
-
- 2.3.1 通过视图修改基表
- 2.3.2 修改基表同步到视图
- 2.3.3 可更新视图的核心约束
- 2.4 删除视图
-
- 2.4.1 标准语法
- 2.4.2 示例
- 3 ~> 视图规则与使用限制
- 4 ~> 工程实践与行业现状
-
- 4.1 视图的核心价值
- 4.2 大厂使用规范
- 5 ~> 实战例题
-
- 5.1 题目
- 5.2 标准解答
- 结尾

0 ~> 前置概念辨析
0.1 两个 “视图” 的本质区分
明确强调二者无任何关联,更加精准的定义如下:
- 本文的视图(View):数据库模式层面的对象,是一段被命名存储的 SELECT 查询定义,以虚拟表的形式对外提供访问能力,属于 SQL 标准语法范畴。
- 事务中的 Read View:InnoDB 引擎 MVCC 机制的底层组件,是事务执行快照读时生成的可见性判断快照,用于判定当前事务能看到哪些版本的行数据,属于事务隔离级别的内部实现逻辑。
二者分属完全不同的技术维度,没有任何关联。
1 ~> 视图基础概念
1.1 核心定义
视图是一个虚拟表,其内容由查询定义,同真实表一样包含命名的列和行数据。
1.1.1 易错问题
如下所示:
- MERGE 合并算法(默认优先):将视图定义的 SQL 与外层查询 SQL 合并为单条语句执行,无额外临时表开销,性能等价于直接执行原生查询。
- TEMPTABLE 临时表算法:当视图定义包含聚合、分组、DISTINCT 等无法合并的逻辑时,MySQL 先将视图查询结果写入临时表(内存或磁盘),再基于临时表执行外层查询,存在额外性能开销。
1.2 基表与视图的联动关系
这个表述对吗:视图的数据变化会影响基表,基表的数据变化也会影响视图。
1.2.1 纠正
实际上该结论存在前提缺失,完整严谨的表述为:
2 ~> 视图基本操作
2.1 创建视图
2.1.1 标准语法
create view视图名as select语句;存在空格缺失问题,标准语法如下:
CREATE [OR REPLACE] VIEW 视图名 [(自定义列名列表)]
AS SELECT 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
关键字说明:
- OR REPLACE:视图已存在时直接覆盖原有定义,避免重名报错。
- 自定义列名列表:可重命名视图的输出列,数量必须与 SELECT 结果列数一致;不指定则默认沿用 SELECT 的列名。
- WITH CHECK OPTION:写入视图数据时校验数据是否满足视图的 WHERE 过滤条件,防止写入后数据从视图中 “消失”。
2.1.2 示例
基于 EMP、DEPT 表创建员工姓名 – 部门名称视图。
— 创建内连接视图
CREATE VIEW v_ename_dname AS
SELECT emp.ename, dept.dname
FROM emp
INNER JOIN dept ON emp.deptno = dept.deptno;
2.2 查询视图
视图的查询语法与普通物理表完全一致,支持 WHERE、ORDER BY、联表等所有查询语法。
— 查询视图并按部门排序
SELECT * FROM v_ename_dname ORDER BY dname;
执行逻辑等价于直接运行视图定义的完整 SELECT 语句。
2.3 视图数据修改
2.3.1 通过视图修改基表
示例:更新视图中的员工姓名,基表同步变更。
— 通过视图更新员工姓名
UPDATE v_ename_dname SET ename = 'smith' WHERE ename = 'SMITH';
- 执行结果:视图与基表 emp 的 ename 字段同步更新。
- 成立前提:ename 列唯一来自单表 emp,且视图满足可更新条件;若尝试更新 dname(来自 dept 表),多表连接视图通常不支持跨表更新。
2.3.2 修改基表同步到视图
示例:更新基表部门名称,视图数据同步变更。
— 修改基表 DEPT 的部门名称
UPDATE dept SET dname = 'aaaaa' WHERE deptno = 30;
- 执行结果:再次查询视图,所有 30 号部门对应的 dname 同步更新。
- 结论:基表数据变更必然实时反映到视图中,无任何前提条件。
2.3.3 可更新视图的核心约束
补充工业界标准约束。
视图支持 UPDATE/INSERT/DELETE 必须同时满足:
- 无聚合函数(SUM/COUNT/MAX 等)、无 GROUP BY、无 DISTINCT、无 UNION、无 HAVING。
- 视图列不能是表达式、常量或函数计算的结果。
- 单表视图天然支持更新;多表连接视图仅允许更新其中一张基表的列,且连接不能导致行映射歧义。
- FROM 子句中不能包含子查询。
2.4 删除视图
2.4.1 标准语法
DROP VIEW [IF EXISTS] 视图名;
2.4.2 示例
DROP VIEW v_ename_dname;
- 执行后仅删除视图的定义元数据,不会对基表数据产生任何影响。
- 物理层面:删除视图不会删除任何 .ibd 数据文件,仅移除对应的视图定义文件。
3 ~> 视图规则与使用限制
4 ~> 工程实践与行业现状
4.1 视图的核心价值
判断一下,下面这句话的表述有没有问题:“高频访问不用做多表查询、字段更清晰”。
这句话是有问题的,下面纠正一下:
4.2 大厂使用规范
互联网行业普遍现状,大厂内部限制使用视图,核心原因如下:
5 ~> 实战例题
5.1 题目
针对 actor 表创建视图 actor_name_view,只包含 first_name 以及 last_name 两列。
5.2 标准解答
CREATE VIEW actor_name_view AS
SELECT first_name, last_name
FROM actor;
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|
艾莉丝努力练剑
C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 👀 ❤️ ⭐ 💬 不要忘记给博主“一键四连”哦! “今日练剑达成!” “技术之路难免有困惑,但同行的人会让前进更有方向。” |
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!
往期回顾:
【MYSQL】MYSQL学习的一大重点:事务(下)- InnoDB 事务隔离性原理(MVCC 视角)
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

网硕互联帮助中心







评论前必须登录!
注册