一张不存数据的表
视图就是把一条常用的 SELECT 起个名字存起来,以后像查表一样查它。
今天弄懂三件事:视图里存了什么?查视图时发生了什么?通过视图改数据,改到了哪里?
→ / 空格 / 翻页笔:下一步 ←:上一步 + -:字号 F:全屏
① 你写的查询
SELECT * FROM s_view;
↓
② 视图 s_view 里只存了一条 SELECT
SELECT * FROM s WHERE dept = '信息学院'
里面没有任何数据
↓
③ 到学生表 s 里去找
点左边的按钮播放
🧭 先猜一猜:这些需求,视图能帮上什么忙? 点击卡片翻面
1
视图是什么:一条存起来的 SELECT
视图和基本表有什么不同
👩🏫
📍 场景 · 信息学院辅导员"我每天都要查我们学院的学生,每次都得写一遍
WHERE dept = '信息学院',太麻烦了。"复制出来的表是一张“照片”:以后学生表里来了新生,复制的表里没有,还得重新复制。
建一个视图,数据库只记住这条 SELECT。每次查视图,都重新到学生表里去取,结果永远是最新的。
视图 = 一条起了名字的 SELECT。它不存数据,每次查询视图,才到基本表里去取数据。
📊 视图和表比一比
| 基本表 s | 视图 s_view | |
|---|---|---|
| 存的是 | 数据 | 一条 SELECT |
| s 的数据变了 | — | 查视图的结果跟着变 |
| 怎么查 | SELECT * FROM s | SELECT * FROM s_view |
🪟 打个比方
- 基本表像仓库,里面真的放着货
- 视图像仓库的一扇窗户:窗户里不放货,透过它看到的总是仓库现在的样子
2
视图有什么用
数据安全、简化操作、数据集成、逻辑独立性
同一份数据,给不同的人开不同的窗户。点下面四个按钮,一个一个看。
3
创建视图:CREATE VIEW
语句格式,多表视图,在视图上建视图
最简单的写法:CREATE VIEW 视图名 AS SELECT 语句; 方括号里的部分都可以不写。
两个例子切换右上角的按钮
⚠️ 注意
- 视图名不能和已有的表、视图重名
- 写了字段列表,个数要和 SELECT 的列数一样多
💡 小技巧
- 先把 AS 后面的 SELECT 单独运行,结果对了,再在前面加上
CREATE VIEW 视图名 AS - Workbench:右键 Views → Create View → 写语句 → Apply
4
查看视图
DESCRIBE、SHOW CREATE VIEW、SHOW FULL TABLES
DESCRIBE 看视图有哪些列;SHOW CREATE VIEW 看视图是怎么定义的;SHOW FULL TABLES 看库里哪些是视图。
5
修改与删除视图
ALTER VIEW、CREATE OR REPLACE VIEW、DROP VIEW
ALTER VIEW 修改视图;CREATE OR REPLACE VIEW 有就替换、没有就新建;DROP VIEW 删除视图,不会删掉表里的数据。
⚖️ 两种修改写法
| 视图…… | ALTER VIEW | CREATE OR REPLACE |
|---|---|---|
| 已经存在 | 修改 | 替换(效果一样) |
| 不存在 | 报错 | 新建一个 |
🗑️ 删除视图
DROP VIEW 视图1, 视图2;一次可以删多个- 加上
IF EXISTS,视图不存在时不报错
6
通过视图改数据:改的其实是基本表
INSERT、UPDATE、DELETE,以及 WITH CHECK OPTION
视图里没有数据。对视图做 INSERT / UPDATE / DELETE,实际改的是基本表。加上 WITH CHECK OPTION,不符合视图条件的数据就写不进去。
📌 记住
- 对视图增、删、改 → 改的是基本表
- WITH CHECK OPTION:从窗户放进去的数据,必须在窗户里看得见
7
哪些视图不能改数据?
点视图中的一行,看它来自基本表的哪几行
看一条就够了:视图的一行,是不是正好对应基本表的一行?是 → 可以改;不是 → 这个视图只能查。
📋 这几种视图只能查,不能改数据
| 视图的定义里有 | 为什么 |
|---|---|
| COUNT、SUM 等统计,GROUP BY | 一行是由好几行统计出来的 |
| DISTINCT | 去重后的一行,可能对应好几行 |
| 多张表连接 | 一行来自两张表,删除时不知道删哪张表的 |
✓
课堂小测
点击选项,立即看对错;答错了可以再选
一页总结
保山学院 · 人工智能教研室 · 曹鼎鼎 | 数据库原理与应用 · 第 7 章 视图和索引