MYSQL数据库的视图(view)

(2)视图(view

用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。视图是一个虚拟表,其内容由查询定义。

 概述:

ü 视图以经过定制的方式显示来自一个或多个表的数据

ü  视图是一种数据库对象,用户可以象查询普通表一样查询视图。

ü  视图内其实没有存储任何数据,它只是对表的一个查询。

ü  视图的定义保存在数据字典内。创建视图所基于的表为基表

ü  视图一经定义以后,就可以像表一样被查询、修改、删除和更新

作用:精华志京华志毕业设计辅导咨询 [email protected]

 

ü  简化数据查询语句

ü  使用户能从多角度看到同一数据

ü  提高了数据的安全性

ü  提供了一定程度的逻辑独立性

ü  减少带宽流量、优化后还可提高执行效率

优点:

ü  提供了另外一种级别的表安全性

ü  隐藏的数据的复杂性

ü  简化的用户的SQL命令

ü  通过重命名列,从另一个角度提供数据

视图的创建:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

    VIEW view_name [(column_list)]

    AS select_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]

说明:

l  OR REPLACE给定了OR REPLACE子句,语句能够替换已有的同名视图。

l  ALGORITHM可选的mysql算法扩展,算法会影响MySQL处理视图的方式。有以下三个值:

        UNDEFINED--MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

        MERGE--会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

         TEMPTABLE--视图的结果将被置于临时表中,然后使用它执行语句。

l  veiw_name:视图名。

l  column_list要想为视图的列定义明确的名称,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list

l  select_statement:用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制:

1.定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;

2.在定义中引用的表或视图必须存在;

l  WITH [cascaded|local] CHECK OPTION:在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCALCASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADEDWITH CHECK OPTION指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。

l  视图定义服从下述限制:

ü  SELECT语句不能包含FROM子句中的子查询。

ü  SELECT语句不能引用系统或用户变量。

ü  SELECT语句不能引用预处理语句参数。

ü  在存储子程序内,定义不能引用子程序参数或局部变量。

ü  在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。

ü  在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。

ü  在视图定义中命名的表必须已存在。

ü  不能将触发程序与视图关联在一起。

修改视图:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

    VIEW view_name [(column_list)]

    AS select_statement

    [WITH [CASCADED | LOCAL] CHECK OPTION]

说明:

该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。该语句需要具有针对视图的CREATE VIEWDROP权限,也需要针对SELECT语句中引用的每一列的某些权限。

 

查看视图:精华志京华志毕业设计辅导咨询 [email protected]

 

SHOW CREATE VIEW view_name

说明:

该语句给出了1个创建给定视图的CREATE VIEW语句。

 

删除视图:

DROP VIEW [IF EXISTS]

    view_name [, view_name] ...

[RESTRICT | CASCADE]

说明:

l  DROP VIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限。

l  可以使用关键字IF EXISTS来防止因不存在的视图而出错。

l  如果给定了RESTRICTCASCADE,将解析并忽略它们。

更新视图:

概述:

  视图的使用与表一样,有增删改查四种操作,且语法也与表相同。

  在视图上也可以使用修改数据的DML语句,如INSERTUPDATEDELETE可以统称为通过视图更新数据

  通过视图更新数据有如下限制:

ü  一次只能修改一个底层的基表

ü  如果修改违反了基表的约束条件,则无法更新视图

ü  如果视图中的列不是表中的原始列(如创建视图时使用了连接操作符、聚合函数等),则不能通过视图更新。

视图更新操作:

  可更新的视图:要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSETUPDATEDELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。如果视图包含下述结构中的任何一种,那么它就是不可更新的:

ü  聚合函数;

ü  DISTINCT关键字;

ü  GROUP BY子句;

ü  ORDER BY子句;

ü  HAVING子句;

ü  UNION运算符;

ü  位于选择列表中的子查询;

ü  FROM子句中包含多个表;

ü  SELECT语句中引用了不可更新视图;

  插入数据:使用INSERT语句通过视图向基本表插入数据

spacer.gif

注意:

ü  当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。

ü  INSERT语句还有一个限制:SELECT语句中必须包含FROM子句中指定表的所有不能为空的列。

  修改数据:使用UPDATE语句可以通过视图修改基本表的数据

注意:若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。

 

  删除数据:使用DELETE语句可以通过视图删除基本表的数据

注意:对依赖于多个基本表的视图,不能使用DELETE语句。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章