MySQL的视图讲解

1、什么是视图

视图是从一个或多个表中查询出来的数据保存为视图,是一种虚拟存在的表。

注意:

数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。

2、为什么要使用视图

重复利用SQL语句

简化SQL查询,快速取数据

只用知道表的部分结构

保护数据,根据特定授权(分配用户一定权限,安全性)

更改数据格式,视图可返回与底层表的格式不同的数据表,展现出来。

3、视图与表的区别:

  • 表要占用磁盘空间,视图不需要
  • 视图不能添加索引
  • 使用视图可以简化查询
  • 视图可以提高安全性

4 .创建视图

CREATE VIEW语法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
 VIEW view_name [(column_list)]
 AS select_statement
 [WITH [CASCADED | LOCAL] CHECK OPTION]

解释::

  1. OR REPLACE: 替换重复视图名(可选)
  2. ALGORITHM:可选的ALGORITHM子句是对标准SQL的MySQL扩展

可取三个值:MERGETEMPTABLEUNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

明确选择TEMPTABLE的1个原因在于,创建临时表之后、并在完成语句处理之前,能够释放基表上的锁定。与MERGE算法相比,锁定释放的速度更快,这样,使用视图的其他客户端不会被屏蔽过长时间。

3.view_name :视图名

4.select_statement :

select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。

该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限

视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name。

mysql> CREATE VIEW test.v AS SELECT * FROM t;

表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。

column_list

视图必须具有唯一的列名,不得有重复,默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的ID。column_list中的名称数目必须等于SELECT语句检索的列数。

SELECT语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。

对于SELECT语句中不合格的表或视图,将根据默认的数据库进行解释。通过用恰当的数据库名称限定表或视图名,视图能够引用表或其他数据库中的视图。

能够使用多种SELECT语句创建视图。视图能够引用基表或其他视图。它能使用联合、UNION和子查询。SELECT甚至不需引用任何表。

例子说明:

 /*创建一个视图,名字userview */
 CREATE VIEW userview
AS
 SELECT * FROM a WHERE id=1;
MySQL的视图讲解

OR REPLACE:表示替换已有的视图名称

/*通过 OR REPLACE来替换重名的视图*/
 
CREATE OR REPLACE VIEW userview
 AS
 SELECT * FROM a WHERE NAME="华为";
MySQL的视图讲解

algorithm algorithm可取三个值:merge、temptable或undefined。如果没有algorithm子句,默认算法是undefined(未定义的)。算法会影响MySQL处理视图的方式。

MERGE

ALGORITHM=MERGE 不会建立临时表,而只是把条件和视图条件合并保存起来,直接去查基表,建临时表相比之下开销较大。默认的情况下,则更倾向于使用merge。

如果不指定algorithm,则更倾向于使用merge。
 /*指定算法的视图ALGORITHM=MERGE */
 
 CREATE ALGORITHM=MERGE VIEW view_merge 
 AS
 SELECT * FROM a WHERE NAME ="华为";
MySQL的视图讲解

2 .TEMPTABLE

ALGORITHM=TEMPTABLE 适合于较复杂的视图,

比如有聚合函数的视图等,这种是无法合并条件去基表查询的,

需要生成一张临时表

 /*指定算法的视图。 
 查询姓名为"华为" 的address的平均值
 */
 
 CREATE ALGORITHM=TEMPTABLE VIEW view_merge 
 AS
 SELECT AVG(address) FROM a WHERE NAME ="华为";
MySQL的视图讲解

s

 [WITH [CASCADED | LOCAL] CHECK OPTION]

对于可更新视图,可给定WITH CHECK OPTION子句来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为“真”。

在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。请考虑下述表和视图集合的定义:

 /*创建一张表*/
CREATE TABLE t1 (a INT); 
MySQL的视图讲解

 /*创建一个条件a<2的V1视图*/
 CREATE VIEW v1 
 AS 
 SELECT * FROM t1 WHERE a < 2
 WITH CHECK OPTION;
MySQL的视图讲解

/*根据view_a视图创建v2视图*/
 CREATE VIEW v2 
 AS 
 SELECT * FROM v1 WHERE a > 0
 
 WITH LOCAL CHECK OPTION;
MySQL的视图讲解

 /*根据view_a视图创建v3视图*/
 CREATE VIEW v3 
 AS 
 SELECT * FROM v1 WHERE a > 0
 
 WITH CASCADED CHECK OPTION;
MySQL的视图讲解

这里,视图v2和v3是根据另一视图v1定义的。v2具有LOCAL检查选项,因此,仅会针对v2检查对插入项进行测试。v3具有CASCADED检查选项,因此,不仅会针对它自己的检查对插入项进行测试,也会针对基本视图的检查对插入项进行测试。在下面的语句中,介绍了这些差异:

 /*在视图v2中插入数据a=1*/
 INSERT INTO v2 VALUES(1);
MySQL的视图讲解

 /*在视图v2中插入数据a=2*/
 INSERT INTO v3 VALUES(2);
MySQL的视图讲解

视图的可更新性受到v1视图条件的限制


修改视图

ALTER VIEW语法

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
 VIEW view_name [(column_list)]
 AS select_statement
 [WITH [CASCADED | LOCAL] CHECK OPTION]

该语句用于更改已有视图的定义。其语法与CREATE VIEW类似。该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。

修改视图前

MySQL的视图讲解

修改视图后

 /*修改视图*/
 ALTER VIEW view_a
 AS SELECT id,NAME
 FROM a ;
MySQL的视图讲解

a

删除视图

语法:

DROP VIEW [IF EXISTS]
 view_name [, view_name] ...
 [RESTRICT | CASCADE]

DROP VIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限。

可以使用关键字IF EXISTS来防止因不存在的视图而出错。给定了该子句时,将为每个不存在的视图生成NOTE。如果给定了RESTRICT和CASCADE,将解析并忽略它们

 /*删除视图view_b和view_c*/
 DROP VIEW view_b,view_c
MySQL的视图讲解

查看视图;

查看视图可以当表的查看

 /*查看视图*/
 SELECT * FROM view_a;
MySQL的视图讲解

注意::

视图定义服从下述限制:

· SELECT语句不能包含FROM子句中的子查询。

· SELECT语句不能引用系统或用户变量。

· SELECT语句不能引用预处理语句参数。

· 在存储子程序内,定义不能引用子程序参数或局部变量。

· 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。

· 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。

· 在视图定义中命名的表必须已存在。

· 不能将触发程序与视图关联在一起。

在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。


分享到:


相關文章: