1.视图概述
视图是从一个或几个基本表(或视图)导出的表。
视图是一个虚表,意思就是说,数据库中只存了视图的表结构,而没有存放视图的数据。
2.定义视图
(1)创建视图
CREATE VIEW <视图名>[(<列名>[,<列名>]...)]
AS <子查询>
[WITH CHECK OPINION];
其中,子查询可以是SELECT语句,但是子查询中不能包含ORDER BY和DISTINCT关键字。
WITH CHECK OPINION表示对视图进行UPDATE、INSERT、DELETE操作时要保证更新、插入、删除的操作满足视图定义中的谓词条件(即子查询中的条件表达式)。
若语句没有指定视图的列,则默认视图的列由SELECT语句中的各个字段组成,但是以下三种情况必须指明视图的列:
1.某个目标列不是单纯的属性名,而是集函数或列表达式;
2.多表连接时选出了几个同名的列作为视图的字段;
3.需要在视图中为某个列启用新的更适合得名字。
注意:组成视图的属性列名要么全部省略要么全部指定,没有第三种选择。
例如:
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPINION;
在定义视图时加上了WITH CHECK OPINION 所以在对该视图进行插入、修改和删除时DBMS会自动加上Sdept = ‘IS’的条件。
创建以上视图实际上是创建了表1:
Sno | Sname | Sage |
2020002 | 刘晨 | 19 |
DBMS执行CREATE VIEW的结果只是把对视图的定义存入数据字典,并不执行SELECT语句,只是在对视图查询时,才按视图的定义从基本表中将数据查出。
例如:创建信息系选修了1号课程的学生的视图。
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';
视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或同时建立在基本表和视图上。如:
创建信息系选修了1号课程且成绩在90分及以上的学生的视图:
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE GRADE >= 90;
注意:此视图是建立在IS_S1视图的基础之上的。
(2)删除视图
视图创建好之后,若导出此视图的基本表被删除了,该视图将失效。
删除语句:DROP VIEW <视图名>;
视图被删除,由该视图导出的其他视图也将失效,用户也应该将这些失效的视图删除。
3.查询视图
视图建立好后,可以像对基本表一样对视图进行查询,对于基本表的查询语法一般可以用于视图。
首先要介绍一下“消解”的概念:由对视图的查询转换为对基本表的查询的过程称为“消解”。
(1)在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage FROM IS_Student
WHERE Sage < 20;
DBMS在执行此查询时,将其与IS_Student视图定义中的子查询:
SELECT Sno,Sage FROM Student
WHERE Sdept = 'IS';--'IS'就是指信息系。
结合起来转换成对Student表的查询:
SELECT Sno,Sname,Sage
FROM Student WHERE Sdept = '计算机系' AND Sage < 20;
视图是定义在基本表上的虚表,它可以和其他表一起使用,实现连接查询或嵌套查询。也就是说,在关系数据库的三级模式结构中,外模式不仅包括视图,而且还可以包括一些基本表。
(2)查询信息系为1号课程的学生:
SELECT Sno,Sname FROM IS_Student,SC
WHERE IS_Student.Sno = SC.Sno AND
SC.Cno = '1';--SC是课程表,存放课程号,课程名信息。
4.更新视图
更新视图是指用户通过视图对数据库中的数据进行插入(INSERT)、删除(DELETE)、修改(UPDATE)操作。
由于视图是不实际存在的虚表,对视图的更新最终要转化为对基本表的更新。
(1)将信息学生视图IS_Student中学号为2020002的学生姓名改成刘辰。
UPDATE IS_Student SET Sname = '刘辰'
WHERE Sno = '2020002';
与查询视图类似,DBMS执行此语句时,首先进行有效性检查,检查更新所涉及的表、视图等是否在数据库中存在,若存在,则从数据字典中取出该语句所涉及到视图的定义,把定义中的子查询和用户对视图的更新操作结合起来,转换成对基本表的更新,然后再执行这个经过修正的更新操作。
转换后的更新语句:
UPDATE Student Set Sname = '刘辰'
WHERE Sno = '2020002' AND Sdept = 'IS';
5.视图的用途
(1)简化用户的操作
(2)使用户能以多种角度看待同一数据
(3)对重构数据库提供了一定程度的逻辑独立性
(4)能够对机密数据提供安全保护