视图

视图的特点

1.        虚表,是从一个或几个基本表(或视图)导出的表

2.        只存放视图的定义,不会出现数据冗余

3.        基表中的数据发生变化,从视图中查询出的数据也随之改变

基于视图的操作

1.        查询

2.        删除

3.        受限更新

定义基于该视图的新视图

l  建立视图

CREATE  VIEW <视图名>  [(<列名> [,<列名>]…)]

AS <子查询>

[ WITH  CHECK OPTION ];

但是对于以下3种情况,必须明确指定视图的属性列名字:

1)某个目标列是集函数或列表达式

2)多表连接时选出了几个同名属性列作为视图的属性字段

3)需要在视图中为某个列启用新的更合适的名字

<子查询>:可以是任意的Select语句,但是不能含有Order By字句和Distinct短语。 

l  WITH  CHECK  OPTION:表示对视图进行修改、插入和删除操作时,必须保证所要修改、插入和删除的行满足子查询中的“条件表达式”。

u  [例]  建立信息系学生的视CREATE  VIEW    IS_Student

            AS                                图。

SELECT  Sno,Sname,Sage              

 FROM    Student

 WHERE   Sdept= 'IS';

u  [例]  建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。

CREATE  VIEW  IS_Student

                AS               

SELECT  Sno,Sname,Sage

               FROM    Student

               WHERE   Sdept= 'IS'

               WITH  CHECK OPTION;

基于多个基表的视图

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

带表达式的视图

[例]  定义一个反映学生出生年份的视图。     

CREATE VIEW    BT_S(Sno,Sname,Sbirth)

          AS           

              SELECT   Sno,Sname,2004-Sage

          FROM   Student

注意:带表达式的视图必须明确定义组成视图的各个属性列名

建立分组视图

CREATE  VIEW   S_G(Sno,Gavg)

                AS                

SELECT   Sno,AVG(Grade)

FROM   SC

GROUP BY   Sno;

注意:假设SC表中“成绩”列Grade为数字型           

删除视图

DROP VIEW  <视图名>;

查询视图DBMS实现视图查询的方法:视图消解法

l  [例]  在信息系学生的视图(IS_Student)中找出年龄小于20岁的学生学号和年龄。       

SELECT  Sno,Sage

       FROM      IS_Student

       WHERE    Sage<20;

IS_Student 视图的定义 :    

CREATE VIEW    IS_Student

    AS      SELECT    Sno,Sname,Sage

               FROM    Student

               WHERE    Sdept= 'IS';

 

转换后的查询语句为:      

SELECT  Sno,Sage             

FROM  Student      

WHERE  Sdept= 'IS'  AND  Sage<20

视图消解法的局限

1、有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。

[例]在S_G视图中查询平均成绩在90分以上 的学生学号和平均成绩。

l  S_G视图定义:       

CREATE VIEW   S_G (Sno,Gavg)

        AS    SELECT   Sno,AVG(Grade)

      FROM   SC

      GROUP  BY  Sno;

l  查询语句如下:

         SELECT  *

FROM  S_G

WHERE  Gavg>=90

l  把该查询语句和视图定义中的子查询结合起来,形成最终的查询语句如下:

错误:     SELECT  Sno,AVG(Grade)

FROM     SC

WHERE    AVG(Grade)>=90

GROUP BY   Sno;    

正确:     SELECT  Sno,AVG(Grade)

FROM    SC

GROUP BY   Sno

HAVING   AVG(Grade)>=90;

更新视图

1.        就是通过视图来插入(Insert)、删除(Delete)和修改(Update) 基本表中的数据,对视图的更新,最终要转换为对基本表的更新

2.        为了防止更新不属于该视图范围的数据,可以在定义视图时加上 With Check Option子句

l  修改视图语句格式:

Update    < 视图名>

Set     < 要更新的列名=更新后的值 >

Where   < 条件表达式>

l  插入视图语句格式:

Insert  

Into   < 视图名> (属性名1, 属性名2, …)

Values  (属性1值, 属性2值, …)  

l  删除视图语句格式:

Delete

From     < 视图名>

Where   < 条件表达式>

u  修改实例

[例]  将信息系学生视图IS_Student中学号95002 的学生姓名改为“刘辰”。

UPDATE   IS_Student

SET   Sname= '刘辰'

WHERE   Sno= '95002';

转换后的语句:

UPDATE   Student

SET   Sname= '刘辰'

WHERE   Sno= '95002' AND Sdept= 'IS';

u  插入实例

[例]  向信息系学生视图IS_Student中插入一个新的学生记录:95029,赵新,20岁。

INSERT

INTO    IS_Student

VALUES (‘95029’,‘赵新’,20);

转换为对基本表的更新:

     INSERT

INTO    Student(Sno,Sname,Sage,Sdept)

VALUES(‘95029’,‘赵新’,20,‘IS’ );

u  删除实例

[例]  删除信息系学生视图 IS_Student中学号为95029的记录。

DELETE

FROM   IS_Student

WHERE   Sno= '95029';

转换为对基本表的删除:

DELETE

FROM   Student

WHERE   Sno= '95029' AND Sdept= 'IS';

实际系统对视图更新的限制

2.        允许对行列子集视图进行更新

3.        对其他类型视图的更新不同系统有不同限制

DB2 对视图更新的限制:

(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。

(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。

(3) 若视图的字段来自集函数,则此视图不允许更新

(4) 若视图定义中含有GROUPBY子句,则此视图不允许更新。

(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。

(6) 若视图定义中有嵌套查询,且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。

(7) 一个不允许更新的视图上定义的视图也不允许更新

视图的作用

1.      视图能够简化 用户的操作

2.      视图使用户能以多种角度看待同一数据

3.      视图对重构数据库 提供了一定程度的逻辑独立性

4.      视图能够对机密数据提供安全保护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈善强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值