Skip to content

数据库视图

  • 视图本质就是将结果集换存起来
  • 由于结果集是一张虚拟的表,所以视图也一张虚拟的表
  • 由于结果集是建立在表的基础上的,所以视图也是建立在表的基础上的

作用:

  1. 视图可以用来简化SQL语句
  2. 视图可以用来隐藏表的结构
  3. 视图可以用来提升数据安全性

创建视图语法:

sql

create view 视图名称 as select 语句;

获取视图内容:

sql

select * from 视图名称;

视图操作

视图数据操作

  1. 增加内容
sql

insert into 视图名称 values(数据1,数据2);

update 视图名称 set 字段名称 = 字段值 [where 条件];

delete from 视图名称 [where 条件];

注意点:

由于视图保存的是结果集,结果是基于原始表的,所以操作视图中的数据,本质上操作的是原始表中的数据

  1. 修改视图内容

修改视图的字段和条件规则:

sql

alter view 视图名称 as select 语句;

  1. 删除视图
sql

drop view if exists 视图名;

创建视图完整语句

sql

create [algorithm={merge||template||undefined}]
view 视图名称
as select 语句
[with check option];

  • 视图算法:
  1. 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;   

  1. 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 的选项下

  1. 要保证数据update之后也要符合where的条件
  2. 要保证insert之后的数据能被视图查询出来
  3. 对于delete,有无 with check option 都一样
  4. 对于没有where字句的视图,使用with check option 是多余的

注意点:

默认情况下哪怕插入的数据和更新的数据不符合创建视图条件,我们也是可以通过视图来插入和更新的

即不满足select条件的不允许插入和更新视图

  • 更新的限制(不能更新):

聚合函数:

  • DISTINCT 关键字
  • GROUP BY子句
  • HAVING子句
  • UNION运算符
  • FROM子句包含多张表
  • SELECT语句中应用了不可更新的形势图

Released under the MIT License.