本章主要讲解以下3点知识:
1 视图的创建和撤消
2 对视图的更新操作
3 视图的优点
视图的创建和撤消
视图的创建创建视图可用“CREATE VIEW”语句实现。其句法如下:
CREATE VIEW <视图名>(列表名)AS <SELECT 查询语句>
例3.27 对于教学数据库中基本表S、SC、C,用户经常要用到S#、SNAME、CNAME和GRADE等列的数据,那么可用下列语句建立视图:
CREATE VIEW STUDENT_GRADE(S#,SNAME,CNAME,GRADE)
AS SELECT S.S#,SNAME,CNAME,GRADE
FROM S,SC,C WHERE S.S# = SC.S# AND SC.C# = C.C#;
视图的撤消在视图不需要时,可以用“DROP VIEW”语句把其从系统中撤消。其句法如下:
DROP VIEW 视图名
例3.28 撤消STUDENT_GRADE视图,可用下列语句实现:
DROP VIEW STUDENT_GRADE;
对视图的更新操作
如果视图是从单个基本表只使用选择、投影操作导出的,并且包含了基本表的主键,那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。例3.29 下面讨论对视图更新的几个例子。
①设有一个视图定义
CREATE VIEW SUDENT_GRADE
AS
SELECT S.S#, SNAME,CNAME,GRADE
FROM S,SC,C WHERE S.S# = SC.S# AND SC.C# =C.C#;
这个视图定义了学生选修的课程名和成绩,是由三个基本表联接而成的。
如果用户要在视图中执行插入操作:
INSERT INTO STUDENT_GRADE VALUES ('S24', 'WANG', 'MATHS',80);
若在基本表C中,课程名为MATHS的课程号有多个,则往基本表SC插入元组时,课程号C#就不定了。因此,对这个视图的更新是不允许的。
②设有一个视图定义,包含每个学生选修课程(成绩为非空)的门数和平均成绩:
CREATE VIEW S_GRADE(S#,C_NUM,AVG_GRADE)
AS
SELECT S#,COUNT(C#),AVG(GRADE)
FROM SC WHERE GRADE IS NOT NULL
视图S_GRADE虽然是从单个基本表导出,但导出时使用了分组和聚集操作,因此也是不能更新的。譬如,在未更改基本表SC中值时,要在视图S_GRADE中更改学生的平均成绩,显然是不切实际的。
③如果定义了一个有关男学生的视图:
CREATE VIEW S_MALE
AS
SELECT S#,SNAME,AGE FROM S WHERE SEX ='M';
这个视图是从单个关系只使用选择和投影导出的,并且包含键S#,因此是可更新的。譬如,执行插入操作:
INSERT INTO S_MALE VALUES('S28','WU',18);
系统自动会把它转变成下列语句:
INSERT INTO S VALUES('S28', 'WU',18, 'M');
视图的优点视图是用户一级的数据观点,由于有了视图,使数据库系统具有下列优点:
(1)视图提供了逻辑数据独立性。
(2)简化了用户观点。数据库的全部结构是复杂的,并有多种联系。
(3)数据的安全保护功能。S孴鶺{|媁\<