

# 使用视图


在 Amazon Athena 中，视图是逻辑表，而非物理表。每次在查询中引用视图时，定义该视图的查询都会运行。您可以从 `SELECT` 查询创建视图，然后在未来的查询中引用该视图。

您可以在 Athena 中使用两种不同的视图：Athena 视图和 Amazon Glue Data Catalog 视图。

## 何时使用 Athena 视图？


您可能希望创建 Athena 视图以达到以下目的：
+ **查询数据子集**：例如，您可以根据原始表创建一个包含列子集的视图，以简化查询数据。
+ **合并表**：您可以使用视图将多个表合并为一个查询。如果您有多个表，希望使用 `UNION ALL` 将它们组合起来，可以创建一个视图，利用表达式简化针对组合表的查询。
+ **隐藏复杂性**：使用视图隐藏现有基本查询的复杂性和简化用户运行的查询。基本查询通常包括表之间的联接、列列表中的表达式和其他 SQL 语法，这使理解和调试查询变得困难。您可以创建一个能够隐藏复杂性和简化查询的视图。
+ **优化查询**：您可以使用视图来试验优化技术，以创建优化的查询。例如，如果您发现某种 `WHERE` 条件、`JOIN` 命令或其他表达式的组合能带来最佳性能，则可以使用这些子句和表达式创建一个视图。应用程序然后可以针对此视图执行相对简单的查询。如果后来您又发现更好的优化原始查询的办法，则当您重新创建视图时，所有应用程序会立即利用优化的基本查询。
+ **隐藏底层名称**：您可以使用视图隐藏底层表和列名称，并最大程度减少维护问题（如果这些名称改变）。如果名称发生变化，只需使用新名称重新创建视图即可。使用该视图而非表的查询直接保持运行，无需更改。

  有关更多信息，请参阅 [使用 Athena 视图](views-console.md)。

## 何时使用 Amazon Glue Data Catalog 视图？


当您想跨 Amazon Web Services 服务（例如 Amazon Athena 和 Amazon Redshift）使用单一通用视图时，请使用 Amazon Glue Data Catalog 视图。在 Data Catalog 视图中，访问权限由创建视图的用户（而不是查询视图的用户）定义。这种授权方法称为*定义程序*语义。

以下使用案例展示如何使用 Data Catalog 视图。
+ **优化访问控制** – 您可以创建视图，根据用户所需的权限级别来限制数据访问。例如，您可以使用 Data Catalog 视图来防止非人力资源（HR）部门的员工查看个人身份信息。
+ **确保记录完整** – 通过对 Data Catalog 视图应用某些筛选器，您可以确保 Data Catalog 视图中的数据记录始终完整。
+ **增强安全性** – 在 Data Catalog 视图中，用于创建视图的查询定义必须完好无损，才能创建视图。这样的话，Data Catalog 视图不易受到恶意行为者的 SQL 命令的影响。
+ **防止访问基础表** – 定义程序语义允许用户访问视图，而无需向他们提供基础表。只有定义视图的用户才需要访问表。

