免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2007 | 回复: 2
打印 上一主题 下一主题

MySQL 5新特性之视图 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 14:26 |只看该作者 |倒序浏览
本文讲述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 SELECTproduct.name as name, product .price as price, purchase.qty as qty,product .price * purchase.qty as total_value from product, purchasewhere 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)的权限;
(2)
SELECT语句不能包含FROM子句中的子查询;
(3)
SELECT语句不能引用系统或用户变量;
(4)
SELECT语句不能引用预处理语句参数;
(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 SELECTproduct.name as name, product .price as price, product .price *purchase.qty as total_value from product, purchase whereproduct.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的权限。

[ 本帖最后由 gunguymadman 于 2008-8-29 09:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-28 15:43 |只看该作者
沙发~~

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
3 [报告]
发表于 2008-08-28 16:36 |只看该作者
收藏先
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP