3.5 视 图 3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 撤销视图 3.5.5 视图的作用 3.5.2 查询视图 用户角度:查询视图与查询基本表相同 RDBMS实现视图查询的方法 视图消解法(View Resolution) 进行有效性检查 转换成等价的对基本表的查询 执行转换后的查询 查询视图(续) 【例3-64】查询计算机学院2008年12月30日借书的学生的借书证号、姓名和ISBN。 SELECT 借书证号,姓名, ISBN FROM CS_VIEW WHERE 借书时间= 2008-12-30; DBMS在执行此查询时,首先进行有效性检查,然后从数据字典中取出CS_VIEW视图的定义: CREATE VIEW CS_VIEW AS SELECT STUDENT.借书证号,姓名,性别,ISBN,借书时间 FROM STUDENT,BORROW WHERE STUDENT.借书证号= BORROW.借书证号 AND 专业名=计算机 WITH CHECK OPTION ; 查询视图(续) 视图消解转换后的查询语句为: SELECT STUDENT.借书证号,姓名, ISBN, FROM STUDENT,BORROW WHERE STUDENT.借书证号= BORROW.借书证号 AND 专业名=计算机 AND借书时间= 2008-12-30; 查询视图(续) 视图消解法的局限 有些情况下,视图消解法不能生成正确查询。 查询视图(续) 【例3-65】查询学生所借图书的总价值超过800元的学生的借书证号、姓名和总价值。 SELECT借书证号, 姓名, 总价值 FROM TOTAL_PRICE WHERE 总价值800; TOTAL_PRICE视图的子查询定义: CREATE VIEW TOTAL_PRICE (借书证号, 姓名, 总价值) AS SELECT BORROW.借书证号, 姓名, SUM(价格) FROM STUDENT,BOOK,BORROW WHERE STUDENT.借书证号= BORROW.借书证号 AND BOOROW.ISBN=BOOK.ISBN GROUP BY BORROW.借书证号; 查询转换 错误: SELECT BORROW.借书证号, 姓名, SUM(价格) FROM STUDENT,BOOK,BORROW WHERE STUDENT.借书证号= BORROW.借书证号 AND BOOROW.ISBN=BOOK.ISBN AND SUM(价格)800 GROUP BY BORROW.借书证号; 正确: SELECT BORROW.借书证号, 姓名, SUM(价格) FROM STUDENT,BOOK,BORROW WHERE STUDENT.借书证号= BORROW.借书证号 AND BOOROW.ISBN=BOOK.ISBN GROUP BY BORROW.借书证号 HAVING SUM(价格)800; 3.5 视 图 3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 撤销视图 3.5.5 视图的作用 3.5.3 更新视图 更新视图操作包括: 插入(INSERT) 删除(DELETE) 修改(UPDATE) 更新视图(续) 在DB2中对视图的更新有如下限制: (1)若视图的属性来自属性表达式或常数,则不允许对视图执行INSERT和UPDATE操作,但允许执行DELETE操作。 (2)若视图的属性来自聚集函数,则不允许对此视图更新。 (3)若视图定义中有GROUP BY子句,则不允许对此视图更新。 (4)若视图定义中有DISTINCT任选项,则不允许对此视图更新。 (5)若视图定义中有嵌套查询,并且嵌套查询的FROM子句涉及导出该视图的基本表,则不允许对此视图更新。 (6)若视图由两个以上的基本表导出,则不允许对此视图更新。 (7)如果在一个不允许更新的视图上再定义一个视图,这种二次视图是不允许更新的。 更新视图(续) 【例3-66】将视图CS_VIEW中借书证号为“080102”的学生的借书时间改为2008-12-25。 UPDATE CS_VIEW SET借书时间=2008-12-25 WHERE 借书证号=080102; 本例中该更新语句是可以执行的,且执行时也是转换为对基本表的更新。但是对于视图CS_VIEW_081010和TOTAL_PRICE的更新是不允许的。 3.5 视 图 3.5.1 定义视图 3.5.2 查询视图 3.5.3 更新视图 3.5.4 撤销视图 3.5.5 视图的作用
原创力文档

文档评论(0)