《数据库系统概论》 -- 3.2. 视图
概念
视图是从一个或几个基本表(或视图)导出的表
视图是一个虚表
数据库只存放视图的定义,不存放视图对应的数据
视图一经定义,就可以被查询,删除,但是更新操作有一定限制
定义视图
格式 CREATE VIEW <视图名> [(<列名>[,<列名>...])]
AS <子查询>
[WITH CHECK OPTION];
说明 子查询可以是任意的SELECT语句,是否可以包含ORDER BY子句和DISTINCT短语,取决于具体系统;
视图的定义可以基于另一个视图
后加WITH CHECK OPTION短语约束视图进行更新、插入、删除数据时,仍应该要满足子查询中的条件
注意 列名要么全部指定,要么全不指定,不指定时,使用子查询中列名
出现下面情况,必须指定:
某个目标列为聚集函数或列表达式
多表连接时,有同名列
需要为某个列命名
分类 行列子集视图:一个视图是从某单个基本表导出的,只是去掉了某些行,则该视图称为行列子集视图
带表达式的视图:一个视图中的某属性是基本表的某属性经过算术/逻辑/比较运算得到的,则该视图称为带表达式的视图
分组视图:带有聚集函数和GROUP BY子句的查询来定义视图
举例 建立信息系学生的视图
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';
建立信息系学生的视图,并约束在进行修改和插入操作时,该视图只有信息系学生(行列子集视图)
CREATE VIEW IS_Student_View
AS
SELECT Sno,Sname,Sage FROM Student Where Sdept='IS'
WITH CHECK OPTION;
建立信息系选修了1好课程的学生的视图(包括学号,姓名,成绩)
CRETAE VIEW IS_S1 (Sno,Sname,Grade)
AS
SELECT SC.Sno,Sname,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno AND Sdept='IS' AND SC.Cno='1';
建立信息系选修了1号课程且成绩在90分以上的学生的视图
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
定义一个反映学生出生年份的视图(带表达式的视图)
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2017-Sage
FROM Student;
将学生的学号和平均成绩定义为一个视图(分组视图)
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
将Student表中的所有女生定义为一个视图
CREATE VIEW G_Student
AS
SELECT *
FROM Student
WHERE Ssex='女';
删除视图
格式 DROP VIEW <视图名> [CASCADE];
说明 视图删除后,视图定义将会从数据字典中删除
如果在该视图的基础上还导出了其他视图,则使用CASCADE级联删除即可,否则拒绝执行
举例 DROP VIEW BT_S; /*成功执行*/
DROP VIEW IS_S1; /*拒绝执行*/
DROP VIEW IS_SI CASCADE; /*成功执行,同时删除IS_S2*/
查询视图
概念 视图消解:在执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图是否存在,如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为对基本表的查询,在后在执行修正后的查询
注意 WHERE子句中聚集函数是不能做条件表达式的,但是大多数RDBS对查询都有优化,都可以进行正确转换
更新视图
概念 更新视图,是指通过视图来插入、删除、修改
注意 视图是不存储实际数据的虚表,所以对视图的更新会经过视图消解最终转换为对基本表的更新
并不是所有视图都可以更新,比如平均成绩视图
各个RDBMS的视图更新操作需参考各RDBMS的具体实现
举例 将信息系学生试图IS_Student中学号为201215122的学生姓名改为刘辰--视图之UPDATE
UPDATE IS_Student
SET Sname='刘辰'
WHERE Sno='201215122';
向信息系学生视图IS_Student中插入一个新的学生记录('201215129','赵新',20)--视图之INSERT
INSERT INTO IS_Student
VALUES ('201215129','赵新',20);
删除信息系学生视图IS_Student中的学号为201215129的学生记录--视图之DELETE
DELETE FROM IS_Student
WHERE Sno='201215129';
视图的作用
简化用户操作
以多种角度看待同一数据
对重构数据库(对数据库进行新增基本表,或修改基本表)提供了一定的逻辑独立性(不影响用户的应用程序)
对机密数据提供安全保护(如全校所有学生的信息都在一个表里,但是给每个学院创建各自的视图,则每个学员只能看到自己学院的数据)
适当利用视图,查询语句更清晰