• 第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;
  • 相关阅读:
    【一】、Cypress下载及安装介绍
    利用Selenium多用户同时开启多线程登录博客园
    实用的jsonpath模块
    Linux常用命令
    Python读取CSV文件
    python算法集锦【四】
    基础类封装-浏览器文件上载类库封装
    基础类封装-查找页面元素类库封装
    基础类封装-键盘类操作库封装
    自动化测试框架Python+selenium+unittest系列 之 配置文件读取(Python)
  • 原文地址:https://www.cnblogs.com/xzxl/p/10744796.html
Copyright © 2020-2023  润新知