什么是视图?
视图是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储,所以用户不需要担心视图会充满磁盘空间。
而且,对视图的操作和对普通表的操作一样。
创建视图的例子:
假设我这有一张用户信息表,如下所示
我现在想对用户提供一个用户 id 在 10 以下的包含用户姓名、头像地址、性别这三个属性的视图,那么执行以下语句。
CREATE VIEW person_view(
name,
profile_img,
wechat_id)
AS SELECT name,profile_img,wechat_id
FROM tb_person_info
WHERE user_id < 10;
之后,对这种数据的查询就无需再执行同样的 sql 语句,直接去视图获取数据即可。
为什么要使用视图?
使用视图主要有保证数据安全、简化复杂的SQL操作等优点。下面我们来详细看一下这两个优点。
1. 数据安全
用户只能查询和修改能看到的数据。因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。
2. 简化复杂的 SQL 操作
复杂的连接,比如某查询操作涉及好多表,有很多过滤条件,并且这个操作频繁的发生,那么这个时候就可以为它创建一个视图,以后再执行相同的操作的时候,就直接执行 select * from view 就可以了,这样就不必执行总是重复的执行那么一大串的 sql 操作,减少了很多不必要的开销。
扫描二维码关注公众号,回复:
6680729 查看本文章
视图的缺点
- 性能差:数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
- 修改限制:当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
可更新的视图
MySQL 允许用户在遵守特定规则的前提下通过视图修改数据。
对于 MySQL 来说,如果下面的条件能够满足,那么视图就是可更新的。
- 没有使用聚合函数,比如 MAX()、MIN()、AVG() 等
- 视图没有使用 group by 或者 having 子句
- select 或 from 子句中不存在子查询,并且 where 子句中的任何子查询都不引用 from 子句中的表
- 视图没有使用 union、union all、distinct
- from 子句包括不止一个表或可更新视图
- 如果有不止一个表或视图,那么 from 子句只使用内连接