250 likes | 385 Views
3.5 视 图. 视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。换句话说,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。 3.5.1 定义视图 1. 建立视图 SQL 语言用 CREATE VIEW 命令建立视图,其一般格式为 :. CREATE VIEW < 视图名 >[< 列名 >[,< 列名 >]…)] AS < 子查询 > [WITH CHECK OPTION];
E N D
3.5 视 图 • 视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。换句话说,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。 • 3.5.1 定义视图 • 1. 建立视图 • SQL 语言用 CREATE VIEW 命令建立视图,其一般格式为:
CREATE VIEW <视图名 >[<列名>[,<列名>]…)] • AS < 子查询> • [WITH CHECK OPTION]; • 如果CREATE VIEW 语句仅指定了视图名,省略了组成视图的各个属性名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况
下必须明确指定组成视图的所有列名: • 其中某个目标不是单纯的属性名,而是集函数或列表达式。 • 多表连接是选出了几个同名列作为视图的字段。 • 需要在视图中为某个列启用新的更合适的名字。
例1 建立信息系学生的视图。 • CREATE VIEW IS-STUDENT • AS • SELECT Sno,Sname,Sage • FROM Student • WHERE Sdept =‘IS’ ;
DBMS 执行此语句时就相当建立如下虚表: • IS -STUDENT表 • Sno Sname Sage • 95002 刘 辰 19 • 95004 张 力 18
例 建立信息系学生的视图,进行操作时该视图只有信息系学生。 • CREAT VIEW IS -STUDENT • AS • SELECT Sno,Sname, Sage • FROM Student • WHERE Sdept=‘IS’ • WITH CHECK OPTION;
建立选修了一号课程 的学生视图 • CREAT E VIEW IS-S1(Sno,Sname,Grade) • AS • SELECT Student.Sno,Sname, Grade • FROM Student, SC • WHERE Sdept=‘IS’ AND SC.Cno=‘1’ • AND Student.Sno= SC.Sno
建立选修了一号课程成绩在90分以上的学生视图建立选修了一号课程成绩在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,1996-Sage • FROM Student;
例将学生的学号极其平均成绩定义为一个视图 • CREATE VIEW S-G(Sno,Gavg) • AS SELECT Sno, AVG(Grade) • FROM SC • GROUP BY Sno;
将表中所有女生定义为一个视图 • CREAT VIEW F- Student • (Stdnum, Name ,Sex, Age, Dept) • AS • SELECT * • FROM Student • WHERE Ssex=‘女’;
2 删除视图:使用 DROP VIEW格式 • DROP VIEW <视图名>; • 例 删除视图IS-S1 • DROP VIEW IS-S1;
小结 • 视图的类型: • 1基本表上的视图{单表视图,多表视图} • 2 视图上的视图{单视图上的视图,多视图上的视图} • 3基本表与视图上的视图{普通视图,带表达式的视图,分组视图}
3.5.2 查询视图 • 例 在信息系学生的视图中找出年龄小于20的学生。 • SELECT Sno,Sage • FROM IS-STUDENT • WHERE Sage〈 20; • SELECT Sno,Sname,Sage • FROM Student • WHERE Sdept=‘IS’;
转换为 • SELECT Sno, Sage • FROM Student • WHERE Sdept=‘IS’ AND Sage‹ 20 ;
例 查询信息系选修了一号课的学生 • SELECT Sno,Sname • FROM IS-STUDENT,SC • WHERE IS -STUDENT.Sno=SC。Sno • AND SC.Cno=‘1’;
3.5.3 视图更新 • 更新视图包括: • 插入(INSERT), 删除(DELETE)和修改 • (UPDATE) • 例 将信息系学生视图中学号为95002的学生改为“刘辰”. • UPDATE IS_ STUDENT • SET Sname =‘刘辰’ • WHERE Sno =‘95002’;
转换语句 • UPDATE Student • SET Sname =‘刘辰’ • WHERE Sno =‘95002 AND Sdept=‘IS’
例 向信息系学生视图中插入一个新的学生记录.其中学号为95029,姓名为赵新,年龄为20岁。 • INSERT • INTO IS -STUDENT • VALUES(‘95029’, ‘赵新’,20); • DBMS将其转换为对表的基本更新:
INSERT • INTO Student(Sno,Sname,Sage, • Sdept) • VALUES(‘95029’,‘赵新’,‘20’,‘IS’ ) • 例 删除计算机系学生视图CS-S中学号为95029的学生记录
DELETE • FROM IS-STUDENT • WHERE Sno=‘95029’ • DBMS将其换为对基本表的更新 • DELETE • FROM Student • WHERE Sno=‘95029’AND • Sdept=‘IS’;
关系数据库 遵守如下规定: • 1 若视图是由两个以上的基本表导出的,则不允许更新。 • 2 若视图的字段来自字段表达式或常数,则不允许执行INSERT和UPDATE ,但允许执行DELETE。 • 3 若视图的字段来自集函数,则不允许更新。 • 4 若视图中含有GROUP BY 子句,不允许更新。
5 若视图中含有DISTINCT短语,不允许更新。 • 6 若视图中含有嵌套查询,并且内层查寻的子句 FROM 涉及的是该视图的基本表,则不允许更新。 • 7一个不允许更新的视图上定义的视图, 也不允许更新。
例 将成绩在平均成绩之上的元组定义成一个视图GOOD-SC。 • CREATE VIEW GOOD-SC • AS • SELECT Sno, Cno, Grade • FROM SC • WHERE Grade> • (SELECT AVG (Grade) • FROM SC ) ;
3.5.4视图的用途 • 1 视图能够简化用户的操作 • 2 视图能够以多种角度看问题 • 3 视图对重构数据库提供了一定程度的逻辑独立性 • 4 视图能够对机密数据提供安全保护