📚 假设你在学校的数据库中工作。学校有一张 s(学生表),记录了全校所有学生的信息:学号、姓名、性别、年龄、专业、所在学院……一共上万条数据。
现在 信息学院的辅导员 找你说:"我每次都只想看我们学院的学生,每次都要写 WHERE dept='信息学院',烦死了!能不能给我做一个'小表',里面就只有我们学院的学生?"
你不想真的复制一份数据出来(占空间,而且数据一更新就两边不一致),那怎么办?—— 这就是 视图 要解决的问题。
① 什么是视图?
视图(View)是在一个或多个基本表(或其他视图)的基础上,通过一条 查询语句(SELECT) 定义出来的 虚拟表格。
把一句你常用的 SELECT 查询语句"打个包",给它取个名字,以后就可以像查一张普通表那样去查这个名字。这个被打包的"假表"就是视图。
它本身 不真正存储数据,只是把"怎么查"这件事记下来了。每次你查它,它才临时去基本表里捞一遍数据给你看。
一句话理解
👉 视图就是 "一条 SELECT 语句的快捷方式"。
② 视图 vs 基本表:相似与不同
视图和基本表,一个是"虚"的,一个是"实"的。但在使用层面,它们又有惊人的相似。
视图和基本表 都可以用在 SELECT 语句里查询。
对使用者而言,几乎感觉不到差别 —— 你可以像查一张普通表那样去查视图:
SELECT * FROM s_view;
基本表:在硬盘里真实存储着每一行数据。
视图:只在数据库里存了一条"查询定义",数据一行都不存。
查视图的那一刻,数据库才根据定义去基本表里"现算"。
基本表像 仓库,里面真的堆着货。
视图像 仓库的一扇窗户,你透过窗户能看到仓库里的一部分货 —— 但窗户本身不存货,你看到的永远是仓库里 当下 的样子。
③ 视图有什么用?
既然视图只是个"快捷方式",为什么数据库要花力气支持它?因为它解决了 4 个真实的工程问题:
提升数据的逻辑独立性
基本表的字段名/结构改了,只要在视图里"换个映射",外部使用者完全感觉不到变化。底层结构和应用层的耦合被打破了。
用于数据集成
把分散在多张表里的数据,通过 JOIN 拼接成一张"看起来很完整"的虚拟表。用户不用关心数据原本散落在哪几张表里。
提升数据操作的便捷性
把一段复杂的 SELECT(带多表 JOIN、复杂筛选条件)封装成视图,以后写一句 SELECT * FROM 视图名 就能用,不用反复写那段长 SQL。
提升数据的安全性
给不同用户开放不同视图:辅导员只看到自己学院的学生,财务只看到工资字段不看到电话号码 —— 通过视图实现"按需暴露"。
这是视图最容易被忽略、但最重要的作用。举例:原来表里字段叫 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 视图名来查询。 - 四大作用:逻辑独立性、数据集成、操作便捷、数据安全。
- 实时联动:基本表变了,视图查出来的结果也跟着变 —— 它是窗户,不是快照。
- 核心价值:把"复杂"藏在视图里,把"简单"留给使用者。
✏️ 综合练习
关于视图,下列说法中 正确 的是?
✅ 正确答案:B
视图是虚拟表,只在数据库中存储其"定义语句"(一条 SELECT),不真正存储数据;A 错误,视图不存数据;C 错误,视图与基本表实时联动;D 错误,视图可以基于多张基本表(甚至基于其他视图)创建。
基本表 s 中原有 100 行数据,基于它创建了视图 v。之后有人向 s 中 INSERT 了 20 行新数据。此时再查询 SELECT COUNT(*) FROM v,返回的结果是?(假设视图无 WHERE 过滤)
✅ 正确答案:B
视图本身不存数据,每次查询时数据库都会"重新执行视图定义中的那条 SELECT",所以视图永远反映基本表的最新状态。基本表新增 20 行后,视图自然能查到全部 120 行。
某公司财务部门只需要查看员工的"工号、姓名、部门"这三个字段,不应该 看到员工的"身份证号、家庭住址、电话"。使用视图实现这个需求,最贴切的体现了视图的哪个作用?
✅ 正确答案:D
这是视图"按需暴露"安全特性的典型场景:通过 CREATE VIEW v AS SELECT 工号, 姓名, 部门 FROM 员工,只把允许财务看的字段放进视图里,其他敏感字段被"隔离"在视图之外。这正是 提升数据安全性 的体现。
下列哪个比喻 最准确 地描述了视图与基本表的关系?
✅ 正确答案:B
"窗户"的比喻最准确:① 窗户本身不存货(视图不存数据);② 窗户能看到仓库里的部分货物(视图按定义筛选数据);③ 仓库里的货物变了,窗户看到的也跟着变(实时联动)。A 是"备份"思维 —— 错;C 是"快照"思维 —— 错;D 否认了视图与基本表的依赖关系 —— 错。