MySQL高级之视图
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 ;