Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2878056
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Mysql/postgreSQL

2012-03-19 15:39:21

1、视图的含义
    视图是一种虚拟的表。视图从数据库中的一个或多个表导出来的表。视图还可以从已经存在的视图的基础上定义。数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
    视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。
 
2、视图的作用
 
 4.复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。

3、创建视图
MySQL中,创建视图是通过SQL语句CREATE VIEW实现的。其语法形式如下:

  1. CREATE [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE } ]
  2. VIEW 视图名 [ ( 属性清单 ) ]
  3. AS SELECT语句
  4. [ 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视图。

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

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


4、修改视图
MySQL中,CREATE OR REPLACE VIEW语句可以用来修改视图。该语句的使用非常灵活。在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。CREATE OR REPLACE VIEW语句的语法形式如下:

  1. CREATE OR REPLACE [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE } ]
  2. VIEW 视图名 [ ( 属性清单 ) ]
  3. AS SELECT语句
  4. [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ;

  1. ALTER [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE } ]
  2. VIEW 视图名 [ ( 属性清单 ) ]
  3. AS SELECT语句
  4. [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ;
5、更新视图

更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为是视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
 
6、删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL中,使用DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。本节将详细讲解删除视图的方法。
对需要删除的视图,使用DROP VIEW语句进行删除。基本形式如下:

  1. DROP VIEW [ IF EXISTS] 视图名列表 [ RESTRICT | CASCADE]

7、查看视图

MySQL中,SHOW CREATE VIEW语句可以查看视图的详细定义。其语法形式如下:

  1. SHOW CREATE VIEW 视图名

 
 
阅读(519) | 评论(2) | 转发(0) |
0

上一篇:mysql索引 创建删除

下一篇:视图SQL语句

给主人留下些什么吧!~~

nba76ers2013-11-23 13:36:55

视图是虚表,是从一个或几个基本表(或视图)中导出的表,在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。

nba76ers2012-03-19 16:58:30

ALGORITHM有三个参数分别是:merge、TEMPTABLE、UNDEFINED

看mysql手册中提到,替换与具体化的方式的各自适用之处,可以这样理解:
因为临时表中的数据不可更新。所以,如果使用参数是TEMPTABLE,无法进行更新。
当你的参数定义是UNDEFINED(没有定义ALGORITHM参数)。mysql更倾向于选择合并方式。是因为它更加有效。

换方式理解,视图名直接使用视图的公式替换掉了。针对上面视图teams,mysql会使用该视图的公式进行替换,视图公式合并到了select中。结果就是变成了如下sql语句:
select * from (SELECT  DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result)。
也就是最后提交给mysql处理该sql语句。

具体化方式理解,mysql先得到了视图执行的结果,该结果形成一个中间结果暂时存在内存中。之