文章目录
- 简介
- 创建视图
- 修改视图
- 删除视图
- 总结
- 参考文献
简介
视图,即VIEW,是SQL中的一个重要概念,它其实是一种虚拟表(非实体数据表,本身不存储数据)。
视图类似于编程中的函数,也可以理解成是一个访问数据的接口。
从上图可以看出,视图实际上是一种介于数据表和用户之间的虚拟表。正常情况下,用户本来就可以跟数据表直接交互,那在中间放一个view层,相比有什么好处呢?
我简单介绍一下我的理解:
- 针对开发人员来讲,可以简化每次查询的步骤,对于一些固定化的查询,可以将其保存成视图,下次直接调用视图,而不需要重新书写查询(类似一个查询函数)。
- 权限管理功能(安全性)。可以针对不同的用户,制定不同的查询视图。用户只对部分数据有查看权限,而不可窥全豹。
比如说一张表有用户的身份证信息,我不想对外部人员提供这种敏感字段,但我必须给他提供这张表中的其他信息,比如说用户的性别、年龄等,那我就有两种方式来解决这个问题:
- 新建一个实体表。把原表的身份证字段去掉,剩下数据导入这个新实体表,对外提供新实体表;(缺陷显而易见,空间浪费,同步更新等,优点是查的快)
- 使用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查询的一个封装,实际上就是一个函数,把(可能会多次使用的)复杂的查询提前写成模块,既简化了调用,又方便了查询的复用。同时,嵌套视图这一设计,类似模块化编程,大大提升了查询的可复用。
那接下来还有最重要的一个问题,视图跟临时表相比,有什么优劣?(前面简单介绍了一下)
首先,临时表其实可以分两种,一种是SQL中的临时表,即在一次查询中临时存在的表,查询连接结束后,临时表就会被自动释放;另一种是我们口头意义上的临时表,是可以持久保存的实体表,其实就是新建一张表,然后把数据放进去。
视图胜在可以自动更新啊,如果要手动维护一张实体临时表的话,太麻烦,每次有更新之后还需要手动导进去。
参考文献
- 12丨视图在SQL中的作用是什么,它是怎样工作的?