数据库视图

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

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

1、建立视图

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

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

       AS <子查询>

       [WITH CHECK OPTION];

       其中,子查询可以是任意的SELECT语句,是否可以含有ORDER BY 子句和DISTINCT短语,则取决于具体系统的实现。

       组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。但在下列三种情况下必须明确指定组成视图的所有列名:

  • 某个目标列不是单纯的属性名,而是聚集函数或列表达式;
  • 多表连接时选出了几个同名列作为视图的字段;
  • 需要在视图中为某个列启用新的更适合的名字。

2、删除视图

       该语句的格式为

       DROP VIEW <视图名> [CASCADE];

       视图删除之后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用CASCADE级联删除语句把该视图和由它导出的所有视图一起删除。基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图的定义没有从字典中清除。删除这些视图定义需要显示地使用DROP VIEW语句。

3、查询视图

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

       关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图定义,把定义中的子查询和用户的查询连接起来,转换成等价的对基本表的查询,然后再执行修正了的查询,这一转换过程称为视图消解

4、更新视图

       更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。

       由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新,像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作。

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

       目前,各个关系数据库管理系统一般都只允许对行列子集视图进行更新,而且各个系统对视图的更新还有更进一步的规定。由于各个系统实现方法上的差异,这些规定也不尽相同。

例如,DB2规定:

  • 若视图是由两个基本表导出的,则此视图不允许更新。
  • 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
  • 若视图的字段来自聚集函数,则此视图不允许更新。
  • 若此视图定义中含有GROUP BY子句,则此视图不允许更新。
  • 若此视图定义中含有DISTINCT短语,则此视图不允许更新。
  • 若此视图中有嵌套查询,并内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
  • 一个不允许更新的视图上定义的视图也不允许更新。

注意:不可更新的视图与不允许更新的视图是两个不同的概念。前者指理论上已经证明其是不可更新的视图。后者指实际系统中不支持其更新,但其本身有可能是可更新的视图。

5、视图的作用

       视图最终是定义在基本表上的,对视图的一切操作最终也要转换为基本表的操作。而且对于非行列子集视图进行查询或者更新时还有可能出现问题。既然如此,为什么还要定义视图呢?这是因为合理使用视图能够带来许多好处。

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

       视图机制使用户可以将注意力集中在所关心的数据上。如果这些数据不是直接来自基本表,则可以通过定义视图使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。例如,那些定义了若干张表连接的视图就将表与表之间的连接操作对用户隐秘起来。换句话说,用户所做的只是对一个虚表的简单查询,而这个虚表是怎样来的,用户无需了解。

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

       视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常重要的。

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

       数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对逻辑独立性则不能完全地支持。

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

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

5)适当利用视图可以更加清晰地表达查询。

你可能感兴趣的:(MySql)