第11讲:视图及其应用

回顾:三级模式两层映像

  • 基本表:对应概念模式的数据在SQL中被称为基本表
  • 视图:对应外模式的数据在SQL中被称为视图,视图不仅包含外模式,还包含E-C映像

 

一、视图的概念与结构

1. SQL中的数据库结构

    ①基本表:是实际存储于存储文件中的表,基本表中的数据是需要存储的

    ②视图:只存储由基本表导出视图的所需要的公式,即由基本表产生视图的映像信息,其数据并不存储(而是在运行过程中动态产生与维护的)

    注:对视图的更改最终要反映在对基本表的更改上。

    

 

2. 定义视图

    ①语法形式:create view 视图名 [(列名 [, 列名 ... ])] as (子查询) [with check option]

    ②如果视图的属性名缺省,则默认为子查询结果中的属性名

    ③“as 子查询”就是我们所说的“E-C映像”

    ④“with check option”指明当对视图进行insert、update、delete时,要检查进行insert/update/delete的元组是否满足视图定义中子查询中定义的条件表达式

【示例1】定义一个视图 CompStud 为计算机系的学生,通过该视图可以将Student表中其他系的学生屏蔽掉:

  • create view CompStud as (select * from Student where D# in (select D# from Dept where Dname = '计算机'));

【示例2】定义一个视图Teach为教师任课的情况,把Teacher表中的个人隐私方面的信息,如工资等屏蔽掉,仅反映其教哪门课及其学分等:

  • create view Teach as (select T.Tname, C.Cname, Credit from Teacher T, Course C where T.T# = C.C#);

【示例3】定义视图StudStat, 描述学生的平均成绩、最高成绩,最低成绩等:

  • create view StudStat(S#, Sname, AvgS, MinS, MaxS, CNT) as (select S#, Sname, avg(Score), min(Score), max(Score), count(*) from Student S, SC where S.S# = SC. S# group by S.S#);

 

3. 使用视图

    ①定义好的视图就像Table一样,可以在select语句中使用

【示例1】检索主讲数据库课程的教师姓名,我们可使用Teach:

  • select T.Tname from Teach where T.Cname = '数据库';

【示例2】检索计算机系的所有学生,我们可使用CompStud:

  • select * from CompStud;

【示例3】检索计算机系的年龄小于20的所有学生,我们可使用CompStud:

  • select * from CompStud where Sage < 20;

【示例4】基于视图StudStat检索学生张三的平均成绩:

  • select Sname, AvgS from StudStat where Sname = '张三';  // 定义视图,有时可方便用户进行检索操作

 

4. 视图的更新问题

    ①因视图是不保存数据的,故对视图的更新最终要反映到对基本表的更新上

    ②值得注意的是,在一些情况下,视图定义的映射是不可逆的

  • 如果视图的select目标列包含聚集函数,则不能更新
  • 如果视图的select子句使用了unique或distinct,则不能更新
  • 如果视图中包括了groupby子句,则不能更新
  • 如果视图中包括了经算术表达式计算出来的列,则不能更新
  • 如果视图是由单个表的列构成,但并没有包括主键,则不能更新

    ③如果视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主键,则可以更新 

【不可更新示例1】不能由视图S_G的更新,而更新SC表:

  • create view S_G(S#, Savg) as (select S#, avg(Score) from SC group by S#);
  • update S_G set Savg = 85 where S# = '98030101';

【不可更新示例2】不能由视图ClassStud的更新,而更新Student表:

  • create view ClassStud(Sname, Sclass) as (select Sname, Sclass from Student);
  • insert into ClassStud Values ('张三', '980301');  // 因为缺少S#,而S#是Student的主键

【可更新示例】能由视图CStud的更新,而更新Student表:

  • create view CStud(S#, Sname, Sclass) as (select S#, Sname, Sclass from Student where D# = '03');
  • insert into CStud Values('98030104', '张三丰', '980301');  // 有主键S#,而对于缺失的属性(如Ssex、Sage)则用null来表示

 

5. 撤消视图

    ①语法形式:drop view 视图名;

【示例】撤消视图Teach:

  • drop view Teach;

 

posted @ 2019-04-21 13:04  GGBeng  阅读(599)  评论(0编辑  收藏  举报