视图 
=======================



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

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



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

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

* 通过限制对表的一组预定行或列的访问，提供额外级别的表安全性。

  

* 隐藏数据复杂性。

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




<!-- -->

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

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




<!-- -->

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

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




视图的特征 
--------------

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

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

视图中的数据操作 
-----------------

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

如何在视图中访问数据 
-------------------

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

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

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

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

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




<!-- -->

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

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




<!-- -->

3. 执行 SQL 语句。

   




可更新的 Join Views 
------------------------

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

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

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