3. 关系数据库标准语言 SQL
3.6 视图
### 视图
- 从一个或几个基本表导出的表
- 从一个或几个视图导出的表
- 是虚表
- 数据库中只存放视图的定义
- 对视图的更新操作有一定限制
### 建立视图
CREATE VIEW <视图名> [(<列名>[, <列名>]...)]
AS <子査询>
[WITH CHECK OPTION];
- 子查询可以是任意的 SELECT 语句
### WITH CHECK OPTION
- 对视图进行更新, 插入或删除时
- 行需要满足视图定义中子查询的条件表达式
### 需要明确指定列名的情况
- 某个目标列是聚集函数或列表达式
- 多表连接时有同名列
- 为某个列启用新的名字
### 例 84
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS';
- 列名为 SELECT 子句中的三个列名
### 视图定义的执行
- 只是把视图的定义存入数据库
- 并不执行 SELECT 语句
- 查询视图时才按视图定义查找数据
### 例 85
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION;
- 对该视图操作时会自动加上 Sdept ='IS' 条件
### 行列子集视图
- 若一个视图是从单个基本表导出
- 只去掉了基本表的某些行和列
- 但保留了主码
- 则称为行列子集视图
### 例 86
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno, Sname, Grade
FROM Student, SC
WHERE Sdept = 'IS' AND Student.Sno=SC.Sno
AND SC.Cno='1';
- 视图可以建立在多个基本表上
### 例 87
CREATE VIEW IS_S2
AS
SELECT Sno,Sname.Grade FROM IS_S1
WHERE Grade >= 90;
- 视图可以建立在一个或多个己定义好的视图上
- 或建立在基本表与视图上
### 带表达式的视图
- 为了减少冗余数据, 基本表中只存放基本数据
- 定义视图时可以根据需要设置一些派生属性列
- 这些派生属性叫做虚拟列
### 例 88
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno, Sname, 2024-Sage
FROM Student;
- 这是一个带表达式的视图
### 分组视图
- 带有聚集函数和 GROUP BY 子句查询定义的视图
### 例 89
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno, AVG(Grade) FROM SC
GROUP BY Sno;
### 删除视图
DROP VIEW <视图名> [CASCADE];
- CASCADE 级联删除语句
- 删除基本表并不会删除由该基本表导出的视图定义
- MySQL 中会忽视 CASCADE 参数
### 例 91
DROP VIEW BT_S; /*成功执行*/
DROP VIEW IS_S1; /*拒绝执行*/
- IS\_S1 视图上还导出了 IS\_S2 视图
- 所以该语句被拒绝执行
- 注意 MySQL 中不会拒绝执行
### 例 92
SELECT Sno,Sage
FROM IS_Student
WHERE Sage < 20;
- 视图查询和基本表查询一样
### 视图查询
- 进行有效性检查
- 从数据字典中取出视图的定义
- 结合定义中的子査询和用户查询
- 转换成等价基本表査询
- 执行修正后的查询
- 这一过程称为视图消解 (View Resolution)
### 例 92 转换后
SELECT Sno,Sage
FROM Student
WHERE Sdept = 'IS' AND Sage < 20;
### 更新视图
- 通过视图来 INSERT, DELETE, UPDATE 数据
- 对视图的更新操作也通过视图消解
- 为防止操作出错, 可加 WITH CHECK OPTION
### 例 95
UPDATE IS_Student
SET Sname = '刘辰'
WHERE Sno = '201215122';
### 例 95 转换后
UPDATE Student
SET Sname = '刘辰'
WHERE Sno = '201215122' AND Sdept = 'IS';
### 不是所有视图都可更新
- 有些视图的更新不能唯一地有意义地转换成对相应基本表的更新
- 一般行列子集视图是可更新的
### 视图的作用
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当利用视图可以更清晰地表达查询

### 3.6 视图
- 解释视图的基本概念.
- 在什么情况下需要明确指定列名?
- 视图在数据库中是如何存储的?
- WITH CHECK OPTION 有什么作用?
- 什么是行列子集视图?
- 解释视图的主要作用和优点.
----
[ 3.5 数据更新](dbds-3-5.html#/overview)
[| 练习 |](dbds-exec.html)
[ 4.1 问题的提出](dbds-4-1.html#/overview)