MySQL中的视图详解
视图是MySQL 5.0中增加的三大新功能之一(另外两个是存储过程与触发器),也是一般稍微“高级”一点的数据库所必需要有的功能。MySQL在定义视图上没什么限制,基本上所有的查询都可定义为视图,并且也支持可更新视图(当然只有在视图和行列与基础表的行列之间存在一一对应关系时才能更新),因此从功能上说MySQL的视图功能已经很完善了。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
一、为什么要使用视图
1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。
2.查询性能提高。
3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的
4.复杂的查询需求。可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
视图的工作机制:当调用视图的时候,才会执行视图中的sql,进行取数据操作。视图的内容没有存储,而是在视图被引用的时候才派生出数据。这样不会占用空间,由于是即时引用,视图的内容总是与真实表的内容是一致的。
视图这样设计有什么好处?节省空间,内容是总是一致的话,那么我们不需要维护视图的内容,维护好真实表的内容,就可以保证视图的完整性了。
二、创建视图注意事项
创建视图存在如下注意事项:
(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的语句,它将被忽略。
视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并 不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时 动态生成的。
视图相对于矜通的表的优势主要包括以下几项。
简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件, 对用户来说已经是过滤好的复合条件的结果集。
安
全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能 限制到某个行某个列,但是通过视图就可以简单地实现。
数据独立:一旦视图的结构确定了就可以屏蔽表结构变化对用户的影响,源表增加 列对视图没有影响;源表修改列名,则可以通过修改视
图来解决,不会造成对访问 者的影响。
11.2
视图操作
视图的操作包括创建或者修改视图、刪除视图,以及査看视图定义-11.2.1创建或者修改视图
创建视图需要有CREATE VIEW的权限,并且对于查询涉及的列有SELECT权限。
如果使用CREATE OR REPLACE或者ALTER修改视图,那么还需要该视图的DROP 权限。
创建视阁的语法为:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view一name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
修改视阁的语法为:
ALTER [ALGORITHM ^ {UNDEFINED | MERGE j TEMPTABLE}]
V工EW view一name [(coiumn_list)]
AS select__statement
MySQL视图的定义有一些限制,例如,在FROM关键字后面不能包含子査询,这和其 他数据库足不同的,如果视图是从其他数据库迁移过来的,那么可能需要因此做一些改动, 可以将子查询的内容先定义成一个视图,然后对该视图再创建视图就可以实现类似的功能了。 视图的可更新性和视图中查询的定义有关系,以下类型的视图是不可更新的。
包含以下关键字的SQL语句:聚合函数(SUM、MIN、MAX、COUNT等)、 DISTINCT、GROUP BY、HAVING、UNION 或者 UNION ALL。 s> 常量视图。
SELECT中包含子查询。
JION0
FROM —个不能更新的视图。
WHERE字句的子查询引用了 FROM字句中的表。
例如,以下的视图都是不可更新的:
--包含聚合函数
mysql> create or replace view payment一sum as
-> select staff_idf sum(amount) from payment group by staff一id;
Query OK, 0 rows affected (0.00 sec)
—常量视图
'-select中位含子査询
mysql> create view city_view as
-> select (select city from city where city一id = 1);
Query OK, 0 rows affected {0.00 sec)
WITH [CASCADED | LOCAL] CHECK OPTION决定了是否允许更新数据使记录不再满 足视图的条件。这个选项与Oracle数据库中的选项是类似
的,其中:
LOCAL是只要满足本视图的条件就可以更新;
11.2视图操作
J CASCADED则是必须满足所有针对该视图的所有视图的条件才可以更新。
如果没有明确是LOCAL还是CASCADED,则默认是CASCADED。
例如,对payment表创建两层视图,并进行更新操作:
raysql> create or replace view payinent_view as -> select payment_id,amount from payment -> where amount < 10 WITH CHECK
OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> create or replace view paymerst_viewl as
_> select paymen^id, amount from payment_view ◊where amount > 5 WITH LOCAL CHECK OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> create or replace view payment_view2 as
-> select payment一id,amount from payment_view -> where amount > 5 WITH CASCADED CHECK OPTION;
Query OK# 0 rows affected (0.00 sec)
mysql> select * from payment_viewl limit 1;
mysql> update payment_viewl set amount=10 -> where payment_id = 3;
从测试结果可以看出,payment_viewl楚WITH LOCAL CHECK OPTION的,所以只要 满足本视图的条件就可以更新,但是payment_view2是WITH CASCADED CHECK OPTION的,必须满足针对该视图的所有视图才可以更新,因为更新后记录不再满足payment_view的 条件,所以更新操作提示错误退出。
11.2.2删除视图
用户可以一次删除一个或者多个视图,前提是必须有该视图的DROP权限。
DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]
例如,删除Staffjist视图:
mysql> drop view staff_list;
Query OK, 0 rows affected (0.00 sec)
11.2.3查看视图
从MySQL 5.1版本开始,使用SHOW TABLES命令的时候不仅显示表的名字,同时也 会显示视图的名字,而不存在单独显示视图的SHOW VIEWS
命令。
同样,在使用SHOW TABLE STATUS命令的时候,不但可以显示表的信息,同时也可 以显示视图的信息。所以,可以通过下面的命令显示视图
的信息:
SHOW TABLE STATUS [FROM dbname] [LIKE 'pattern']
下面演示的是査看staffjist视图信息的操作:
mysql> show table status like 1staff_listr \G
Name: staff—list Engine: NULL Version: NULL Row_format: NOLL Rows: NULL
Avg_row_length: NULL Data_length: NULL Max_data_length: NULL Index一length: NULL Data_free: NULL Auto_increment: NULL
Create time: NULL
Update_time: NULL Check_time: NULL Collation: NULL Checksum: NULL Create_options: NULL Comment: VIEW
1 row in set (0.01 sec)
如果需要査洵某个视图的定义,可以使用SHOW CREATE VIEW命令进行杳看:最后,通过查看系统表information_schema.views也可以也#视图的相关信息:
浙公网安备 33010602011771号