zoukankan      html  css  js  c++  java
  • 《数据库系统概论》 -- 3.2. 视图

    概念

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

             视图是一个虚表

             数据库只存放视图的定义,不存放视图对应的数据

             视图一经定义,就可以被查询,删除,但是更新操作有一定限制

    定义视图

             格式         CREATE VIEW <视图名> [(<列名>[,<列名>...])]

                                AS <子查询>

                                [WITH CHECK OPTION];

             说明         子查询可以是任意的SELECT语句,是否可以包含ORDER BY子句和DISTINCT短语,取决于具体系统;

                                视图的定义可以基于另一个视图

                                后加WITH CHECK OPTION短语约束视图进行更新、插入、删除数据时,仍应该要满足子查询中的条件

             注意         列名要么全部指定,要么全不指定,不指定时,使用子查询中列名

                                出现下面情况,必须指定:

                                         某个目标列为聚集函数或列表达式

                                         多表连接时,有同名列

                                         需要为某个列命名

             分类         行列子集视图:一个视图是从某单个基本表导出的,只是去掉了某些行,则该视图称为行列子集视图

                                带表达式的视图:一个视图中的某属性是基本表的某属性经过算术/逻辑/比较运算得到的,则该视图称为带表达式的视图

                                分组视图:带有聚集函数和GROUP BY子句的查询来定义视图

             举例         建立信息系学生的视图

                                         CREATE VIEW IS_Student

                                         AS

                                         SELECT Sno,Sname,Sage FROM Student WHERE Sdept='IS';

                                建立信息系学生的视图,并约束在进行修改和插入操作时,该视图只有信息系学生(行列子集视图

                                         CREATE VIEW IS_Student_View

                                         AS

                                         SELECT Sno,Sname,Sage FROM Student Where Sdept='IS'

                                         WITH CHECK OPTION;

                                建立信息系选修了1好课程的学生的视图(包括学号,姓名,成绩)

                                         CRETAE VIEW IS_S1 (Sno,Sname,Grade)

                                         AS

                                         SELECT SC.Sno,Sname,Grade

                                         FROM Student,SC

                                         WHERE Student.Sno=SC.Sno AND Sdept='IS' 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,2017-Sage

                                         FROM Student;

                                将学生的学号和平均成绩定义为一个视图(分组视图

                                         CREATE VIEW S_G(Sno,Gavg)

                                         AS

                                         SELECT Sno,AVG(Grade)

                                         FROM SC

                                         GROUP BY Sno;

                                将Student表中的所有女生定义为一个视图

                                         CREATE VIEW G_Student

                                         AS

                                         SELECT *

                                         FROM Student

                                         WHERE Ssex='女';

    删除视图

             格式         DROP VIEW <视图名> [CASCADE];

             说明         视图删除后,视图定义将会从数据字典中删除

                                如果在该视图的基础上还导出了其他视图,则使用CASCADE级联删除即可,否则拒绝执行

             举例         DROP VIEW BT_S;  /*成功执行*/

                                DROP VIEW IS_S1;  /*拒绝执行*/

                                DROP VIEW IS_SI CASCADE;  /*成功执行,同时删除IS_S2*/

    查询视图

             概念         视图消解:在执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图是否存在,如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换为对基本表的查询,在后在执行修正后的查询

             注意         WHERE子句中聚集函数是不能做条件表达式的,但是大多数RDBS对查询都有优化,都可以进行正确转换

    更新视图

             概念         更新视图,是指通过视图来插入、删除、修改

             注意         视图是不存储实际数据的虚表,所以对视图的更新会经过视图消解最终转换为对基本表的更新

                                并不是所有视图都可以更新,比如平均成绩视图

                                各个RDBMS的视图更新操作需参考各RDBMS的具体实现

             举例         将信息系学生试图IS_Student中学号为201215122的学生姓名改为刘辰--视图之UPDATE

                                         UPDATE IS_Student

                                         SET Sname='刘辰'

                                         WHERE Sno='201215122';

                                向信息系学生视图IS_Student中插入一个新的学生记录('201215129','赵新',20)--视图之INSERT

                                         INSERT INTO IS_Student

                                         VALUES ('201215129','赵新',20);

                                删除信息系学生视图IS_Student中的学号为201215129的学生记录--视图之DELETE

                                         DELETE FROM IS_Student

                                         WHERE Sno='201215129';

    视图的作用

             简化用户操作

             以多种角度看待同一数据

             对重构数据库(对数据库进行新增基本表,或修改基本表)提供了一定的逻辑独立性(不影响用户的应用程序)

             对机密数据提供安全保护(如全校所有学生的信息都在一个表里,但是给每个学院创建各自的视图,则每个学员只能看到自己学院的数据)

             适当利用视图,查询语句更清晰

  • 相关阅读:
    linux系统mysql数据库安装步骤
    uwsgi 配置文件
    服务器重启后,docker无法启动
    标准库functools.wraps的使用方法
    闭包函数延迟绑定问题
    python的面向对象编程
    python中包的介绍与常用模块
    drf知识整理一
    Django知识整理四(choices参数,MTV与MVC模型,ajax介绍,ajax传json文件,ajax传文件,contentType前后端传输数据编码格式)
    DRF序列化组件
  • 原文地址:https://www.cnblogs.com/yc913344706/p/7472045.html
Copyright © 2011-2022 走看看