视图,即VIEW,是SQL中的一个重要概念,它其实是一种虚拟表(非实体数据表,本身不存储数据)。
视图类似于编程中的函数,也可以理解成是一个访问数据的接口。
从上图可以看出,视图实际上是一种介于数据表和用户之间的虚拟表。正常情况下,用户本来就可以跟数据表直接交互,那在中间放一个view层,相比有什么好处呢?
我简单介绍一下我的理解:
比如说一张表有用户的身份证信息,我不想对外部人员提供这种敏感字段,但我必须给他提供这张表中的其他信息,比如说用户的性别、年龄等,那我就有两种方式来解决这个问题:
以MySQL为例,其创建视图的语法:
create view view_name as
select column_1, column_2,...
from table_name
where condition
可以看到,视图是建立在SQL查询的基础上,封装成了一个视图。
这样就会基于SQL查询的结果集来形成一张虚拟表。但是这个虚拟表并不占用数据存储空间,每次调用视图都是跑一遍查询,将结果集缓存在内存中的过程,所以被称为是虚拟表,视图每次查出来的数据都是新的。
还有比较重要的一点,上面的语法中只用了一张表,只是为了简化演示,实际上view封装的SQL查询跟正常的查询没有区别,你可以join任意多个表来创建一个视图。
当视图创建完之后,就可以直接作为一张表来使用了:
select * from view_name
另外,允许嵌套视图的存在。即可以在视图的基础上基础创建视图。
create view view_name as
select column_1, column_2
from view_name_a
where condition
或者把视图作为子查询的内表都可以。
实际上,在某些情况下,你可以这么写:
delete from view_name where condition
(据说)如果视图是基于单表的,那源table中符合情况的数据,大概率会被删掉;但如果视图中join了多个表,那么这种delete基本不会成功,因为修改会涉及多个实体表。
这个需要注意,不要对视图进行任何update操作!!! 因为有可能会改掉底层数据。
alter view view_name as
select column_1, column_2
from view_name
where condition
可以看到,修改视图的语法跟创建视图完全一样。
我觉得alter内部就是先删除老视图,然后再重新create。。。
提一句SQLite,这个轻量级数据库,并不支持修改视图,即只能使用CREATE和DROP,如果想要修改视图的话,只能先DROP,后重新CREATE。
drop view view_name
视图只是虚拟表,它只是封装了底层数据表的查询接口,因此有些RDBMS不支持对视图创建索引。(有的支持,如新版本的SQL server)。
再次总结下视图的好处:
但是在某些情况下的确是可以通过update视图来改变底层数据的,所以视图的安全性并不绝对
);另外,针对不同用户,提供不同的视图来借此开放不同的数据权限,也是安全性的一个体现;那接下来还有最重要的一个问题,视图跟临时表相比,有什么优劣?(前面简单介绍了一下)
首先,临时表其实可以分两种,一种是SQL中的临时表,即在一次查询中临时存在的表,查询连接结束后,临时表就会被自动释放;另一种是我们口头意义上的临时表,是可以持久保存的实体表,其实就是新建一张表,然后把数据放进去。
视图胜在可以自动更新啊,如果要手动维护一张实体临时表的话,太麻烦,每次有更新之后还需要手动导进去。