视图是一个或多个表的逻辑表示形式。本质上,视图是存储的查询。

视图从其所基于的表中导出其数据,称为基表。基表可以是表或其他视图。在视图上执行的所有操作实际上都会影响基表。您可以在大多数使用表的地方使用视图。

注意 物化视图使用不同于标准视图的数据结构。

视图使您能够为不同类型的用户定制数据的呈现方式。 视图通常用于:

  • 通过限制对表的一组预定行或列的访问,提供额外级别的表安全性。
  • 隐藏数据复杂性。

例如,可以使用 join 定义单个视图。join 是多个表中的相关列或行的集合。但是,视图隐藏了这样一个事实,即此信息实际上源于几个表。查询可能还会使用表信息执行大量计算。因此,用户无需知道如何执行 join 或计算,也可以查询视图。

  • 以与基表不同的视角呈现数据。

例如,可以重命名视图的列,而不影响视图所基于的表。

  • 将应用程序与基表定义中的更改隔离开来。

例如,如果视图的定义查询引用了四列表中的三列,此时向表中添加了第五列,视图的定义不会受影响。并且使用该视图的所有应用程序也不受影响。

视图的特征

与表不同,视图不分配存储空间,视图也不包含数据。 相反,视图是由从视图引用的基表中提取或导出数据的查询定义的。 因为视图基于其他对象,所以对于在数据字典中定义视图的查询,它不需要存储以外的存储。

视图对其引用的对象具有依赖关系,这些对象由数据库自动处理。例如,如果删除并重新创建视图的基表,则数据库将确定视图定义是否可以接受新的基表。

视图中的数据操作

因为视图是从表派生的,所以它们有许多相似之处。用户可以查询视图,也可以对视图执行 DML 操作。对视图执行的操作会影响视图的某个基表中的数据,并受基表的完整性约束和触发器的约束。

如何在视图中访问数据

OceanBase 数据库将视图定义作为定义视图的查询文本存储在数据字典中。

在 SQL 语句中引用视图时,OceanBase 数据库将执行以下任务:

  1. 将针对视图的查询 (只要可能) 与定义视图和任何基础视图的查询合并。

OceanBase 数据库优化合并查询,就像您在不引用视图的情况下发出查询一样。因此,OceanBase 数据库可以对任何被引用基表列使用索引,无论这些列是在视图定义中引用的,还是在针对视图的用户查询中引用的。

有时 OceanBase 数据库无法将视图定义与用户查询合并。在这种情况下,OceanBase 数据库可能不会对被引用的列上使用所有索引。

  1. 解析 merged 语句中的共享 SQL 区。

OceanBase 数据库解析在新的共享 SQL 区域中引用视图的语句仅如果没有现有的共享 SQL 区域包含类似语句。 因此,视图提供了减少与共享 SQL 关联的内存使用的好处。

  1. 执行 SQL 语句。

可更新的 Join Views

Join Views 在 FROM 子句中包含多个表或视图。

一个可更新的 join view,也称为可修改的 join view,涉及两个或多个基表或视图,并允许 DML 操作。 一个可更新的视图在 SELECT 语句的顶级 FROM 子句中包含多个表,并且不受限于 WITH READ ONLY 子句。

要实现可更新,视图必须满足多个条件。例如,其中一条通用规则就是对于 join view 的 INSERT、UPDATE 或 DELETE 操作一次只能修改一个基表。