1. 什么是视图
1.虚拟存在的表
2.对使用视图的用户来说透明的,带来的好处 简单、安全、数据独立
2. 视图的操作
2.1 创建修改视图
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`c` AS `c` from `t1` where (`t1`.`c` < 4) WITH CASCADED CHECK OPTION
select_statement 提供视图定义的select语句,可以从其他基表和视图查询
视图在创建时就已经定义好,不会受视图依赖的表影响。依赖表添加的列,视图查询结果不会出现新的列,删除了列,会导致视图中的对应列找不到,报错。
2.1.1.ALGORITHM
ALGORITHM 视图处理算法,视图本身的属性。
ALGORITHM三个值: MERGE,TEMPTABLE或 UNDEFINED
MERGE: 服务器将视图SQL和查询SQL进行合并,然后基于底层表查询,返回结果给客户端。
TEMPTABLE: 视图的结果检索到临时表(虚拟的),然后在执行查询SQL。
UNDEFINED: 视图尽可能的选择MERGE算法而不是TEMPTABLE算法。应为MERGE算法更高效,而且临时表被使用时视图不能够被更新。
显示指定TEMPTABLE算法的一个原因是在创建临时表之后以及在用于完成处理语句之前,可以在基础表上释放锁。这会导致比MERGE算法更快的锁释放,因此使用该视图的其他客户端不会被锁定。
算法被认为是UNDEFINED有3中情况,1是没有指定ALGORITHM , 2是显示指定ALGORITHM =UNDEFINED ,3是ALGORITHM = MERGE 但是视图只能用TEMPTABLE算法处理,此时MYSQL会生成警告并把算法设置为UNDEFINED
如果视图包含GROUP BY 、DISTANCT、任何聚合函数、UNION、子查询等,只要无法再原表和视图记录中建立意义映射的场景,MYSQL都使用临时表算法来实现视图。
如果想确定MYSQL到底使用哪种算法,可以EXPLAIN 查询语句。临时表算法查询结果select_type出现DERIVED
2.1.2. 可更新和可插入的视图
包含以下选项视图不可跟新:
包含聚合函数、DISTINCT、GROUP BY、HAVING、UNION、UNION ALL
select_statement 包含子查询 (select (select ....))
包含常量列的视图(只局限于视图中的非常量列进行update)
ALGORITHM = TEMPTABLE 视图
FROM一个不能更新的视图
没有更新的基表
对基表的列多次引用(可以update、delete, 不能insert)
join 外连接不可更新,内连接 视连接的表(视图)情况而定
包含下列选项才是可插入视图:
可更新
对基表没有进行列的多次引用
视图必须包含基表中没有默认值的所有列
视图列必须是简单的列引用。它们不能是表达式
MYSQL不支持视图上建任何触发器
2.1.3. WITH CHECK OPTION Clause
MYSQL 5.7.6之前
With LOCAL 要检查视图where子句 不检查依赖的视图
With CASCADED 要检查视图where子句 还要检查依赖视图
With no check option 不检查视图where子句 也不检查依赖视图
之后With LOCAL 要检查视图where子句 还要检查依赖的视图
With CASCADED 要检查视图where子句 还要检查依赖视图
With no check option 不检查视图where子句 但要检查依赖视图
查看MYSQL版本select version() from dual;
2.3. 删除修改视图
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE] 包含 IF EXISTS 不报错误, 不包含如果视图不存在 报错 RESTRICT | CASCADE 解析并被忽略 ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
作者:1833322237
链接:https://www.jianshu.com/p/3f0e58f3ab00