Appearance
数据库视图
- 视图本质就是将结果集换存起来
- 由于结果集是一张虚拟的表,所以视图也一张虚拟的表
- 由于结果集是建立在表的基础上的,所以视图也是建立在表的基础上的
作用:
- 视图可以用来简化SQL语句
- 视图可以用来隐藏表的结构
- 视图可以用来提升数据安全性
创建视图语法:
sql
create view 视图名称 as select 语句;
获取视图内容:
sql
select * from 视图名称;
视图操作
视图数据操作
- 增加内容
sql
insert into 视图名称 values(数据1,数据2);
update 视图名称 set 字段名称 = 字段值 [where 条件];
delete from 视图名称 [where 条件];
注意点:
由于视图保存的是结果集,结果是基于原始表的,所以操作视图中的数据,本质上操作的是原始表中的数据
- 修改视图内容
修改视图的字段和条件规则:
sql
alter view 视图名称 as select 语句;
- 删除视图
sql
drop view if exists 视图名;
创建视图完整语句
sql
create [algorithm={merge||template||undefined}]
view 视图名称
as select 语句
[with check option];
- 视图算法:
- merge:合并式(替代式)算法
- 将视图的语句和外层的语句合并之后再执行
- 该算法允许更新数据
sql
# 普通语句
select city,name from person;
# 创建视图
create algorithm=merge view person_view as select city,name from person;
# 查询视图
select * from person_view;
# 上面的查询语句通过合并式算法会生成以下的语句
select * from (select city,name from person_view) as t;
- temptable:临时表算法
- 将视图生成一个临时表,再执行外层的语句
- 该算法不允许更新数据
sql
# 普通语句
select city,name from person;
# 创建视图
create algorithm=temptable view person_view as select city,name from person;
# 查询视图
select * from person_view;
# 上面的查询语句通过临时表算法,先查询数据创建一张临时表,再执行查询临时表中的数据
(select city,name from person_view) as t;
select * from t;
3.undefined : 未定义算法
由mysql自己决定使用如上的那种算法,默认就是undefined, 一般情况下会自动选择merge算法
视图限制(with check option)
在with check option 的选项下
- 要保证数据update之后也要符合where的条件
- 要保证insert之后的数据能被视图查询出来
- 对于delete,有无 with check option 都一样
- 对于没有where字句的视图,使用with check option 是多余的
注意点:
默认情况下哪怕插入的数据和更新的数据不符合创建视图条件,我们也是可以通过视图来插入和更新的
即不满足select条件的不允许插入和更新视图
- 更新的限制(不能更新):
聚合函数:
- DISTINCT 关键字
- GROUP BY子句
- HAVING子句
- UNION运算符
- FROM子句包含多张表
- SELECT语句中应用了不可更新的形势图