MySQL高级之视图

MySQL高级之视图

  • 1 视图概述
  • 2 创建或者修改视图
  • 3 查看视图
  • 4 删除视图

1 视图概述

视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图相对于普通的表的优势主要包括以下几项。

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  • 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

2 创建或者修改视图

创建视图的语法为:

CREATE [OR REPLACE] # 创建或者修改
   [ALGORITHM = {MERGE  | TEMPTABLE | UNDEFINED}] #创建视图是的算法 (默认为UNDEFINED)
VIEW view_name [(column_list)] # 视图名称
AS
[SELECT  statement] # 查询语句

创建视图的算法

  • 使用MERGE算法,mysql首先将输入查询与定义视图的select语句组合成单个查询。 然后mysql执行组合查询返回结果集。 如果select语句包含集合函数(如min,max,sum,count,avg等)或distinct,group by,havaing,limit,union,union all,子查询,则不允许使用MERGE算法。 如果select语句无引用表,则也不允许使用MERGE算法。 如果不允许MERGE算法,mysql将算法更改为UNDEFINED。我们要注意,将视图定义中的输入查询和查询组合成一个查询称为视图分辨率。
  • 使用TEMPTABLE算法,mysql首先根据定义视图的SELECT语句创建一个临时表,然后针对该临时表执行输入查询。因为mysql必须创建临时表来存储结果集并将数据从基表移动到临时表,所以TEMPTABLE算法的效率比MERGE算法效率低。 另外,使用TEMPTABLE算法的视图是不可更新的。
  • 当我们创建视图而不指定显式算法时,UNDEFINED是默认算法。 UNDEFINED算法使mysql可以选择使用MERGE或TEMPTABLE算法。mysql优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。

SELECT语句

  • SELECT语句可以在where 语句中包含子查询,但FROM子句中的不能包含子查询。
  • SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
  • SELECT语句不能引用准备语句的参数。

修改视图的语法为:

ALTER 
 [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] #创建视图是的算法 (默认为UNDEFINED)
VIEW view_name [(column_list)] # 要修改的视图名称 
AS select_statement  # 
[WITH [CASCADED | LOCAL] CHECK OPTION]
  • WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条件。
  • LOCAL : 只要满足本视图的条件就可以更新。
  • CASCADED : 必须满足所有针对该视图的所有视图的条件才可以更新。 默认值. 12345

修改视图的语句和创建视图的语句完全一样。当视图存在时,修改语句对视图进行修改;当视图不存在时,创建视图。

3 查看视图

从 MySQL 5.1 版本开始,使用 SHOW TABLES 命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的 SHOW VIEWS 命令。

show tables;

同样,在使用 SHOW TABLE STATUS 命令的时候,不但可以显示表的信息,同时也可以显示视图的信息。

SHOW TABLE STATUS;

4 删除视图

语法 :

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

示例 , 删除视图city_country_view :

DROP VIEW city_country_view ; 

你可能感兴趣的:(mysql,视图,mysql)