Data Catalog 视图定义存储于 Amazon Glue Data Catalog。这意味着，您可以使用 Amazon Lake Formation 通过资源授权、列授权或基于标签的访问控制来授予访问权限。有关在 Lake Formation 中授予和撤消访问权限的更多信息，请参阅《Amazon Lake Formation Developer Guide》**中的 [Granting and revoking permissions on Data Catalog resources](https://docs.amazonaws.cn/lake-formation/latest/dg/granting-catalog-permissions.html)。

有关更多信息，请参阅 [在 Athena 中使用 Data Catalog 视图](views-glue.md)。

# 使用 Athena 视图
Athena 视图

可在 Athena 控制台中轻松创建、更新和管理 Athena 视图。

## 创建视图


您可以通过使用模板或运行现有查询以在 Athena 控制台中创建视图。

**使用模板创建视图**

1. 在 Athena 控制台中，选择 **Tables and views**（表和视图）旁边的 **Create**（创建），然后选择 **Create view**（创建视图）。  
![\[创建视图。\]](http://docs.amazonaws.cn/athena/latest/ug/images/create-view.png)

   此操作会将可编辑的视图模板放入查询编辑器中。

1. 根据您的要求编辑视图模板。在语句中输入视图的名称时，请记住，视图名称不能包含除下划线 (`(_)`) 以外的特殊字符。请参阅[命名数据库、表和列](tables-databases-columns-names.md)。避免使用[转义查询中的保留关键字](reserved-words.md)来命名视图。

   有关创建视图的更多信息，请参阅 [CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) 和 [Athena 视图示例](views-examples.md)。

1. 选择 **Run**（运行）以创建视图。该视图将显示在 Athena 控制台中的视图列表中。

**通过现有查询创建视图**

1. 使用 Athena 查询编辑器运行现有查询。

1. 在查询编辑器窗口下，选择 **Create**（创建），然后选择 **View from query**（通过查询查看）。  
![\[选择 Create（创建），View from query（通过查询查看）。\]](http://docs.amazonaws.cn/athena/latest/ug/images/create-view-from-query.png)

1. 在 **Create View**（创建视图）对话框中，输入视图名称并选择 **Create**（创建）。视图名称不能包含除下划线 `(_)` 以外的特殊字符。请参阅[命名数据库、表和列](tables-databases-columns-names.md)。避免使用[转义查询中的保留关键字](reserved-words.md)来命名视图。

   Athena 将视图添加到控制台的视图列表中，并显示查询编辑器中视图的 `CREATE VIEW` 语句。

**备注**
+ 如果删除了作为其他表的依据的表，并且尝试运行该视图，Athena 将显示一条错误消息。
+ 可以创建一个嵌套视图，即在现有视图之上的视图。Athena 可防止您运行引用自身的递归视图。

# Athena 视图示例
示例

要显示视图查询的语法，请使用 [SHOW CREATE VIEW](show-create-view.md)。

**Example 示例 1**  
请考虑以下两个表：表 `employees`，具有两列，分别是 `id` 和 `name`，以及表 `salaries`，也具有两列，分别是 `id` 和 `salary`。  
在本示例中，我们创建名为 `name_salary` 的视图作为 `SELECT` 查询，该查询将获得一个 ID 列表，这些 ID 映射到来自表 `employees` 和 `salaries` 的薪水：  

```
CREATE VIEW name_salary AS
SELECT
 employees.name, 
 salaries.salary 
FROM employees, salaries 
WHERE employees.id = salaries.id
```

**Example 示例 2**  
在以下示例中，我们创建一个名为 `view1` 的视图，以使您能够隐藏较复杂的查询语法。  
该视图运行在两个表，即 `table1` 和 `table2` 上，其中每个表都是不同的 `SELECT` 查询。该视图选择来自 `table1` 的列并将结果与 `table2` 联接。联接基于在两个表中都存在的列 `a`。  

```
CREATE VIEW view1 AS
WITH
  table1 AS (
         SELECT a, 
         MAX(b) AS the_max 
         FROM x 
         GROUP BY a
         ),
  table2 AS (
         SELECT a, 
         AVG(d) AS the_avg 
         FROM y 
         GROUP BY a)
SELECT table1.a, table1.the_max, table2.the_avg
FROM table1
JOIN table2 
ON table1.a = table2.a;
```

有关查询联合视图的信息，请参阅 [查询联合视图](running-federated-queries.md#running-federated-queries-federated-views)。

# 管理 Athena 视图


在 Athena 控制台中，您可以：
+ 在列出表的左窗格中找到所有视图。
+ 筛选视图。
+ 预览视图、显示其属性、编辑或删除视图。

**显示视图的操作**

只有创建了视图后，该视图才会出现在控制台中。

1. 在 Athena 控制台中，选择 **Views**（视图），然后选择一个视图，展开它并显示视图中的列。

1. 选择视图旁边的三个竖直的点，以显示视图的操作列表。  
![\[视图的操作菜单。\]](http://docs.amazonaws.cn/athena/latest/ug/images/view-options.png)

1. 选择操作以预览视图、将视图名称插入查询编辑器、删除视图、查看视图属性，或在查询编辑器中显示并编辑视图。

## Athena 视图支持的 DDL 操作


Athena 支持下列视图管理操作。


| 语句 | 说明 | 
| --- | --- | 
| [CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) |  从指定的 `SELECT` 查询创建新视图。有关更多信息，请参阅 [创建视图](views-console.md#creating-views)。 可选的 `OR REPLACE` 子句允许您通过替换来更新现有视图。  | 
| [DESCRIBE VIEW](describe-view.md) |  显示命名视图的列列表。这能让您检查复杂视图的属性。  | 
| [DROP VIEW](drop-view.md) |  删除现有视图。如果该视图不存在，可选 `IF EXISTS` 子句将抑制错误出现。  | 
| [SHOW CREATE VIEW](show-create-view.md) |  显示创建指定视图的 SQL 语句。  | 
| [SHOW VIEWS](show-views.md) |  列出指定数据库或当前数据库（如果省略数据库的名称）中的视图。将可选 `LIKE` 子句与一个正则表达式结合使用来限制视图名称列表。您还可以在控制台的左窗格中看到视图列表。  | 
| [SHOW COLUMNS](show-columns.md) |  列出视图的架构中的列。  | 

# Athena 视图注意事项和限制
注意事项和限制

Athena 视图具有以下注意事项和限制。

## 注意事项


以下注意事项适用于在 Athena 中创建和使用视图：
+ 在 Athena 中，您可以预览和使用在 Athena 控制台、Amazon Glue Data Catalog 中或通过运行于连接到同一目录的 Amazon EMR 集群上的 Presto 创建的视图。
+ 如果您已在 Data Catalog 中创建了 Athena 视图，则数据目录会将视图视为表。您可以使用在 Data Catalog 中表级精细访问控制来[限制对这些视图的访问](fine-grained-access-to-glue-resources.md)。
+  Athena 可防止您运行递归视图，如有运行，则会显示错误消息。递归视图是引用自身的视图查询。
+ Athena 在检测到过时视图时会显示错误消息。发生以下一种情况时，会报告过时的视图：
  + 视图引用了不存在的表或数据库。
  + 在引用的表中进行了架构或元数据更改。
  + 删除了引用的表并使用不同的架构或配置重新创建。
+ 您可以创建并运行嵌套视图，只要嵌套视图背后的查询有效以及表和数据库存在。

## 限制

+ Athena 视图名称不能包含下划线 `(_)` 之外的特殊字符。有关更多信息，请参阅 [命名数据库、表和列](tables-databases-columns-names.md)。
+ 避免使用保留关键字来命名视图。如果使用保留关键字，请在视图查询中使用双引号将保留关键字括起来。请参阅[转义查询中的保留关键字](reserved-words.md)。
+ 您不能将 Athena 中创建的视图与外部 Hive 元存储或 UDF 结合使用。有关使用在 Hive 外部创建的视图的信息，请参阅 [使用 Hive 视图](hive-views.md)。
+ 您不能将视图与地理空间函数结合使用。
+ 您无法使用视图管理 Amazon S3 中数据的访问控制。要查询视图，您需要相应权限才能访问存储在 Amazon S3 中的数据。有关更多信息，请参阅 [控制从 Athena 对 Amazon S3 的访问](s3-permissions.md)。
+ 虽然 Athena 引擎版本 3 支持跨账户查询视图，但无法创建包含跨账户 Amazon Glue Data Catalog 的视图。有关访问跨账户数据目录的信息，请参阅 [配置 Amazon Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。
+ Athena 视图不支持 Hive 或 Iceberg 隐藏的元数据列 `$bucket`、`$file_modified_time`、`$file_size` 和 `$partition`。有关在 Athena 中使用 `$path` 元数据列的信息，请参阅 [获取 Amazon S3 中源数据的文件位置](select.md#select-path)。

# 在 Athena 中使用 Data Catalog 视图
Glue Data Catalog 视图

在 Amazon Athena 中创建 Data Catalog 视图需要特殊的 `CREATE VIEW` 语句。查询它们将使用传统的 SQL `SELECT` 语法。Data Catalog 视图也称为*多方言*视图或 MDV。

## 创建 Data Catalog 视图


要在 Athena 中创建 Data Catalog 视图，请使用以下语法。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS athena-sql-statement
```

**注意**  
`SHOW VIEW JSON` 选项仅适用于 Data Catalog 视图，不适用于 Athena 视图。使用 `SHOW VIEW JSON` 选项执行“空运行”，以验证输入，如果验证成功，则返回将代表视图的 Amazon Glue 表对象的 JSON。实际视图未创建。如果未指定 `SHOW VIEW JSON` 选项，则会进行验证，并在 Data Catalo 中照常创建视图。

以下示例展示 `Definer` 角色的用户如何创建 `orders_by_date` Data Catalog 视图。该示例假设 `Definer` 角色对 `default` 数据库中的 `orders` 表具有完全 `SELECT` 权限。

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

有关语法信息，请参阅[CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view)。

## 查询 Data Catalog 视图


视图创建后，`Lake Formation` 管理员可以向 `Invoker` 主体授予对 Data Catalog 视图的 `SELECT` 权限。然后，`Invoker` 主体无需访问视图所引用的基础基表，即可查询视图。以下是 `Invoker` 查询示例。

```
SELECT * from orders_by_date where price > 5000
```

## 注意事项和限制


以下大多数 Data Catalog 视图限制特定于 Athena。有关同样适用于其他服务的 Data Catalog 视图的其他限制，请参阅 Lake Formation 文档。
+ Data Catalog 视图不能引用其他视图、数据库资源链接或表资源链接。
+ 在视图定义中，您最多可以引用 10 个表。
+ 在 Lake Formation 中，表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果有，则会出现错误“多方言视图只能引用没有 IAMAllowedPrincipals 权限的表”。
+ 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果该表未按此方式注册，则会出现错误“多方言视图只能引用 Lake Formation 托管表”。有关如何在 Lake Formation 中注册 Amazon S3 位置的信息，请参阅*Amazon Lake Formation开发者指南*中的[注册 Amazon S3 位置](https://docs.amazonaws.cn/lake-formation/latest/dg/register-location.html)。
+ Amazon Glue[GetTables](https://docs.amazonaws.cn/glue/latest/webapi/API_GetTables.html) 和 [SearchTables](https://docs.amazonaws.cn/glue/latest/webapi/API_SearchTables.html) API 调用不会更新 `IsRegisteredWithLakeFormation` 参数。要查看参数的正确值，请使用 Amazon Glue [GetTable](https://docs.amazonaws.cn/glue/latest/webapi/API_GetTable.html) API。有关更多信息，请参阅*Amazon Lake Formation开发者指南*中的 [GetTables 和 SearchTables API 不会更新 IsRegisteredWithLakeFormation 参数的值](https://docs.amazonaws.cn/lake-formation/latest/dg/limitations.html#issue-GetTables-value)。
+ `DEFINER` 主体只能是 IAM 角色。
+ `DEFINER` 角色必须对基础表具有完全的 `SELECT`（可授予）权限。
+ 不支持 `UNPROTECTED` Data Catalog 视图。
+ 视图定义中不支持用户定义的函数（UDF）。
+ Athena 联合数据来源不能用于 Data Catalog 视图。
+ 外部 Hive 元存储不支持 Data Catalog 视图。
+ Athena 在检测到过时视图时会显示错误消息。发生以下一种情况时，会报告过时的视图：
  + 视图引用了不存在的表或数据库。
  + 在引用的表中进行了架构或元数据更改。
  + 删除了引用的表并使用不同的架构或配置重新创建。

## 权限


Data Catalog 视图需要三个角色：`Lake Formation Admin`、`Definer` 和 `Invoker`。
+ **`Lake Formation Admin`** – 有权配置所有 Lake Formation 权限。
+ **`Definer`** – 创建 Data Catalog 视图。`Definer` 角色必须对视图定义引用的所有基础表具有完全的可授予 `SELECT` 权限。
+ **`Invoker`** – 可以查询 Data Catalog 视图或检查其元数据。若要显示查询的调用者，可以使用 `invoker_principal()` DML 函数。有关更多信息，请参阅 [invoker\$1principal()](functions-env3.md#functions-env3-invoker-principal)。

`Definer` 角色的信任关系必须允许 Amazon Glue 和 Lake Formation 服务主体采取 `sts:AssumeRole` 操作。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[创建视图的先决条件](https://docs.amazonaws.cn/lake-formation/latest/dg/working-with-views.html#views-prereqs)。

还需要针对 Athena 访问的 IAM 权限。有关更多信息，请参阅 [Amazon Athena 的 Amazon 托管策略](security-iam-awsmanpol.md)。

# 管理 Data Catalog 视图


您可以使用 DDL 命令来更新和管理您的 Data Catalog 视图。

## 更新 Data Catalog 视图


`Lake Formation` 管理员或定义者可以使用 `ALTER VIEW UPDATE DIALECT` 语法来更新视图定义。以下示例修改视图定义，从 `returns` 表（而不是 `orders` 表）中选择列。

```
ALTER VIEW orders_by_date UPDATE DIALECT
AS
SELECT return_date, sum(totalprice) AS price
FROM returns
WHERE order_city = 'SEATTLE'
GROUP BY orderdate
```

## Amazon Glue Data Catalog 视图支持的 DDL 操作


Athena 支持 Amazon Glue Data Catalog 视图的下列操作。


| 语句 | 说明 | 
| --- | --- | 
| [ALTER VIEW DIALECT](alter-view-dialect.md) |  可以通过添加引擎方言，或者更新或删除现有的引擎方言来更新 Data Catalog 视图。  | 
| [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view) |  从指定的 `SELECT` 查询创建 Data Catalog 视图。有关更多信息，请参阅 [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view)。 可选的 `OR REPLACE` 子句允许您通过替换来更新现有视图。  | 
| [DESCRIBE VIEW](describe-view.md) |  显示命名视图的列列表。这能让您检查复杂视图的属性。  | 
| [DROP VIEW](drop-view.md) |  删除现有视图。如果该视图不存在，可选 `IF EXISTS` 子句将抑制错误出现。  | 
| [SHOW CREATE VIEW](show-create-view.md) |  显示创建指定视图的 SQL 语句。  | 
| [SHOW VIEWS](show-views.md) |  列出指定数据库或当前数据库（如果省略数据库的名称）中的视图。将可选 `LIKE` 子句与一个正则表达式结合使用来限制视图名称列表。您还可以在控制台的左窗格中看到视图列表。  | 
| [SHOW COLUMNS](show-columns.md) |  列出视图的架构中的列。  | 