视图的作用:
■视图可以让查询变得很清楚:
如果您要找的数据存放在三张关系表里面,查看数据的时候,你就要写个联合查询了。换种方法,我把联合查询的数据放到视图里面,这样查询起来是不是更方便呢?
■保护数据库的重要数据,给不同的人看不同的数据:
假如您让别人帮您开发一套系统,但是你又想把真正表的暴露出来,这个时候视图是不是最好的选择呢?
视图的类型:
mysql的视图有三种类型:MERGE、TEMPTABLE、UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
1,MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
2,TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
3,UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
二、创建、删除视图:
创建视图基本语法:
代码如下 | 复制代码 |
CREATE VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] |
如下:
代码如下 | 复制代码 |
mysql> CREATE VIEW sc AS SELECT s.Name,c.Cname FROM students AS s RIGHT JOIN courses AS c ON s.CID1=c.CID; Query OK, 0 rows affected (0.07 sec) mysql> SHOW TABLES; mysql> SELECT * FROM sc; |
删除视图基本语法:
代码如下 | 复制代码 |
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE] |
如下:
代码如下 | 复制代码 |
mysql> DROP VIEW IF EXISTS sc; Query OK, 0 rows affected (0.01 sec) |
查看视图创建过程:
代码如下 | 复制代码 |
mysql> SHOW CREATE VIEW scG *************************** 1. row *************************** View: sc Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `sc` AS select `s`.`Name` AS `Name`,`c`.`Cname` AS `Cname` from (`courses` `c` left join `students` `s` on((`s`.`CID1` = `c`.`CID`))) character_set_client: utf8 collation_connection: utf8_general_ci 1 row in set (0.00 sec) |
三、在MySQL中使用视图的注意事项:
(1) 运行创建视图的语句需要用户具有创建视图(crate view)的权限,若加了[or replace]时,还需要用户具有删除视图(drop view)的权限;
(2) select语句不能包含from子句中的子查询;
(3) select语句不能引用系统或用户变量;
(4) select语句不能引用预处理语句参数;
(5) 在存储子程序内,定义不能引用子程序参数或局部变量;
(6)在定义中引用的表或视图必须存在。但是,创建了MySQL视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用check table语句;
(7) 在定义中不能引用temporary表,不能创建temporary视图;
(8) 在视图定义中命名的表必须已存在;
(9) 不能将触发程序与视图关联在一起;
(10) 在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。
(11)MySQL视图不支持雾化(即将视图保持为实际的数据),也不能创建索引,因此效率较低!