第三章:关系数据库标准语言S0L 视图
第三章:关系数据库标准语言SQL 视 图
1、视图 从一个或几个基本表(或视图)导出的表。 数据库只存放视图的定义,不存储视图所对应的数据,数据存放在基本表中。 对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。 视图一经定义后,可以像表一样被查询、修改、删除和更新。 2、视图的优点 ①为用户集中数据,简化用户的数据查询和处理; ②屏蔽数据库的复杂性 ③简化用户权限的管理; ④便于数据共享; ⑤可以重新组织数据以便输出到其他应用程序中。 只有在当前数据库中才能创建视图,视图不能与表同名
1、视图 • 从一个或几个基本表(或视图)导出的表。 • 数据库只存放视图的定义,不存储视图所对应的数据,数据存放在基本表中。 • 对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。 • 视图一经定义后,可以像表一样被查询、修改、删除和更新。 2、视图的优点 ① 为用户集中数据,简化用户的数据查询和处理; ② 屏蔽数据库的复杂性; ③ 简化用户权限的管理; ④ 便于数据共享; ⑤ 可以重新组织数据以便输出到其他应用程序中。 只有在当前数据库中才能创建视图,视图不能与表同名
3、创建视图 全部省略或全 部指定 CREATE VIEW I schema name. I view name [(column[.nD)I [WITH [ .n1 /*指出视图的属性* AS select statement /*指定视图创建的语句* [ WITH CHECK OPTION[ I /*指出视图上所做的修改符合限制条件* 在下列情况下必须指定组成视图的所有列名 ①视图中的列是从算术表达式、函数或常量派生的; ②两个或更多的列可能会具有相同的名称(通常是由于联接的原 因) ③视图中的某个列的指定名称不同于其派生来源列的名称
3、创建视图 在下列情况下必须指定组成视图的所有列名: ① 视图中的列是从算术表达式、函数或常量派生的; ② 两个或更多的列可能会具有相同的名称(通常是由于联接的原 因); ③ 视图中的某个列的指定名称不同于其派生来源列的名称。 CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] [ WITH [ ,...n ] ] /*指出视图的属性*/ AS select_statement /*指定视图创建的语句*/ [ WITH CHECK OPTION ] [ ; ] /*指出视图上所做的修改符合限制条件*/ 全部省略或全 部指定
EG:创建计算机专业学生的视图CSXS,并保证对该视图的修改都符合“专业为计算机” 这一条件。 CREATE VIEW CS XS AS SELECT XSB.* FROM XSB WHERE XSB. Majors计算机 WITH CHECK OPTION EG:创建CSKC视图,包括计算机专业各学生的学号、其选修的课程号以及成绩。要 保证对该视图的修改都符合“专业为计算机”这一条件。 CREATE VIEW CS KC AS SELECT XSB. Stu ID CJB. C ID cJB grade FROM XSB CJB WHERE XSB. Stu ID= CJB.Stu ID AND XSB. Major=计算机 WITH CHECK OPTION
EG:创建计算机专业学生的视图CS_XS,并保证对该视图的修改都符合“专业为计算机” 这一条件。 CREATE VIEW CS_XS AS SELECT XSB.* FROM XSB WHERE XSB.Major='计算机' WITH CHECK OPTION; EG:创建CS_KC视图,包括计算机专业各学生的学号、其选修的课程号以及成绩。要 保证对该视图的修改都符合“专业为计算机”这一条件。 CREATE VIEW CS_KC AS SELECT XSB.Stu_ID,CJB.C_ID,CJB.Grade FROM XSB,CJB WHERE XSB.Stu_ID=CJB.Stu_ID AND XSB.Major='计算机' WITH CHECK OPTION;
EG:创建计算机专业学生的平均成绩视图 CS KC AVG,包括学号和 平均成绩。 CREATE VIEW CS KC AVG(Stu ID, Grade avg) AS SELECT CJB. Stu ID,AVG(CJB Grade) FROM CJB GROUP BY CJB. Stu id CREATE VIEW CS KC AVG CREATE VIEW CS KC AVG AS AS SELECT CJB. Stu ID, AVG(CJB Grade)As SELECT CJB. Stu ID, AVG(CJB Grade) ade avg FROM CJB FROM CJB GROUP BY CJB. Stu ID GROUP BY CJB. Stu id
EG:创建计算机专业学生的平均成绩视图CS_KC_AVG,包括学号和 平均成绩。 CREATE VIEW CS_KC_AVG(Stu_ID,Grade_avg) AS SELECT CJB.Stu_ID,AVG(CJB.Grade) FROM CJB GROUP BY CJB.Stu_ID; CREATE 比较: VIEW CS_KC_AVG AS SELECT CJB.Stu_ID,AVG(CJB.Grade) FROM CJB GROUP BY CJB.Stu_ID; CREATE VIEW CS_KC_AVG AS SELECT CJB.Stu_ID,AVG(CJB.Grade) AS Grade_avg FROM CJB GROUP BY CJB.Stu_ID;
4、查询视图 视图定义后,可以像查询基本表那样对视图进行查询。 EG:查找计算机专业的学生学号和选修的课程号。 SELECT STU IDC ID FROM CS KC EG:查找平均成绩在80分以上的学生的学号和平均成绩。 SELECT FROM CS KC AVG WHERE GRADE AVG>=80 在使用视图查询时,若其关联的基本表中添加了新字段,则必须重 新创建视图才能查询到新字段
4、查询视图 视图定义后,可以像查询基本表那样对视图进行查询。 EG:查找计算机专业的学生学号和选修的课程号。 SELECT STU_ID,C_ID FROM CS_KC; EG:查找平均成绩在80分以上的学生的学号和平均成绩。 • SELECT * FROM CS_KC_AVG • WHERE GRADE_AVG>=80; 在使用视图查询时,若其关联的基本表中添加了新字段,则必须重 新创建视图才能查询到新字段
视图查询执行过程(视图消解): ①进行有效性检查,确定查询涉及到的表或视图是否存在; ②取出视图定义,结合定义中的子查询和用户查询,转换为等价的对基本表的查询 执行查询。 EG:创建CSCJ视图,包含学生学号和平均成绩。查询平均成绩在90分以上的学生学号 和平均成绩。 CREATE VIEW CS CJ(SNO, Gavg) AS SELECT CJB. Stu ID, AVG(CJB Grade) SELECT CJB. Stu ID, AVG(CJB Grade) FROM CJB FROM CJB WHERE AVG(CJB Grade>=90 GROUP BY CJB. Stu id GROUP BY CJB Stu id GO SELECT N SELECT CJB. Stu ID, AVG(CJB Grade FROM CS CJ FROM CJB WHERE Gave>=90 GROUP BY CJB. Stu ID HAVING AVG(CJB Grade>=90
视图查询执行过程(视图消解): ① 进行有效性检查,确定查询涉及到的表或视图是否存在; ② 取出视图定义,结合定义中的子查询和用户查询,转换为等价的对基本表的查询; ③ 执行查询。 EG:创建CS_CJ视图,包含学生学号和平均成绩。查询平均成绩在90分以上的学生学号 和平均成绩。 CREATE VIEW CS_CJ(SNO,Gavg) AS SELECT CJB.Stu_ID,AVG(CJB.Grade) FROM CJB GROUP BY CJB.Stu_ID; GO SELECT * FROM CS_CJ WHERE Gavg>=90; SELECT CJB.Stu_ID,AVG(CJB.Grade) FROM CJB WHERE AVG(CJB.Grade>=90 GROUP BY CJB.Stu_ID; SELECT CJB.Stu_ID,AVG(CJB.Grade) FROM CJB GROUP BY CJB.Stu_ID HAVING AVG(CJB.Grade>=90;
·目前多数关系数据库系统对行列子集视图的查询均能进行正确转换。 但对非行列子集视图的查询不一定能做转换,因此这类查询应该直接 对基本表进行。 注 行列子集视图:从单个基本表导出来,保留了主码,只去掉了基本表的 某些行和某些列。 上例为非行列子集视图(包含由聚集函数产生的列),因此这类查询不 能做转换,应该直接对进本表进行查询
• 目前多数关系数据库系统对行列子集视图的查询均能进行正确转换。 但对非行列子集视图的查询不一定能做转换,因此这类查询应该直接 对基本表进行。 注: 行列子集视图:从单个基本表导出来,保留了主码,只去掉了基本表的 某些行和某些列。 上例为非行列子集视图(包含由聚集函数产生的列),因此这类查询不 能做转换,应该直接对进本表进行查询
更新视图 通过更新视图(插入、修改、删除)数据可以修改基本表数据。 对视图的更新,通过视图消解,最终转化为对基本表的更新操作。 不是所有的视图都可以更新,只有对满足可更新条件的视图,才能进 行更新。 (1)可更新视图 满足以下条件的视图: ①创建视图的 SELECT语句中没有聚合函数,且没有TOP、 GROUP BY、 UNION子句及 DISTINCT关键字; ②创建视图的 SELECT语句中不包含从基本表列通过计算所得的列; ③创建视图的 SELECT语句的FROM子句中至少要包含一个基本表
5、更新视图 通过更新视图(插入、修改、删除)数据可以修改基本表数据。 对视图的更新,通过视图消解,最终转化为对基本表的更新操作。 不是所有的视图都可以更新,只有对满足可更新条件的视图,才能进 行更新。 (1)可更新视图 满足以下条件的视图: ① 创建视图的SELECT语句中没有聚合函数,且没有TOP、GROUP BY、UNION子句及DISTINCT关键字; ② 创建视图的SELECT语句中不包含从基本表列通过计算所得的列; ③ 创建视图的SELECT语句的FROM子句中至少要包含一个基本表
(2)插入数据 使用 INSERT语句通过视图向基本表插入数据 EG:向CSXS视图中插入以下记录:(081115,刘明义,1,19899-8°, 计算机,50NULL INSERT INTO CS XS ALUES(081115刘明义,1,1989-9-8,计算机,50,NULL) 当视图所依赖的基本表有多个时,不能向该视图插入数据
(2)插入数据 使用INSERT语句通过视图向基本表插入数据。 EG:向CS_XS视图中插入以下记录:(’081115’,’刘明义’,1,’1989-9-8’,’ 计算机’,50,NULL) INSERT INTO CS_XS VALUES('081115', '刘明义' ,1,'1989-9-8', '计算机' ,50,NULL); 当视图所依赖的基本表有多个时,不能向该视图插入数据