视图 View

虚拟的表,真实的便利 —— 一种"看起来像表,但不存数据"的特殊对象

🎯 学习目标
  • 理解视图是什么、为什么需要视图
  • 说出视图与基本表的本质差异
  • 掌握视图的 4 个核心作用与典型应用场景
  • 理解视图与基本表的"实时联动"工作机制

📚 假设你在学校的数据库中工作。学校有一张 s(学生表),记录了全校所有学生的信息:学号、姓名、性别、年龄、专业、所在学院……一共上万条数据。

现在 信息学院的辅导员 找你说:"我每次都只想看我们学院的学生,每次都要写 WHERE dept='信息学院',烦死了!能不能给我做一个'小表',里面就只有我们学院的学生?"

你不想真的复制一份数据出来(占空间,而且数据一更新就两边不一致),那怎么办?—— 这就是 视图 要解决的问题。

① 什么是视图?

📖 定义

视图(View)是在一个或多个基本表(或其他视图)的基础上,通过一条 查询语句(SELECT) 定义出来的 虚拟表格

💬 人话翻译

把一句你常用的 SELECT 查询语句"打个包",给它取个名字,以后就可以像查一张普通表那样去查这个名字。这个被打包的"假表"就是视图。

它本身 不真正存储数据,只是把"怎么查"这件事记下来了。每次你查它,它才临时去基本表里捞一遍数据给你看。

一句话理解

👉 视图就是 "一条 SELECT 语句的快捷方式"

基本表 s(真实存数据) s01 张三 信息学院 s02 李四 信息学院 s03 王五 理学院 s04 赵六 理学院 SELECT 查询 WHERE dept='信息学院' 视图 s_view(虚拟,不存数据) s01 张三 信息学院 s02 李四 信息学院 每次查询时才"临时算出来" 视图只存"查询定义",数据始终来自基本表
视图与基本表的关系示意图

② 视图 vs 基本表:相似与不同

视图和基本表,一个是"虚"的,一个是"实"的。但在使用层面,它们又有惊人的相似。

🤝 相似之处

视图和基本表 都可以用在 SELECT 语句里查询

对使用者而言,几乎感觉不到差别 —— 你可以像查一张普通表那样去查视图:

SELECT * FROM s_view;

🆚 本质不同

基本表:在硬盘里真实存储着每一行数据。

视图:只在数据库里存了一条"查询定义",数据一行都不存。

查视图的那一刻,数据库才根据定义去基本表里"现算"。

💡 一个小比喻

基本表像 仓库,里面真的堆着货。

视图像 仓库的一扇窗户,你透过窗户能看到仓库里的一部分货 —— 但窗户本身不存货,你看到的永远是仓库里 当下 的样子。

③ 视图有什么用?

既然视图只是个"快捷方式",为什么数据库要花力气支持它?因为它解决了 4 个真实的工程问题:

1

提升数据的逻辑独立性

基本表的字段名/结构改了,只要在视图里"换个映射",外部使用者完全感觉不到变化。底层结构和应用层的耦合被打破了。

2

用于数据集成

把分散在多张表里的数据,通过 JOIN 拼接成一张"看起来很完整"的虚拟表。用户不用关心数据原本散落在哪几张表里。

3

提升数据操作的便捷性

把一段复杂的 SELECT(带多表 JOIN、复杂筛选条件)封装成视图,以后写一句 SELECT * FROM 视图名 就能用,不用反复写那段长 SQL。

4

提升数据的安全性

给不同用户开放不同视图:辅导员只看到自己学院的学生,财务只看到工资字段不看到电话号码 —— 通过视图实现"按需暴露"。

💬 重点理解:第 1 条"逻辑独立性"

这是视图最容易被忽略、但最重要的作用。举例:原来表里字段叫 sn(姓名),后来 DBA 把它改名为 student_name

如果应用程序里到处写着 SELECT sn FROM s,那要全部改一遍。但如果中间隔了一层视图,只改视图定义就够了,应用程序一行不用动。

④ 视图的工作机制:数据始终联动

📖 核心机制

