你的浏览器不支持本网站所要求的功能, 现在看到的是本网站简化版本.

为了获得最佳体验, 请使用最新的Chrome, Safari, Firefox 或 Edge 浏览器.

3. 关系数据库标准语言 SQL

3.6 视图

Powered by impress.js
Ver. 2408

### 视图 - 从一个或几个基本表导出的表 - 从一个或几个视图导出的表 - 是虚表 - 数据库中只存放视图的定义 - 对视图的更新操作有一定限制
### 建立视图 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';
### 不是所有视图都可更新 - 有些视图的更新不能唯一地有意义地转换成对相应基本表的更新 - 一般行列子集视图是可更新的
### 视图的作用 - 视图能够简化用户的操作 - 视图使用户能以多种角度看待同一数据 - 视图对重构数据库提供了一定程度的逻辑独立性 - 视图能够对机密数据提供安全保护 - 适当利用视图可以更清晰地表达查询
![course 3.6 mindmap](img/c03/mindmap-3-6.png)
### 3.6 视图 - 解释视图的基本概念. - 在什么情况下需要明确指定列名? - 视图在数据库中是如何存储的? - WITH CHECK OPTION 有什么作用? - 什么是行列子集视图? - 解释视图的主要作用和优点. ---- [ 3.5 数据更新](dbds-3-5.html#/overview) [| 练习 |](dbds-exec.html) [ 4.1 问题的提出](dbds-4-1.html#/overview)

黑公网安备23010302001726号   黑ICP备2024033110号-1