MySQL视图介绍
MySQL视图介绍
发表于2010年03月07日由崔玉松
一.视图概述
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
视图:查看图形或文档的方式。
视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。
所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。
当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
视图有很多优点,主要表现在:
•视点集中
•简化操作
•定制数据
•合并分割数据
•安全性
当然视图也存在一些缺点,最大的缺点就是视图带来的更新负担,比如源数据改了,那么视图中要做相应更新,视图中数据改了源数据也要做同步,这和MySQL的Cache差不多。
二.创建视图——CREATEVIEW
1.语法
CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEW[db_name.]view_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]通过该语句可以创建视图,若给定了[ORREPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。
2.使用举例
Eg.本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息。
CREATETABLEproduct
(
product_idINTNOTNULL,
nameVARCHAR(50)NOTNULL,
priceDOUBLENOTNULL
);
INSERTINTOproductVALUES(1,‘apple‘,5.5);
CREATETABLEpurchase
(
idINTNOTNULL,
product_idINTNOTNULL,
qtyINTNOTNULLDEFAULT0,
gen_timeDATETIMENOTNULL
);
INSERTINTOpurchaseVALUES(1,1,10,NOW());
CREATEVIEWpurchase_detailASSELECTproduct.nameasname,product.priceasprice,purchase.qtyasqty,product.price*purchase.qtyastotal_valuefromproduct,purchasewhereproduct.product_id=purchase.product_id;
创建成功后,输入:SELECT*FROMpurchase_detail;
运行效果如下:
+——-+——-+—–+————-+
|name|price|qty|total_value|
+——-+——-+—–+————-+
|apple|5.5|10|55|
+——-+——-+—–+————-+
1rowinset(0.01sec)
3.注意事项
创建视图存在如下注意事项:
(1)运行创建视图的语句需要用户具有创建视图(CRATEVIEW)的权限,若加了[ORREPLACE]时,还需要用户具有删除视图(DROPVIEW)的权限;
(2)SELECT语句不能包含FROM子句中的子查询;
(3)SELECT语句不能引用系统或用户变量;
(4)SELECT语句不能引用预处理语句参数;
(5)在存储子程序内,定义不能引用子程序参数或局部变量;
(6)在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECKTABLE语句;
(7)在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;
(8)在视图定义中命名的表必须已存在;
(9)不能将触发程序与视图关联在一起;
(10)在视图定义中允许使用ORDERBY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDERBY的语句,它将被忽略。
三.修改视图——ALTERVIEW
1.语法
ALTER[ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]该语句用于更改已有视图的定义。其语法与CREATEVIEW类似。
2.使用举例
Eg.将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:
ALTERVIEWpurchase_detailASSELECTproduct.nameasname,product.priceasprice,product.price*purchase.qtyastotal_valuefromproduct,purchasewhereproduct.product_id=purchase.product_id;
此时通过语句:select*frompurchase_detail;对视图进行查询时,结果如下:
+——-+——-+————-+
|name|price|total_value|
+——-+——-+————-+
|apple|5.5|55|
+——-+——-+————-+
3.注意事项
修改视图的注意事项除了第一条外跟创建视图的注意事项是一样的。第(1)条应改为:
该语句需要具有针对视图的CREATEVIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。
四.删除视图——DROPVIEW
1.语法
DROPVIEW[IFEXISTS]view_name[,view_name]…[RESTRICT|CASCADE]该语句用户删除视图,可一次删除多个视图。[IFEXISTS]选项确保语句正确运行。若没有该子句,当指定的视图不存在时,将发生错误。
2.使用举例
Eg1.删除在前面的小节中创建的视图purchase_detail:DROPVIEWpurchase_detail;
Eg2.删除一个未知的视图:DROPVIEWIFEXISTStest_view;
Eg3.删除多个视图:DROPVIEWIFEXISTStest_view1,test_view2;
3.注意事项
必须对要删除的一个或多个视图拥有DROPVIEW的权限。
五查看视图
1)mysql>showtablestatuswherecomment='view';
(说明:Mysql5.1支持视图,视图被看作一种抽象表,因此显示视图状态的语句与显示表状态的语句相同,只是在comment列中以‘view’区分)
2)mysql>select*frominformation_schema.tableswheretable_schema='yourDatabaseName'andtable_type='view';
(说明:这种方法通过系统表查找,效果同上,显示信息更详细。如果不能正确显示结果,可能是大小写的问题,Mysql在不同系统平台不同配置参数下的显示结果可能不同,注意这点。)