视图中的内容 总是与基本表中的数据保持一致。当基本表的数据发生变化时,相关视图查询出来的结果也会随之变化 —— 因为视图本身没存数据,每次查询都是临时去基本表里捞。

💬 时间线举例

① 8:00 创建视图 s_view,定义为"信息学院的学生"。此时基本表里有 5 个信息学院学生。

② 9:00 查 SELECT * FROM s_view,返回 5 行。

③ 10:00 有人在基本表 s 里 INSERT 了一个新的信息学院学生。

④ 11:00 再查 SELECT * FROM s_view,返回 6 行

视图自动"知道"基本表变了 —— 因为它本来就是临时去基本表里捞的。

⚠️ 一个反直觉的点

很多人会以为视图是"快照"(查一次就固定了),其实不是。视图是 "实时窗口",每次查询都是看到基本表 当下最新 的状态。

📋 本节小结

📋 知识回顾
  • 视图是虚拟表:本质是一条被命名了的 SELECT 语句,不真正存数据。
  • 使用上像基本表:可以 SELECT * FROM 视图名 来查询。
  • 四大作用:逻辑独立性、数据集成、操作便捷、数据安全。
  • 实时联动:基本表变了,视图查出来的结果也跟着变 —— 它是窗户,不是快照。
  • 核心价值:把"复杂"藏在视图里,把"简单"留给使用者。

✏️ 综合练习

第 1 题 · 概念理解

关于视图,下列说法中 正确 的是?

A. 视图和基本表一样,都在硬盘上真实存储数据
B. 视图是虚拟表,只存储查询定义,数据来自基本表
C. 视图一旦创建,里面的数据就被"冻结",不会随基本表变化
D. 视图只能从一张基本表创建,不能跨表

✅ 正确答案:B

视图是虚拟表,只在数据库中存储其"定义语句"(一条 SELECT),不真正存储数据;A 错误,视图不存数据;C 错误,视图与基本表实时联动;D 错误,视图可以基于多张基本表(甚至基于其他视图)创建。

第 2 题 · 工作机制

基本表 s 中原有 100 行数据,基于它创建了视图 v。之后有人向 s 中 INSERT 了 20 行新数据。此时再查询 SELECT COUNT(*) FROM v,返回的结果是?(假设视图无 WHERE 过滤)

A. 100(视图被冻结了)
B. 120(视图实时反映基本表当前状态)
C. 20(视图只能看到新增的数据)
D. 报错,视图需要重新创建才能看到新数据

✅ 正确答案:B

视图本身不存数据,每次查询时数据库都会"重新执行视图定义中的那条 SELECT",所以视图永远反映基本表的最新状态。基本表新增 20 行后,视图自然能查到全部 120 行。

第 3 题 · 应用场景

某公司财务部门只需要查看员工的"工号、姓名、部门"这三个字段,不应该 看到员工的"身份证号、家庭住址、电话"。使用视图实现这个需求,最贴切的体现了视图的哪个作用?

A. 提升数据的逻辑独立性
B. 用于数据集成
C. 提升数据操作的便捷性
D. 提升数据的安全性

✅ 正确答案:D

这是视图"按需暴露"安全特性的典型场景:通过 CREATE VIEW v AS SELECT 工号, 姓名, 部门 FROM 员工,只把允许财务看的字段放进视图里,其他敏感字段被"隔离"在视图之外。这正是 提升数据安全性 的体现。

第 4 题 · 类比理解

下列哪个比喻 最准确 地描述了视图与基本表的关系?

A. 视图是基本表的"备份",是基本表的复制品
B. 视图是基本表的"窗户",透过窗户能看到基本表的当下状态
C. 视图是基本表的"快照",定格了某一时刻的数据
D. 视图和基本表是完全独立的两份数据

✅ 正确答案:B

"窗户"的比喻最准确:① 窗户本身不存货(视图不存数据);② 窗户能看到仓库里的部分货物(视图按定义筛选数据);③ 仓库里的货物变了,窗户看到的也跟着变(实时联动)。A 是"备份"思维 —— 错;C 是"快照"思维 —— 错;D 否认了视图与基本表的依赖关系 —— 错。