

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用檢視
<a name="views"></a>

Amazon Athena 中的檢視是邏輯資料表，而非實體資料表。每次在查詢中參考檢視時，定義該檢視的查詢就會執行。您可以從 `SELECT` 查詢建立檢視，然後在未來的查詢中參考此檢視。

在 Athena 中，您可以使用兩種不同類型的檢視：Athena 檢視和 AWS Glue Data Catalog 檢視。

## 何時使用 Athena 檢視？
<a name="when-to-use-views"></a>

您建立 Athena 檢視可能是為了：
+ **查詢資料子集** – 例如，您可以從原始資料表建立包含資料欄子集的檢視，以簡化查詢資料。
+ **合併資料表** – 您可以使用檢視將多個資料表合併到一個查詢。當您有多個資料表，且想要使用 `UNION ALL` 合併它們時，您可以使用該表達式建立檢視，以簡化查詢已合併的資料表。
+ **隱藏複雜性** – 使用檢視以隱藏現有基礎查詢的複雜性並簡化使用者執行的查詢。基礎查詢通常包含資料表之間的聯結、欄清單中的表達式，以及其他 SQL 語法，導致難以了解和除錯。您可以建立檢視以隱藏複雜性並簡化查詢。
+ **最佳化查詢** – 您可以使用檢視來試驗最佳化技術，進而建立最佳化查詢。例如，如果您發現有一組 `WHERE` 條件、`JOIN` 順序或其他表達式可展現最佳效能，您可以使用這些子句和表達式來建立檢視。然後，應用程式可以對此檢視執行相當簡單的查詢。如果您後來發現有更好的方式可最佳化原始查詢，當您重新建立檢視時，所有應用程式就可立即利用最佳化基礎查詢。
+ **隱藏基礎名稱** – 您可以使用檢視來隱藏基礎資料表和資料欄名稱，並將維護問題減到最少 (如果這些名稱變更)。如果名稱發生變更，您可以直接使用新的名稱重新建立檢視。直接使用檢視 (而不是資料表) 的查詢可繼續執行，而不需要變更。

  如需詳細資訊，請參閱[使用 Athena 檢視](views-console.md)。

## 何時使用 AWS Glue Data Catalog 檢視？
<a name="when-to-use-views-gdc"></a>

當您想要跨 Amazon Athena 和 Amazon Redshift AWS 服務 的單一通用 AWS Glue Data Catalog 檢視時，請使用檢視。在 Data Catalog 檢視中，存取許可由建立檢視的使用者定義，而不是由查詢檢視的使用者定義。授予許可的這種方法被稱為*定義程式*語義。

下列使用案例顯示如何使用 Data Catalog 檢視。
+ **更大的存取權** – 您建立的檢視會根據使用者需要的許可層級，來限制資料存取權。例如，您可使用 Data Catalog 檢視，來阻止不在人力資源 (HR) 部門工作的員工查看可識別的個人身分資訊。
+ **確保完整記錄** – 透過將某些篩選條件套用至 Data Catalog 檢視，您可確保 Data Catalog 檢視中的資料記錄一律是完整的。
+ **增強的安全性** – 在 Data Catalog 檢視中，建立檢視的查詢定義必須完整，才能建立檢視。這使得 Data Catalog 檢視不易受到惡意執行者的 SQL 命令的影響。
+ **防止存取基礎資料表** – 定義程式語意可讓使用者存取檢視，而無需讓基礎資料表可供其使用。只有定義檢視的使用者才需要存取該資料表。

