Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261037
  • 博文数量: 93
  • 博客积分: 3001
  • 博客等级: 中校
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-11 13:20
文章分类

全部博文(93)

文章存档

2011年(1)

2009年(92)

我的朋友

分类: Mysql/postgreSQL

2009-07-11 14:28:12

本文讲述MySql5.x中视图的使用,包括创建视图、修改视图和删除视图的相关知识,包括命令的语法、使用举例以及注意事项。

一.视图概述

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

二.创建视图——CREATE  VIEW

1.语法

CREATE  [OR  REPLACE]  [ALGORITHM  =  {UNDEFINED  |  MERGE  |  TEMPTABLE}]
VIEW  [db_name.]view_name  [(column_list)]
AS  select_statement
[WITH  [CASCADED  |  LOCAL]  CHECK  OPTION]

通过该语句可以创建视图,若给定了[OR  REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。

表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

2.使用举例

Eg.  本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息。

CREATE  TABLE  product

(

product_id  INT  NOT  NULL,

name  VARCHAR(50)  NOT  NULL,

price  DOUBLE  NOT  NULL

);

INSERT  INTO  product  VALUES(1,  'apple  ',  5.5);

CREATE  TABLE  purchase

(

id  INT  NOT  NULL,

product_id  INT  NOT  NULL,

qty  INT  NOT  NULL  DEFAULT  0,

gen_time  DATETIME  NOT  NULL

);

INSERT  INTO  purchase  VALUES(1,  1,  10,  NOW());

CREATE  VIEW  purchase_detail  AS  SELECT  product.name  as  name,  product  .price  as  price,  purchase.qty  as  qty,  product  .price  *  purchase.qty  as  total_value  from  product,  purchase  where  product.product_id  =  purchase.product_id;

创建成功后,输入:SELECT  *  FROM  purchase_detail;

运行效果如下:

+-------+-------+-----+-------------+

|  name  |  price  |  qty  |  total_value  |

+-------+-------+-----+-------------+

|  apple  |      5.5  |  10  |  55  |

+-------+-------+-----+-------------+

1  row  in  set  (0.01  sec)

3.注意事项

创建视图存在如下注意事项:

1运行创建视图的语句需要用户具有创建视图(CRATE  VIEW)的权限,若加了[OR  REPLACE]时,还需要用户具有删除视图(DROP  VIEW)的权限;

2SELECT语句不能包含FROM子句中的子查询;

3SELECT语句不能引用系统或用户变量;

4SELECT语句不能引用预处理语句参数;

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

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

7)在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;

8)在视图定义中命名的表必须已存在;

9)不能将触发程序与视图关联在一起;

10)在视图定义中允许使用ORDER  BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER  BY的语句,它将被忽略。

三.  修改视图——ALTER  VIEW

1.语法

ALTER  [ALGORITHM  =  {UNDEFINED  |  MERGE  |  TEMPTABLE}]
VIEW  view_name  [(column_list)]
AS  select_statement
[WITH  [CASCADED  |  LOCAL]  CHECK  OPTION]

该语句用于更改已有视图的定义。其语法与CREATE  VIEW类似。

2.使用举例

Eg.  将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:

ALTER  VIEW  purchase_detail  AS  SELECT  product.name  as  name,  product  .price  as  price,  product  .price  *  purchase.qty  as  total_value  from  product,  purchase  where  product.product_id  =  purchase.product_id;

此时通过语句:select  *  from  purchase_detail;对视图进行查询时,结果如下:

+-------+-------+-------------+

|  name  |  price  |  total_value  |

+-------+-------+-------------+

|  apple  |      5.5  |      55  |

+-------+-------+-------------+

3.注意事项

修改视图的注意事项除了第一条外跟创建视图的注意事项是一样的。第(1)条应改为:

该语句需要具有针对视图的CREATE  VIEWDROP权限,也需要针对SELECT语句中引用的每一列的某些权限。

四.  删除视图——DROP  VIEW

1.语法

DROP  VIEW  [IF  EXISTS]
view_name  [,  view_name]  ...
[RESTRICT  |  CASCADE]

该语句用户删除视图,可一次删除多个视图。[IF  EXISTS]选项确保语句正确运行。若没有该子句,当指定的视图不存在时,将发生错误。

2.使用举例

Eg1.  删除在前面的小节中创建的视图purchase_detailDROP  VIEW  purchase_detail;

Eg2.  删除一个未知的视图:DROP  VIEW  IF  EXISTS  test_view;

Eg3.  删除多个视图:DROP  VIEW  IF  EXISTS  test_view1,  test_view2;

3.注意事项

必须对要删除的一个或多个视图拥有DROP  VIEW的权限。

 

阅读(1784) | 评论(0) | 转发(0) |
0

上一篇:show 的用法

下一篇:sum函数

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