??视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。
一、视图
1. 视图概述
??视图中保存的仅仅是一条select语句,其数据源自数据库表或其他视图。视图的作用类似于筛选,且不占用存储空间。
2. 视图工作机制
??当调用视图时才执行视图中的SQL语句,进行数据读取操作。视图中的内容没有存储,而是在视图被引用时才派生数据,即即时引用。这样的好处是不需要维护视图的内容。
二、视图管理
1. 创建视图
??创建视图需要具有CREATE VIEW权限,和查询涉及的列的SELECT权限。
1.1 语法格式
create [algorithm = {undefined | merge | temptable}]
view view_name [(state1, state2...)]
as 查询语句
[with [cascaded | local] check option];
1.2 参数说明
参数 | 说明 |
---|---|
algorithm | undefined表示MySQL自动选择使用的算法;merge表示将使用视图的语句与视图的定义合起来,使视图定义的某部分取代语句的对应部分;temptable表示将视图的结果存入临时表,然后使用临时表执行语句 |
查询语句 | 一个完整的查询语句 |
cascaded、local | cascaded表示更新视图时满足所有相关视图和表的条件,local表示更新视图时满足该视图本身的定义条件即可 |
with check option | 更新视图时保证在该视图的权限范围之内 |
1.3 注意点
- 在定义中引用的表或视图必须存在,但创建视图后可以舍弃定义引用的表或视图。可以使用check table语句检查视图定义引用的表或视图是否存在。
- select语句不能包含from字句中的子查询
- select语句不能引用系统或用户变量
- select语句不能引用预处理语句参数
- 在定义中不能引用temporary表,不能创建temporary视图
2. 删除视图
??删除视图需要具有drop权限。
drop view [if exsts] view_name[, view_name2...] [restrict | cascade];
3. 查看视图
??查看视图需要具有show view权限,查看视图指查看数据库中已经存在的视图的定义。
-- 法一
[describe | desc] view_name;
-- 法二
show table status like ‘view_name‘;
-- 法三
show create view ‘view_name‘;
-- 法四
select * from information_schema.views where table_name=‘view_name‘;
4. 修改视图
??修改视图指修改数据库中已经存在表的定义,当基本表的某些字段发生改变时们可以通过修改视图来保持视图与基本表一致。
[create or replace | alter] [algorithm = {undefined | merge | temptable}] view view_name [{state1, state2...}]
as 查询语句
[with [cascaded | local] check option];
5. 更新视图数据
??对视图的更新其实就是对表的更新,更新视图是指通过视图来插入、更新、删除表中的数据。因为视图是一个虚拟表,没有数据,视图更新都是通过转化到基本表来更新。
5.1 原则:尽量不要更新视图。
5.2 以下情况无法更新视图
- 视图中包含sum、count等聚集函数。
- 视图中包含union、union all、distinct、groud by、having等关键字。
- 常量视图,如:CREATE VIEW view_now AS select now()。
- 视图中包含子查询。
- 由不可更新的视图导出的视图。
- 创建视图时algorithm为temptable类型。
- 视图对应的表上存在没有默认值的列,而该列没有包含在视图里。
- with check option值为1时为local视图,表示更新视图时要满足该视图本身的定义条件才能顺利执行;值为2时为cascaded视图,表示更新视图时要满足所有视图的检查条件的更新语句才能顺利执行。