Data Catalog 檢視定義存放在 AWS Glue Data Catalog中。這意味著您可使用 AWS Lake Formation ，以透過資源授權、資料欄授權或以標籤為基礎的存取控制來授予存取權。如需有關在 Lake Formation 中授予和撤銷存取權的詳細資訊，請參閱《AWS Lake Formation 開發人員指南》**中的[授與和撤銷存取 Data Catalog 資源的許可](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

如需詳細資訊，請參閱[在 Athena 中使用 Data Catalog 檢視](views-glue.md)。

# 使用 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_tw/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_tw/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`。  
在這個範例中，我們以 `SELECT` 查詢建立名為 `name_salary` 的檢視，從資料表 `employees` 和 `salaries` 取得映射到 salaries 的 ID 清單：  

```
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_tw/athena/latest/ug/images/view-options.png)

1. 選擇動作可預覽檢視、將檢視名稱插入查詢編輯器中、刪除檢視、查看檢視的屬性，或在查詢編輯器中顯示和編輯檢視。

## 對 Athena 檢視支援的 DDL 動作
<a name="views-supported-actions"></a>

Athena 對檢視支援下列管理動作。


| 陳述式 | Description | 
| --- | --- | 
| [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。
+ 如果您已在資料目錄中建立 Athena 檢視，則資料目錄會將檢視視為資料表。您可以在資料目錄中使用資料表層級的精細存取控制，對這些檢視[限制存取](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)。

# 在 Athena 中使用 Data Catalog 檢視
<a name="views-glue"></a>

在 Amazon Athena 中建立 Data Catalog 檢視需要特殊的 `CREATE VIEW` 陳述式。進行查詢則使用傳統的 SQL `SELECT` 語法。Data Catalog 檢視也稱為*多方言*檢視或 MDV。

## 建立 Data Catalog 檢視
<a name="views-glue-creating-a-data-catalog-view"></a>

若要在 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` 選項會執行可驗證輸入的「試轉」，如果驗證成功，則會傳回將表示檢視的 AWS Glue 資料表物件的 JSON。此舉不會建立實際檢視。如果未指定 `SHOW VIEW JSON` 選項，則會完成驗證，並在 Data Catalog 中如常建立檢視。

下列範例顯示具有 `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 檢視
<a name="views-glue-querying-a-data-catalog-view"></a>

建立檢視之後，`Lake Formation` 管理員可將 Data Catalog 檢視的 `SELECT` 許可授予 `Invoker` 主體。然後，`Invoker` 主體可查詢檢視，而無需存取檢視參考的基礎基本資料表。以下是範例 `Invoker` 查詢。

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

## 考量和限制
<a name="views-glue-limitations"></a>

下列大多數 Data Catalog 檢視限制專用於 Athena。如需 Data Catalog 檢視 (還適用於其他服務) 的其他限制，請參閱 Lake Formation 文件。
+ Data Catalog 檢視無法參考其他檢視、資料庫資源連結或資料表資源連結。
+ 檢視定義中可參考最多 10 個資料表。
+ 資料表不得具有 Lake Formation 中的 `IAMAllowedPrincipals` 資料湖許可。如果存在，則錯誤多方言檢視只能參考沒有 IAMAllowedPrincipals 許可的資料表。
+ 資料表的 Amazon S3 位置必須註冊為 Lake Formation 資料湖位置。如果資料表並未如此註冊，則會發生錯誤多方言檢視只能參考 Lake Formation 受管資料表。如需有關如何在 Lake Formation 中註冊 Amazon S3 位置的資訊，請參閱《AWS Lake Formation 開發人員指南**》中的[註冊 Amazon S3 位置](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)。
+  AWS Glue [GetTables](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTables.html) 和 [SearchTables](https://docs.aws.amazon.com/glue/latest/webapi/API_SearchTables.html) API 呼叫不會更新 `IsRegisteredWithLakeFormation` 參數。若要檢視 參數的正確值，請使用 AWS Glue [GetTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetTable.html) API。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南**》中的 [GetTables 和 SearchTables API 不會更新 IsRegisteredWithLakeFormation 參數的值](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html#issue-GetTables-value)。
+ `DEFINER` 主體只能是 IAM 角色。
+ `DEFINER` 角色必須具有基礎資料表的完整 `SELECT` (可授予) 許可。
+ `UNPROTECTED` Data Catalog 檢視不受支援。
+ 檢視定義中不支援使用者定義函數 (UDF)。
+ Athena 聯合資料來源無法用於 Data Catalog 檢視。
+ 外部 Hive 中繼儲存不支援 Data Catalog 檢視。
+ Athena 會在偵測到過時的檢視時顯示錯誤訊息。當發生下列其中一種情況時，便會報告過時的檢視：
  + 檢視參考資料表或資料庫不存在。
  + 在參考的資料表中進行了結構描述或中繼資料變更。
  + 參考的資料表遭捨棄，並使用不同的結構描述或組態重新建立。

## 許可
<a name="views-glue-permissions"></a>

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` 角色的信任關係必須允許 AWS Glue 和 Lake Formation 服務主體`sts:AssumeRole`的動作。如需詳細資訊，請參閱《AWS Lake Formation 開發人員指南**》中的[建立檢視的先決條件](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html#views-prereqs)。

還需要 Athena 進行存取的 IAM 許可。如需詳細資訊，請參閱[AWS Amazon Athena 的 受管政策](security-iam-awsmanpol.md)。

# 管理 Data Catalog 檢視
<a name="views-glue-managing"></a>

您可以使用 DDL 命令來更新和管理 Data Catalog 檢視。

## 更新 Data Catalog 檢視
<a name="views-glue-updating-a-data-catalog-view"></a>

`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
```

## AWS Glue Data Catalog 檢視支援的 DDL 動作
<a name="views-glue-supported-actions"></a>

Athena 支援下列 AWS Glue Data Catalog 檢視動作。


| 陳述式 | Description | 
| --- | --- | 
| [變更檢視方言](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) |  列出檢視的結構描述中的欄。  | 