目录

1 定义

2 视图创建、查询、删除及更新

2.1 视图创建

2.2 视图查询

2.3 视图删除

2.4 试图更新

3 视图的优缺点

3.1 优点

3.2 缺点


1 定义

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放试图对应的数据。

2 视图创建、查询、删除及更新

2.1 视图创建

create view <视图名> [视图的所有列名]
as <子查询>
[with check option]; #[]可选的,<>必须项
例如:在两张表之间建立视图
create view user
as 
select uid,phone_number,user_name,gender,age from user_basic natural join user_detailed;

最后的with check option是数据库在对试图进行数据修改时要符合创建视图时的条件。
例如:
create view sex
as 
select uid,phone_number,user_name,age from user_basic natural join user_detailed
where user_detailed.gender = 0;#0代表女,1代表男

这时在后续向sex中增加数据时,会自动将gender置为0.

视图的列名要么全写(会自动与子查询的结果列一一匹配),要么全不写。但一下三种情况必须全写:
①某个目标列不是单纯的列名,而是聚集函数或列表达式。
②多表连接时选出几个同名列字段作为视图的字段。
③需要启用新的名字。
建议全写,清晰可见,方便后期的查询维护。

2.2 视图查询

视图查询并不是先执行视图的查询,再在视图查询结果上去执行自己的查询;而是将视图的定义取出来与用户的查询结合起来,之后去查询基本表。(视图消解)

查询语句与对基本表相同。

2.3 视图删除

drop view <视图名> [cascade];
#cascade为可选项,添加时会删除从自己(该视图)上导出的视图,以及视图上的视图。
#不添加时,如果视图上还有视图的定义,则会拒绝执行。

2.4 试图更新

会转化为对基本表的更新,有些字段不可更新。例如:

①字段是由聚集函数导出的,此时无法更新。比如说是平均值,最大值,总数。

②视图的子查询中含 distinct 短语。数据库可能存在多个该数据的行,无法判断用户的真实意义。

③视图中含有 group by 短语。同上。

④字段是表达式或常数。

3 视图的优缺点

3.1 优点

①视图能简化用户的操作。

②视图使用户能以多种角度看待同一数据。

③视图对重构数据库提供了一定的逻辑独立性。程序员不需要去修改以前的代码,只需要在重构的数据库上建立同样的视图即可。

④视图能对机密数据提供安全保护。可以对不同的用户种类进行不同的授权。或者是定义不同的试图争对各种用户。

3.2 缺点

①修改的限制。更新视图时,可能建立视图和修改视图的并不是同一个小组的,无法确切的理解视图中的字段是如何形成的,这可能导致sql语句的错误执行。

②可能的性能差异。视图的查询会转化成对基本表的查询。即使非常简单的查询,对于复杂的视图也会去对视图的定义中的条件去结合而变成一条非常复杂的sql语句。