视图是一个虚拟表,不存放任何数据。
实现:
MySQL可以使用合并算法和临时表算法来实现视图。
如果视图中包含group by、distinct、任何聚合函数、union、子查询等,只要无法再原表记录和视图记录中建立一一映射的场景中,MySQL都将使用临时表算法实现视图。
合并算法:将视图SQL和查询SQL进行合并,查询结果返回到客户端
临时表算法:将视图SQL进行查询,返回的结果集存放到临时表,再使用查询SQL进行查询,最终返回结果到客户端
查看到底是使用哪种算法:
explain select * from view_name;
如果select_type为 DERIVED 说明视图是采用临时表算法实现的,SIMPLE则为合并算法。
限制:
- 不支持物化视图(指将视图结果数据存放在一个可以查看的表中)
- 不支持在视图中创建索引
- 不会保存视图定义的原始SQL语句
创建视图
create view view_name as
select * from table_name;
修改视图
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]
删除视图
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
可更新视图
定义视图的select语句不能包含以下任何元素:
聚合函数,如:min,max,sum,avg,count等。
DISTINCT子句
GROUP BY子句
HAVING子句
左连接或外连接。
UNION或UNION ALL子句
SELECT子句中的子查询或引用该表的where子句中的子查询出现在FROM子句中。
引用FROM子句中的不可更新视图
仅引用文字值
对基表的任何列的多次引用
update view_name set col = new_value where ...;