MySQL数据库视图

一、什么是视图 1、视图是存放数据的一个接口,也可以说是虚拟表,这些数据可以是从一个或几个基表(视图)的数据,也可是用户自己定义的数据,其实视图里面不存放数据,数据据还是存在基表里面,基表数据发生变化,视图里的数据也随之变量,视图里数据变化,基表也会变化。 2、视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 3、对其中所引用的基础表来说,MySQL视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。 4、视图是存储在数据库中的查询的sql 语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。   二、视图的作用 1. 视图可以让查询变得很清楚(复杂的SQL语句变得很简单)有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的。 2.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。   三、创建视图 create [or replace] [algorithm={merge|temptable|undefined}] view view_name [(column_list)] as select_statement [with [cascaded|local] check option] 例子: 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; alter [or replace] [algorithm={merge|temptable|undefined}] view view_name [(column_list)] as select_statement [with [cascaded|local] check option] 视图有三种类型 Merge: 会将引用视图的语句的文本与视图定义结合起来,使用得视图定义的某一部分取代语句的对应部分 Temptable:临时表 undefined : Megre algorithm=merge with local check option [local]只要满足本视图的条件就可以更新 with cascaded check option [cascaded]则是必须满足所有针对视图的条件,才可以更新 创建视图存在如下注意事项: (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 语法 ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] 该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。   六、删除视图DROP VIEW 1、语法 DROP VIEW [IF EXISTS] view_name [, view_name] … [RESTRICT | CASCADE] 语句用户删除视图,可一次删除多个视图。[IF EXISTS]选项确保语句正确运行。若没有该子句,当指定的视图不存在时,将发生错误。 2、使用举例 Eg1. 删除在前面的小节中创建的视图purchase_detail:DROP VIEW purchase_detail; Eg2. 删除一个未知的视图:DROP VIEW IF EXISTS test_view; Eg3. 删除多个视图:DROP VIEW IF EXISTS test_view1, test_view2; 3. 注意事项 必须对要删除的一个或多个视图拥有DROP VIEW的权限。   七、查看视图 1、mysql> show table status where comment='view'; (说明:Mysql5.1支持视图,视图被看作一种抽象表,因此显示视图状态的语句与显示表状态的语句相同,只是在comment列中以‘view’区分) 2、mysql> select * from information_schema.tables where table_schema='yourDatabaseName' and table_type='view'; (说明:这种方法通过系统表查找,效果同上,显示信息更详细。如果不能正确显示结果,可能是大小写的问题,Mysql在不同系统平台不同配置参数下的显示结果可能不同,注意这点。)      
posted @ 2012-04-26 18:38  gxldan  阅读(285)  评论(0编辑  收藏  举报