

# 使用 Athena 视图
<a name="views-console"></a>

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

## 创建视图
<a name="creating-views"></a>

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

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

1. 在 Athena 控制台中，选择 **Tables and views**（表和视图）旁边的 **Create**（创建），然后选择 **Create view**（创建视图）。  
![\[创建视图。\]](http://docs.aws.amazon.com/zh_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.aws.amazon.com/zh_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 视图示例
<a name="views-examples"></a>

要显示视图查询的语法，请使用 [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 视图
<a name="views-managing"></a>

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

**显示视图的操作**

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

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

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

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

## Athena 视图支持的 DDL 操作
<a name="views-supported-actions"></a>

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 视图注意事项和限制
<a name="considerations-limitations-views"></a>

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

## 注意事项
<a name="considerations-views"></a>

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

## 限制
<a name="limitations-views"></a>
+ 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 支持跨账户查询视图，但无法创建包含跨账户 AWS Glue Data Catalog 的视图。有关访问跨账户数据目录的信息，请参阅 [配置 AWS 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)。