龙空技术网

MySQL的视图讲解

凌晨三点半的代码 724

前言:

而今同学们对“mysql删除视图某一行”都比较着重,大家都想要知道一些“mysql删除视图某一行”的相关内容。那么小编也在网摘上搜集了一些关于“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]

解释::

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

可取三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有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 userviewAS SELECT * FROM a WHERE id=1;

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

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

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 ="华为";
2 .TEMPTABLE

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

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

需要生成一张临时表

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

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); 
 /*创建一个条件a<2的V1视图*/ CREATE VIEW v1  AS  SELECT * FROM t1 WHERE a < 2 WITH CHECK OPTION;
/*根据view_a视图创建v2视图*/ CREATE VIEW v2  AS  SELECT * FROM v1 WHERE a > 0  WITH LOCAL CHECK OPTION;
 /*根据view_a视图创建v3视图*/ CREATE VIEW v3  AS  SELECT * FROM v1 WHERE a > 0  WITH CASCADED CHECK OPTION;

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

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

视图的可更新性受到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语句中引用的每一列的某些权限。

修改视图前

修改视图后

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

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
查看视图;

查看视图可以当表的查看

 /*查看视图*/ SELECT * FROM view_a;
注意::

视图定义服从下述限制:

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

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

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

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

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

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

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

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

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

标签: #mysql删除视图某一行