

# ビューを使用する
<a name="views"></a>

Amazon Athena のビューは、物理的なテーブルではなく、論理的なテーブルです。ビューを定義するクエリは、1 つのクエリでビューが参照されるたびに実行されます。`SELECT` クエリからビューを作成でき、今後のクエリでこのビューを参照できます。

Athena では、Athena ビューと AWS Glue Data Catalog ビューという 2 種類のビューを使用できます。

## Athena ビューを使用すべき場合
<a name="when-to-use-views"></a>

Athena ビューを作成すると、次のようなことが可能になります: 
+ **データのサブセットをクエリする** – 例えば、元のテーブルの列のサブセットを含むビューを作成して、データのクエリを簡素化できます。
+ **テーブルを組み合わせる** – ビューを使用して、複数のテーブルを組み合わせて 1 つのクエリにすることができます。複数のテーブルを持ち、それらを `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 のサービス 全体で 1 つの共通ビューが必要な場合は AWS Glue Data Catalog ビューを使用します。データカタログビューでは、アクセス許可はビューをクエリするユーザーではなく、ビューを作成したユーザーによって定義されます。この権限の付与方法は、definer セマンティクスと呼ばれます。

以下のユースケースは、データカタログビューの使用例です。
+ **アクセスコントロールの強化** — ユーザーが必要とするアクセス許可のレベルに基づいてデータアクセスを制限するビューを作成します。例えば、データカタログビューを使用して、人事 (HR) 部門に属さない従業員が個人を特定できる情報を表示できないようにすることができます。
+ **完全なレコードを確保** — データカタログビューに特定のフィルターを適用することで、データカタログビューのデータレコードを常に完全な状態にすることができます。
+ **セキュリティの強化** — データカタログビューでビューを作成するには、ビューを作成するクエリ定義をそのまま維持する必要があります。これにより、データカタログビューは悪意のある行為者からの SQL コマンドの影響を受けにくくなります。
+ **基礎となるテーブルへのアクセスを防ぐ** — Definer セマンティクスにより、ユーザーは基礎となるテーブルを利用できるようにしなくてもビューにアクセスすることができます。ビューを定義したユーザーのみがテーブルにアクセスする必要があります。

データカタログビュー定義は 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 でデータカタログビューを使用する](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/ja_jp/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/ja_jp/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**  
次の 2 つのテーブルを考えてみます。2 つの列 (`employees` と `id`) がある `name` テーブルと 2 つの列 (`salaries` と `id`) がある `salary` テーブルです。  
この例では、`name_salary` という名前のビューを `SELECT` テーブル および `employees` テーブルから給料にマッピングされた ID のリストを取得する `salaries` クエリとして作成します。  

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

**Example 例 2**  
次の例では、`view1` という名前のビューを作成して、複合型のクエリ構文を非表示にします。  
このビューは 2 つのテーブル (`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. ビューの横にある 3 つの縦のドットを選択して、ビューのアクションのリストを表示します。  
![\[ビューのアクションメニュー。\]](http://docs.aws.amazon.com/ja_jp/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 で作成されたビューをプレビューして使用できます。
+ データカタログで Athena ビューを作成した場合、データカタログはビューをテーブルとして扱います。データカタログでテーブルレベルのきめ細かなアクセスコントロールを使用して、これらのビューへの[アクセスを制限](fine-grained-access-to-glue-resources.md)できます。
+  Athena は再帰的なビューの実行を妨げ、そのような場合にはエラーメッセージを表示します。再帰的なビューとは、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)」を参照してください。
+ Hive または Iceberg の非表示メタデータ列 `$bucket`、`$file_modified_time`、`$file_size`、および `$partition` は Athena のビューでサポートされていません。Athena の `$path`メタデータ列の使用方法については「[Amazon S3 内にあるソースデータのファイルの場所の取得](select.md#select-path)」を参照してください。

# Athena でデータカタログビューを使用する
<a name="views-glue"></a>

Amazon Athena でデータカタログビューを作成するには、特別な `CREATE VIEW` ステートメントが必要です。それらのデータカタログビューのクエリでは、従来の SQL `SELECT` 構文を使用します。データカタログビューは、*マルチダイアレクト*ビュー、または MDV とも呼ばれます。

## データカタログビューを作成する
<a name="views-glue-creating-a-data-catalog-view"></a>

Athena でデータカタログビューを作成するには、次の構文を使用します。

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

**注記**  
`SHOW VIEW JSON` オプションはデータカタログビューにのみ適用され、Athena ビューには適用されません。`SHOW VIEW JSON` オプションを使用すると、入力を検証する「ドライラン」が実行され、検証が成功すると、ビューを表す AWS Glue テーブルオブジェクトの JSON が返されます。実際のビューは作成されません。`SHOW VIEW JSON` オプションを指定しない場合、検証が完了し、ビューはデータカタログに通常どおり作成されます。

次の例は、`Definer` ロールのユーザーが `orders_by_date` データカタログビューを作成する方法を示しています。この例では、`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)」を参照してください。

## データカタログビューをクエリする
<a name="views-glue-querying-a-data-catalog-view"></a>

ビューが作成されると、`Lake Formation` 管理者は、データカタログビューに対する `Invoker` 許可を `SELECT` プリンシパルに付与できます。その後、`Invoker` プリンシパルは、ビューが参照する基になるベーステーブルにアクセスしなくてもビューをクエリできます。以下は `Invoker` クエリの例です。

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

## 考慮事項と制限事項
<a name="views-glue-limitations"></a>

次に示すデータカタログビューの制限の大部分は、Athena に固有のものです。他のサービスにも適用されるデータカタログビューの他の制限については、Lake Formation ドキュメントを参照してください。
+ データカタログビューは、他のビュー、データベースリソースリンク、テーブルリソースリンクのいずれも参照できません。
+ ビュー定義では最大 10 個のテーブルを参照できます。
+ Lake Formation のテーブルには `IAMAllowedPrincipals` データレイクのアクセス許可を付与してはいけません。付与されている場合は、Multi Dialect views may only reference tables without IAMAllowedPrincipals permissions というエラーが表示されます。
+ テーブルの Amazon S3 の場所は、Lake Formation データレイクの場所として登録する必要があります。テーブルがこのように登録されていない場合、Multi Dialect views may only reference Lake Formation managed tables というエラーが表示されます。Lake Formation で Amazon S3 の場所を登録する方法については、「*AWS Lake Formation Developer Guide*」の「[Registering an Amazon S3 location](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 Developer Guide*」の「[GetTables and SearchTables APIs do not update the value for the IsRegisteredWithLakeFormation parameter](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html#issue-GetTables-value)」を参照してください。
+ `DEFINER` プリンシパルは IAM ロールのみにできます。
+ `DEFINER` ロールには、基礎となるテーブルに対する完全な `SELECT` (付与可能な) 権限が必要です。
+ `UNPROTECTED` データカタログビューはサポートされていません。
+ ユーザー定義関数 (UDF) は、ビュー定義ではサポートされていません。
+ Athena 統合データソースはデータカタログビューでは使用できません。
+ Data Catalog ビューは外部 Hive メタストアではサポートされていません。
+ Athena は、古いビューを検出するとエラーメッセージを表示します。以下のいずれかが発生すると、古いビューが報告されます。
  + このビューは、存在しないテーブルまたはデータベースを参照します。
  + スキーマまたはメタデータの変更は、参照されるテーブルで行われます。
  + 参照されるテーブルは削除され、異なるスキーマまたは設定で再度作成されます。

## アクセス許可
<a name="views-glue-permissions"></a>

データカタログビューには `Lake Formation Admin`、`Definer`、`Invoker` の 3 つのロールが必要です。
+ **`Lake Formation Admin`** — すべてのLake Formation 権限を設定するためのアクセス権があります。
+ **`Definer`** — データカタログビューを作成します。`Definer` ロールには、ビュー定義が参照するすべての基礎となるテーブルに対して付与可能で完全な `SELECT` 権限が必要です。
+ **`Invoker`** — データカタログビューにクエリを実行したり、そのメタデータを確認したりできます。クエリの呼び出し元を表示するには、`invoker_principal()` DML 関数を使用できます。詳細については、「[invoker\$1principal()](functions-env3.md#functions-env3-invoker-principal)」を参照してください。

`Definer` ロールの信頼関係によって、AWS Glue と Lake Formation のサービスプリンシパルに対する `sts:AssumeRole` アクションを許可する必要があります。詳細については、「AWS Lake Formation デベロッパーガイド」の「[Prerequisites for creating views](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html#views-prereqs)」を参照してください。

Athena にアクセスするための IAM アクセス許可も必要です。詳細については、「[AWSAmazon Athena の 管理ポリシー](security-iam-awsmanpol.md)」を参照してください。

# データカタログビューを管理する
<a name="views-glue-managing"></a>

DDL コマンドを使用して、データカタログビューを更新および管理できます。

## データカタログビューを更新する
<a name="views-glue-updating-a-data-catalog-view"></a>

`Lake Formation` 管理者または定義者は、`ALTER VIEW UPDATE DIALECT` 構文を使用してビュー定義を更新できます。次の例では、ビュー定義を変更して、`orders` テーブルではなく `returns` テーブルから列を選択します。

```
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 ビューで次のアクションをサポートします。


| ステートメント | 説明 | 
| --- | --- | 
| [ALTER VIEW DIALECT](alter-view-dialect.md) |  エンジンダイアレクトを追加するか、既存のエンジンダイアレクトを更新または削除して、データカタログビューを更新します。  | 
| [CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view) |  指定された `SELECT` クエリからデータカタログビューを作成します。詳細については、「[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) |  ビュー用のスキーマの列を一覧表示します。  | 