视图

为什么要使用视图?

    当然是因为它有很多好处啦,那它有哪些好处呢:

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

    视图机制使用户可以将注意力集中在所关心的数据上(换句话说就是可以不用去什么那些我们不 care 的数据)。
    也即,如果你所关心的数据不是直接来自基本表(比如说来自多张表或者有一些经过计算、处理的数据),那么定义视图可以使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。

    例如,那些定义了若干张表连接的视图就将表与表之间的连接操作对用户隐藏起来了。
    换句话说,用户所做的只是对一个虚表的简单查询就可以查看到我们所需要的来自多张表的数据(而这个虚表是怎么得来的,用户无须了解)。

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

    视图机制能使不同的用户以不同的方式看待同一数据(不同的用户在多个相同的基本表之上建立不同的视图,组成不同的含义),当许多不同种类的用户共享同一个数据库时,这种灵活性是非常重要的。

  3.视图对重构数据库提供了一定程度的逻辑独立性(数据的逻辑独立性是指当数据库重构时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响)

    在关系数据库中,数据库的重构往往是不可避免的。

    重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。这样,通过建立视图,尽管数据库的逻辑结构改变了,但应用程序不必修改。

    当然,视图只能在一定程度上提供数据的逻辑独立性,由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而需要做相应修改。

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

    有了视图机制,就可以在设计数据库应用系统时对不同的用户定义不同的视图,使机密数据不出现在不应看到这些数据的用户视图上。(这样视图机制就自动提供了对机密数据的安全保护功能)

    例如,Student 表涉及全校15个院系的学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本院系的学生视图。

  5.适当利用视图可以更清晰地表达查询(可以将常用的一些复杂的查询的一部分拿出来创建一个视图,然后再通过视图完成剩下的一部分)

什么是视图?

    视图是从一个或几个表(或视图)导出的表。它与基本表不同,是一个虚表。
    数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
    所以,一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。(从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。)

    视图一经定义,就可以和基本表一样被查询、被删除。(也可以在一个视图上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制)

定义视图(建立视图):

    SQL 语句用 create view 命令建立视图,其一般格式为

       create view <视图名> [(<列名> [,<列名>]…)]

       AS <子查询>        -- 子查询可以是任意的 select 语句 (是否可以含有 order by 子句和 distinct 短语,则取决于具体系统的实现)

       [with check option] ;       -- with check option 表示对视图进行 update、insert 和 delete 操作时要保证更新、插入或删除的行满足视图定义中“子查询中的条件表达式”

    组成视图的属性列名,或者全部省略,或者全部指定(紧跟着视图名),没有第三种选择但在下列三种情况下必须明确指定组成视图的所有列名

    (1)某个目标列不是单纯的属性名,而是聚合函数或列表达式;

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

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

    若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。

    定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的

    由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,也称它们为虚拟列。

    (带虚拟列的视图也称为带表达式的视图)

删除视图:

    drop view<视图名> [cascade] ;

    如果视图上还导出了其他视图,则可以使用 cascade 级联删除语句把该视图和由它导出的所有视图一起删除(不使用 cascade 则拒绝执行)。

    基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。(删除这些视图定义需要显式地使用 drop view 语句)

查询视图:

    视图定义后,用户就可以像对基本表一样对视图进行查询了。

    关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户调用视图的查询结合起来,转换成等价的对基本表的查询。

    一般情况下,视图查询的转换是直截了当的。但有些情况下,这种转换不能直接进行,查询时就会出现问题。

    where 子句中是不能用聚集函数作为条件表达式的所以含有聚集函数的视图在查询的时候就有可能会遇到问题(当含有聚集函数的字段又出现在 where子句中时)

    目前多数关系数据库系统对行列子集视图的查询均能进行正确转换。但对非行列子集视图的查询就不一定能做转换了。

更新视图:

    更新视图是指通过视图来插入(insert)、删除(delete)和修改(update)数据。

    由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。

    为防止用户通过视图对数据进行增加、删除、修改时有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上 with check option 子句。(这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件则拒绝执行该操作)

    在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。(比如一个涉及到各个学生的平均分的视图,它的更新是无法转换成对基本表的更新的,因为系统无法修改各科成绩来达到平均分的修改)

    目前,各个关系数据库管理系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定。(DB2规定:略)

原文地址:https://www.cnblogs.com/zhangchaoran/p/8026733.html