

# Athena の SQL リファレンス
<a name="ddl-sql-reference"></a>

Amazon Athena では、データ定義言語 (DDL) とデータ操作言語 (DML) のステートメント、関数、演算子、およびデータ型のサブセットがサポートされています。いくつかの例外を除き、Athena DDL は [HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL) に基づいており、Athena DML は [Trino](https://trino.io/docs/current/language.html) に基づいています。Athena エンジンのバージョンに関する詳細については、「[Athena エンジンのバージョニング](engine-versions.md)」を参照してください。

**Topics**
+ [Athena のデータ型](data-types.md)
+ [DML クエリ、関数、および演算子](dml-queries-functions-operators.md)
+ [DDL ステートメント](ddl-reference.md)
+ [考慮事項と制限事項](other-notable-limitations.md)

# Amazon Athena のデータ型
<a name="data-types"></a>

`CREATE TABLE` を実行するときは、列名と、各列に含めることができるデータ型を指定します。作成するテーブルは、AWS Glue Data Catalog に保存されます。

他のクエリエンジンとの相互運用性を促進するため、Athena は `CREATE TABLE` などの DDL ステートメントに [Apache Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types) データ型名を使用します。`SELECT`、`CTAS`、および `INSERT INTO` などの DML クエリの場合、Athena は [Trino](https://trino.io/docs/current/language/types.html) データ型名を使用します。以下の表は、Athena でサポートされるデータ型を示しています。DDL 型と DML 型が名前、可用性、構文といった点で異なる場合は、個別の列に表示されます。


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/data-types.html)

**Topics**
+ [データ型の例](data-types-examples.md)
+ [データ型に関する考慮事項](data-types-considerations.md)
+ [タイムスタンプデータを使用する](data-types-timestamps.md)

# データ型の例
<a name="data-types-examples"></a>

以下の表は、DML データ型のリテラル例を示しています。


****  

| データ型 | 例 | 
| --- | --- | 
| BOOLEAN |  `true` `false `  | 
| TINYINT |  `TINYINT '123'`  | 
| SMALLINT |  `SMALLINT '123'`  | 
| INT, INTEGER |  `123456790`  | 
| BIGINT |  `BIGINT '1234567890'` `2147483648`  | 
| REAL |  `'123456.78'`  | 
| DOUBLE |  `1.234`  | 
| DECIMAL(precision, scale) |  `DECIMAL '123.456'`  | 
| CHAR, CHAR(length) |  `CHAR 'hello world'`, `CHAR 'hello ''world''!'`  | 
| VARCHAR, VARCHAR(length) |  `VARCHAR 'hello world'`, `VARCHAR 'hello ''world''!'`  | 
| VARBINARY |  `X'00 01 02'`  | 
| TIME, TIME(precision) |  `TIME '10:11:12'`, `TIME '10:11:12.345'`  | 
| TIME WITH TIME ZONE |  `TIME '10:11:12.345 -06:00'`  | 
| DATE |  `DATE '2024-03-25'`  | 
|  TIMESTAMP, TIMESTAMP WITHOUT TIME ZONE, TIMESTAMP(*precision*), TIMESTAMP(*precision*) WITHOUT TIME ZONE   |  `TIMESTAMP '2024-03-25 11:12:13'`, `TIMESTAMP '2024-03-25 11:12:13.456'`  | 
| TIMESTAMP WITH TIME ZONE, TIMESTAMP(precision) WITH TIME ZONE |  `TIMESTAMP '2024-03-25 11:12:13.456 Europe/Berlin'`  | 
| INTERVAL YEAR TO MONTH |  `INTERVAL '3' MONTH`  | 
| INTERVAL DAY TO SECOND |  `INTERVAL '2' DAY`  | 
| ARRAY[element\$1type] |  `ARRAY['one', 'two', 'three']`  | 
| MAP(key\$1type, value\$1type) |  `MAP(ARRAY['one', 'two', 'three'], ARRAY[1, 2, 3])` マップは、キーの配列と値の配列から作成されることに注意してください。次の例では、文字列を整数にマッピングするテーブルを作成します。 <pre>CREATE TABLE map_table(col1 map<string, integer>) LOCATION '...';<br />INSERT INTO map_table values(MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]));</pre>  | 
| ROW(field\$1name\$11 field\$1type\$11, field\$1name\$12 field\$1type\$12, …) |  `ROW('one', 'two', 'three')` この方法で作成された行には列名がないことに注意してください。列名を追加するには、以下の例にあるように、`CAST` を使用できます。 <pre>CAST(ROW(1, 2, 3) AS ROW(one INT, two INT, three INT))</pre>  | 
| JSON |  `JSON '{"one":1, "two": 2, "three": 3}'`  | 
| UUID |  `UUID '12345678-90ab-cdef-1234-567890abcdef'`  | 
| IPADDRESS |  `IPADDRESS '10.0.0.1'` `IPADDRESS '2001:db8::1'`  | 

# データ型に関する考慮事項
<a name="data-types-considerations"></a>

## サイズ制限
<a name="data-types-considerations-size"></a>

サイズ制限を指定しないデータ型については、単一の行内にあるすべてのデータに対して 32MB という実用的制限が設定されていることに注意してください。詳細については、「[Amazon Athena での SQL クエリに関する考慮事項と制約事項](other-notable-limitations.md)」の [Row or column size limitation](other-notable-limitations.md#sql-limitations-rowsize) を参照してください。

## CHAR と VARCHAR
<a name="data-types-considerations-char"></a>

`CHAR(n)` 値には、常に `n` の文字数があります。たとえば、`CHAR(7)` に「abc」をキャストすると、末尾に 4 つのスペースが追加されます。

`CHAR` 値の比較には、先頭と末尾のスペースが含まれます。

`CHAR` または `VARCHAR` に長さが指定されている場合、文字列は読み取り時に指定された長さで切り捨てられます。基盤となるデータ文字列がそれより長い場合、基盤となるデータ文字列はそのまま変更されません。

`CHAR` または `VARCHAR` で一重引用符をエスケープするには、追加の一重引用符を使用します。

DML クエリ内の文字列に文字列以外のデータ型をキャストするには、`VARCHAR` データ型にキャストします。

`substr` 関数を使用して `CHAR` データ型から指定された長さの従属文字列を返すには、まず `CHAR` 値を `VARCHAR` としてキャストする必要があります。以下の例では、`col1` が `CHAR` データ型を使用します。

```
substr(CAST(col1 AS VARCHAR), 1, 4)
```

## DECIMAL
<a name="data-types-considerations-decimal"></a>

特定の 10 進値を含む行を選択する場合など、`SELECT` クエリのリテラルとして 10 進値を指定するには、以下の例にあるように、クエリ内で `DECIMAL` 型を指定し、一重引用符内のリテラルとして 10 進値をリストすることができます。

```
SELECT * FROM my_table
WHERE decimal_value = DECIMAL '0.12'
```

```
SELECT DECIMAL '44.6' + DECIMAL '77.2'
```

# タイムスタンプデータを使用する
<a name="data-types-timestamps"></a>

このセクションでは、Athena でのタイムスタンプデータを使用する場合のいくつかの考慮事項について説明します。

**注記**  
以前のエンジンバージョンから Athena エンジンバージョン 3 では、タイムスタンプの処理が多少変わりました。Athena エンジンバージョン 3 で発生する可能性のあるタイムスタンプ関連のエラーと推奨される解決策については、[Athena エンジンバージョン 3](engine-versions-reference-0003.md) リファレンスにある「[タイムスタンプの変更](engine-versions-reference-0003.md#engine-versions-reference-0003-timestamp-changes)」を参照してください。

## タイムスタンプデータを Amazon S3 オブジェクトに書き込むためのフォーマット
<a name="data-types-timestamps-writing-to-s3-objects"></a>

タイムスタンプデータを Amazon S3 オブジェクトに書き込む際の形式は、使用する列データ型と [SerDe ライブラリ](https://docs.aws.amazon.com/athena/latest/ug/supported-serdes.html)の両方によって決まります。
+ タイプ `DATE` のテーブル列がある場合、Athena はデータの対応する列またはプロパティが ISO 形式 `YYYY-MM-DD` の文字列、または Parquet や ORC のような組み込みの日付型であることを期待します。
+ タイプ `TIME` のテーブル列がある場合、Athena はデータの対応する列またはプロパティが ISO 形式 `HH:MM:SS` の文字列、または Parquet や ORC のような組み込みの時間型であることを期待します。
+ タイプ `TIMESTAMP` のテーブル列がある場合、、Athena はデータの対応する列またはプロパティが、その形式 `YYYY-MM-DD HH:MM:SS.SSS` の文字列 (日付と時刻の間のスペースに注意)、または Parquet、ORC、Ion のような組み込みの時間型であることを期待します。Athena は、無効なタイムスタンプの動作を保証しないことに注意してください (例: `0000-00-00 08:00:00.000`）。
**注記**  
OpenCSVSerDe のタイムスタンプは例外であり、ミリ秒単位の精度の UNIX エポックとしてエンコードする必要があります。

## 時間分割されたデータがレコードのタイムスタンプフィールドと一致することを確認します
<a name="data-types-timestamps-time-partitioned-data-and-timestamp-fields"></a>

データの作成者は、パーティションの値がパーティション内のデータと一致していることを確認する必要があります。たとえば、データに `timestamp` プロパティがあり、Firehose を使用してデータを Amazon S3 にロードする場合、Firehose のデフォルトパーティショニングは実経過時間ベースであることから、[動的パーティショニング](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html)を使用する必要があります。

## パーティションキーのデータ型として文字列を使用
<a name="data-types-timestamps-partition-key-types"></a>

パフォーマンス上の理由から、パーティションキーのデータ型として `STRING` を使用することをお勧めします。Athena では `DATE` タイプを使用した場合、その形式 `YYYY-MM-DD` のパーティション値を日付として認識しますが、これによってパフォーマンスが低下する可能性があります。この理由から、パーティションキーには `STRING` データ型を使用することをお勧めします。

## 同じく時間分割されているタイムスタンプフィールドのクエリを作成する方法
<a name="data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned"></a>

時間分割されたタイムスタンプフィールドのクエリを作成する方法は、クエリするテーブルの種類によって異なります。

### Hive テーブル
<a name="data-types-timestamps-hive-tables"></a>

Athena で最も一般的に使用されている Hive テーブルでは、クエリエンジンは列とパーティションキーの関係を認識しません。このため、クエリには必ず列とパーティションキーの両方に述語を追加する必要があります。

たとえば、`event_time` 列と `event_date` パーティションキーがあり、23:00 から 03:00 までのイベントをクエリしたいとします。この場合、次の例のように、クエリに列とパーティションキーの両方に述語を含める必要があります。

```
WHERE event_time BETWEEN start_time AND end_time 
  AND event_date BETWEEN start_time_date AND end_time_date
```

### Iceberg テーブルの使用
<a name="data-types-timestamps-iceberg-tables"></a>

Iceberg テーブルでは、計算されたパーティション値を使用できるため、クエリが簡単になります。たとえば、Iceberg テーブルが次のような `PARTITIONED BY` 句で作成されたとします。

```
PARTITIONED BY (event_date month(event_time))
```

この場合、クエリエンジンは `event_time` 述語の値に基づいてパーティションを自動的に削除します。このため、クエリでは次の例のように `event_time` の述語を指定するだけです。

```
WHERE event_time BETWEEN start_time AND end_time
```

詳細については、「[Iceberg テーブルを作成する](querying-iceberg-creating-tables.md)」を参照してください。

タイムスタンプ列に Iceberg の非表示パーティショニングを使用する場合、Iceberg はタイムスタンプ列から派生し、より効果的なパーティショニングのために日付に変換された構築済みテーブル列にパーティションを作成することがあります。例えば、タイムスタンプ列 `event_time` から `event_date` を作成し、`event_date` で自動的にパーティション分割する場合があります。この場合、パーティション**タイプ**は**日付**です。

パーティションを使用する際の最適なクエリパフォーマンスを得るには、1 日の範囲をフィルタリングして述語プッシュダウンを有効にします。例えば、次のクエリはプッシュダウンされません。範囲は 1 日以内であっても 1 つの日付パーティションに変換できないためです。

```
WHERE event_time >= TIMESTAMP '2024-04-18 00:00:00' AND event_time < TIMESTAMP '2024-04-18 12:00:00'
```

代わりに、次の例のように、1 日の範囲を使用して、述語プッシュダウンを許可し、クエリパフォーマンスを向上させます。

```
WHERE event_time >= TIMESTAMP '2024-04-18 00:00:00' AND event_time < TIMESTAMP '2024-04-19 00:00:00'
```

タイムスタンプ部分が `00:00:00` である限り、`BETWEEN start_time AND end_time` 構文を使用するか、複数日の範囲を使用することもできます。

詳細については、[Trino ブログの投稿記事](https://trino.io/blog/2023/04/11/date-predicates.html)を参照してください。

# DML クエリ、関数、および演算子
<a name="dml-queries-functions-operators"></a>

Athena DML クエリエンジンは、基本的に Trino と Presto の構文をサポートし、独自の改良が加えられています。Athena は Trino と Presto のすべての機能をサポートしているわけではありません。詳細については、このセクション、および「[考慮事項と制限事項](other-notable-limitations.md)」で特定のステートメントに関するトピックを参照してください。関数の詳細については、「[Amazon Athena の関数](functions.md)」を参照してください。Athena エンジンバージョンの詳細については、「[Athena エンジンのバージョニング](engine-versions.md)」を参照してください。

DDL ステートメントの詳細については、「[DDL ステートメント](ddl-reference.md)」を参照してください。サポートされていない DDL ステートメントのリストについては、「[サポートされない DDL](unsupported-ddl.md)」を参照してください。

**Topics**
+ [SELECT](select.md)
+ [INSERT INTO](insert-into.md)
+ [VALUES](values-statement.md)
+ [DELETE](delete-statement.md)
+ [UPDATE](update-statement.md)
+ [MERGE INTO](merge-into-statement.md)
+ [OPTIMIZE](optimize-statement.md)
+ [VACUUM](vacuum-statement.md)
+ [EXPLAIN と EXPLAIN ANALYZE](athena-explain-statement.md)
+ [PREPARE](sql-prepare.md)
+ [UNLOAD](unload.md)
+ [関数](functions.md)
+ [サポートされているタイムゾーンを使用する](athena-supported-time-zones.md)

# SELECT
<a name="select"></a>

0 個以上のテーブルからデータの行を取得します。

**注記**  
このトピックでは、参照用に概要情報を提供します。`SELECT` と SQL 言語の使用に関する包括的な情報は、このドキュメントでは説明しません。Athena に固有の SQL の使用については、「[Amazon Athena での SQL クエリに関する考慮事項と制約事項](other-notable-limitations.md)」および「[Amazon Athena で SQL クエリを実行する](querying-athena-tables.md)」を参照してください。データベースの作成、テーブルの作成、および Athena のテーブルに対する `SELECT` クエリの実行の例については、[はじめに](getting-started.md) を参照してください。

## 概要
<a name="synopsis"></a>

```
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

**注記**  
SQL SELECT ステートメントの予約語は、二重引用符で囲む必要があります。詳細については、「[SQL SELECT ステートメントでエスケープする予約語](reserved-words.md#list-of-reserved-words-sql-select)」を参照してください。

## パラメータ
<a name="select-parameters"></a>

**[ WITH with\$1query [, ....]]**  
`WITH` を使用すると、ネストされたクエリをフラット化したり、サブクエリを簡素化できます。  
`WITH` 句を使用した再帰クエリの作成は、Athena エンジンバージョン 3 以降でサポートされています。最大再帰深度は 10 です。  
`WITH` 句はクエリの `SELECT` リストに先行し、`SELECT` クエリ内で使用する 1 つ以上のサブクエリを定義します。  
各サブクエリは、ビュー定義と同じように、一時テーブルを定義します。一時テーブルは `FROM` 句で参照できます。このテーブルはクエリを実行時のみに使用します。  
`with_query` 構文は次のとおりです。  

```
subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)
```
各パラメータの意味は次のとおりです。  
+  `subquery_table_name` は、`WITH` 句のサブクエリの結果を定義する一時テーブルの一意な名前です。各 `subquery` には、`FROM` 句で参照可能なテーブル名を付ける必要があります。
+  `column_name [, ...]` は、出力列名の省略可能なリストです。列名の数は、`subquery` で定義した列数以下でなければなりません。
+  `subquery` は、任意のクエリステートメントです。

**[ ALL \$1 DISTINCT ] select\$1expression**  
 `select_expression` は、選択する行を決定します。`select_expression` には、次のいずれかの形式が使用されます。  

```
expression [ [ AS ] column_alias ] [, ...]
```

```
row_expression.* [ AS ( column_alias [, ...] ) ]
```

```
relation.*
```

```
*
```
+ `expression [ [ AS ] column_alias ]` 構文は出力列を指定します。オプションの `[AS] column_alias` 構文は、出力の列に使用されるカスタム見出し名を指定します。
+ `row_expression.* [ AS ( column_alias [, ...] ) ]` の場合、`row_expression` は データ型 `ROW` の任意の式です。行のフィールドは、結果に含まれる出力列を定義します。
+ `relation.*` の場合、`relation` の列が結果に含まれます。この構文では列のエイリアスは使用できません。
+ アスタリスク `*` は、すべての列を結果セットに含めることを指定します。
+ 結果セット内の列の順序は、select 式による指定の順序と同じです。select 式が複数の列を返す場合、列の順序はソースリレーションまたは行タイプの式で使用されている順序に従います。
+ 列のエイリアスを指定すると、そのエイリアスは既存の列または行のフィールド名よりも優先されます。select 式に列名がない場合は、インデックスが 0 の匿名の列名 (`_col0`、`_col1`、`_col2, ...`) が出力に表示されます。
+  `ALL` はデフォルトです。`ALL` は、それを省略した場合と同じように扱われます。すべての列のすべての行が選択され、重複も含まれます。
+ `DISTINCT` は、列に重複する値が含まれているときに、個別の値のみを返すために使用します。

**FROM from\$1item [, ...]**  
クエリへの入力を示します。`from_item` は、以下に示すように、ビュー、結合コンストラクト、サブクエリのいずれかです。  
`from_item` は以下のいずれかです。  
+  `table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]` 

  `table_name` は行の選択元であるターゲットテーブルの名前であり、`alias` は `SELECT` ステートメントの出力に渡す名前です。`column_alias` は指定した `alias` の列を定義します。
 **-または-**   
+  `join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]` 

  `join_type` は以下のいずれかです。
  +  `[ INNER ] JOIN` 
  +  `LEFT [ OUTER ] JOIN` 
  +  `RIGHT [ OUTER ] JOIN` 
  +  `FULL [ OUTER ] JOIN` 
  +  `CROSS JOIN` 
  +  `ON join_condition | USING (join_column [, ...])`。`join_condition` では、複数のテーブルにおいて結合キーの列名を指定できます。`join_column` を使用するには、`join_column` が両方のテーブルに存在している必要があります。

**[ WHERE condition ]**  
指定した `condition` に従って結果をフィルタリングします。通常、`condition` には次の構文が含まれています。  

```
column_name operator value [[[AND | OR] column_name operator value] ...]
```
*演算子*は、比較演算子 `=`、`>`、`<`、`>=`、`<=`、`<>`、`!=` のいずれかになります。  
次のサブクエリ式も、`WHERE` 句で使用できます。  
+ `[NOT] BETWEEN integer_A AND integer_B` - 次の例のように、2 つの整数間の範囲を指定します。列のデータ型が `varchar` の場合、最初に列を整数にキャストする必要があります。

  ```
  SELECT DISTINCT processid FROM "webdata"."impressions"
  WHERE cast(processid as int) BETWEEN 1500 and 1800
  ORDER BY processid
  ```
+ `[NOT] LIKE value` - 指定したパターンを検索します。次の例のように、パーセント記号 (`%`) をワイルドカード文字として使用します。

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer LIKE '%.org'
  ```
+ `[NOT] IN (value[, value[, ...])` - 次の例のように、列で使用できる値のリストを指定します。

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer IN ('example.com','example.net','example.org')
  ```

**[ GROUP BY [ ALL \$1 DISTINCT ] grouping\$1expressions [, ...]]**  
`SELECT` ステートメントの出力を、一致する値を持つ行に分割します。  
 `ALL` と `DISTINCT` は、重複したグループ化セットごとに個別の出力行を生成するかどうかを決定します。省略すると、`ALL` が使用されます。  
`grouping_expressions` では、複雑なグループ化オペレーションを実行できます。複雑なグループ化オペレーションを使用して、複数の列セットの集計を必要とする分析を単一のクエリで実行できます。  
`grouping_expressions` 要素には、`SUM`、`AVG`、`COUNT` など、入力列に対して実行される任意の関数を指定できます。  
`GROUP BY` 式は、`SELECT` ステートメントの出力に表示されない入力列名で出力をグループ化できます。  
すべての出力式は、集計関数であるか、`GROUP BY` 句に存在する列であることが必要です。  
単一のクエリを使用して、複数の列セットの集計を必要とする分析を実行できます。  
Athena は、`GROUPING SETS`、`CUBE`、および `ROLLUP` を使用する複雑な集計をサポートしています。`GROUP BY GROUPING SETS` で、グループ化する列の複数のリストを指定します。`GROUP BY CUBE` で、特定の列のセットに対して、すべての可能なグループ化セットを生成します。`GROUP BY ROLLUP` で、特定の列のセットに対して、すべての可能な小計を生成します。複雑なグループ化オペレーションでは、入力列で構成される式でのグループ化がサポートされていません。列名のみが許可されます。  
通常、`UNION ALL` を使用しても、これらの `GROUP BY` オペレーションと同じ結果を達成できます。ただし、`GROUP BY` を使用するクエリでは、データの読み取りが 1 回で済むという利点があります。`UNION ALL` は基となるデータを 3 回読み取るため、データソースが変わりやすい場合は、不整合な結果が生成されることがあります。

**[ HAVING condition ]**  
集計関数と `GROUP BY` 句で使用します。どのグループを選択するかを制御します。`condition` を満たさないグループは排除されます。このフィルタ処理は、グループや集計の計算後に行われます。

**[ \$1 UNION \$1 INTERSECT \$1 EXCEPT \$1 [ ALL \$1 DISTINCT ] union\$1query] ]**  
`UNION`、`INTERSECT`、および `EXCEPT` は、複数の `SELECT` ステートメントの結果を 1 つのクエリに結合します。`ALL` または `DISTINCT` は、最終的な結果セットに含められる行の一意性を制御します。  
`UNION` は、最初のクエリから得られた行と、2 番目のクエリから得られた行を結合します。重複を排除するため、`UNION` はメモリを消費するハッシュテーブルを構築します。パフォーマンス向上のため、クエリに重複を排除する必要がない場合は `UNION ALL` の使用を検討してください。複数の `UNION` 句は左から右に処理されます。ただし、括弧を使用して処理の順序を明示的に定義することもできます。  
`INTERSECT` は、最初のクエリと 2 番目のクエリ両方の結果に存在する行のみを返します。  
`EXCEPT` は、最初のクエリの結果からの行を返し、2 番目のクエリで見つかった行は排除されます。  
`ALL` は、行が同一の場合でも、すべての行が含まれる処理を実行します。  
`DISTINCT` は、統合された結果セットに一意の行のみが含まれるようにします。

**[ ORDER BY expression [ ASC \$1 DESC ] [ NULLS FIRST \$1 NULLS LAST] [, ...]]**  
結果セットを 1 つ以上の出力 `expression` でソートします。  
句に複数の式が含まれている場合、結果セットは最初の `expression` に従ってソートされます。次に、最初の式で一致した値がある行に 2 番目の `expression` が適用されます。以下、同様です。  
各 `expression` では、`SELECT` の出力列を指定するか、出力列の位置を 1 から始まる序数で指定できます。  
`ORDER BY` は、`GROUP BY` または `HAVING` 句の後で、最後のステップとして評価されます。`ASC` と `DESC` は、結果のソートを昇順にするか、降順にするかを決定します。デフォルトの並べ替え順序は昇順 (`ASC`) です。デフォルトの null 順序は、昇順または降順のソート順に関係なしに `NULLS LAST` です。

**[ OFFSET count [ ROW \$1 ROWS ] ]**  
`OFFSET` 句を使用して、結果セットの先頭の行をいくつか破棄します。`ORDER BY` 句が存在する場合、`OFFSET` 句はソートされた結果セットに対して評価されます。スキップされた行が破棄された後もセットはソートされたままになります。クエリに `ORDER BY` 句がない場合、破棄される行は任意です。`OFFSET` で指定したカウントが結果セットのサイズに等しいかそれを超える場合、最終結果は空になります。

**LIMIT [ count \$1 ALL ]**  
結果セットの行数を `count` に制限します。`LIMIT ALL` は `LIMIT` 句を省略した場合と同じです。クエリに `ORDER BY` 句がない場合は、任意の結果になります。

**TABLESAMPLE [BERNOULLI \$1 SYSTEM] (percentage)**  
サンプリング方法に基づいてテーブルから行を選択する演算子 (オプション) です。  
 `BERNOULLI` は、`percentage` の確率でテーブルサンプルに存在する各行を選択します。テーブルのすべての物理ブロックがスキャンされ、サンプルの `percentage` とランタイムに計算されるランダム値の比較に基づいて、特定の行がスキップされます。  
`SYSTEM` では、テーブルがデータの論理セグメントに分割され、この詳細度でテーブルがサンプリングされます。  
特定のセグメントのすべての行が選択されるか、サンプルの `percentage` とランタイムに計算されたランダム値の比較に基づいて当該セグメントがスキップされます。`SYSTEM` サンプリングはコネクタに依存します。この方法では、独立したサンプリング確率は保証されません。

**[ UNNEST (array\$1or\$1map) [WITH ORDINALITY] ]**  
配列またはマップをリレーションに展開します。配列は単一の列に展開されます。マップは 2 つの列 (*キー*、*値*) に展開されます。  
`UNNEST` に複数の引数を使用できます。これらの引数は、複数の列に展開され、各列の行数は最大の基数引数と同じになります。  
その他の列には NULL が埋め込まれます。  
`WITH ORDINALITY` 句は、序数列を末尾に追加します。  
 通常、`UNNEST` は `JOIN` と一緒に使用し、`JOIN` の左側のリレーションの列を参照できます。

## Amazon S3 内にあるソースデータのファイルの場所の取得
<a name="select-path"></a>

テーブル行にあるデータの Amazon S3 ファイルの場所を確認するには、以下の例にあるように、`SELECT` クエリで `"$path"` を使用できます。

```
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
```

このクエリは以下のような結果を返します。

```
s3://amzn-s3-demo-bucket/datasets_mytable/year=2019/data_file1.json
```

テーブル内にあるデータについて S3 ファイル名パスのソートされた一意のリストを返すには、以下の例にあるように、`SELECT DISTINCT` と `ORDER BY` を使用できます。

```
SELECT DISTINCT "$path" AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

パスなしでファイル名のみを返すには、以下の例にあるように、`"$path"` をパラメータとして `regexp_extract` 関数に渡すことができます。

```
SELECT DISTINCT regexp_extract("$path", '[^/]+$') AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

特定のファイルからのデータを返すには、以下の例にあるように、`WHERE` 句でそのファイルを指定します。

```
SELECT *,"$path" FROM my_database.my_table WHERE "$path" = 's3://amzn-s3-demo-bucket/my_table/my_partition/file-01.csv'
```

詳細と例については、ナレッジセンターの記事、「[Athena テーブルの行の Amazon S3 ソースファイルを表示する方法を教えてください](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/)」を参照してください。

**注記**  
Athena では、Hive または Iceberg の非表示のメタデータ列 `$bucket`、`$file_modified_time`、`$file_size`、および `$partition` は、ビューでサポートされていません。

## 一重引用符のエスケープ
<a name="select-escaping"></a>

 一重引用符をエスケープするには、以下の例のように、その前に別の一重引用符を付けます。これを二重引用符と混同しないでください。

```
Select 'O''Reilly'
```

**結果**  
`O'Reilly`

## その他のリソース
<a name="select-additional-resources"></a>

Athena で `SELECT` ステートメントを使用する方法の詳細については、以下のリソースを参照してください。


| 詳細情報の内容 | 参照先 | 
| --- | --- | 
| Athena でクエリを実行する | [Amazon Athena で SQL クエリを実行する](querying-athena-tables.md) | 
| SELECT を使用してテーブルを作成する | [クエリ結果からテーブルを作成する (CTAS)](ctas.md) | 
| SELECT クエリからのデータを別のテーブルに挿入する | [INSERT INTO](insert-into.md) | 
| SELECT ステートメントで組み込みの関数を使用する | [Amazon Athena の関数](functions.md) | 
| SELECT ステートメントでユーザー定義の関数を使用する | [ユーザー定義関数を使用してクエリする](querying-udf.md) | 
| データカタログのメタデータをクエリする | [AWS Glue Data Catalog をクエリする](querying-glue-catalog.md) | 

# INSERT INTO
<a name="insert-into"></a>

ソーステーブルで実行される `SELECT` クエリステートメント、またはステートメントの一部として提供される `VALUES` のセットに基づいて、送信先テーブルに新しい行を挿入します。ソーステーブルが CSV や JSON などの形式の基盤データに基づくもので、宛先テーブルが Parquet や ORC など別の形式に基づいている場合は、`INSERT INTO` クエリを使用して、選択したデータを宛先テーブルの形式に変換できます。

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

Athena で `INSERT` クエリを使用するときは、以下の点を考慮してください。
+ Amazon S3 で暗号化された基盤データがあるテーブルに対して `INSERT` クエリを実行する場合、`INSERT` クエリが書き込む出力ファイルはデフォルトで暗号化されません。暗号化されたデータを含むテーブルに挿入する場合は、`INSERT` クエリの結果を暗号化することをお勧めします。

  コンソールを使用したクエリ結果の暗号化の詳細については、「[Amazon S3 に保存された Athena クエリ結果を暗号化する](encrypting-query-results-stored-in-s3.md)」を参照してください。AWS CLI または Athena API を使用した暗号化を有効にするには、[StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) アクションの `EncryptionConfiguration` プロパティを使用して、要件に沿った Amazon S3 暗号化オプションを指定します。
+ `INSERT INTO` ステートメントの場合、予想されるバケット所有者の設定は、Amazon S3 内の送信先テーブルのロケーションには適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「[Athena コンソールを使用してクエリ結果の場所を指定する](query-results-specify-location-console.md)」を参照してください。
+ ACID 準拠の `INSERT INTO` ステートメントについては、[Iceberg テーブルデータを更新する](querying-iceberg-updating-iceberg-table-data.md) の `INSERT INTO` セクションを参照してください。

### サポートされる形式と SerDes
<a name="insert-into-supported-formats"></a>

次の形式と SerDes を使用して、データから作成されたテーブルに対して `INSERT` クエリを実行できます。


| データ形式 | SerDe | 
| --- | --- | 
|  Avro  |  org.apache.hadoop.hive.serde2.avro.AvroSerDe  | 
| Ion | com.amazon.ionhiveserde.IonHiveSerDe | 
|  JSON  |  org.apache.hive.hcatalog.data.JsonSerDe  | 
|  ORC  |  org.apache.hadoop.hive.ql.io.orc.OrcSerde  | 
|  Parquet  |  org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe  | 
|  テキストファイル  |  org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  TSV、およびカスタム区切りファイルがサポートされています。   | 
| CSV | org.apache.hadoop.hive.serde2.OpenCSVSerde 書き込みは文字列型でのみサポートされます。Athena から、Glue スキーマに文字列以外の型を含むテーブルに書き込むことはできません。詳細については、「[CSV SerDe](csv-serde.md#csv-serde-opencsvserde-considerations-non-string)」を参照してください。  | 

### バケット化されたテーブルはサポートされていません
<a name="insert-into-bucketed-tables-not-supported"></a>

`INSERT INTO` はバケット化されたテーブルではサポートされていません。詳細については、「[パーティショニングとバケット化を使用する](ctas-partitioning-and-bucketing.md)」を参照してください。

### フェデレーティッドクエリはサポートされていません
<a name="insert-into-federated-queries-not-supported"></a>

横串検索では、`INSERT INTO` はサポートされていません。これを試みた場合、「This operation is currently not supported for external catalogs (この操作は現在、外部カタログではサポートされていません)」というエラーメッセージが表示されることがあります。横串検索の詳細については、「[Amazon Athena フェデレーティッドクエリを使用する](federated-queries.md)」を参照してください。

### パーティション
<a name="insert-into-limitations-partitioning"></a>

`INSERT INTO` または `CREATE TABLE AS SELECT` クエリでパーティションを使用するときは、このセクションのポイントを考慮してください。

#### 制限
<a name="insert-into-partition-limits"></a>

この `INSERT INTO` ステートメントは、送信先テーブルへの最大 100  個のパーティションの書き込みをサポートします。100 個を超えるパーティションを持つテーブルから `SELECT` 句を使用して行を追加する場合、`SELECT` クエリは、100 個以下のパーティションに制限されない限り失敗します。

この制限を回避する方法については、「[CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する](ctas-insert-into.md)」を参照してください。

#### 列の順序
<a name="insert-into-partition-detection"></a>

`INSERT INTO` または `CREATE TABLE AS SELECT` ステートメントは、`SELECT` ステートメントで射影された列のリストの最後の列がパーティションされた列であることを期待します。

ソーステーブルがパーティションされていない場合、または宛先テーブルとは異なる列でパーティションされている場合、`INSERT INTO destination_table SELECT * FROM source_table` のようなクエリは、ソーステーブルの最後の列の値が宛先テーブルのパーティション列の値であると見なします。パーティションされていないテーブルからパーティションテーブルを作成するときは、この点に留意してください。

#### リソース
<a name="insert-into-partition-resources"></a>

パーティションでの `INSERT INTO` の使用に関する詳細については、以下のリソースを参照してください。
+ パーティションされたデータをパーティションテーブルに挿入する方法については、「[CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する](ctas-insert-into.md)」を参照してください。
+ パーティションされていないデータをパーティションテーブルに挿入する方法については、「[ETL およびデータ分析での CTAS および INSERT INTO を使用する](ctas-insert-into-etl.md)」を参照してください。

### Amazon S3 に書き込まれるファイル
<a name="insert-into-files-written-to-s3"></a>

Athena は、`INSERT` コマンドの結果として、Amazon S3 のソースデータの場所にファイルを書き込みます。`INSERT` オペレーションごとに、既存のファイルを追加するのではなく、新しいファイルが作成されます。ファイルの場所は、テーブルの構造と `SELECT` クエリ (存在する場合) に応じて異なります。Athena は、`INSERT` クエリごとにデータマニフェストファイルを生成します。マニフェストは、クエリが書き込んだファイルを追跡します。これは、Amazon S3 にある Athena のクエリ結果の場所に保存されます。詳細については、「[クエリ出力ファイルを識別する](querying-finding-output-files.md#querying-identifying-output-files)」を参照してください。

### トランザクション集約型更新の回避
<a name="insert-into-transactional-caveat"></a>

`INSERT INTO` を使用して Amazon S3 内のテーブルに行を追加しても、Athena は既存のファイルの書き換えや変更を行いません。その代わりに、Athena は 1 つ、または複数の新しいファイルとして行を書き込みます。[小さなファイルが多数存在するテーブルはクエリパフォーマンスの低下につながり](performance-tuning-data-optimization-techniques.md#performance-tuning-avoid-having-too-many-files)、`PutObject` や `GetObject` などの書き込みおよび読み取り操作は Amazon S3 のコスト増加につながるため、`INSERT INTO` を使用するときは以下のオプションを検討してください。
+ 行の大規模なバッチに対する `INSERT INTO` 操作の実行頻度を減らす。
+ データインジェスト量が多い場合は、[Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) といったサービスの使用を検討する。
+ もとより `INSERT INTO` を使用しないようにする。その代わりに、より大きなファイルに行を蓄積し、Athena が行をクエリできる Amazon S3 に直接アップロードします。

### 孤立したファイルの検索
<a name="insert-into-files-partial-data"></a>

`CTAS` または `INSERT INTO` ステートメントが失敗すると、孤立したデータがデータの場所に残され、後続のクエリで読み取られる場合があります。検査または削除する孤立したファイルを見つけるには、Athena に用意されているデータマニフェストファイルを使用して、書き込まれるファイルのリストを追跡できます。詳細については、「[クエリ出力ファイルを識別する](querying-finding-output-files.md#querying-identifying-output-files)」および「[DataManifestLocation](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionStatistics.html#athena-Type-QueryExecutionStatistics-DataManifestLocation)」を参照してください。

## INSERT INTO...SELECT
<a name="insert-into-select"></a>

1 つのテーブル、`source_table` に対して実行するクエリを指定します。これにより、2 番目のテーブル、`destination_table` に挿入する行が決定されます。`SELECT` クエリが `source_table` での列を指定する場合、その列は `destination_table` の列と正確に一致する必要があります。

`SELECT` クエリの詳細については、「[SELECT](select.md)」を参照してください。

### 概要
<a name="insert-into-select-synopsis"></a>

```
INSERT INTO destination_table 
SELECT select_query 
FROM source_table_or_view
```

### 例
<a name="insert-into-select-examples"></a>

`vancouver_pageviews` テーブル内のすべての行を選択し、`canada_pageviews` テーブルに挿入します。

```
INSERT INTO canada_pageviews 
SELECT * 
FROM vancouver_pageviews;
```

`date` 列の値が `2019-07-01`～`2019-07-31` の `vancouver_pageviews` テーブル内の行のみを選択し、`canada_july_pageviews` に挿入します。

```
INSERT INTO canada_july_pageviews
SELECT *
FROM vancouver_pageviews
WHERE date
    BETWEEN date '2019-07-01'
        AND '2019-07-31';
```

`cities_world` テーブルの `city` と `state` 列で、`country` 列の値が `usa` の行だけを選択して、`cities_usa` テーブルの `city` と `state` 列に挿入します。

```
INSERT INTO cities_usa (city,state)
SELECT city,state
FROM cities_world
    WHERE country='usa'
```

## INSERT INTO...VALUES
<a name="insert-into-values"></a>

列と値を指定して、既存のテーブルに行を挿入します。指定された列と関連するデータ型は、宛先テーブルの列およびデータ型と正確に一致する必要があります。

**重要**  
Athena は `INSERT` オペレーションごとにファイルを生成するため、`VALUES` を使用した行の挿入は推奨されません。これにより、多数の小さなファイルが作成され、テーブルのクエリパフォーマンスが低下する可能性があります。`INSERT` クエリが作成するファイルを識別するには、データマニフェストファイルを調べます。詳細については、「[クエリ結果と最近のクエリを操作する](querying.md)」を参照してください。

### 概要
<a name="insert-into-values-synopsis"></a>

```
INSERT INTO destination_table [(col1,col2,...)] 
VALUES (col1value,col2value,...)[,
       (col1value,col2value,...)][,
       ...]
```

### 例
<a name="insert-into-values-examples"></a>

次の例では、都市テーブルには、`id`、`city`、`state`、`state_motto` の 3 つの列があります。`id` 列は `INT` 型で、他のすべての列は `VARCHAR` 型です。

`cities` テーブルに 1 つの行を挿入し、すべての列の値を指定します。

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice')
```

`cities` テーブルに 2 行を挿入します。

```
INSERT INTO cities 
VALUES (1,'Lansing','MI','Si quaeris peninsulam amoenam circumspice'),
       (3,'Boise','ID','Esto perpetua')
```

# VALUES
<a name="values-statement"></a>

リテラルインラインテーブルを作成します。テーブルは匿名にすることも、 `AS` 句を使用してテーブル名、列名、またはその両方を指定することもできます。

## 概要
<a name="values-statement-synopsis"></a>

```
VALUES row [, ...]
```

## パラメータ
<a name="values-statement-parameters"></a>

**行**  
`row` パラメータは、単一の式または `( column_expression [, ...] )` にすることができます。

## 例
<a name="values-statement-examples"></a>

1 列 3 行のテーブルを返します。

```
VALUES 1, 2, 3
```

2 列 3 行のテーブルを返します。

```
VALUES
    (1, 'a'),
    (2, 'b'),
    (3, 'c')
```

列 `id` と `name` を含むテーブルを返します。

```
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

列 `id` と `name` を含む `customers` というテーブルを作成します。

```
CREATE TABLE customers AS
SELECT * FROM (
    VALUES
        (1, 'a'),
        (2, 'b'),
        (3, 'c')
) AS t (id, name)
```

## 以下も参照してください。
<a name="values-statement-see-also"></a>

[INSERT INTO...VALUES](insert-into.md#insert-into-values)

# DELETE
<a name="delete-statement"></a>

Apache Iceberg テーブルの行を削除します。`DELETE` はトランザクション型で、Apache Iceberg テーブルでのみサポートされています。

## 概要
<a name="delete-statement-synopsis"></a>

Iceberg テーブルから行を削除するには、次の構文を使用します。

```
DELETE FROM [db_name.]table_name [WHERE predicate]
```

詳細と例については、[Iceberg テーブルデータを更新する](querying-iceberg-updating-iceberg-table-data.md) の `DELETE` セクションを参照してください。

# UPDATE
<a name="update-statement"></a>

Apache Iceberg テーブルの行を更新します。`UPDATE` はトランザクションであり、Apache Iceberg テーブルでのみサポートされています。ステートメントは既存の行でのみ機能し、行の挿入や追加には使用できません。

## 概要
<a name="update-statement-synopsis"></a>

Iceberg テーブルの行を更新するには、次の構文を使用します。

```
UPDATE [db_name.]table_name SET xx=yy[,...] [WHERE predicate]
```

詳細と例については、[Iceberg テーブルデータを更新する](querying-iceberg-updating-iceberg-table-data.md) の `UPDATE` セクションを参照してください。

# MERGE INTO
<a name="merge-into-statement"></a>

Apache Iceberg テーブルに条件付きで行を更新、削除、または挿入します。単一のステートメントで、更新、削除、挿入のアクションを組み合わせることができます。

**注記**  
`MERGE INTO` はトランザクションで、Athena エンジンバージョン 3 の Apache Iceberg テーブルでのみサポートされています。

## 概要
<a name="merge-into-statement-synopsis"></a>

Iceberg テーブルから条件付きで行を更新、削除、または挿入するには、次の構文を使用します。

```
MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
```

*when\$1clause* は次のいずれかです。

```
WHEN MATCHED [ AND condition ]
    THEN DELETE
```

```
WHEN MATCHED [ AND condition ]
    THEN UPDATE SET ( column = expression [, ...] )
```

```
WHEN NOT MATCHED [ AND condition ]
    THEN INSERT (column_name[, column_name ...]) VALUES (expression, ...)
```

`MERGE` は、異なる `MATCHED` の条件を持つ任意の数の `WHEN` 句をサポートします。条件句は、`MATCHED` ステートと一致条件によって選択された最初の `WHEN` 句の `DELETE`、`UPDATE` または `INSERT` 演算を実行します。

ソース行ごとに、`WHEN` 句が順番に処理されます。最初に一致した `WHEN` 句のみが実行されます。後続の句は無視されます。1 つのターゲットテーブル行が複数のソース行と一致すると、ユーザーエラーが発生します。

ソース行がどの `WHEN` 句にも一致せず、`WHEN NOT MATCHED` 句がない場合、そのソース行は無視されます。

`UPDATE` 演算を含む `WHEN` 句では、列値の式はターゲットまたはソースの任意のフィールドを参照できます。`NOT MATCHED` の場合、`INSERT` の式はソースの任意のフィールドを参照できます。

**例**  
次の例では、行が最初のテーブルに存在しない場合、2 番目のテーブルの行を最初のテーブルにマージしています。`VALUES` 句にリストされている列の先頭には、ソーステーブルのエイリアスを付ける必要があることに注意してください。`INSERT` 句にリストされているターゲット列には、このプレジックスを付けないでください。

```
MERGE INTO iceberg_table_sample as ice1
USING iceberg2_table_sample as ice2
ON ice1.col1 = ice2.col1
WHEN NOT MATCHED 
THEN INSERT (col1)
      VALUES (ice2.col1)
```

その他の `MERGE INTO` 例については、「[Iceberg テーブルデータを更新する](querying-iceberg-updating-iceberg-table-data.md)」を参照してください。

# OPTIMIZE
<a name="optimize-statement"></a>

関連する削除ファイルのサイズと数に基づいて、データファイルをより最適化されたレイアウトに書き換えることにより、Apache Iceberg テーブル内の行を最適化します。

**注記**  
`OPTIMIZE` は Apache Iceberg テーブルでのみサポートされているトランザクションです。

## 構文
<a name="optimize-statement-syntax"></a>

次の構文の概要は、Iceberg テーブルのデータレイアウトを最適化する方法を示しています。

```
OPTIMIZE [db_name.]table_name REWRITE DATA USING BIN_PACK
  [WHERE predicate]
```

**注記**  
`WHERE` 句の*述語*にはパーティション列のみを使用できます。非パーティション列を指定すると、クエリは失敗します。

圧縮アクションは、書き換えプロセス中にスキャンしたデータ量の分だけ課金されます。`REWRITE DATA` アクションは、述語を使用して、一致する行を含むファイルを選択します。ファイル内のいずれかの行が述語と一致する場合、ファイルは最適化のために選択されます。したがって、`WHERE` 句を指定することで、圧縮オペレーションの影響を受けるファイルの数を制御できます。

## 圧縮のプロパティの設定
<a name="optimize-statement-configuring-compaction-properties"></a>

圧縮用に選択するファイルのサイズと、圧縮後の結果のファイルサイズを制御するには、テーブルプロパティパラメータを使用します。[ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) コマンドを使用して、関連する[テーブルプロパティ](querying-iceberg-creating-tables.md#querying-iceberg-table-properties)を設定できます。

## その他のリソース
<a name="optimize-statement-additional-resources"></a>

[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)

# VACUUM
<a name="vacuum-statement"></a>

`VACUUM` ステートメントは、[スナップショットの有効期限切れ](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)と[孤立ファイルの削除](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)を実行して、Apache Iceberg テーブルのテーブルメンテナンスを実行します。

**注記**  
`VACUUM` はトランザクションで、Athena エンジンバージョン 3 の Apache Iceberg テーブルでのみサポートされています。

`VACUUM` ステートメントは、ストレージの消費量を減らすことで Iceberg テーブルを最適化します。`VACUUM` の使用の詳細については、「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。`VACUUM` ステートメントは Amazon S3 に API 呼び出しを行うため、Amazon S3 への関連するリクエストに対して料金がかかることに注意してください。

**警告**  
スナップショット有効期限切れオペレーションを実行すると、期限切れのスナップショットへのタイムトラベルができなくなります。

## 概要
<a name="vacuum-statement-synopsis"></a>

Iceberg テーブルで不要になったデータファイルを削除するには、次の構文を使用します。

```
VACUUM [database_name.]target_table
```
+ `VACUUM` は、Iceberg データが Amazon S3 バケットではなく Amazon S3 フォルダに格納されることを想定しています。例えば、Iceberg データが `s3://amzn-s3-demo-bucket/myicebergfolder/` ではなく `s3://amzn-s3-demo-bucket`/ に格納されている場合、`VACUUM` ステートメントは「GENERIC\$1INTERNAL\$1ERROR: ファイルシステムロケーション: `s3://amzn-s3-demo-bucket` にパスがありません」というエラーで失敗します。
+ `VACUUM` がデータファイルを削除できるようにするには、クエリ実行ロールに、Iceberg テーブル、メタデータ、スナップショット、およびデータファイルが配置されているバケットに対する `s3:DeleteObject` 許可が必要です。許可が存在しない場合、`VACUUM` クエリは成功しますが、ファイルは削除されません。
+ アンダースコアで始まる名前 (例: `_mytable`) を持つテーブルで `VACUUM` を実行するには、次の例にあるようにテーブル名をバックティックで囲みます。テーブル名の前にデータベース名を付ける場合は、データベース名をバックティックで囲まないでください。バックティックの代わりに二重引用符を使用しても機能しないことに注意してください。

  この動作は `VACUUM` に固有の動作です。`CREATE` および `INSERT INTO` ステートメントでは、アンダースコアで始まるテーブル名にバックティックは必要ありません。

  ```
  VACUUM `_mytable`
  VACUUM my_database.`_mytable`
  ```

## 実行されたオペレーション
<a name="vacuum-statement-operations-performed"></a>

`VACUUM` では以下のオペレーションを実行します。
+ `vacuum_max_snapshot_age_seconds` テーブルプロパティで指定された時間よりも古いスナップショットを削除します。デフォルトでは、このプロパティは 432,000 秒 (5 日間) に設定されています。
+ 保持期間に含まれていないスナップショットのうち、`vacuum_min_snapshots_to_keep` テーブルプロパティで指定された数を超えているスナップショットを削除します。デフォルト は 1 です。

  これらのテーブルプロパティは `CREATE TABLE` ステートメントで指定できます。テーブルを作成した後、[ALTER TABLE SET TBLPROPERTIES](querying-iceberg-alter-table-set-properties.md) ステートメントを使用してテーブルを更新できます。
+ スナップショットを削除した結果としてアクセスできなかったメタデータおよびデータファイルをすべて削除します。`vacuum_max_metadata_files_to_keep` テーブルプロパティを設定すると、保持する古いメタデータファイルの数を設定できます。デフォルト値は 100 です。
+ `vacuum_max_snapshot_age_seconds` テーブルプロパティで指定された時間より古い孤立ファイルを削除します。孤立ファイルとは、テーブルのデータディレクトリにある、テーブルステートの一部ではないファイルです。

Athena で Apache Iceberg テーブルを作成および管理する方法については、「[Iceberg テーブルを作成する](querying-iceberg-creating-tables.md)」および「[Iceberg テーブルを管理する](querying-iceberg-managing-tables.md)」を参照してください。

# Athena での EXPLAIN および EXPLAIN ANALYZE の使用
<a name="athena-explain-statement"></a>

`EXPLAIN` ステートメントは、指定された SQL ステートメントの論理実行または分散実行プランを表示、または SQL ステートメントを検証します。結果はテキスト形式での出力、またはグラフへのレンダリングのためのデータ形式での出力が可能です。

**注記**  
`EXPLAIN` 構文を使用せずに、Athena コンソールでクエリの論理プランと分散プランのグラフィック表現を表示できます。詳細については、「[SQL クエリの実行プランを表示する](query-plans.md)」を参照してください。

`EXPLAIN ANALYZE` ステートメントでは、指定した SQL ステートメントの分散実行プランと、SQL クエリ内の各オペレーションに関する計算コストの両方を表示します。結果はテキスト形式または JSON 形式で出力することができます。

## 考慮事項と制限事項
<a name="athena-explain-statement-considerations-and-limitations"></a>

Athena の `EXPLAIN` および `EXPLAIN ANALYZE` ステートメントには、以下の制限があります。
+ `EXPLAIN` クエリはデータをスキャンしないため、Athena はそれらに対する料金を請求しません。ただし、`EXPLAIN` クエリはテーブルメタデータの取得のために AWS Glue を呼び出すので、呼び出し回数が [Glue の無料利用枠制限](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Categories=categories%23analytics&all-free-tier.q=glue&all-free-tier.q_operator=AND)を超える場合に料金が発生する可能性があります。
+ この理由は、`EXPLAIN ANALYZE` クエリが実行されデータをスキャンすると、Athena は、そのスキャンされたデータ量に対して課金をするためです。
+ Lake Formation で定義されている行またはセルのフィルタリング情報、およびクエリの統計情報は、`EXPLAIN` および `EXPLAIN ANALYZE` の出力には表示されません。

## EXPLAIN 構文
<a name="athena-explain-statement-syntax-athena-engine-version-2"></a>

```
EXPLAIN [ ( option [, ...]) ] statement
```

*option* は以下のいずれかにすることができます。

```
FORMAT { TEXT | GRAPHVIZ | JSON }
TYPE { LOGICAL | DISTRIBUTED | VALIDATE | IO }
```

`FORMAT` オプションを指定しない場合、出力はデフォルトで `TEXT` 形式となります。`IO` タイプは、クエリが読み取るテーブルとスキーマに関する情報を提供します。

## EXPLAIN ANALYZE 構文
<a name="athena-explain-analyze-statement"></a>

`EXPLAIN` からの出力に加えて、`EXPLAIN ANALYZE` では、CPU 使用率、入力された行数、出力された行数など、指定したクエリの実行時に関する統計情報も出力します。

```
EXPLAIN ANALYZE [ ( option [, ...]) ] statement
```

*option* は以下のいずれかにすることができます。

```
FORMAT { TEXT | JSON }
```

`FORMAT` オプションを指定しない場合、出力はデフォルトで `TEXT` 形式となります。`EXPLAIN ANALYZE` によるすべてのクエリは `DISTRIBUTED` なので、`EXPLAIN ANALYZE` では `TYPE` オプションを使用することはできません。

*ステートメント*は以下のいずれかになります。

```
SELECT
CREATE TABLE AS SELECT
INSERT
UNLOAD
```

## EXPLAIN での例
<a name="athena-explain-statement-examples"></a>

以下の `EXPLAIN` に関する例では、まず端的なものを示し、その後に、複合型のものへと進みます。

### 例 1: テキスト形式でクエリプランを表示するために、EXPLAIN ステートメントを使用する
<a name="athena-explain-statement-example-text-query-plan"></a>

次の例の `EXPLAIN` では、Elastic Load Balancing ログでの `SELECT` クエリについて、その実行プランを表示します 使用される形式はデフォルトのテキスト出力です。

```
EXPLAIN 
SELECT 
   request_timestamp, 
   elb_name, 
   request_ip 
FROM sampledb.elb_logs;
```

#### 結果
<a name="athena-explain-statement-example-text-query-plan-results"></a>

```
- Output[request_timestamp, elb_name, request_ip] => [[request_timestamp, elb_name, request_ip]]
    - RemoteExchange[GATHER] => [[request_timestamp, elb_name, request_ip]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=sampledb, tableName=elb_logs, 
analyzePartitionValues=Optional.empty}] => [[request_timestamp, elb_name, request_ip]]
                LAYOUT: sampledb.elb_logs
                request_ip := request_ip:string:2:REGULAR
                request_timestamp := request_timestamp:string:0:REGULAR
                elb_name := elb_name:string:1:REGULAR
```

### 例 2: EXPLAIN を使用してクエリプランをグラフ化する
<a name="athena-explain-statement-example-graph-a-query-plan"></a>

Athena コンソールを使用してクエリプランをグラフ化できます。次のような `SELECT` ステートメントを Athena クエリエディタに入力し、**[EXPLAIN]** を選択します。

```
SELECT 
      c.c_custkey,
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey
```

Athena クエリエディタの **[Explain]** ページが開き、クエリの分散プランと論理プランが表示されます。次のグラフは、この例の論理プランを示します。

![\[Athena クエリエディタによってレンダリングされたクエリプランのグラフ。\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/athena-explain-statement-tpch.png)


**重要**  
現在、一部のパーティションフィルターは、Athena がクエリに適用しても、ネストされたオペレーターツリーグラフに表示されない場合があります。このようなフィルターの効果を検証するには、クエリで `EXPLAIN` または `EXPLAIN ANALYZE` を実行し、結果を表示します。

Athena コンソールでクエリプランのグラフ機能を使用する方法の詳細については、「[SQL クエリの実行プランを表示する](query-plans.md)」を参照してください。

### 例 3: EXPLAIN ステートメントを使用してパーティションプルーニングを検証する
<a name="athena-explain-statement-example-verify-partition-pruning"></a>

パーティションされたキーにフィルタリング述語を使用してパーティションテーブルをクエリする場合、クエリエンジンはパーティションされたキーにこの述語を適用して、読み込むデータの量を減らします。

以下の例では、パーティションテーブルでの `SELECT` クエリについてパーティションプルーニングを検証するために `EXPLAIN` クエリを使用します。まず、`CREATE TABLE` ステートメントが `tpch100.orders_partitioned` テーブルを作成します。テーブルは、列 `o_orderdate` でパーティションされます。

```
CREATE TABLE `tpch100.orders_partitioned`(
  `o_orderkey` int, 
  `o_custkey` int, 
  `o_orderstatus` string, 
  `o_totalprice` double, 
  `o_orderpriority` string, 
  `o_clerk` string, 
  `o_shippriority` int, 
  `o_comment` string)
PARTITIONED BY ( 
  `o_orderdate` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/<your_directory_path>/'
```

`SHOW PARTITIONS` コマンドによる表示にあるように、`tpch100.orders_partitioned` テーブルには `o_orderdate` にいくつかのパーティションがあります。

```
SHOW PARTITIONS tpch100.orders_partitioned;

o_orderdate=1994
o_orderdate=2015
o_orderdate=1998
o_orderdate=1995
o_orderdate=1993
o_orderdate=1997
o_orderdate=1992
o_orderdate=1996
```

以下の `EXPLAIN` クエリは、指定された `SELECT` ステートメントでパーティションプルーニングを検証します。

```
EXPLAIN 
SELECT 
   o_orderkey, 
   o_custkey, 
   o_orderdate 
FROM tpch100.orders_partitioned
WHERE o_orderdate = '1995'
```

#### 結果
<a name="athena-explain-statement-example-verify-partition-pruning-results"></a>

```
Query Plan
- Output[o_orderkey, o_custkey, o_orderdate] => [[o_orderkey, o_custkey, o_orderdate]]
    - RemoteExchange[GATHER] => [[o_orderkey, o_custkey, o_orderdate]]
        - TableScan[awsdatacatalog:HiveTableHandle{schemaName=tpch100, tableName=orders_partitioned, 
analyzePartitionValues=Optional.empty}] => [[o_orderkey, o_custkey, o_orderdate]]
                LAYOUT: tpch100.orders_partitioned
                o_orderdate := o_orderdate:string:-1:PARTITION_KEY
                    :: [[1995]]
                o_custkey := o_custkey:int:1:REGULAR
                o_orderkey := o_orderkey:int:0:REGULAR
```

結果にある太字のテキストは、`PARTITION_KEY` に述語 `o_orderdate = '1995'` が適用されたことを示しています。

### 例 4: EXPLAIN クエリを使用して結合順序と結合タイプをチェックする
<a name="athena-explain-statement-example-check-join-order-and-type"></a>

以下の `EXPLAIN` クエリは、`SELECT` ステートメントの結合順序と結合タイプをチェックします。`EXCEEDED_LOCAL_MEMORY_LIMIT` エラーが発生する確率を減らすことができるように、このようなクエリを使用してクエリのメモリ使用量を調べます。

```
EXPLAIN (TYPE DISTRIBUTED)
   SELECT 
      c.c_custkey, 
      o.o_orderkey,
      o.o_orderstatus
   FROM tpch100.customer c 
   JOIN tpch100.orders o 
       ON c.c_custkey = o.o_custkey 
   WHERE c.c_custkey = 123
```

#### 結果
<a name="athena-explain-statement-example-check-join-order-and-type-results"></a>

```
Query Plan
Fragment 0 [SINGLE]
    Output layout: [c_custkey, o_orderkey, o_orderstatus]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - Output[c_custkey, o_orderkey, o_orderstatus] => [[c_custkey, o_orderkey, o_orderstatus]]
        - RemoteSource[1] => [[c_custkey, o_orderstatus, o_orderkey]]

Fragment 1 [SOURCE]
    Output layout: [c_custkey, o_orderstatus, o_orderkey]
    Output partitioning: SINGLE []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - CrossJoin => [[c_custkey, o_orderstatus, o_orderkey]]
            Distribution: REPLICATED
        - ScanFilter[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("c_custkey" = 123)] => [[c_custkey]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
        - LocalExchange[SINGLE] () => [[o_orderstatus, o_orderkey]]
            - RemoteSource[2] => [[o_orderstatus, o_orderkey]]

Fragment 2 [SOURCE]
    Output layout: [o_orderstatus, o_orderkey]
    Output partitioning: BROADCAST []
    Stage Execution Strategy: UNGROUPED_EXECUTION
    - ScanFilterProject[table = awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=orders, analyzePartitionValues=Optional.empty}, grouped = false, 
filterPredicate = ("o_custkey" = 123)] => [[o_orderstatus, o_orderkey]]
            LAYOUT: tpch100.orders
            o_orderstatus := o_orderstatus:string:2:REGULAR
            o_custkey := o_custkey:int:1:REGULAR
            o_orderkey := o_orderkey:int:0:REGULAR
```

このクエリ例は、パフォーマンスを向上させるためにクロス結合に最適化されています。結果は、`tpch100.orders` が `BROADCAST` 分散タイプとして分散されることを示しています。これは、結合オペレーションを実行するすべてのノードに `tpch100.orders` テーブルが分散されることを意味します。`BROADCAST` 分散タイプでは、`tpch100.orders` テーブルのフィルタリングされた結果のすべてが、結合操作を実行する各ノードのメモリに収まることが必要とされています。

ただし、`tpch100.customer` テーブルは `tpch100.orders` よりも小さくなります。`tpch100.customer` に必要なメモリは少ないため、クエリを `tpch100.orders` ではなく `BROADCAST tpch100.customer` に書き直すことができます。これにより、クエリが `EXCEEDED_LOCAL_MEMORY_LIMIT` エラーを受け取る確率が低くなります。この戦略では、以下の点を前提としています。
+ `tpch100.customer.c_custkey` が `tpch100.customer` テーブルで一意である。
+ `tpch100.customer` と `tpch100.orders` の間に 1 対多のマッピング関係がある。

以下の例は、書き直されたクエリを示しています。

```
SELECT 
    c.c_custkey,
    o.o_orderkey,
    o.o_orderstatus
FROM tpch100.orders o
JOIN tpch100.customer c -- the filtered results of tpch100.customer are distributed to all nodes.
    ON c.c_custkey = o.o_custkey 
WHERE c.c_custkey = 123
```

### 例 5: EXPLAIN クエリを使用して効果がない述語を削除する
<a name="athena-explain-statement-example-remove-unneeded-predicates"></a>

`EXPLAIN` クエリを使用して、フィルタリング述語の有効性をチェックすることができます。以下の例にあるように、結果を使用して効果がない述語を削除できます。

```
EXPLAIN
   SELECT 
      c.c_name
   FROM tpch100.customer c
   WHERE c.c_custkey = CAST(RANDOM() * 1000 AS INT)
   AND c.c_custkey BETWEEN 1000 AND 2000
   AND c.c_custkey = 1500
```

#### 結果
<a name="athena-explain-statement-example-remove-unneeded-predicates-results"></a>

```
Query Plan
- Output[c_name] => [[c_name]]
    - RemoteExchange[GATHER] => [[c_name]]
        - ScanFilterProject[table = 
awsdatacatalog:HiveTableHandle{schemaName=tpch100, 
tableName=customer, analyzePartitionValues=Optional.empty}, 
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = 
CAST(("random"() * 1E3) AS int)))] => [[c_name]]
                LAYOUT: tpch100.customer
                c_custkey := c_custkey:int:0:REGULAR
                c_name := c_name:string:1:REGULAR
```

結果にある `filterPredicate` は、オプティマイザが元の 3 つの述語を 2 つの述語にマージし、それらの適用順序を変更したことを示しています。

```
filterPredicate = (("c_custkey" = 1500) AND ("c_custkey" = CAST(("random"() * 1E3) AS int)))
```

結果が述語 `AND c.c_custkey BETWEEN 1000 AND 2000` に効果がないことを示しているので、クエリ結果を変更することなくこの述語を削除できます。

`EXPLAIN` クエリの結果で使用された用語については、「[Athena EXPLAIN ステートメントの結果を理解する](athena-explain-statement-understanding.md)」を参照してください。

## EXPLAIN ANALYZE での例
<a name="athena-explain-analyze-examples"></a>

次に、`EXPLAIN ANALYZE` クエリとその出力に関する例を示します。

### 例 1: クエリプランとコンピューティングのコストをテキスト形式で表示するために、EXPLAIN ANALYZE を使用する
<a name="athena-explain-analyze-example-cflogs-text"></a>

次の例の `EXPLAIN ANALYZE` は、CloudFront ログでの `SELECT` クエリについて、その実行プランとコンピューティングコストを表示します。使用される形式はデフォルトのテキスト出力です。

```
EXPLAIN ANALYZE SELECT FROM cloudfront_logs LIMIT 10
```

#### 結果
<a name="athena-explain-analyze-example-cflogs-text-results"></a>

```
 Fragment 1
     CPU: 24.60ms, Input: 10 rows (1.48kB); per task: std.dev.: 0.00, Output: 10 rows (1.48kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer,\
       os, browser, browserversion]
Limit[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
             Input avg.: 10.00 rows, Input std.dev.: 0.00%
LocalExchange[SINGLE] () => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
 browser, browserversion]]
                 CPU: 0.00ns (0.00%), Output: 10 rows (1.48kB)
                 Input avg.: 0.63 rows, Input std.dev.: 387.30%
RemoteSource[2] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
                     CPU: 1.00ms (0.03%), Output: 10 rows (1.48kB)
                     Input avg.: 0.63 rows, Input std.dev.: 387.30%

 Fragment 2
     CPU: 3.83s, Input: 998 rows (147.21kB); per task: std.dev.: 0.00, Output: 20 rows (2.95kB)
     Output layout: [date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
       browser, browserversion]
LimitPartial[10] => [[date, time, location, bytes, requestip, method, host, uri, status, referrer, os,\
  browser, browserversion]]
             CPU: 5.00ms (0.13%), Output: 20 rows (2.95kB)
             Input avg.: 166.33 rows, Input std.dev.: 141.42%
TableScan[awsdatacatalog:HiveTableHandle{schemaName=default, tableName=cloudfront_logs,\
  analyzePartitionValues=Optional.empty}, 
grouped = false] => [[date, time, location, bytes, requestip, method, host, uri, st
                 CPU: 3.82s (99.82%), Output: 998 rows (147.21kB)
                 Input avg.: 166.33 rows, Input std.dev.: 141.42%
                 LAYOUT: default.cloudfront_logs
                 date := date:date:0:REGULAR
                 referrer := referrer:string:9:REGULAR
                 os := os:string:10:REGULAR
                 method := method:string:5:REGULAR
                 bytes := bytes:int:3:REGULAR
                 browser := browser:string:11:REGULAR
                 host := host:string:6:REGULAR
                 requestip := requestip:string:4:REGULAR
                 location := location:string:2:REGULAR
                 time := time:string:1:REGULAR
                 uri := uri:string:7:REGULAR
                 browserversion := browserversion:string:12:REGULAR
                 status := status:int:8:REGULAR
```

### 例 2: クエリプランを JSON 形式で表示するために、EXPLAIN ANALYZE を使用する
<a name="athena-explain-analyze-example-cflogs-json"></a>

次の例は、CloudFront ログでの `SELECT` クエリについて、その実行プランとコンピューティングコストを表示します。この例では、出力形式として JSON を指定しています。

```
EXPLAIN ANALYZE (FORMAT JSON) SELECT * FROM cloudfront_logs LIMIT 10
```

#### 結果
<a name="athena-explain-analyze-example-cflogs-json-results"></a>

```
{ 
    "fragments": [{ 
        "id": "1", 
 
        "stageStats": { 
            "totalCpuTime": "3.31ms", 
            "inputRows": "10 rows", 
            "inputDataSize": "1514B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host,\
           uri, status, referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "Limit", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                  "uri", "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 10.0, 
                        "nodeInputRowsStdDev": 0.0 
                    }] 
                }, 
                "children": [{ 
                    "name": "LocalExchange", 
                    "identifier": "[SINGLE] ()", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                      "uri", "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "0.00ns", 
                        "nodeOutputRows": 10, 
                        "nodeOutputDataSize": "1514B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 0.625, 
                            "nodeInputRowsStdDev": 387.2983346207417 
                        }] 
                    }, 
                    "children": [{ 
                        "name": "RemoteSource", 
                        "identifier": "[2]", 
                        "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host",\
                          "uri", "status", "referrer", "os", "browser", "browserversion"], 
                        "details": "", 
                        "distributedNodeStats": { 
                            "nodeCpuTime": "0.00ns", 
                            "nodeOutputRows": 10, 
                            "nodeOutputDataSize": "1514B", 
                            "operatorInputRowsStats": [{ 
                                "nodeInputRows": 0.625, 
                                "nodeInputRowsStdDev": 387.2983346207417 
                            }] 
                        }, 
                        "children": [] 
                    }] 
                }] 
            }] 
        } 
    }, { 
        "id": "2", 
 
        "stageStats": { 
            "totalCpuTime": "1.62s", 
            "inputRows": "500 rows", 
            "inputDataSize": "75564B", 
            "stdDevInputRows": "0.00", 
            "outputRows": "10 rows", 
            "outputDataSize": "1514B" 
        }, 
        "outputLayout": "date, time, location, bytes, requestip, method, host, uri, status,\
           referrer, os, browser, browserversion", 
 
        "logicalPlan": { 
            "1": [{ 
                "name": "LimitPartial", 
                "identifier": "[10]", 
                "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                  "status", "referrer", "os", "browser", "browserversion"], 
                "details": "", 
                "distributedNodeStats": { 
                    "nodeCpuTime": "0.00ns", 
                    "nodeOutputRows": 10, 
                    "nodeOutputDataSize": "1514B", 
                    "operatorInputRowsStats": [{ 
                        "nodeInputRows": 83.33333333333333, 
                        "nodeInputRowsStdDev": 223.60679774997897 
                    }] 
                }, 
                "children": [{ 
                    "name": "TableScan", 
                    "identifier": "[awsdatacatalog:HiveTableHandle{schemaName=default,\
                       tableName=cloudfront_logs, analyzePartitionValues=Optional.empty},\
                       grouped = false]", 
                    "outputs": ["date", "time", "location", "bytes", "requestip", "method", "host", "uri",\
                       "status", "referrer", "os", "browser", "browserversion"], 
                    "details": "LAYOUT: default.cloudfront_logs\ndate := date:date:0:REGULAR\nreferrer :=\
                       referrer: string:9:REGULAR\nos := os:string:10:REGULAR\nmethod := method:string:5:\
                       REGULAR\nbytes := bytes:int:3:REGULAR\nbrowser := browser:string:11:REGULAR\nhost :=\
                       host:string:6:REGULAR\nrequestip := requestip:string:4:REGULAR\nlocation :=\
                       location:string:2:REGULAR\ntime := time:string:1: REGULAR\nuri := uri:string:7:\
                       REGULAR\nbrowserversion := browserversion:string:12:REGULAR\nstatus :=\
                       status:int:8:REGULAR\n", 
                    "distributedNodeStats": { 
                        "nodeCpuTime": "1.62s", 
                        "nodeOutputRows": 500, 
                        "nodeOutputDataSize": "75564B", 
                        "operatorInputRowsStats": [{ 
                            "nodeInputRows": 83.33333333333333, 
                            "nodeInputRowsStdDev": 223.60679774997897 
                        }] 
                    }, 
                    "children": [] 
                }] 
            }] 
        } 
    }] 
}
```

## その他のリソース
<a name="athena-explain-statement-additional-resources"></a>

詳細については、次のリソースを参照してください。
+  [Athena EXPLAIN ステートメントの結果を理解する](athena-explain-statement-understanding.md)
+  [SQL クエリの実行プランを表示する](query-plans.md)
+  [完了したクエリの統計と実行の詳細を表示する](query-stats.md)
+ Trino の「[https://trino.io/docs/current/sql/explain.html](https://trino.io/docs/current/sql/explain.html)」ドキュメント
+ Trino の「[https://trino.io/docs/current/sql/explain-analyze.html](https://trino.io/docs/current/sql/explain-analyze.html)」ドキュメント
+  *AWS Big Data Blog* の「[Optimize Federated Query Performance using EXPLAIN and EXPLAIN ANALYZE in Amazon Athena](https://aws.amazon.com/blogs/big-data/optimize-federated-query-performance-using-explain-and-explain-analyze-in-amazon-athena/)」。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/7JUyTqglmNU/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/7JUyTqglmNU)


# Athena EXPLAIN ステートメントの結果を理解する
<a name="athena-explain-statement-understanding"></a>

このトピックでは、Athena `EXPLAIN` ステートメントの結果で使用されるオペレーション用語の概要を説明します。

## EXPLAIN ステートメントの出力タイプ
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN` ステートメントの出力は、以下の 2 つのタイプのいずれかになります。
+ **論理プラン** – SQL エンジンがステートメントの実行に使用する論理プランを表示します。このオプションの構文は `EXPLAIN` または `EXPLAIN (TYPE LOGICAL)` です。
+ **分散プラン** – 分散環境での実行プランを表示します。出力には、処理ステージであるフラグメントが表示されます。各プランフラグメントは、1 つ、または複数のノードによって処理されます。データは、フラグメントを処理するノード間で交換できます。このオプションの構文は `EXPLAIN (TYPE DISTRIBUTED)` です。

  分散プランの出力では、フラグメント (処理ステージ) は `Fragment` *number* [*fragment\$1type*] により表されます。この時、*number* はゼロから始まる整数であり、*fragment\$1type* はフラグメントがノードによってどのように実行されるかを指定します。以下の表では、データ交換のレイアウトに関する洞察を提供するフラグメントタイプが説明されています。  
**分散プランのフラグメントタイプ**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-explain-statement-understanding.html)

## Exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

Exchange 関連の用語は、データがワーカーノード間でどのように交換されるかを表します。転送はローカルまたはリモートのいずれかです。

**LocalExchange [*exchange\$1type*] **  
クエリのさまざまなステージで、データをワーカーノード内でローカルに転送します。*exchange\$1type* の値は、このセクションで後ほど説明する論理交換タイプまたは分散交換タイプのいずれかになります。

**RemoteExchange [*exchange\$1type*] **  
クエリのさまざまなステージで、データをワーカーノード間で転送します。*exchange\$1type* の値は、このセクションで後ほど説明する論理交換タイプまたは分散交換タイプのいずれかになります。

### 論理交換タイプ
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

以下の交換タイプは、論理プランの交換フェーズで実行されるアクションを説明します。
+ **`GATHER`** – 単一のワーカーノードが、他のすべてのワーカーノードからの出力を収集します。例えば、選択クエリの最後のステージでは、すべてのノードから結果が収集され、その結果が Amazon S3 に書き込まれます。
+ **`REPARTITION`** – 次の演算子への適用に必要なパーティショニングスキームに基づいて、行データを特定のワーカーに送信します。
+ **`REPLICATE`** – 行データをすべてのワーカーにコピーします。

### 分散交換タイプ
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

以下の交換タイプは、データが分散プラン内のノード間で交換されるときのデータのレイアウトを示します。
+ **`HASH`** – この交換は、ハッシュ関数を使用して複数の宛先にデータを分散します。
+ **`SINGLE`** – この交換は、データを単一の宛先に分散します。

## スキャニング
<a name="athena-explain-statement-understanding-scanning"></a>

以下の用語は、クエリ中にデータがどのようにスキャンされるかを説明します。

**TableScan **  
Amazon S3 または Apache Hive コネクタからテーブルのソースデータをスキャンし、フィルタ述語から生成されたパーティションプルーニングを適用します。

**ScanFilter **  
Amazon S3 または Hive コネクタからテーブルのソースデータをスキャンし、フィルタ述語から生成されたパーティションプルーニングと、パーティションプルーニング経由で適用されない追加のフィルタ述語から生成されたパーティションプルーニングを適用します。

**ScanFilterProject **  
最初に、Amazon S3 または Hive コネクタからテーブルのソースデータをスキャンし、フィルタ述語から生成されたパーティションプルーニングと、パーティションプルーニング経由で適用されない追加のフィルタ述語から生成されたパーティションプルーニングを適用します。次に、出力データのメモリレイアウトを新しい射影に変更して、後続ステージのパフォーマンスを向上させます。

## 結合
<a name="athena-explain-statement-understanding-join"></a>

2 つのテーブル間でデータを結合します。結合は、結合タイプおよび分散タイプ別に分類できます。

### 結合の種類
<a name="athena-explain-statement-understanding-join-types"></a>

結合タイプは、結合オペレーションの実行方法を定義します。

**CrossJoin** – 結合された 2 つのテーブルのデカルト積を生成します。

**InnerJoin** – 両方のテーブルに一致する値を持つレコードを選択します。

**LeftJoin** – 左側のテーブルからのすべてのレコードと、右側のテーブルからの一致するレコードを選択します。一致するレコードがない場合、右側の結果は NULL になります。

**RightJoin** – 右側のテーブルからのすべてのレコードと、左側のテーブルからの一致するレコードを選択します。一致するレコードがない場合、左側の結果は NULL になります。

**FullJoin** – 左または右のテーブルのレコードに一致するものがあるすべてのレコードを選択します。結合されたテーブルには両方のテーブルからのすべてのレコードが含まれ、どちらかのテーブルで一致するレコードが欠落していれば NULL が入力されます。

**注記**  
パフォーマンス上の理由から、クエリエンジンは、結合クエリを異なる結合タイプに書き直して、同じ結果を生成することができます。例えば、1 つのテーブルでの述語を使用した内部結合クエリは、`CrossJoin` に書き直すことができます。これは、スキャンされるデータを少なくするために、述語をテーブルのスキャンフェーズにプッシュダウンします。

### 結合の分散タイプ
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

分散タイプは、結合オペレーションの実行時に、データがワーカーノード間でどのように交換されるかを定義します。

**パーティション** – 左と右の両方のテーブルが、すべてのワーカーノード全体でハッシュパーティション分割されます。パーティション分散では、各ノードで消費されるメモリが少なくなります。パーティション分散は、レプリケート結合よりもはるかに遅くなる可能性があります。パーティション結合は、2 つの大きなテーブルを結合する場合に適しています。

**レプリケート** – 一方のテーブルがすべてのワーカーノード全体でハッシュパーティション分割され、もう一方のテーブルは、結合操作を実行するために、すべてのワーカーノードにレプリケートされます。レプリケート分散はパーティション結合よりもはるかに高速ですが、各ワーカーノードで消費されるメモリが多くなります。レプリケートされたテーブルが大きすぎる場合は、ワーカーノードでメモリ不足エラーが発生する可能性があります。レプリケート結合は、結合されたテーブルの 1 つが小さい場合に適しています。

# PREPARE
<a name="sql-prepare"></a>

後で実行するために、名前 `statement_name` で SQL ステートメントを作成します。ステートメントには、疑問符で表されるパラメータを含めることができます。パラメータの値を指定してプリペアドステートメントを実行するには、[EXECUTE](sql-execute.md) を使用します。

## 概要
<a name="sql-prepare-synopsis"></a>

```
PREPARE statement_name FROM statement
```

次の表は、パラメータの説明です。


****  

| パラメータ  | 説明 | 
| --- | --- | 
| statement\$1name | 準備されるステートメントの名前です。この名前は、ワークグループ内で一意である必要があります。 | 
| statement | SELECT、CTAS、または INSERT INTO クエリです。 | 

**注記**  
ワークグループ内の準備済みステートメントの最大数は 1,000 です。

## 例
<a name="sql-prepare-examples"></a>

次の例では、パラメータなしで選択クエリを準備します。

```
PREPARE my_select1 FROM 
SELECT * FROM nation
```

次の例では、パラメータを含む選択クエリを準備します。`productid` および `quantity` の値は、`EXECUTE` ステートメントの `USING` 句によって指定されます。

```
PREPARE my_select2 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ?
```

次の例では、挿入クエリを準備します。

```
PREPARE my_insert FROM 
INSERT INTO cities_usa (city, state) 
SELECT city, state 
FROM cities_world 
WHERE country = ?
```

## 追加リソース
<a name="sql-prepare-additional-resources"></a>

[プリペアドステートメントを使用する](querying-with-prepared-statements-querying.md)

[EXECUTE](sql-execute.md)

[DEALLOCATE PREPARE](sql-deallocate-prepare.md)

[INSERT INTO](insert-into.md)

# EXECUTE
<a name="sql-execute"></a>

`statement_name` という名前のプリペアドステートメントを実行します。プリペアドステートメントの疑問符のパラメータ値は、カンマ区切りのリストの `USING` 句で定義されています。プリペアドステートメントを作成するには、[PREPARE](sql-prepare.md) を使用します。

## 概要
<a name="sql-execute-synopsis"></a>

```
EXECUTE statement_name [ USING parameter1[, parameter2, ... ] ]
```

## 例
<a name="sql-execute-examples"></a>

次の例は、パラメータがないクエリを準備し、実行します。

```
PREPARE my_select1 FROM 
SELECT name FROM nation 
EXECUTE my_select1
```

次の例は、単一のパラメータがあるクエリを準備し、実行します。

```
PREPARE my_select2 FROM 
SELECT * FROM "my_database"."my_table" WHERE year = ? 
EXECUTE my_select2 USING 2012
```

これは次に相当します:

```
SELECT * FROM "my_database"."my_table" WHERE year = 2012
```

次の例は、2 つのパラメータを持つクエリを準備し、実行します。

```
PREPARE my_select3 FROM 
SELECT order FROM orders WHERE productid = ? and quantity < ? 
EXECUTE my_select3 USING 346078, 12
```

## 追加リソース
<a name="sql-execute-additional-resources"></a>

[プリペアドステートメントを使用する](querying-with-prepared-statements-querying.md)

[PREPARE](sql-prepare.md)

[INSERT INTO](insert-into.md)

# DEALLOCATE PREPARE
<a name="sql-deallocate-prepare"></a>

現在のワークグループの準備済みステートメントから、指定された名前を持つ準備済みステートメントを削除します。

## 概要
<a name="sql-deallocate-prepare-synopsis"></a>

```
DEALLOCATE PREPARE statement_name
```

## 例
<a name="sql-deallocate-prepare-examples"></a>

以下の例では、現在のワークグループから `my_select1` 準備済みステートメントを削除しています。

```
DEALLOCATE PREPARE my_select1
```

## 追加リソース
<a name="sql-deallocate-prepare-additional-resources"></a>

[プリペアドステートメントを使用する](querying-with-prepared-statements-querying.md)

[PREPARE](sql-prepare.md)

# UNLOAD
<a name="unload"></a>

`SELECT` ステートメントからのクエリ結果を指定したデータ形式に書き込みます。`UNLOAD` でサポートされる形式には Apache Parquet、ORC、Apache Avro、および JSON が含まれます。CSV は Athena `SELECT` コマンドがサポートする唯一の出力形式ですが、さまざまな出力形式をサポートする `UNLOAD` コマンドを使用して `SELECT` クエリを囲み、クエリの出力を `UNLOAD` がサポートする形式のいずれかに書き換えることができます。

`CREATE TABLE AS` (CTAS) ステートメントを使用して CSV 以外の形式でデータを出力できますが、CTAS ステートメントでは Athena でテーブルを作成する必要があります。`UNLOAD` ステートメントは、`SELECT` クエリの結果を非 CSV 形式で出力したいが、関連付けられたテーブルを必要としない場合に便利です。たとえば、ダウンストリームアプリケーションでは、`SELECT` クエリの結果を JSON 形式にする必要があります。また、`SELECT` クエリの結果を追加の分析に使用する場合は、Parquet や ORC の方が CSV よりもパフォーマンス面での利点を得られる可能性があります。

## 考慮事項と制限事項
<a name="unload-considerations-and-limitations"></a>

Athena で `UNLOAD` ステートメント使用するときは、次の点に注意してください。
+ **ファイルのグローバルな順序付けがありません** - `UNLOAD` 結果が複数のファイルに並行して書き込まれます。`UNLOAD` ステートメントの `SELECT` クエリでソート順序が指定されている場合、各ファイルの内容はソート順序になりますが、ファイル同士は互いにソートされません。
+ **孤立したデータが削除されません** - 障害が発生した場合、Athena は孤立したデータの削除を試みません。この動作は、CTAS および `INSERT INTO` ステートメントの動作と同じです。
+ **最大パーティション数** - `UNLOAD` で使用できるパーティションの最大数は 100 です。
+ **メタデータおよびマニフェストファイル** - Athena が、`UNLOAD` クエリごとにメタデータファイルとデータマニフェストファイルを生成します。マニフェストは、クエリが書き込んだファイルを追跡します。両方のファイルが、Amazon S3 の Athena クエリ結果の場所に保存されます。詳細については、「[クエリ出力ファイルを識別する](querying-finding-output-files.md#querying-identifying-output-files)」を参照してください。
+ **暗号化** - `UNLOAD` 出力ファイルが、Amazon S3 で使用される暗号化設定に従って暗号化されます。暗号化設定を設定して `UNLOAD` 結果を暗号化するには、[EncryptionConfiguration API](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html) を使用します。
+ **準備済みステートメント** - `UNLOAD` は、準備済みステートメントで使用できます。Athena での準備済みステートメントの詳細については、「[パラメータ化されたクエリを使用する](querying-with-prepared-statements.md)」を参照してください。
+ **サービスクォータ** - `UNLOAD` は、DML クエリクォータを使用します。クオータの詳細については、「[サービスクォータ](service-limits.md)」を参照してください。
+ **予想されるバケット所有者** — 予想されるバケット所有者の設定は、`UNLOAD` クエリで指定された送信先の Amazon S3 の場所には適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「[Athena コンソールを使用してクエリ結果の場所を指定する](query-results-specify-location-console.md)」を参照してください。

## 構文
<a name="unload-syntax"></a>

`UNLOAD` ステートメントでは、次の構文を使用します。

```
UNLOAD (SELECT col_name[, ...] FROM old_table) 
TO 's3://amzn-s3-demo-bucket/my_folder/' 
WITH ( property_name = 'expression' [, ...] )
```

パーティションに書き込む場合を除き、`TO` 書き込み先にはデータのない Amazon S3 ロケーションを指定する必要があります。`UNLOAD` クエリが、指定された場所に書き込む前に、バケットの場所が空であることを確認します。`UNLOAD` は、指定された場所にデータがすでに存在する場合、その場所にデータを書き込まないので、`UNLOAD`が既存のデータを上書きすることはありません。バケットの場所を `UNLOAD` の送信先として再利用するには、バケットの場所にあるデータを削除して、クエリを再度実行します。

`UNLOAD` がパーティションにき込む場合、これとは異なる動作になることに注意してください。同じ `SELECT` ステートメント、同じ `TO` ロケーション、および同じパーティションを持つ同一の `UNLOAD` クエリを複数回実行する場合、各 `UNLOAD` クエリはそのロケーションにある Amazon S3 と指定されたパーティションにデータをアンロードします。

### パラメータ
<a name="unload-parameters"></a>

*property\$1name* に使用できる値は次のとおりです。

** 形式 =「*file\$1format*」 **  
必須。出力のファイル形式を指定します。*file\$1format* に使用できる値は、`ORC`、`PARQUET`、`AVRO`、`JSON`、 または`TEXTFILE` です。

** 圧縮 =「*compression\$1format*」 **  
オプション。このオプションは、ORC および Parquet 形式に固有のものです。ORC の場合、デフォルトは `zlib` で、Parquet の場合、デフォルトは `gzip` です。サポートされている圧縮形式については、「[Athena 圧縮サポート](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html)」を参照してください。  
このオプションは、`AVRO` 形式には適用されません。Athena が、`JSON` および `TEXTFILE` 形式に `gzip` を使用します。

**compression\$1level = *compression\$1level* **  
オプション。ZSTD 圧縮に使用する圧縮レベル。このプロパティは、ZSTD 圧縮にのみ適用されます。詳細については、「[ZSTD 圧縮レベルを使用する](compression-support-zstd-levels.md)」を参照してください。

** field\$1delimiter =「*delimiter*」 **  
オプション。CSV、TSV、およびその他のテキスト形式のファイルのための単一文字のフィールド区切り文字を指定します。次に示す例では、カンマ区切り文字を指定しています。  

```
WITH (field_delimiter = ',')
```
現在、複数文字のフィールド区切り文字はサポートされていません。フィールド区切り文字を指定しない場合、8 進文字 `\001` (^A) が使用されます。

** partitioned\$1by = ARRAY[ *col\$1name*[,...]] **  
オプション。出力をパーティション化する列の配列リスト。  
`SELECT` ステートメントでは、パーティション化された列の名前は、列のリストの最後に記述されていることを確認してください。

## 例
<a name="unload-examples"></a>

次の例では、JSON 形式を使用して `SELECT` クエリの出力を Amazon S3 の場所 `s3://amzn-s3-demo-bucket/unload_test_1/` に書き込みます。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/unload_test_1/' 
WITH (format = 'JSON')
```

次の例では、Snappy 圧縮を使用して `SELECT` クエリの出力を Parquet 形式で書き込みます。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET',compression = 'SNAPPY')
```

次の例では、出力が最後の列でパーティション化された状態で、4 つの列をテキスト形式で書き込みます。

```
UNLOAD (SELECT name1, address1, comment1, key1 FROM table1) 
TO 's3://amzn-s3-demo-bucket/ partitioned/' 
WITH (format = 'TEXTFILE', partitioned_by = ARRAY['key1'])
```

次の例では、Parquet ファイル形式、ZSTD 圧縮、および ZSTD 圧縮レベル 4 を使用して、クエリ結果を指定された場所にアンロードします。

```
UNLOAD (SELECT * FROM old_table) 
TO 's3://amzn-s3-demo-bucket/' 
WITH (format = 'PARQUET', compression = 'ZSTD', compression_level = 4)
```

## その他のリソース
<a name="unload-additional-resources"></a>
+ *AWS Big Data Blog* の「[Simplify your ETL and ML pipelines using the Amazon Athena UNLOAD feature](https://aws.amazon.com/blogs/big-data/simplify-your-etl-and-ml-pipelines-using-the-amazon-athena-unload-feature/)」。

# Amazon Athena の関数
<a name="functions"></a>

Athena エンジンのバージョンに関する詳細については、「[Athena エンジンのバージョニング](engine-versions.md)」を参照してください。`AT TIME ZONE` 演算子で使用できるタイムゾーンのリストについては、「[サポートされているタイムゾーンを使用する](athena-supported-time-zones.md)」を参照してください。

**Topics**
+ [Athena エンジンバージョン 3](functions-env3.md)

# Athena エンジンバージョン 3 の関数
<a name="functions-env3"></a>

Athena エンジンバージョン 3 の関数は Trino に基づいています。Trino の関数、演算子、および式については、Trino ドキュメントの「[Functions and operators](https://trino.io/docs/current/functions.html)」(関数と演算子) とそのサブセクションを参照してください。
+  [Aggregate](https://trino.io/docs/current/functions/aggregate.html) 
+  [配列](https://trino.io/docs/current/functions/array.html) 
+  [バイナリ](https://trino.io/docs/current/functions/binary.html) 
+  [ビット操作](https://trino.io/docs/current/functions/bitwise.html) 
+  [Color](https://trino.io/docs/current/functions/color.html) 
+  [比較](https://trino.io/docs/current/functions/comparison.html) 
+  [条件付き](https://trino.io/docs/current/functions/conditional.html) 
+  [変換](https://trino.io/docs/current/functions/conversion.html) 
+  [日付および時間](https://trino.io/docs/current/functions/datetime.html) 
+  [10 進数](https://trino.io/docs/current/functions/decimal.html) 
+  [地理空間](https://trino.io/docs/current/functions/geospatial.html) 
+  [HyperLogLog](https://trino.io/docs/current/functions/hyperloglog.html) 
+  [IP アドレス](https://trino.io/docs/current/functions/ipaddress.html) 
+  [JSON](https://trino.io/docs/current/functions/json.html) 
+  [Lambda](https://trino.io/docs/current/functions/lambda.html) 
+  [論理](https://trino.io/docs/current/functions/logical.html) 
+  [機械学習](https://trino.io/docs/current/functions/ml.html) 
+  [マッピング](https://trino.io/docs/current/functions/map.html) 
+  [数値演算](https://trino.io/docs/current/functions/math.html) 
+  [分位点ダイジェスト](https://trino.io/docs/current/functions/qdigest.html) 
+  [正規表現](https://trino.io/docs/current/functions/regexp.html) 
+  [セッション](https://trino.io/docs/current/functions/session.html) 
+  [セットダイジェスト](https://trino.io/docs/current/functions/setdigest.html) 
+  [文字列](https://trino.io/docs/current/functions/string.html) 
+  [[テーブル]](https://trino.io/docs/current/functions/table.html) 
+  [Teradata](https://trino.io/docs/current/functions/teradata.html) 
+  [T ダイジェスト](https://trino.io/docs/current/functions/tdigest.html) 
+  [[URL]](https://trino.io/docs/current/functions/url.html) 
+  [UUID](https://trino.io/docs/current/functions/uuid.html) 
+  [Window](https://trino.io/docs/current/functions/window.html) 

## invoker\$1principal() 関数
<a name="functions-env3-invoker-principal"></a>

この `invoker_principal` 関数は Athena エンジンバージョン 3 に固有のもので、Trino にはありません。

関数を呼び出すクエリを実行したプリンシパル (IAM ロールまたは アイデンティティセンター ID) の ARN を含む `VARCHAR` を返します。例えば、クエリ呼び出し元が IAM ロールのアクセス許可を使用してクエリを実行する場合、関数は IAM ロールの ARN を返します。クエリを実行するロールは、`LakeFormation:GetDataLakePrincipal` アクションを許可する必要があります。

### 使用方法
<a name="functions-invoker-principal-usage"></a>

```
SELECT invoker_principal()
```

次の表は結果の例を示しています。


****  

| \$1 | \$1col0 | 
| --- | --- | 
| 1 | arn:aws:iam::111122223333:role/Admin | 

# サポートされているタイムゾーンを使用する
<a name="athena-supported-time-zones"></a>

次の例にあるように、`AT TIME ZONE` 演算子を `SELECT timestamp` ステートメントで使用して、返されるタイムスタンプのタイムゾーンを指定します。

```
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles' AS la_time;
```

**結果**

```
la_time

2012-10-30 18:00:00.000 America/Los_Angeles
```

Athena でサポートされているタイムゾーンのリストについては、このトピックの最後にある [サポートされているタイムゾーンを一覧表示する](#athena-supported-time-zones-list) を展開してください。

## タイムゾーン関数と例
<a name="athena-supported-time-zones-functions-examples"></a>

追加のタイムゾーン関連の関数と例を次に示します。
+ **at\$1timezone(*timestamp*、*zone*)** – *zone* について、対応する現地時間の *timestamp* の値を返します。

  **例**

  ```
  SELECT at_timezone(timestamp '2021-08-22 00:00 UTC', 'Canada/Newfoundland')
  ```

  **結果**

  ```
  2021-08-21 21:30:00.000 Canada/Newfoundland
  ```
+ **timezone\$1hour(*timestamp*)** – timestamp からオフセットされたタイムゾーンの時間を `bigint` として返します。

  **例**

  ```
  SELECT timezone_hour(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **結果**

  ```
  -2
  ```
+ **timezone\$1minute(*timestamp*)** – *timestamp* からオフセットされたタイムゾーンの分を `bigint` として返します。

  **例**

  ```
  SELECT timezone_minute(timestamp '2021-08-22 04:00 UTC' AT TIME ZONE 'Canada/Newfoundland')
  ```

  **結果**

  ```
  -30
  ```
+ **with\$1timezone(*timestamp*, *zone*)** – 指定された *timestamp* と *zone* の値からタイムゾーン付きのタイムスタンプを返します。

  **例**

  ```
  SELECT with_timezone(timestamp '2021-08-22 04:00', 'Canada/Newfoundland')
  ```

  **結果**

  ```
  2021-08-22 04:00:00.000 Canada/Newfoundland
  ```

## サポートされているタイムゾーンを一覧表示する
<a name="athena-supported-time-zones-list"></a>

以下のリストには、Athena で `AT TIME ZONE` 演算子に使用できるタイムゾーンが記載されています。その他のタイムゾーン関連の関数および例については、「[タイムゾーン関数と例](#athena-supported-time-zones-functions-examples)」を参照してください。

```
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
Africa/Djibouti
Africa/Douala
Africa/El_Aaiun
Africa/Freetown
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Juba
Africa/Kampala
Africa/Khartoum
Africa/Kigali
Africa/Kinshasa
Africa/Lagos
Africa/Libreville
Africa/Lome
Africa/Luanda
Africa/Lubumbashi
Africa/Lusaka
Africa/Malabo
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Mogadishu
Africa/Monrovia
Africa/Nairobi
Africa/Ndjamena
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Porto-Novo
Africa/Sao_Tome
Africa/Timbuktu
Africa/Tripoli
Africa/Tunis
Africa/Windhoek
America/Adak
America/Anchorage
America/Anguilla
America/Antigua
America/Araguaina
America/Argentina/Buenos_Aires
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Argentina/Cordoba
America/Argentina/Jujuy
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/Rio_Gallegos
America/Argentina/Salta
America/Argentina/San_Juan
America/Argentina/San_Luis
America/Argentina/Tucuman
America/Argentina/Ushuaia
America/Aruba
America/Asuncion
America/Atikokan
America/Atka
America/Bahia
America/Bahia_Banderas
America/Barbados
America/Belem
America/Belize
America/Blanc-Sablon
America/Boa_Vista
America/Bogota
America/Boise
America/Buenos_Aires
America/Cambridge_Bay
America/Campo_Grande
America/Cancun
America/Caracas
America/Catamarca
America/Cayenne
America/Cayman
America/Chicago
America/Chihuahua
America/Coral_Harbour
America/Cordoba
America/Costa_Rica
America/Creston
America/Cuiaba
America/Curacao
America/Danmarkshavn
America/Dawson
America/Dawson_Creek
America/Denver
America/Detroit
America/Dominica
America/Edmonton
America/Eirunepe
America/El_Salvador
America/Ensenada
America/Fort_Nelson
America/Fort_Wayne
America/Fortaleza
America/Glace_Bay
America/Godthab
America/Goose_Bay
America/Grand_Turk
America/Grenada
America/Guadeloupe
America/Guatemala
America/Guayaquil
America/Guyana
America/Halifax
America/Havana
America/Hermosillo
America/Indiana/Indianapolis
America/Indiana/Knox
America/Indiana/Marengo
America/Indiana/Petersburg
America/Indiana/Tell_City
America/Indiana/Vevay
America/Indiana/Vincennes
America/Indiana/Winamac
America/Indianapolis
America/Inuvik
America/Iqaluit
America/Jamaica
America/Jujuy
America/Juneau
America/Kentucky/Louisville
America/Kentucky/Monticello
America/Knox_IN
America/Kralendijk
America/La_Paz
America/Lima
America/Los_Angeles
America/Louisville
America/Lower_Princes
America/Maceio
America/Managua
America/Manaus
America/Marigot
America/Martinique
America/Matamoros
America/Mazatlan
America/Mendoza
America/Menominee
America/Merida
America/Metlakatla
America/Mexico_City
America/Miquelon
America/Moncton
America/Monterrey
America/Montevideo
America/Montreal
America/Montserrat
America/Nassau
America/New_York
America/Nipigon
America/Nome
America/Noronha
America/North_Dakota/Beulah
America/North_Dakota/Center
America/North_Dakota/New_Salem
America/Ojinaga
America/Panama
America/Pangnirtung
America/Paramaribo
America/Phoenix
America/Port-au-Prince
America/Port_of_Spain
America/Porto_Acre
America/Porto_Velho
America/Puerto_Rico
America/Punta_Arenas
America/Rainy_River
America/Rankin_Inlet
America/Recife
America/Regina
America/Resolute
America/Rio_Branco
America/Rosario
America/Santa_Isabel
America/Santarem
America/Santiago
America/Santo_Domingo
America/Sao_Paulo
America/Scoresbysund
America/Shiprock
America/Sitka
America/St_Barthelemy
America/St_Johns
America/St_Kitts
America/St_Lucia
America/St_Thomas
America/St_Vincent
America/Swift_Current
America/Tegucigalpa
America/Thule
America/Thunder_Bay
America/Tijuana
America/Toronto
America/Tortola
America/Vancouver
America/Virgin
America/Whitehorse
America/Winnipeg
America/Yakutat
America/Yellowknife
Antarctica/Casey
Antarctica/Davis
Antarctica/DumontDUrville
Antarctica/Macquarie
Antarctica/Mawson
Antarctica/McMurdo
Antarctica/Palmer
Antarctica/Rothera
Antarctica/South_Pole
Antarctica/Syowa
Antarctica/Troll
Antarctica/Vostok
Arctic/Longyearbyen
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
Asia/Aqtobe
Asia/Ashgabat
Asia/Ashkhabad
Asia/Atyrau
Asia/Baghdad
Asia/Bahrain
Asia/Baku
Asia/Bangkok
Asia/Barnaul
Asia/Beirut
Asia/Bishkek
Asia/Brunei
Asia/Calcutta
Asia/Chita
Asia/Choibalsan
Asia/Chongqing
Asia/Chungking
Asia/Colombo
Asia/Dacca
Asia/Damascus
Asia/Dhaka
Asia/Dili
Asia/Dubai
Asia/Dushanbe
Asia/Gaza
Asia/Harbin
Asia/Hebron
Asia/Ho_Chi_Minh
Asia/Hong_Kong
Asia/Hovd
Asia/Irkutsk
Asia/Istanbul
Asia/Jakarta
Asia/Jayapura
Asia/Jerusalem
Asia/Kabul
Asia/Kamchatka
Asia/Karachi
Asia/Kashgar
Asia/Kathmandu
Asia/Katmandu
Asia/Khandyga
Asia/Kolkata
Asia/Krasnoyarsk
Asia/Kuala_Lumpur
Asia/Kuching
Asia/Kuwait
Asia/Macao
Asia/Macau
Asia/Magadan
Asia/Makassar
Asia/Manila
Asia/Muscat
Asia/Nicosia
Asia/Novokuznetsk
Asia/Novosibirsk
Asia/Omsk
Asia/Oral
Asia/Phnom_Penh
Asia/Pontianak
Asia/Pyongyang
Asia/Qatar
Asia/Qyzylorda
Asia/Rangoon
Asia/Riyadh
Asia/Saigon
Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
Asia/Taipei
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Tel_Aviv
Asia/Thimbu
Asia/Thimphu
Asia/Tokyo
Asia/Tomsk
Asia/Ujung_Pandang
Asia/Ulaanbaatar
Asia/Ulan_Bator
Asia/Urumqi
Asia/Ust-Nera
Asia/Vientiane
Asia/Vladivostok
Asia/Yakutsk
Asia/Yangon
Asia/Yekaterinburg
Asia/Yerevan
Atlantic/Azores
Atlantic/Bermuda
Atlantic/Canary
Atlantic/Cape_Verde
Atlantic/Faeroe
Atlantic/Faroe
Atlantic/Jan_Mayen
Atlantic/Madeira
Atlantic/Reykjavik
Atlantic/South_Georgia
Atlantic/St_Helena
Atlantic/Stanley
Australia/ACT
Australia/Adelaide
Australia/Brisbane
Australia/Broken_Hill
Australia/Canberra
Australia/Currie
Australia/Darwin
Australia/Eucla
Australia/Hobart
Australia/LHI
Australia/Lindeman
Australia/Lord_Howe
Australia/Melbourne
Australia/NSW
Australia/North
Australia/Perth
Australia/Queensland
Australia/South
Australia/Sydney
Australia/Tasmania
Australia/Victoria
Australia/West
Australia/Yancowinna
Brazil/Acre
Brazil/DeNoronha
Brazil/East
Brazil/West
CET
CST6CDT
Canada/Atlantic
Canada/Central
Canada/Eastern
Canada/Mountain
Canada/Newfoundland
Canada/Pacific
Canada/Saskatchewan
Canada/Yukon
Chile/Continental
Chile/EasterIsland
Cuba
EET
EST5EDT
Egypt
Eire
Europe/Amsterdam
Europe/Andorra
Europe/Astrakhan
Europe/Athens
Europe/Belfast
Europe/Belgrade
Europe/Berlin
Europe/Bratislava
Europe/Brussels
Europe/Bucharest
Europe/Budapest
Europe/Busingen
Europe/Chisinau
Europe/Copenhagen
Europe/Dublin
Europe/Gibraltar
Europe/Guernsey
Europe/Helsinki
Europe/Isle_of_Man
Europe/Istanbul
Europe/Jersey
Europe/Kaliningrad
Europe/Kiev
Europe/Kirov
Europe/Lisbon
Europe/Ljubljana
Europe/London
Europe/Luxembourg
Europe/Madrid
Europe/Malta
Europe/Mariehamn
Europe/Minsk
Europe/Monaco
Europe/Moscow
Europe/Nicosia
Europe/Oslo
Europe/Paris
Europe/Podgorica
Europe/Prague
Europe/Riga
Europe/Rome
Europe/Samara
Europe/San_Marino
Europe/Sarajevo
Europe/Simferopol
Europe/Skopje
Europe/Sofia
Europe/Stockholm
Europe/Tallinn
Europe/Tirane
Europe/Tiraspol
Europe/Ulyanovsk
Europe/Uzhgorod
Europe/Vaduz
Europe/Vatican
Europe/Vienna
Europe/Vilnius
Europe/Volgograd
Europe/Warsaw
Europe/Zagreb
Europe/Zaporozhye
Europe/Zurich
GB
GB-Eire
Hongkong
Iceland
Indian/Antananarivo
Indian/Chagos
Indian/Christmas
Indian/Cocos
Indian/Comoro
Indian/Kerguelen
Indian/Mahe
Indian/Maldives
Indian/Mauritius
Indian/Mayotte
Indian/Reunion
Iran
Israel
Jamaica
Japan
Kwajalein
Libya
MET
MST7MDT
Mexico/BajaNorte
Mexico/BajaSur
Mexico/General
NZ
NZ-CHAT
Navajo
PRC
PST8PDT
Pacific/Apia
Pacific/Auckland
Pacific/Bougainville
Pacific/Chatham
Pacific/Chuuk
Pacific/Easter
Pacific/Efate
Pacific/Enderbury
Pacific/Fakaofo
Pacific/Fiji
Pacific/Funafuti
Pacific/Galapagos
Pacific/Gambier
Pacific/Guadalcanal
Pacific/Guam
Pacific/Honolulu
Pacific/Johnston
Pacific/Kiritimati
Pacific/Kosrae
Pacific/Kwajalein
Pacific/Majuro
Pacific/Marquesas
Pacific/Midway
Pacific/Nauru
Pacific/Niue
Pacific/Norfolk
Pacific/Noumea
Pacific/Pago_Pago
Pacific/Palau
Pacific/Pitcairn
Pacific/Pohnpei
Pacific/Ponape
Pacific/Port_Moresby
Pacific/Rarotonga
Pacific/Saipan
Pacific/Samoa
Pacific/Tahiti
Pacific/Tarawa
Pacific/Tongatapu
Pacific/Truk
Pacific/Wake
Pacific/Wallis
Pacific/Yap
Poland
Portugal
ROK
Singapore
Turkey
US/Alaska
US/Aleutian
US/Arizona
US/Central
US/East-Indiana
US/Eastern
US/Hawaii
US/Indiana-Starke
US/Michigan
US/Mountain
US/Pacific
US/Pacific-New
US/Samoa
W-SU
WET
```

# DDL ステートメント
<a name="ddl-reference"></a>

Athena で直接、ここに記載されている、サポートされているデータ定義言語 (DDL) ステートメントを使用します。Athena クエリエンジンの一部は、[HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL) に基づいています。Athena はすべての DDL ステートメントをサポートしておらず、HiveQL DDL と Athena DDL にはいくつかの違いがあります。詳細については、このセクションのリファレンストピック、および「[サポートされない DDL](unsupported-ddl.md)」を参照してください。

**Topics**
+ [サポートされない DDL](unsupported-ddl.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [ALTER TABLE ADD COLUMNS](alter-table-add-columns.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE CHANGE COLUMN](alter-table-change-column.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)
+ [ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)
+ [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)
+ [ALTER VIEW DIALECT](alter-view-dialect.md)
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)
+ [CREATE TABLE AS](create-table-as.md)
+ [CREATE VIEW](create-view.md)
+ [DESCRIBE](describe-table.md)
+ [DESCRIBE VIEW](describe-view.md)
+ [DROP DATABASE](drop-database.md)
+ [DROP TABLE](drop-table.md)
+ [DROP VIEW](drop-view.md)
+ [MSCK REPAIR TABLE](msck-repair-table.md)
+ [SHOW COLUMNS](show-columns.md)
+ [SHOW CREATE TABLE](show-create-table.md)
+ [SHOW CREATE VIEW](show-create-view.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW PARTITIONS](show-partitions.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW TBLPROPERTIES](show-tblproperties.md)
+ [SHOW VIEWS](show-views.md)

# サポートされない DDL
<a name="unsupported-ddl"></a>

以下の DDL ステートメントは、Athena SQL でサポートされません。Athena の Iceberg テーブルでサポートされている DDL ステートメントについては、「[Iceberg テーブルスキーマを進化させる](querying-iceberg-evolving-table-schema.md)」および「[Iceberg テーブルに対して他の DDL オペレーションを実行する](querying-iceberg-additional-operations.md)」を参照してください。
+ ALTER INDEX
+ ALTER TABLE *table\$1name* ARCHIVE PARTITION
+ ALTER TABLE *table\$1name* CLUSTERED BY
+ ALTER TABLE *table\$1name* DROP COLUMN (Iceberg テーブルでサポート)
+ ALTER TABLE *table\$1name* EXCHANGE PARTITION
+ ALTER TABLE *table\$1name* NOT CLUSTERED
+ ALTER TABLE *table\$1name* NOT SKEWED
+ ALTER TABLE *table\$1name* NOT SORTED
+ ALTER TABLE *table\$1name* NOT STORED AS DIRECTORIES
+ ALTER TABLE *table\$1name* partitionSpec CHANGE COLUMNS
+ ALTER TABLE *table\$1name* partitionSpec COMPACT
+ ALTER TABLE *table\$1name* partitionSpec CONCATENATE
+ ALTER TABLE *table\$1name* partitionSpec SET FILEFORMAT
+ ALTER TABLE *table\$1name* RENAME TO (Iceberg テーブルでサポート)
+ ALTER TABLE *table\$1name* SET SERDEPROPERTIES
+ ALTER TABLE *table\$1name* SET SKEWED LOCATION
+ ALTER TABLE *table\$1name* SKEWED BY
+ ALTER TABLE *table\$1name* TOUCH
+ ALTER TABLE *table\$1name* UNARCHIVE PARTITION
+ COMMIT
+ CREATE INDEX
+ CREATE ROLE
+ CREATE TABLE *table\$1name* LIKE *existing\$1table\$1name* 
+ CREATE TEMPORARY MACRO
+ DELETE FROM
+ DESCRIBE DATABASE
+ DFS
+ DROP INDEX
+ DROP ROLE
+ DROP TEMPORARY MACRO
+ EXPORT TABLE
+ GRANT ROLE
+ IMPORT TABLE
+ LOCK DATABASE
+ LOCK TABLE
+ REVOKE ROLE
+ ROLLBACK
+ SHOW COMPACTIONS
+ SHOW CURRENT ROLES
+ SHOW GRANT
+ SHOW INDEXES
+ SHOW LOCKS
+ SHOW PRINCIPALS
+ SHOW ROLE GRANT
+ SHOW ROLES
+ SHOW STATS
+ SHOW TRANSACTIONS
+ START TRANSACTION
+ UNLOCK DATABASE
+ UNLOCK TABLE

# ALTER DATABASE SET DBPROPERTIES
<a name="alter-database-set-dbproperties"></a>

データベースのプロパティを 1 つ以上作成します。`DATABASE` と `SCHEMA` は、どちらを使用しても同じように機能します。

## 概要
<a name="synopsis"></a>

```
ALTER {DATABASE|SCHEMA} database_name
  SET DBPROPERTIES ('property_name'='property_value' [, ...] )
```

## パラメータ
<a name="parameters"></a>

**SET DBPROPERTIES ('property\$1name'='property\$1value' [, ...]**  
データベースのプロパティを `property_name` として指定し、各プロパティの値を `property_value` として設定します。`property_name` が既に存在する場合、古い値は `property_value` で上書きされます。

## 例
<a name="examples"></a>

```
ALTER DATABASE jd_datasets
  SET DBPROPERTIES ('creator'='John Doe', 'department'='applied mathematics');
```

```
ALTER SCHEMA jd_datasets
  SET DBPROPERTIES ('creator'='Jane Doe');
```

# ALTER TABLE ADD COLUMNS
<a name="alter-table-add-columns"></a>

既存のテーブルに 1 つ以上の列を追加します。オプションの `PARTITION` 構文を使用すると、パーティションメタデータが更新されます。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  ADD COLUMNS (col_name data_type)
```

## パラメータ
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
ユーザー指定の列名/値の組み合わせでパーティションを作成します。列のデータ型が文字列である場合にのみ、`partition_col_value` を引用符で囲みます。

**ADD COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
既存の列の後、パーティション列の前に列を追加します。

## 例
<a name="examples"></a>

```
ALTER TABLE events ADD COLUMNS (eventowner string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (event string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (eventdescription string)
```

## メモ
<a name="alter-table-add-columns-notes"></a>
+ `ALTER TABLE ADD COLUMNS` の実行後に Athena クエリエディタのナビゲーションペインで新しいテーブル列を表示するには、エディタのテーブルリストを手動で更新してから、テーブルをもう一度展開します。
+ `ALTER TABLE ADD COLUMNS` は、`date` データ型の列では機能しません。この問題の回避策は、代わりに `timestamp` データ型を使用することです。

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

テーブルのパーティション列を 1 つ以上作成します。各パーティションは、1 つ以上の異なる列名/値の組み合わせで構成されます。指定した組み合わせごとに別個のデータディレクトリが作成されます。これにより、クエリパフォーマンスが向上する場合があります。パーティション分割された列は、テーブルのデータ自体内には存在しないため、テーブル内の列自体と同じ名前を使用すると、エラーになります。詳細については、「[データのパーティション化](partitions.md)」を参照してください。

Athena では、テーブルとそのパーティションが同じデータ形式を使用する必要がありますが、スキーマは異なる場合があります。詳細については、「」を参照してください[パーティションを使用してテーブルを更新する](updates-and-partitions.md)

IAM ポリシーで必要とされるリソースレベルのアクセス許可 (`glue:CreatePartition` を含む) については、「[AWS Glue API アクセス許可: アクションとリソースのリファレンス](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)」および「[AWS Glue Data Catalog のデータベースとテーブルへのアクセスを構成する](fine-grained-access-to-glue-resources.md)」を参照してください。Athena を使用する際のアクセス許可に関するトラブルシューティングについては、「[アクセス許可](troubleshooting-athena.md#troubleshooting-athena-permissions)」トピックの「[Athena の問題をトラブルシューティングする](troubleshooting-athena.md)」セクションを参照してください。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

## パラメータ
<a name="parameters"></a>

パーティションを追加するときは、パーティションの 1 つ、または複数の列名/値ペアと、そのパーティションのデータファイルが格納されている Amazon S3 パスを指定します。

**[IF NOT EXISTS]**  
同じ定義のパーティションが既に存在する場合、エラーを抑制します。

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
ユーザー指定の列名/値の組み合わせでパーティションを作成します。列のデータ型が文字列である場合に限り、`partition_col_value` を文字列の文字で囲みます。

**[LOCATION 'location']**  
前のステートメントで定義したパーティションの保存先のディレクトリを指定します。データが Hive スタイルのパーティショニング (`pk1=v1/pk2=v2/pk3=v3`) を使用する場合、`LOCATION` 句はオプションです。Hive スタイルのパーティション化では、テーブルの場所、パーティションキー名、およびパーティションキー値からフル Amazon S3 URI が自動的に作成されます。詳細については、「[データのパーティション化](partitions.md)」を参照してください。

## 考慮事項
<a name="alter-table-add-partition-considerations"></a>

Amazon Athena は、単一の `ALTER TABLE ADD PARTITION` DDL ステートメントに追加できるパーティションの数に特定の制限を設定していません。ただし、大量のパーティションを追加する必要がある場合は、パフォーマンス問題が発生する可能性を避けるため、操作を小規模なバッチに分割することを検討してください。以下の例は、連続するコマンドを使用してパーティションを個別に追加し、`IF NOT EXISTS` を使用して重複するパーティションが追加されないようにしています。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 Athena でパーティションを使用するときは、以下の点に留意してください。
+ Athena では、1,000 万のパーティションを持つ AWS Glue テーブルへのクエリがサポートされていますが、1 回のスキャンで読み取れるのは、100 万のパーティションまでです。
+ クエリを最適化し、スキャンされるパーティションの数を減らすため、パーティションプルーニングやパーティションインデックスの使用といった戦略を検討してください。

Athena でのパーティションの使用に関するその他の考慮事項については、「[データのパーティション化](partitions.md)」を参照してください。

## 例
<a name="examples"></a>

次の例では、Hive スタイルのパーティション化されたデータ用のテーブルに、1 つのパーティションを追加します。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

次の例では、Hive スタイルのパーティション化されたデータ用のテーブルに、複数のパーティションを追加します。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

テーブルが Hive スタイルのパーティション化されたデータ向けのものではない場合は、`LOCATION` 句が必要です。この句は、パーティションのデータが含まれるプレフィックスのフル Amazon S3 URI でなければなりません。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

パーティションがすでに存在する場合にエラーを無視するには、次の例のように `IF NOT EXISTS` 句を使用します。

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## ゼロバイト `_$folder$` ファイル
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

`ALTER TABLE ADD PARTITION` ステートメントを実行し、すでに存在するパーティションと正しくない Amazon S3 の場所を誤って指定すると、形式 `partition_value_$folder$` のゼロバイトプレースホルダーが Amazon S3 に作成されます。これらのファイルは手動で削除する必要があります。

これを防ぐには、次の例のように、`ALTER TABLE ADD PARTITION` ステートメントで `ADD IF NOT EXISTS` 構文を使用します。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```

# ALTER TABLE CHANGE COLUMN
<a name="alter-table-change-column"></a>

テーブルの列の名前、タイプ、順序、またはコメントを変更します。

## 概要
<a name="alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 例
<a name="alter-table-change-column-example"></a>

次の例では、列名 `area` を `zip` に変更し、データ型を整数にして、名前が変更された列を `id` 列の後に配置します。

```
ALTER TABLE example_table CHANGE COLUMN area zip int AFTER id
```

次の例では、`example_table` のメタデータの `zip` 列にコメントを追加します。コメントを表示するには、 AWS CLI [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html) コマンドを使用するか、AWS Glue コンソールでテーブルのスキーマにアクセスします。

```
ALTER TABLE example_table CHANGE COLUMN zip zip int COMMENT 'USA zipcode'
```

# ALTER TABLE DROP PARTITION
<a name="alter-table-drop-partition"></a>

名前付きテーブルの指定したパーティションを削除します。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_spec) [, PARTITION (partition_spec)]
```

## パラメータ
<a name="alter-table-drop-partition-parameters"></a>

**[IF EXISTS]**  
指定したパーティションが存在しない場合、エラーメッセージを抑制します。

**PARTITION (partition\$1spec)**  
各 `partition_spec` は、列名/値の組み合わせを `partition_col_name = partition_col_value [,...]` という形式で指定します。

## 例
<a name="alter-table-drop-partition-examples"></a>

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN');
```

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN'), PARTITION (dt = '2014-05-15', country = 'IN');
```

## 注意事項
<a name="alter-table-drop-partition-notes"></a>

`ALTER TABLE DROP PARTITION` ステートメントには、すべてのパーティションを一括に削除するための単一的な構文は存在しません。また、削除するパーティションの範囲を指定するための、フィルタリング条件もサポートされていません。

この点の回避策として、スクリプト内で、AWS Glue API の [GetPartitions](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-GetPartitions) および [BatchDeletePartition](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-BatchDeletePartition) アクションを使用できます。`GetPartitions` アクションでは、SQL の `WHERE` 式のような、複雑なフィルター表現がサポートされます。`GetPartitions` を使用して、削除対象のパーティションについてフィルタリングされたリストを作成した後は、`BatchDeletePartition` アクションにより、25 個までのパーティションをまとめて削除できます。

# ALTER TABLE RENAME PARTITION
<a name="alter-table-rename-partition"></a>

パーティション値の名前を変更します。

**注記**  
ALTER TABLE RENAME PARTITION はパーティション列の名前を変更しません。パーティション列の名前を変更するには、AWS Glue コンソールを使用できます。詳細については、このドキュメントで後述する「[AWS Glue でのパーティション列の名前の変更](#alter-table-rename-partition-column-name)」を参照してください。

## 概要
<a name="synopsis"></a>

`table_name` という名前のテーブルの場合、`partition_spec` が指定したパーティション値の名前を、`new_partition_spec` が指定した値に変更します。

```
ALTER TABLE table_name PARTITION (partition_spec) RENAME TO PARTITION (new_partition_spec)
```

## パラメータ
<a name="parameters"></a>

**PARTITION (partition\$1spec)**  
各 `partition_spec` は、列名/値の組み合わせを `partition_col_name = partition_col_value [,...]` という形式で指定します。

## 例
<a name="examples"></a>

```
ALTER TABLE orders 
PARTITION (dt = '2014-05-14', country = 'IN') RENAME TO PARTITION (dt = '2014-05-15', country = 'IN');
```

## AWS Glue でのパーティション列の名前の変更
<a name="alter-table-rename-partition-column-name"></a>

AWS Glue コンソールでパーティション列の名前を変更するには、次の手順を実行します。

**AWS Glue コンソールでテーブルパーティション列の名前を変更する**

1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール ([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)) を開きます。

1. ナビゲーションペインで、**[Table]** (テーブル) を選択します。

1. **[テーブル]** ページにある **[テーブルをフィルタリング]** 検索ボックスを使用して、変更するテーブルを見つけます。

1. **[名前]** 列で、変更するテーブルのリンクを選択します。

1. テーブルの詳細ページにある **[スキーマ]** セクションで、次のいずれかを実行します。
   + JSON 形式で名前を変更するには、**[JSON としてスキーマを編集]** を選択します。
   + 名前を直接変更するには、**[スキーマを編集]** を選択します。この手順では、**[スキーマを編集]** を選択します。

1. 名前を変更するパーティション分割された列のチェックボックスにチェックを入れてから、**[編集]** を選択します。

1. **[スキーマエントリの編集]** ダイアログボックスにある **[名前]** に、パーティション列の新しい名前を入力します。

1. **[新しいテーブルバージョンとして保存]** を選択します。このアクションは、パーティション列の名前を更新し、データの個別の物理的コピーを作成することなくスキーマの進化履歴を維持します。

1. テーブルバージョンを比較するには、テーブルの詳細ページで **[アクション]** を選択してから、**[バージョンを比較]** を選択します。

## その他のリソース
<a name="alter-table-rename-partition-additional-resources"></a>

 パーティショニングについての詳細は、「[データのパーティション化](partitions.md)」を参照してください。

# ALTER TABLE REPLACE COLUMNS
<a name="alter-table-replace-columns"></a>

[LazySimpleSerDe](lazy-simple-serde.md) で作成したテーブルから既存の列をすべて削除して、それらを指定された列のセットに置き換えます。オプションの `PARTITION` 構文を使用すると、パーティションメタデータが更新されます。`ALTER TABLE REPLACE COLUMNS` を使用し、保持したい列のみを指定することによって、列をドロップすることもできます。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  REPLACE COLUMNS (col_name data_type [, col_name data_type, ...])
```

## パラメータ
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
ユーザー指定の列名/値の組み合わせでパーティションを指定します。列のデータ型が文字列である場合にのみ、`partition_col_value` を引用符で囲みます。

**REPLACE COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
既存の列を、指定された列名とデータ型に置き換えます。

## 注意事項
<a name="alter-table-replace-columns-notes"></a>
+ `ALTER TABLE REPLACE COLUMNS` を実行した後で Athena クエリエディタのナビゲーションペインにテーブル列での変更を表示する場合に、エディタ内でテーブルのリストを手動で更新してから、テーブルの展開が再度必要となる場合があります。
+ `ALTER TABLE REPLACE COLUMNS` は、`date` データ型の列では機能しません。この問題の回避策は、テーブルで `timestamp` データ型を代わりに使用することです。
+ 単一の列だけを置き換える場合でも、構文は `ALTER TABLE table-name REPLACE COLUMNS` (複数形で *columns* を含む形式) とする必要があることに注意してください。置き換えの対象である列だけでなく、維持しておく列も指定する必要があります。これを行わない場合、指定されていない列は削除されます。この構文と動作は Apache Hive DDL から派生したものです。リファレンスについては、Apache ドキュメントの「[Add/Replace Columns](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns)」(列の追加/置換) を参照してください。

## 例
<a name="alter-table-replace-columns-example"></a>

次の例での ([LazySimpleSerDe](lazy-simple-serde.md) により作成された) テーブル `names_cities` には、`col1`、`col2`、および `col3` という名前の 3 つの列があります。すべての列の型は `string` です。テーブル内の列を表示するために、次のコマンドでは [SHOW COLUMNS](show-columns.md) ステートメントを使用しています。

```
SHOW COLUMNS IN names_cities
```

クエリの結果:

```
col1
col2
col3
```

次の `ALTER TABLE REPLACE COLUMNS` コマンドでは、列の名前を `first_name`、`last_name`、および `city` に置き換えます。基盤となるソースデータは影響を受けません。

```
ALTER TABLE names_cities
REPLACE COLUMNS (first_name string, last_name string, city string)
```

結果をテストするために、再度 `SHOW COLUMNS` が実行されます。

```
SHOW COLUMNS IN names_cities
```

クエリの結果:

```
first_name
last_name
city
```

更新された列名を表示する別の方法として、Athena クエリエディタで[テーブルをプレビュー](creating-tables-showing-table-information.md)する、または独自の`SELECT`クエリを実行することもできます。

# ALTER TABLE SET LOCATION
<a name="alter-table-set-location"></a>

`table_name` という名前のテーブルの場所と、必要に応じて `partition_spec` のパーティションを変更します。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name [ PARTITION (partition_spec) ] SET LOCATION 'new location'
```

## パラメータ
<a name="alter-table-set-location-parameters"></a>

**PARTITION (partition\$1spec)**  
場所を変更するパーティションを `partition_spec` パラメータで指定します。`partition_spec` は、列名/値の組み合わせを `partition_col_name = partition_col_value` という形式で指定します。

**SET LOCATION 'new location'**  
新しい場所を指定します。Amazon S3 の場所にする必要があります。構文については、「[Amazon S3 のテーブルの場所](tables-location-format.md)」を参照してください。

## 例
<a name="alter-table-set-location-examples"></a>

```
ALTER TABLE customers PARTITION (zip='98040', state='WA') SET LOCATION 's3://amzn-s3-demo-bucket/custdata/';
```

# ALTER TABLE SET TBLPROPERTIES
<a name="alter-table-set-tblproperties"></a>

カスタムまたは事前定義されたメタデータプロパティをテーブルに追加して、それらの割り当てられた値を設定します。テーブル内のプロパティを表示するには、[SHOW TBLPROPERTIES](show-tblproperties.md) コマンドを使用します。

Apache Hive の[マネージドテーブル](https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables)はサポートされていないため、`'EXTERNAL'='FALSE'` を設定しても効果はありません。

## 概要
<a name="synopsis"></a>

```
ALTER TABLE table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## パラメータ
<a name="parameters"></a>

**SET TBLPROPERTIES ('property\$1name' = 'property\$1value' [ , ... ])**  
追加するメタデータプロパティを `property_name` として指定し、各プロパティの値を `property value` として指定します。`property_name` が既に存在する場合は、その値が新たに指定された `property_value` に設定されます。  
以下の事前定義されたテーブルプロパティには、特別な用途があります。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/alter-table-set-tblproperties.html)

## 例
<a name="examples"></a>

次の使用例では、テーブルプロパティにコメントノートを追加します。

```
ALTER TABLE orders 
SET TBLPROPERTIES ('notes'="Please don't drop this table.");
```

次の例では、テーブル `existing_table` を変更して、ZSTD 圧縮および ZSTD 圧縮レベル 4 の Parquet ファイル形式を使用します。

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = 4)
```

# ALTER VIEW DIALECT
<a name="alter-view-dialect"></a>

エンジンダイアレクトを AWS Glue Data Catalog ビューに追加したり、ビューから削除したりします。AWS Glue Data Catalog ビューにのみ適用されます。`Lake Formation` 管理者または定義者の許可が必要です。

AWS Glue Data Catalog ビューの詳細については、「[Athena でデータカタログビューを使用する](views-glue.md)」を参照してください。

## 構文
<a name="alter-view-dialect-syntax"></a>

```
ALTER VIEW name [ FORCE ] [ ADD|UPDATE ] DIALECT AS query
```

```
ALTER VIEW name [ DROP ] DIALECT
```

**FORCE**  
`FORCE` キーワードにより、ビュー内の競合するエンジンダイアレクト情報が新しい定義で上書きされます。`FORCE` キーワードは、データカタログビューの更新後に、既存のエンジンダイアレクト間でビュー定義に競合が発生した場合に役立ちます。例えば、データカタログビューに Athena と Amazon Redshift の両方のダイアレクトがあり、更新後に、ビュー定義で Amazon Redshift と競合が発生したとします。この場合は、`FORCE` キーワードを使用して更新を完了させ、Amazon Redshift ダイアレクトを古いものとしてマークできます。古いとマークされたエンジンがビューをクエリすると、クエリは失敗します。エンジンは例外をスローして、古い結果を許可しません。これを修正するには、ビュー内の古いダイアレクトを更新します。

**ADD**  
データカタログビューに新しいエンジンダイアレクトを追加します。指定するエンジンは、データカタログビューに既に存在していない必要があります。

**UPDATE**  
データカタログビューに既に存在するエンジンダイアレクトを更新します。

**DROP**  
既存のエンジンダイアレクトをデータカタログビューから削除します。データカタログビューからエンジンを削除すると、削除されたエンジンからデータカタログビューをクエリできなくなります。ビュー内の他のエンジンダイアレクトは引き続きビューをクエリできます。

**DIALECT AS**  
エンジン固有の SQL クエリを導入します。

## 例
<a name="alter-view-dialect-syntax-examples"></a>

```
ALTER VIEW orders_by_date FORCE ADD DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date FORCE UPDATE DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date DROP DIALECT
```

# CREATE DATABASE
<a name="create-database"></a>

データベースを作成します。`DATABASE` と `SCHEMA` はどちらでも使用できます。どちらも同じ意味です。

**注記**  
データベースの作成、テーブルの作成、および Athena のテーブルに対する `SELECT` クエリの実行の例については、[はじめに](getting-started.md) を参照してください。

## 概要
<a name="synopsis"></a>

```
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name
  [COMMENT 'database_comment']
  [LOCATION 'S3_loc']
  [WITH DBPROPERTIES ('property_name' = 'property_value') [, ...]]
```

Athena のデータベース名の制限については、「[データベース、テーブル、列に名前を付ける](tables-databases-columns-names.md)」を参照してください。

## パラメータ
<a name="parameters"></a>

**[IF NOT EXISTS]**  
`database_name` という名前のデータベースが既に存在する場合、エラーメッセージを抑制します。

**[COMMENT database\$1comment]**  
`comment` という組み込みメタデータプロパティにメタデータ値を設定し、`database_comment` に値を指定します。AWS Glue では、`COMMENT` の内容がデータベースプロパティの `Description` フィールドに書き込まれます。

**[LOCATION S3\$1loc]**  
データベースファイルとメタストアがある場所を `S3_loc` として指定します。これは Amazon S3 の場所にする必要があります。

**[WITH DBPROPERTIES ('property\$1name' = 'property\$1value') [, ...]]**  
データベース定義のカスタムメタデータプロパティを指定します。

## 例
<a name="examples"></a>

```
CREATE DATABASE clickstreams;
```

```
CREATE DATABASE IF NOT EXISTS clickstreams
  COMMENT 'Site Foo clickstream data aggregates'
  LOCATION 's3://amzn-s3-demo-bucket/clickstreams/'
  WITH DBPROPERTIES ('creator'='Jane D.', 'Dept.'='Marketing analytics');
```

## データベースプロパティの表示
<a name="create-database-viewing-properties"></a>

`CREATE DATABASE` を使用して AWSDataCatalog で作成するデータベースのデータベースプロパティを表示するには、以下の例にあるように、AWS CLI コマンドの [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html) を使用することができます。

```
aws glue get-database --name <your-database-name>
```

JSON 出力では、結果が以下のようになります。

```
{
    "Database": {
        "Name": "<your-database-name>",
        "Description": "<your-database-comment>",
        "LocationUri": "s3://amzn-s3-demo-bucket",
        "Parameters": {
            "<your-database-property-name>": "<your-database-property-value>"
        },
        "CreateTime": 1603383451.0,
        "CreateTableDefaultPermissions": [
            {
                "Principal": {
                    "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                },
                "Permissions": [
                    "ALL"
                ]
            }
        ]
    }
}
```

AWS CLI の詳細については、[AWS Command Line Interface ユーザーガイド](https://docs.aws.amazon.com/cli/latest/userguide/)を参照してください。

# CREATE TABLE
<a name="create-table"></a>

指定した名前とパラメータでテーブルを作成します。

**注記**  
このページには、要約されたリファレンス情報が含まれています。Athena でのテーブルの作成と `CREATE TABLE` ステートメントの例に関する詳細については、「[Athena でテーブルを作成する](creating-tables.md)」を参照してください。データベースの作成、テーブルの作成、および Athena のテーブルに対する `SELECT` クエリの実行の例については、「[はじめに](getting-started.md)」を参照してください。

## 概要
<a name="synopsis"></a>

```
CREATE EXTERNAL TABLE [IF NOT EXISTS]
 [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format] 
 [WITH SERDEPROPERTIES (...)]
 [LOCATION 's3://amzn-s3-demo-bucket/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['encryption_option'='SSE_S3 | SSE_KMS | CSE_KMS',] ['kms_key'='aws_kms_key_arn',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]
```

## パラメータ
<a name="parameters"></a>

**EXTERNAL**  
ユーザー指定の `LOCATION` で、テーブルが Amazon S3 に存在する基盤データに基づいていることを指定します。[Iceberg](querying-iceberg-creating-tables.md) テーブルの作成時を除いて、常に `EXTERNAL` キーワードが使用されます。Iceberg 以外のテーブルで、`EXTERNAL` キーワードを指定せずに `CREATE TABLE` を使用すると、Athena でエラーが発生します。外部テーブルを作成する場合、参照先のデータはデフォルト形式に準拠しているか、ユーザーが `ROW FORMAT`、`STORED AS`、および `WITH SERDEPROPERTIES` で指定する形式に準拠している必要があります。

**[IF NOT EXISTS**  
このパラメータは、同じ名前のテーブルが既に存在するかどうかを確認します。その場合、パラメータは `TRUE` を返し、Amazon Athena は `CREATE TABLE` アクションをキャンセルします。キャンセルは Athena がデータカタログを呼び出す前に行われるため、AWS CloudTrail イベントは発生しません。

**[db\$1name.]table\$1name**  
作成するテーブルの名前を指定します。オプションの `db_name` パラメータは、テーブルを作成する先のデータベースを指定します。この引数を省略すると、現在のデータベースが使用されます。テーブル名に数字を含める場合は、`table_name` を引用符で囲みます (例: `"table123"`)。`table_name` をアンダースコアで始める場合は、バックティックを使用します (例: ``_mytable``)。特殊文字 (アンダースコア以外) はサポートされていません。  
Athena のテーブル名では大文字と小文字が区別されませんが、Apache Spark を使用する場合、Spark ではテーブル名を小文字にする必要があります。Athena のテーブル名の制限については、「[データベース、テーブル、列に名前を付ける](tables-databases-columns-names.md)」を参照してください。

**[ ( col\$1name data\$1type [COMMENT col\$1comment] [, ...] ) ]**  
作成する各列の名前とデータ型を指定します。列名に特殊文字 (アンダースコア `(_)` を除く) を使用することはできません。`col_name` をアンダースコアで始める場合は、列名をバックティックで囲みます (例: ``_mycolumn``)。Athena の列名の制限については、「[データベース、テーブル、列に名前を付ける](tables-databases-columns-names.md)」を参照してください。  
`data_type` 値には次のいずれかを指定できます。  
+ `boolean` – 値は `true` もしくは `false` です。
+ `tinyint` – 2 の補数形式の 8 ビット符号付き整数で、最小値は -2^7、最大値は 2^7-1 です。
+ `smallint` – 2 の補数形式の 16 ビット符号付き整数で、最小値は -2^15、最大値は 2^15-1 です。
+ `int` – `CREATE TABLE` のようなデータ定義言語 (DDL) のクエリでは、整数を表すために `int` キーワードを使用します。他のクエリでは、`integer` キーワードを使用します。ここで `integer` は 2 の補数形式の 32 ビット符号付き値で表され、最小値は -2^31、最大値は 2^31-1 です。JDBC ドライバーでは、ビジネス分析アプリケーションとの互換性を確保するために `integer` が返されます。
+ `bigint` – 2 の補数形式の 64 ビット符号付き整数で、最小値は -2^63、最大値は 2^63-1 です。
+ `double` – 64 ビットの符号付き倍精度浮動小数点数です。これは、4.94065645841246544e-324d から 1.79769313486231570e\$1308d の範囲の正または負の値です。`double` は、IEEE Standard for Floating-Point Arithmetic (IEEE 754) に準拠しています。
+ `float` – 32 ビットの符号付き単精度浮動小数点数です。これは、1.40129846432481707e-45 から 3.40282346638528860e\$138 の範囲の正または負の値です。`float`は、IEEE Standard for Floating-Point Arithmetic (IEEE 754) に準拠しています。Presto の `real` に相当します。Athena では、`CREATE TABLE` のような DDL ステートメントで `float`、`SELECT CAST` のような SQL 関数で `real` を使用します。AWS Glue クローラーは `float` で値を返し、Athena は `real` 型と `float` 型を内部で変換します ([2018 年 5 月 6 日](release-notes.md#release-note-2018-06-05) リリースノートを参照)。
+ `decimal [ (precision, scale) ]`。ここで `precision` は桁の合計数であり、`scale` (オプション) は小数点以下の桁数です。デフォルトは 0 です。たとえば、`decimal(11,5)`、`decimal(15)` のタイプ定義を使用します。*precision* の最大値は 38 で、*scale* の最大値も 38 です。

  たとえばクエリ DDL 式で特定の小数値を含む行を選択する場合など、小数値をリテラルとして指定するには、`decimal` 型の定義を指定し、クエリ内で小数値をリテラル (一重引用符) としてリストします。例としては `decimal_value = decimal '0.12'` のようになります。
+ `char` – 固定長の文字データです。`char(10)` のように、1 から 255 の長さを指定します。詳細については、「[CHAR Hive データ型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-char)」を参照してください。
+ `varchar` – 可変長の文字データです。`varchar(10)` のように、1 から 65535 の長さを指定します。詳細については、「[VARCHAR Hive データ型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-varchar)」を参照してください。
+ `string` – 一重引用符または二重引用符で囲まれた文字列リテラルです。
**注記**  
文字列以外のデータ型を Athena の `string` にキャストすることはできません。その代わりに `varchar` にキャストします。
+ `binary` – (Parquet のデータ用)
+ `date` – `YYYY-MM-DD` などの ISO 形式の日付です。例えば、`date '2008-09-15'`。例外として、1970 年 1 月 1 日以降の経過日数を使用する OpenCSVSerDe があります。詳細については、「[CSV を処理するための Open CSV SerDe](csv-serde.md)」を参照してください。
+ `timestamp` – 分解能をミリ秒単位まで指定可能な、[https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html](https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html) 互換形式での日付と時刻のインスタント (例、`yyyy-MM-dd HH:mm:ss[.f...]`) です。例えば、`timestamp '2008-09-15 03:04:05.324'`。例外として、UNIX の数値形式 (`1579059880000` など) の `TIMESTAMP` データを使用する OpenCSVSerDe があります。詳細については、「[CSV を処理するための Open CSV SerDe](csv-serde.md)」を参照してください。
+ `array` < data\$1type >
+ `map` < primitive\$1type, data\$1type >
+ `struct`< col\$1name : data\$1type [comment col\$1comment] [, ...]>

**[COMMENT table\$1comment]**  
`comment` テーブルプロパティを作成し、指定した `table_comment` を追加します。

**[PARTITIONED BY (col\$1name data\$1type [ COMMENT col\$1comment ], ... ) ]**  
`col_name`、`data_type` および `col_comment` が指定された 1 つ以上の列を持つ、パーティションされたテーブルを作成します。テーブルは、個別の列名と値の組み合わせで構成されるパーティションを 1 つ以上持つことができます。指定した組み合わせごとに別個のデータディレクトリが作成されます。これにより、クエリパフォーマンスが向上する場合があります。パーティション化された列はテーブルデータ内には存在しません。テーブル列と同じ `col_name` の値を使用する場合は、エラーになります。詳細については、「[データのパーティション](partitions.md)」を参照してください。  
パーティションされたテーブルを作成したら、[MSCK REPAIR TABLE](msck-repair-table.md) 句で構成されるクエリを続けて実行し、パーティションメタデータ (`MSCK REPAIR TABLE cloudfront_logs;` など) を更新します。Hive と互換性のないパーティションの場合、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用してパーティションをロードすることで、データをクエリできるようにします。

**[CLUSTERED BY (col\$1name, col\$1name, ...) INTO num\$1buckets BUCKETS]**  
パーティションの有無にかかわらず、指定された `col_name` 列のデータを*バケット*と呼ばれるデータサブセットに分割します。`num_buckets` パラメータは、作成するバケットの数を指定します。バケット化は、大規模なデータセットでの一部のクエリのパフォーマンスを向上させることができます。

**[ROW FORMAT row\$1format]**  
テーブルの行形式と基になるソースデータ (該当する場合) を指定します。`row_format` として、`DELIMITED` 句で 1 つ以上の区切り記号を指定できます。または、以下に説明するように、`SERDE` 句を使用できます。`ROW FORMAT` を省略するか、`ROW FORMAT DELIMITED` を指定すると、ネイティブ SerDe が使用されます。  
+ [DELIMITED FIELDS TERMINATED BY char [ESCAPED BY char]]
+ [DELIMITED COLLECTION ITEMS TERMINATED BY char]
+ [MAP KEYS TERMINATED BY char]
+ [LINES TERMINATED BY char]
+ [NULL DEFINED AS char]

  Hive 0.13 で、STORED AS ファイル形式が `TEXTFILE` である場合にのみ使用できます。
 **--または--**   
+ SERDE 'serde\$1name' [WITH SERDEPROPERTIES ("property\$1name" = "property\$1value", "property\$1name" = "property\$1value" [, ...] )]

  `serde_name` は、使用する SerDe を示します。`WITH SERDEPROPERTIES` 句を使用すると、SerDe で許可される 1 つ以上のカスタムプロパティを指定できます。

**[STORED AS file\$1format]**  
テーブルデータのファイル形式を指定します。省略すると、デフォルトの `TEXTFILE` が使用されます。`file_format` のオプションは以下のとおりです。  
+ SEQUENCEFILE
+ TEXTFILE
+ RCFILE
+ ORC
+ PARQUET
+ AVRO
+ ION
+ INPUTFORMAT input\$1format\$1classname OUTPUTFORMAT output\$1format\$1classname

**[LOCATION 's3://amzn-s3-demo-bucket/[folder]/']**  
テーブルが作成される Amazon S3 内の基盤データの場所を指定します。ロケーションパスは、バケット名、またはバケット名と 1 つ以上のフォルダである必要があります。パーティションを使用する場合は、パーティションされたデータのルートを指定します。テーブルのロケーションの詳細については、「[Amazon S3 でテーブルの場所を指定する](tables-location-format.md)」を参照してください。データ形式と許可については、「[Amazon S3 に関する考慮事項](creating-tables.md#s3-considerations)」を参照してください。  
フォルダやバケットの後にはスラッシュを使用します。ファイル名や glob 文字を使用しないでください。  
 ** を使用します**。  
`s3://amzn-s3-demo-bucket/`  
`s3://amzn-s3-demo-bucket/folder/`  
`s3://amzn-s3-demo-bucket/folder/anotherfolder/`  
 **使用不可:**  
`s3://amzn-s3-demo-bucket`  
`s3://amzn-s3-demo-bucket/*`  
`s3://amzn-s3-demo-bucket/mydatafile.dat`

**[TBLPROPERTIES ( ['has\$1encrypted\$1data'='true \$1 false',] ['encryption\$1option'='SSE\$1S3 \$1 SSE\$1KMS \$1 CSE\$1KMS',] ['kms\$1key'='aws\$1kms\$1key\$1arn',] ['classification'='classification\$1value',] property\$1name=property\$1value [, ...] ) ]**  
定義済みのテーブルプロパティ (`"comment"` など) に加えて、テーブル定義のカスタムメタデータとしてキーと値のペアを指定します。  
**has\$1encrypted\$1data** — Athena には、`has_encrypted_data` という組み込みプロパティがあります。`LOCATION` により指定された基盤となるデータセットの CSE-KMS 暗号化を指定するには、このプロパティを `true` に設定します。省略するか、そのワークグループの設定がクライアント側の設定を上書きしない場合、`false` が設定されます。省略するか、`false` に設定して基になるデータを暗号化すると、クエリはエラーになります。詳細については、「[保管中の暗号化](encryption.md)」を参照してください。  
**encryption\$1option** – `LOCATION` によって指定された基盤となるデータセットで使用される最高レベルの暗号化を示すには、このプロパティを `SSE_S3`、`SSE_KMS`、または `CSE_KMS` のいずれかに設定します。詳細については、「[保管中の暗号化](encryption.md)」を参照してください。  
**kms\$1key** – このプロパティを、テーブルデータファイルの暗号化と復号に使用される AWS KMS キー ARN に設定します。Athena はこのキーを使用して、`SSE_KMS` または `CSE_KMS` 暗号化を使用して書き込むときにテーブルデータファイルを暗号化し、CSE-KMS 暗号化テーブルデータファイルを復号します。`encryption_option` が `SSE_KMS` または `CSE_KMS` に設定されている場合、このパラメータは必須ではありません。詳細については、「[保管中の暗号化](encryption.md)」を参照してください。  
**分類** — CloudTrail コンソールで Athena 用に作成されたテーブルは、`classification` プロパティの値として `cloudtrail` を追加されます。ETL ジョブを実行する場合、AWS Glue では、テーブルの作成時に `classification` プロパティを設定し、AWS Glue のデータ型を `csv`、`parquet`、`orc`、`avro`、`json` のいずれかに指定する必要があります。例えば、`'classification'='csv'`。このプロパティを指定しないと、ETL ジョブは失敗します。AWS Glue コンソール、API、または CLI を使用して後で指定できます。詳細については、「[ETL ジョブのテーブルを作成する](schema-classifier.md)」と、「AWS Glue デベロッパーガイド」の「[AWS Glue でジョブを作成する](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)」を参照してください。  
**compression\$1level** — `compression_level` プロパティは使用する圧縮レベルを指定します。このプロパティは、ZSTD 圧縮にのみ適用されます。有効な値は 1 から 22 です。デフォルト値は 3 です。詳細については、「[ZSTD 圧縮レベルを使用する](compression-support-zstd-levels.md)」を参照してください。  
その他のテーブルプロパティの詳細については、「[ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)」を参照してください。

## 例
<a name="create-table-examples"></a>

次のサンプル `CREATE TABLE` ステートメントは、Amazon S3 に保存されているタブ区切りの惑星データに基づいてテーブルを作成します。

```
CREATE EXTERNAL TABLE planet_data (
  planet_name string,
  order_from_sun int,
  au_to_sun float,
  mass float,
  gravity_earth float,
  orbit_years float,
  day_length float
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/tsv/'
```

以下の点に注意してください。
+ `ROW FORMAT DELIMITED` 句は、データが特定の文字で区切られていることを示します。
+ `FIELDS TERMINATED BY '\t'` 句は、TSV データ内のフィールドがタブ文字 ('\$1t') で区切られることを指定します。
+ `STORED AS TEXTFILE` 句は、データがプレーンテキストファイルとして Amazon S3 に保存されることを示します。

データをクエリするには、次のようなシンプルな `SELECT` ステートメントを使用できます。

```
SELECT * FROM planet_data
```

この例を使用して Athena で独自の TSV テーブルを作成するには、テーブル名と列名を独自のテーブルと列の名前とデータ型に置き換えてから、TSV ファイルが保存されている Amazon S3 パスをポイントするように `LOCATION` 句を更新します。

テーブル作成の詳細については、「[Athena でテーブルを作成する](creating-tables.md)」を参照してください。

# CREATE TABLE AS
<a name="create-table-as"></a>

[SELECT](select.md) クエリの結果が入力された新しいテーブルを作成します。空のテーブルを作成するには、[CREATE TABLE](create-table.md) を使用します。`CREATE TABLE AS` は `CREATE TABLE` DDL ステートメントと `SELECT` DML ステートメントを組み合わせているため、技術的には DDL と DML の両方を含んでいます。ここでは `CREATE TABLE AS` が他の DDL ステートメントとまとめられているが、Athena の CTAS クエリは、Service Quotas の目的で DML として扱われることに注意してください。Athena の Service Quotasの詳細については、「[サービスクォータ](service-limits.md)」を参照してください。

**注記**  
CTAS ステートメントの場合、予想されるバケット所有者の設定は、Amazon S3 内の送信先テーブルの場所には適用されません。予期されるバケット所有者の設定は、Athena クエリの結果の出力先として指定した Amazon S3 内の場所にのみ適用されます。詳細については、「[Athena コンソールを使用してクエリ結果の場所を指定する](query-results-specify-location-console.md)」を参照してください。

このリファレンストピックの対象外である `CREATE TABLE AS` に関する追加情報については、「[クエリ結果からテーブルを作成する (CTAS)](ctas.md)」を参照してください。

**Topics**
+ [概要](#synopsis)
+ [CTAS テーブルのプロパティ](#ctas-table-properties)
+ [例](#ctas-table-examples)

## 概要
<a name="synopsis"></a>

```
CREATE TABLE table_name
[ WITH ( property_name = expression [, ...] ) ]
AS query
[ WITH [ NO ] DATA ]
```

コードの説明は以下のとおりです。

**WITH ( property\$1name = expression [, ...] )**  
オプションの CTAS テーブルのプロパティのリスト。一部のプロパティはデータストレージ形式に固有です。「[CTAS テーブルのプロパティ](#ctas-table-properties)」を参照してください。

**query**  
新しいテーブルの作成に使用される [SELECT](select.md) クエリです。  
パーティションがあるクエリを作成する予定がある場合は、`SELECT` ステートメントで列のリストの最後に、パーティションされた列の名前を指定します。

**[ WITH [ NO ] DATA ]**  
`WITH NO DATA` が指定されている場合、元のテーブルと同じスキーマを持つ新しい空のテーブルが作成されます。

**注記**  
クエリの結果出力に列ヘッダーを含めるには、CTAS クエリの代わりに単純な `SELECT` クエリを実行します。クエリ結果の場所から結果を取得するか、Athena コンソールを使用して結果を直接ダウンロードすることができます。詳細については、「[クエリ結果と最近のクエリを操作する](querying.md)」を参照してください。

## CTAS テーブルのプロパティ
<a name="ctas-table-properties"></a>

Athena の各 CTAS テーブルには、`WITH (property_name = expression [, ...] )` を使用して指定するオプションの CTAS テーブルプロパティのリストがあります。これらのパラメータの使用方法については、「[CTAS クエリの例](ctas-examples.md)」を参照してください。

** `WITH (property_name = expression [, ...], )` **    
 `table_type = ['HIVE', 'ICEBERG']`   
オプション。デフォルト: `HIVE`。生成されるテーブルのテーブルタイプを指定します  
例：  

```
WITH (table_type ='ICEBERG')
```  
 `external_location = [location]`   
Iceberg テーブルは外部ではないため、このプロパティは Iceberg テーブルには適用されません。CTAS ステートメントで Iceberg テーブルのルートロケーションを定義するには、このセクションで後述する `location` プロパティを使用します。
オプション。Athena が CTAS クエリを Amazon S3 に保存する場所です。  
例：  

```
 WITH (external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/')
```
Athena は、クエリ結果に同じパスを 2 回使用しません。場所を手動で指定する場合は、指定する Amazon S3 の場所にデータがないことを確認してください。Athena がデータの削除を試みることはありません。再度同じ場所を使用する場合は、手動でデータを削除します。そうしないと、CTAS クエリは失敗します。  
[クエリ結果の場所を強制する](workgroups-settings-override.md)ワークグループで `external_location` を指定する CTAS クエリを実行すると、クエリはエラーメッセージを伴って敗します。ワークグループに対して指定されたクエリ結果の場所を確認するには、[ワークグループの詳細を参照してください](viewing-details-workgroups.md)。  
ワークグループがクエリ結果の場所に関するクライアント側の設定を上書きする場合、Athena は以下の場所にテーブルを作成します。  

```
s3://amzn-s3-demo-bucket/tables/query-id/
```
`external_location` プロパティを使用して場所を指定せず、ワークグループがクライアント側の設定を上書きしない場合、Athena はクエリ結果の場所に[クライアント側の設定](query-results-specify-location-console.md)を使用して、以下の場所にテーブルを作成します。  

```
s3://amzn-s3-demo-bucket/Unsaved-or-query-name/year/month/date/tables/query-id/
```  
 `is_external = [boolean]`   
オプション。テーブルが外部テーブルかどうかを示します。デフォルトは true です。Iceberg テーブルの場合、これを false に設定する必要があります。  
例：  

```
WITH (is_external = false)
```  
 `location = [location]`   
Iceberg テーブルには必須です。クエリ結果から作成される Iceberg テーブルのルート位置を指定します。  
例：  

```
WITH (location ='s3://amzn-s3-demo-bucket/tables/iceberg_table/')
```  
 `field_delimiter = [delimiter]`   
オプションであり、テキストベースのデータストレージ形式に固有のパラメータ。CSV と TSV のファイル、およびテキストファイルのための単一文字のフィールド区切り文字で、例えば、 。`WITH (field_delimiter = ',')`現在、CTAS クエリは複数文字のフィールド区切り文字をサポートしてません。フィールド区切り文字を指定しなかった場合、デフォルトで `\001` が使用されます。  
 `format = [storage_format]`   
CTAS クエリ結果のストレージ形式 (例: `ORC`、`PARQUET`、`AVRO`、`JSON`、`ION`、または `TEXTFILE`)。Iceberg テーブルで使用できる形式は `ORC`、`PARQUET`、および `AVRO` です。省略した場合は、デフォルトで `PARQUET` が使用されます。このパラメータの名前である `format` は小文字で記述する必要があります。そうしないと、CTAS クエリは失敗します。  
例：  

```
WITH (format = 'PARQUET')
```  
 `bucketed_by = ARRAY[ column_name[,…], bucket_count = [int] ]`   
このプロパティは Iceberg テーブルには適用されません。Iceberg テーブルの場合は、バケット変換によるパーティショニングを使用してください。
データの配置先となるバケットの配列リスト。省略された場合、Athena はこのクエリでデータをバケット化しません。  
 `bucket_count = [int]`   
このプロパティは Iceberg テーブルには適用されません。Iceberg テーブルの場合は、バケット変換によるパーティショニングを使用してください。
データの配置先となるバケットの数。省略された場合、Athena はデータをバケット化しません。例：  

```
CREATE TABLE bucketed_table WITH (
  bucketed_by = ARRAY[column_name], 
  bucket_count = 30, format = 'PARQUET', 
  external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/'
) AS 
SELECT 
  * 
FROM 
  table_name
```  
 `partitioned_by = ARRAY[ col_name[,…] ]`   
このプロパティは Iceberg テーブルには適用されません。Iceberg テーブルにパーティション変換を使用するには、このセクションで後述する `partitioning` プロパティを使用してください。
オプション。CTAS テーブルをパーティションする列の配列リスト。パーティションされた列の名前は、`SELECT` ステートメントで列のリストの最後に記述します。  
 `partitioning = ARRAY[partition_transform, ...]`   
オプション。作成する Iceberg テーブルのパーティショニングを指定します。Iceberg は、さまざまなパーティション変換およびパーティションの進化に対応しています。パーティション変換を次の表に要約します。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/create-table-as.html)
例：  

```
 WITH (partitioning = ARRAY['month(order_date)', 
                            'bucket(account_number, 10)', 
                            'country']))
```  
 `optimize_rewrite_min_data_file_size_bytes = [long]`   
オプション。データ最適化固有の設定。指定した値より小さいファイルは、最適化のために含まれます。デフォルトは `write_target_data_file_size_bytes` の 0.75 倍の値です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。  
例：  

```
WITH (optimize_rewrite_min_data_file_size_bytes = 402653184)
```  
 `optimize_rewrite_max_data_file_size_bytes = [long]`   
オプション。データ最適化固有の設定。指定した値より大きいファイルは、最適化のために含まれます。デフォルトは `write_target_data_file_size_bytes` の 1.8 倍の値です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。  
例：  

```
WITH (optimize_rewrite_max_data_file_size_bytes = 966367641)
```  
 `optimize_rewrite_data_file_threshold = [int]`   
オプション。データ最適化固有の設定。最適化が必要なデータファイルの数が指定されたしきい値より少ない場合、データファイルは書き換えられません。これにより、蓄積するデータファイルの数を増やしてターゲットサイズに近いファイルを生成し、不要な計算をスキップしてコストを削減できます。デフォルトは 5 です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。  
例：  

```
WITH (optimize_rewrite_data_file_threshold = 5)
```  
 `optimize_rewrite_delete_file_threshold = [int]`   
オプション。データ最適化固有の設定。データファイルに関連付けられた削除ファイルの数がしきい値より少ない場合、データファイルは書き換えられません。これにより、データファイルごとに蓄積する削除ファイルの数を増やしてコストを削減できます。デフォルトは 2 です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[Iceberg テーブルを最適化する](querying-iceberg-data-optimization.md)」を参照してください。  
例：  

```
WITH (optimize_rewrite_delete_file_threshold = 2)
```  
 `vacuum_min_snapshots_to_keep = [int]`   
オプション。バキューム固有の設定。保持する最新のスナップショットの最小数。デフォルト は 1 です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[VACUUM](vacuum-statement.md)」を参照してください。  
`vacuum_min_snapshots_to_keep` プロパティには、Athena エンジンバージョン 3 が必要です。
例：  

```
WITH (vacuum_min_snapshots_to_keep = 1)
```  
 `vacuum_max_snapshot_age_seconds = [long]`   
オプション。バキューム固有の設定。保持するスナップショットの経過時間を表す秒単位の期間。デフォルトは 432,000 (5 日) です。このプロパティは Iceberg テーブルにのみ適用されます。詳細については、「[VACUUM](vacuum-statement.md)」を参照してください。  
`vacuum_max_snapshot_age_seconds` プロパティには、Athena エンジンバージョン 3 が必要です。
例：  

```
WITH (vacuum_max_snapshot_age_seconds = 432000)
```  
 `write_compression = [compression_format]`   
圧縮を指定できるストレージ形式に使用するための圧縮タイプ。`compression_format` は、テーブルへのデータの書き込み時に使用される圧縮を指定します。`TEXTFILE`、`JSON`、`PARQUET`、および `ORC` のファイル形式に対して圧縮を指定できます。  
例えば、`format` プロパティにおいてストレージ形式として `PARQUET` が指定されている場合、`write_compression` の値で Parquet での圧縮形式を指定します。この場合、`write_compression` の値を指定することは、`parquet_compression` の値を指定することと同等です。  
同様に、`format` プロパティにおいてストレージ形式として `ORC` が指定されている場合には、`write_compression` の値で ORC の圧縮形式を指定します。この場合、`write_compression` の値を指定することは、`orc_compression` の値を指定することと同等です。  
同じ CTAS クエリで、テーブルプロパティに複数の圧縮形式を指定することはできません。例えば、同一のクエリ内で、`write_compression` と `parquet_compression` の両方を指定することはできません。同様なことが `write_compression` と `orc_compression` にも当てはまります。各ファイル形式でサポートされている圧縮タイプの詳細については、「[Athena で圧縮を使用する](compression-formats.md)」を参照してください。  
 `orc_compression = [compression_format]`   
テーブルへの `ORC` データ書き込み時に、`ORC` ファイル形式に対して使用される圧縮タイプ 例えば、`WITH (orc_compression = 'ZLIB')` と指定します。`ORC` ファイル (`ORC` Postscript を除く) 内のチャンクは、指定された圧縮を使用して圧縮されます。この指定を省略した場合、`ORC` に対してはデフォルトで ZLIB 圧縮が使用されます。  
整合性を保つために、`orc_compression` の代わりに `write_compression` プロパティを使用することをお勧めします。`format` プロパティを使用して、ストレージ形式を `ORC` に指定した上で、`write_compression` プロパティにより、圧縮形式を `ORC` が使用するものに指定します。  
 `parquet_compression = [compression_format]`   
Parquet データのテーブルへの書き込み時に、Parquet ファイル形式に対して使用される圧縮タイプ。例えば、`WITH (parquet_compression = 'SNAPPY')` と指定します。この圧縮は Parquet ファイル内の列チャンクに適用されます。この指定を省略した場合、Parquet に対してはデフォルトで GZIP 圧縮が使用されます。  
整合性を保つために、`parquet_compression` の代わりに `write_compression` プロパティを使用することをお勧めします。`format` プロパティを使用して、ストレージ形式を `PARQUET` に指定した上で、`write_compression` プロパティにより、圧縮形式を `PARQUET` が使用するものに指定します。  
 `compression_level = [compression_level]`   
使用する圧縮レベル。このプロパティは、ZSTD 圧縮にのみ適用されます。有効な値は 1 から 22 です。デフォルト値は 3 です。詳細については、「[ZSTD 圧縮レベルを使用する](compression-support-zstd-levels.md)」を参照してください。

## 例
<a name="ctas-table-examples"></a>

CTAS クエリの例については、次のリソースを参照してください。
+  [CTAS クエリの例](ctas-examples.md) 
+  [ETL およびデータ分析での CTAS および INSERT INTO を使用する](ctas-insert-into-etl.md) 
+  [コストを削減してパフォーマンスを向上させるために Amazon Athena で CTAS ステートメントを使用する](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/) 
+  [CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する](ctas-insert-into.md) 

# CREATE VIEW および CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-view"></a>

ビューは、この先のクエリで参照できる論理的なテーブルです。ビューにはデータは一切含まれず、データを書き込むこともできません。代わりに、ビューで指定するクエリは、別のクエリでそのビューを参照するたびに実行されます。
+ `CREATE VIEW` は、指定された `SELECT` クエリから Athena ビューを作成します。Athena ビューは Athena 内で機能します。Athena ビューの詳細については、「[ビューを使用する](views.md)」を参照してください。
+ `CREATE PROTECTED MULTI DIALECT VIEW` は、AWS Glue Data Catalog に AWS Glue Data Catalog ビューを作成します。AWS Glue Data Catalog ビューは、Amazon Athena や Amazon Redshift などの AWS のサービス 全体で単一の共通ビューを提供します。AWS Glue Data Catalog ビューの詳細については、「[Athena でデータカタログビューを使用する](views-glue.md)」を参照してください。

## CREATE VIEW
<a name="create-view-ate"></a>

Athena 内で使用するビューを作成します。

### 概要
<a name="synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW view_name AS query
```

オプションの `OR REPLACE` 句は、既存のビューを更新して置き換えます。詳細については、「[ビューを作成する](views-console.md#creating-views)」を参照してください。

### 例
<a name="examples"></a>

テーブル `orders` から `test` ビューを作成するには、次のようなクエリを使用します。

```
CREATE VIEW test AS
SELECT 
orderkey, 
orderstatus, 
totalprice / 2 AS half
FROM orders;
```

テーブル `orders` から `orders_by_date` ビューを作成するには、次のクエリを使用します。

```
CREATE VIEW orders_by_date AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
```

既存のビューを更新するには、次のような例を使用します。

```
CREATE OR REPLACE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 4 AS quarter
FROM orders;
```

 Athena ビューの使用の詳細については、「[ビューを使用する](views.md)」を参照してください。

## CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-protected-multi-dialect-view"></a>

AWS Glue Data Catalog で AWS Glue Data Catalog ビューを作成します。データカタログビューは、Athena と Amazon Redshift や Amazon EMR のような他の SQL エンジン間で機能する単一のビュースキーマです。

### 構文
<a name="create-protected-multi-dialect-view-syntax"></a>

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS query
```

**OR REPLACE**  
(オプション) 既存のビューを置き換えて更新します。データカタログビューに他のエンジンの SQL ダイアレクトが含まれている場合、そのビューを置き換えることはできません。呼び出し側のエンジンの SQL ダイアレクトがビュー内に存在する場合は、そのビューを置き換えることができます。

**PROTECTED**  
キーワードが必須です。ビューをデータ漏洩から保護するように指定します。データカタログビューは `PROTECTED` ビューとしてのみ作成できます。

**MULTI DIALECT**  
ビューがさまざまなクエリエンジンの SQL ダイアレクトをサポートし、それらのエンジンで読み取れるように指定します。

**SECURITY DEFINER**  
このビューに対して definer セマンティクスが有効であることを指定します。definer セマンティクスとは、基礎となるテーブルに対する有効な読み取り権限が、実際の読み取りを実行するプリンシパルではなく、ビューを定義したプリンシパルまたはロールに属することを意味します。

**SHOW VIEW JSON**  
(オプション) 実際にビューを作成せずに、データカタログビュー仕様の JSON を返します。この「ドライラン」オプションは、ビューの SQL を検証し、AWS Glue が使用するテーブルメタデータを返す場合に便利です。

### 例
<a name="create-protected-multi-dialect-view-syntax-example"></a>

次の例では、`orders` テーブルに対するクエリに基づいて `orders_by_date` データカタログビューを作成します。

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

AWS Glue Data Catalog ビューの使用の詳細については、「[Athena でデータカタログビューを使用する](views-glue.md)」を参照してください。

# DESCRIBE
<a name="describe-table"></a>

指定したテーブルの 1 つ以上の列 (パーティション列を含む) を表示します。このコマンドは、複雑な列の属性を調べるのに便利です。

## 概要
<a name="synopsis"></a>

```
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )]
```

**重要**  
このステートメントの構文は `DESCRIBE table_name` であり、`DESCRIBE TABLE table_name` ではありません。後者の構文を使用すると、エラーメッセージ FAILED: SemanticException [Error 10001]: Table not found table が表示されます。

## パラメータ
<a name="parameters"></a>

**[EXTENDED \$1 FORMATTED]**  
出力の形式を判断します。これらのパラメータを省略すると、列名と対応するデータ型 (パーティション列を含む) が表形式で表示されます。`FORMATTED` を指定すると、列名とデータ型が表形式で表示されるだけでなく、詳細なテーブルおよびストレージ情報も表示されます。`EXTENDED` は、列およびデータ型の情報を表形式で表示し、Thrift シリアル化形式でテーブルの詳細なメタデータを示します。この形式は読みにくいですが、主としてデバッグの際に役立ちます。

**[PARTITION partition\$1spec]**  
含まれている場合は、`partition_spec` で指定されたパーティションのメタデータが一覧表示されます。`partition_spec` は `(partition_column = partition_col_value, partition_column = partition_col_value, ...)` の形式です。

**[col\$1name ( [.field\$1name] \$1 [.'\$1elem\$1'] \$1 [.'\$1key\$1'] \$1 [.'\$1value\$1'] )\$1 ]**  
確認する列と属性を指定します。構造体の要素には `.field_name`、配列要素には `'$elem$'`、マップキーには `'$key$'`、およびマップ値には `'$value$'` を指定できます。これを再帰的に指定することで、複雑な列を詳しく調査できます。

### 例
<a name="examples"></a>

```
DESCRIBE orders
```

```
DESCRIBE FORMATTED mydatabase.mytable PARTITION (part_col = 100) columnA;
```

次のクエリおよび出力では、Amazon EMR サンプルデータに基づいた `impressions` テーブルの列およびデータ型の情報が表示されています。

```
DESCRIBE impressions
```

```
requestbegintime          string                                         from deserializer   
adid                      string                                         from deserializer   
impressionid              string                                         from deserializer   
referrer                  string                                         from deserializer   
useragent                 string                                         from deserializer   
usercookie                string                                         from deserializer   
ip                        string                                         from deserializer   
number                    string                                         from deserializer   
processid                 string                                         from deserializer   
browsercokie              string                                         from deserializer   
requestendtime            string                                         from deserializer   
timers                    struct<modellookup:string,requesttime:string>  from deserializer   
threadid                  string                                         from deserializer   
hostname                  string                                         from deserializer   
sessionid                 string                                         from deserializer   
dt                        string

# Partition Information
# col_name                data_type                 comment             

dt                        string
```

次のクエリおよび出力の例では、`FORMATTED` オプションが使用された場合の同じテーブルの結果が表示されています。

```
DESCRIBE FORMATTED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

# Detailed Table Information
Database:                 sampledb
Owner:                    hadoop
CreateTime:               Thu Apr 23 02:55:21 UTC 2020
LastAccessTime:           UNKNOWN
Protect Mode:             None
Retention:                0
Location:                 s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions
Table Type:               EXTERNAL_TABLE
Table Parameters:
        EXTERNAL                  TRUE
        transient_lastDdlTime     1587610521

# Storage Information
SerDe Library:                         org.openx.data.jsonserde.JsonSerDe
InputFormat:                           org.apache.hadoop.mapred.TextInputFormat
OutputFormat:                          org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
Compressed:                            No
Num Buckets:                           -1
Bucket Columns:                        []
Sort Columns:                          []
Storage Desc Params:
        paths                                  requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip
        serialization.format                   1
```

次のクエリおよび出力の例では、`EXTENDED` オプションが使用された場合の同じテーブルの結果が表示されています。詳細なテーブル情報は 1 行で出力されますが、ここでは読みやすくするためにフォーマットされています。

```
DESCRIBE EXTENDED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

Detailed Table Information       Table(tableName:impressions, dbName:sampledb, owner:hadoop, createTime:1587610521, 
lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:requestbegintime, type:string, comment:null), 
FieldSchema(name:adid, type:string, comment:null), FieldSchema(name:impressionid, type:string, comment:null), 
FieldSchema(name:referrer, type:string, comment:null), FieldSchema(name:useragent, type:string, comment:null), 
FieldSchema(name:usercookie, type:string, comment:null), FieldSchema(name:ip, type:string, comment:null), 
FieldSchema(name:number, type:string, comment:null), FieldSchema(name:processid, type:string, comment:null), 
FieldSchema(name:browsercokie, type:string, comment:null), FieldSchema(name:requestendtime, type:string, comment:null), 
FieldSchema(name:timers, type:struct<modellookup:string,requesttime:string>, comment:null), FieldSchema(name:threadid, 
type:string, comment:null), FieldSchema(name:hostname, type:string, comment:null), FieldSchema(name:sessionid, 
type:string, comment:null)], location:s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions, 
inputFormat:org.apache.hadoop.mapred.TextInputFormat, 
outputFormat:org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, 
serdeInfo:SerDeInfo(name:null, serializationLib:org.openx.data.jsonserde.JsonSerDe, parameters:{serialization.format=1, 
paths=requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip}), bucketCols:[], sortCols:[], parameters:{}, 
skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), 
storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:dt, type:string, comment:null)], 
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1587610521}, viewOriginalText:null, viewExpandedText:null, 
tableType:EXTERNAL_TABLE)
```

# DESCRIBE VIEW
<a name="describe-view"></a>

指定された Athena または AWS Glue Data Catalog ビューの列のリストを表示します。複合ビューの属性を調べるのに役立ちます。

 データカタログビューの場合、ステートメントの出力は Lake Formation アクセスコントロールによって制御され、呼び出し元がアクセスできる列のみが表示されます。

## 概要
<a name="synopsis"></a>

```
DESCRIBE [db_name.]view_name
```

## 例
<a name="examples"></a>

```
DESCRIBE orders
```

「[SHOW COLUMNS](show-columns.md)」、「[SHOW CREATE VIEW](show-create-view.md)」、「[SHOW VIEWS](show-views.md)」、「[DROP VIEW](drop-view.md)」も参照してください。

# DROP DATABASE
<a name="drop-database"></a>

指定したデータベースをカタログから削除します。データベースにテーブルが含まれている場合は、`DROP DATABASE` を実行する前にそれらのテーブルを削除するか、`CASCADE` 句を使用する必要があります。`DATABASE` と `SCHEMA` はどちらでも使用できます。どちらも同じ意味です。

## 概要
<a name="synopsis"></a>

```
DROP {DATABASE | SCHEMA} [IF EXISTS] database_name [RESTRICT | CASCADE]
```

## パラメータ
<a name="parameters"></a>

**[IF EXISTS]**  
`database_name` が存在しない場合に、エラーを抑制します。

**[RESTRICT\$1CASCADE]**  
`database_name` 内のテーブルを `DROP` オペレーションで処理する方法を決定します。`RESTRICT` を指定すると、テーブルが含まれているデータベースは削除されません。これがデフォルトの動作です。`CASCADE` を指定すると、データベースとそのすべてのテーブルが削除されます。

## 例
<a name="examples"></a>

```
DROP DATABASE clickstreams;
```

```
DROP SCHEMA IF EXISTS clickstreams CASCADE;
```

**注記**  
名前に特殊文字 (例: `my-database`) を含むデータベースを削除しようとすると、エラーメッセージが表示されることがあります。この問題を解決するには、データベース名をバッククォート文字 (`) で囲んでみてください。Athena でのデータベースの名前の付け方については、「[データベース、テーブル、列に名前を付ける](tables-databases-columns-names.md)」を参照してください。

# DROP TABLE
<a name="drop-table"></a>

`table_name` という名前のテーブルからメタデータのテーブル定義を削除します。外部テーブルをドロップすると、基礎となるデータはそのままです。

## 概要
<a name="synopsis"></a>

```
DROP TABLE [IF EXISTS] table_name
```

## パラメータ
<a name="parameters"></a>

**[ IF EXISTS ]**  
`table_name` が存在しない場合に、エラーを抑制します。

## 例
<a name="examples"></a>

```
DROP TABLE fulfilled_orders
```

```
DROP TABLE IF EXISTS fulfilled_orders
```

Athena コンソールのクエリエディタを使用してアンダースコア (\$1) 以外の特殊文字を含むテーブルをドロップする場合は、以下の例にあるように、バックティックを使用します。

```
DROP TABLE `my-athena-database-01.my-athena-table`
```

JDBC コネクタを使用して特殊文字を含むテーブルを削除する場合は、バックティック文字は必要ありません。

```
DROP TABLE my-athena-database-01.my-athena-table
```

# DROP VIEW
<a name="drop-view"></a>

既存の Athena または AWS Glue Data Catalog ビューをドロップ (削除) します。オプションの `IF EXISTS` 句は、ビューが存在しない場合に、エラーが制御される原因となります。

データカタログビューの場合、Athena ビュー構文 (ダイアレクト) がデータカタログビューに存在する場合にのみビューをドロップします。例えば、ユーザーが Athena から `DROP VIEW` を呼び出した場合、ビューに Athena のダイアレクトが存在する場合にのみビューが削除されます。それ以外の場合は、このオペレーションは失敗します。データカタログビューをドロップするには、Lake Formation 管理者またはビュー定義者の許可が必要です。

詳細については、[ビューを使用する](views.md)および[Athena でデータカタログビューを使用する](views-glue.md)を参照してください。

## 概要
<a name="synopsis"></a>

```
DROP VIEW [ IF EXISTS ] view_name
```

## 例
<a name="examples"></a>

```
DROP VIEW orders_by_date
```

```
DROP VIEW IF EXISTS orders_by_date
```

[CREATE VIEW および CREATE PROTECTED MULTI DIALECT VIEW](create-view.md)、[SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[SHOW VIEWS](show-views.md) および [DESCRIBE VIEW](describe-view.md) も参照してください。

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

Hive 互換パーティションを追加した後でカタログ内のメタデータを更新するには、`MSCK REPAIR TABLE` コマンドを使用します。

`MSCK REPAIR TABLE` コマンドは、テーブルの作成後にファイルシステムに追加された Hive 互換パーティションで Simple Storage Service (Amazon S3) などのファイルシステムをスキャンします。`MSCK REPAIR TABLE` は、テーブルメタデータのパーティションと S3 のパーティションを比較します。テーブルの作成時に指定した S3 の場所に新しいパーティションが存在する場合は、これらのパーティションがメタデータと Athena のテーブルに追加されます。

物理パーティションを追加すると、カタログ内のメタデータがファイルシステム内のデータのレイアウトと整合しなくなるので、新しいパーティションに関する情報をカタログに追加する必要があります。メタデータを更新するには、Athena から新しいパーティションのデータをクエリできるように `MSCK REPAIR TABLE` を実行します。

**注記**  
`MSCK REPAIR TABLE` は、パーティションをメタデータに追加するだけであり、パーティションを削除しません。Amazon S3 でパーティションが手動で削除された後でメタデータからそれらのパーティションを削除するには、コマンド `ALTER TABLE table-name DROP PARTITION` を実行します。詳細については、「[ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)」を参照してください。

## 考慮事項と制限事項
<a name="msck-repair-table-considerations"></a>

`MSCK REPAIR TABLE` を使用する際は、次のポイントに注意が必要です。
+ すべてのパーティションを追加するには時間がかかる場合があります。このオペレーションがタイムアウトになると、未完了状態となり、一部のパーティションのみがカタログに追加されます。すべてのパーティションが追加されるまで、同じテーブルで `MSCK REPAIR TABLE` を実行してください。詳細については、「[データのパーティション化](partitions.md)」を参照してください。
+ Hive と互換性のないパーティションの場合、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用してパーティションをロードすることで、データをクエリできるようにします。
+ Athena で使用されるパーティションの場所は、`s3` プロトコル (`s3://amzn-s3-demo-bucket/folder/` など) を使用する必要があります。Athena では、他のプロトコル (`s3a://bucket/folder/` など) を使用する場所は、そこにあるテーブルに対して `MSCK REPAIR TABLE` クエリを実行する場合にクエリが失敗する原因になります。
+ `MSCK REPAIR TABLE` がフォルダとそのサブフォルダの両方をスキャンして一致するパーティションスキームを検索するため、別個のテーブルのデータは別個のフォルダ階層に保存するようにしてください。例えば、テーブル 1 のデータが `s3://amzn-s3-demo-bucket1` にあり、テーブル 2 のデータが `s3://amzn-s3-demo-bucket1/table-2-data` にあるとします。両方のテーブルが文字列でパーティション分割されている場合、`MSCK REPAIR TABLE` はテーブル 2 のパーティションをテーブル 1 に追加します。これを回避するには、この代わりに `s3://amzn-s3-demo-bucket2` や `s3://amzn-s3-demo-bucket1` といった別個のフォルダ構造を使用します。この動作は、Amazon EMR および Apache Hive と同じであることに注意してください。
+ 既知の問題により、パーティション値にコロン (`:`) 記号が含まれている場合 (例えば、パーティション値がタイムスタンプの場合)、`MSCK REPAIR TABLE` は警告なしに失敗します。回避方法として、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用します。
+ `MSCK REPAIR TABLE` では、アンダースコア (\$1) で始まるパーティション列名は追加されません。この制限を回避するには、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用します。

## 概要
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 例
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## トラブルシューティング
<a name="msck-repair-table-troubleshooting"></a>

`MSCK REPAIR TABLE` の実行後、AWS Glue Data Catalog のテーブルにパーティションが追加されない場合は、以下をチェックしてください。
+ **AWS Glue アクセス** – AWS Identity and Access Management (IAM) ロールに、`glue:BatchCreatePartition` アクションを許可するポリシーがあることを確認します。詳細については、このドキュメントで後述する「[IAM ポリシーで glue:BatchCreatePartition を許可する](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy)」を参照してください。
+ **Amazon S3 アクセス** – ロールに [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) アクションを含む Amazon S3 にアクセスするために、十分なアクセス許可を持つポリシーがあることを確認します。許可する Simple Storage Service (Amazon S3) アクションの例については、「[Athena で Amazon S3 バケットへのクロスアカウント アクセスを構成する](cross-account-permissions.md)」のバケットポリシー例を参照してください。
+ **Amazon S3 オブジェクトキーの大文字と小文字の区別** – Amazon S3 パスがキャメルケースではなく小文字になっている (例: `userId` ではなく `userid`) ことを確認するか、`ALTER TABLE ADD PARTITION` を使用してオブジェクトキー名を指定します。詳細については、このドキュメントで後述する「[Amazon S3 パスを変更するか再度定義する](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path)」を参照してください。
+ **クエリのタイムアウト** – `MSCK REPAIR TABLE` は、初めてテーブルを作成する場合、またはデータとパーティションメタデータ間のパリティについて不確実性がある場合の使用に最適です。`MSCK REPAIR TABLE` を使用して新しいパーティションを頻繁に追加し (例えば、日常的に追加するなど)、クエリのタイムアウトが発生している場合は、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) の使用を検討してください。
+ **ファイルシステムからパーティションが欠落している** – Amazon S3 でパーティションを手動で削除してから `MSCK REPAIR TABLE` を実行すると、「Partitions missing from filesystem」というエラーメッセージが表示される場合があります。これは、`MSCK REPAIR TABLE` がテーブルメタデータから古いパーティションを削除しないために発生します。削除済みのパーティションをテーブルメタデータから除外するには、代わりに [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) を実行します。[SHOW PARTITIONS](show-partitions.md) も同様に、ファイルシステムのパーティションではなく、メタデータのパーティションだけをリストすることに注意してください。
+ **「NullPointerException 名は null です」というエラー**

  AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作や CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) テンプレートを使用して、`TableType` プロパティを指定せずに Athena で使用するテーブルを作成し、`SHOW CREATE TABLE` または `MSCK REPAIR TABLE` などの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。

  このエラーを解決するには、[TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性の値を AWS Glue `CreateTable` API コール、または [CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)の一部として指定します。`TableType` に使用できる値には、`EXTERNAL_TABLE` や `VIRTUAL_VIEW` が含まれます。

  この要件は、AWS Glue `CreateTable` API 操作や `AWS::Glue::Table` テンプレートを使用してテーブルを作成する場合にだけ適用されます。DDL ステートメントや AWS Glue クローラを使用して Athena のテーブルを作成すると、`TableType` プロパティが自動的に定義されます。

以下のセクションで詳細を説明します。

### IAM ポリシーで glue:BatchCreatePartition を許可する
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

`MSCK REPAIR TABLE` の実行に使用しているロールにアタッチされている IAM ポリシーを見直します。[Athena で AWS Glue Data Catalog を使用](data-sources-glue.md)する場合は、IAM ポリシーで `glue:BatchCreatePartition` アクションが許可されている必要があります。`glue:BatchCreatePartition` アクションを許可する IAM ポリシーの例については、「[AWS 管理ポリシー: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)」を参照してください。

### Amazon S3 パスを変更するか再度定義する
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

Amazon S3 パスの 1 つ以上のオブジェクトキーが小文字ではなくキャメルケースになっている場合、`MSCK REPAIR TABLE` がパーティションを AWS Glue Data Catalog に追加しない場合があります。例えば、Amazon S3 パスにオブジェクトキー名 `userId` が含まれている場合、次のパーティションが AWS Glue Data Catalog に追加されない可能性があります。

```
s3://amzn-s3-demo-bucket/path/userId=1/

s3://amzn-s3-demo-bucket/path/userId=2/

s3://amzn-s3-demo-bucket/path/userId=3/
```

この問題を解決するには、次のいずれかを実行します。
+ Amazon S3 オブジェクトキーを作成するときには、キャメルケースではなく小文字を使用してください。

  ```
  s3://amzn-s3-demo-bucket/path/userid=1/
  
  s3://amzn-s3-demo-bucket/path/userid=2/
  
  s3://amzn-s3-demo-bucket/path/userid=3/
  ```
+ 次の例に示されているように、[ALTER TABLE ADD PARTITION](alter-table-add-partition.md) を使用して場所を再度定義します。

  ```
  ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION (userId=1)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/'
  PARTITION (userId=2)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/'
  PARTITION (userId=3)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
  ```

Amazon S3 オブジェクトキー名には大文字を使用できますが、Amazon S3 バケットの名称は常に小文字にする必要があります。詳細については、「Amazon S3 ユーザーガイド」の「[オブジェクトキー命名ガイドライン](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)」と「[バケット命名規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)」を参照してください。

# SHOW COLUMNS
<a name="show-columns"></a>

指定された単一のテーブル、Athena ビュー、またはデータカタログビューの列名のみを表示します。Athena ビューのより詳細な情報を取得するには、代わりに AWS Glue Data Catalog をクエリします。詳細と例については、[AWS Glue Data Catalog をクエリする](querying-glue-catalog.md) トピックの次のセクションを参照してください。
+ 列メタデータ (データ型など) を表示するには、「[指定したテーブルまたはビューの列を一覧表示または検索する](querying-glue-catalog-listing-columns.md)」を参照してください。
+ `AwsDataCatalog` の特定のデータベース内の全テーブルですべての列を一覧表示するには、「[指定したテーブルまたはビューの列を一覧表示または検索する](querying-glue-catalog-listing-columns.md)」を参照してください。
+ `AwsDataCatalog` の全データベースにある全テーブルの全列を表示するには、「[全テーブルのすべての列を一覧表示する](querying-glue-catalog-listing-all-columns-for-all-tables.md)」を参照してください。
+ データベース内の特定のテーブルに共通する列を表示するには、「[特定のテーブルに共通する列を一覧表示する](querying-glue-catalog-listing-columns-in-common.md)」 を参照してください。

データカタログビューの場合、ステートメントの出力は Lake Formation アクセスコントロールによって制御され、呼び出し元がアクセスできる列のみが表示されます。

## 概要
<a name="synopsis"></a>

```
SHOW COLUMNS {FROM|IN} database_name.table_or_view_name
```

```
SHOW COLUMNS {FROM|IN} table_or_view_name [{FROM|IN} database_name]
```

`FROM` および `IN` キーワードは、同じように使用できます。*table\$1or\$1view\$1name* または *database\$1name* にハイフンのような特殊文字が含まれている場合は、名前をバッククォートで囲みます (``my-database`.`my-table`` など)。*table\$1or\$1view\$1name* または *database\$1name* をシングルクォートまたはダブルクォートで囲んではいけません。現在、`LIKE` およびパターンマッチングの式の使用はサポートされていません。

## 例
<a name="examples"></a>

次の例はどれも同等で、`customers` データベース内の `orders` テーブルの列を表示します。最初の 2 つの例では、`customers` が現在のデータベースとします。

```
SHOW COLUMNS FROM orders
```

```
SHOW COLUMNS IN orders
```

```
SHOW COLUMNS FROM customers.orders
```

```
SHOW COLUMNS IN customers.orders
```

```
SHOW COLUMNS FROM orders FROM customers
```

```
SHOW COLUMNS IN orders IN customers
```

# SHOW CREATE TABLE
<a name="show-create-table"></a>

`table_name` という既存のテーブルを分析し、作成元のクエリを生成します。

## 概要
<a name="synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## パラメータ
<a name="parameters"></a>

**TABLE [db\$1name.]table\$1name**  
`db_name` パラメータはオプションです。省略すると、コンテキストはデフォルトで現在のデータベースになります。  
テーブル名は必須です。

## 例
<a name="examples"></a>

```
SHOW CREATE TABLE orderclickstoday;
```

```
SHOW CREATE TABLE `salesdata.orderclickstoday`;
```

## トラブルシューティング
<a name="show-create-table-troubleshooting"></a>

AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作や CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) テンプレートを使用して、`TableType` プロパティを指定せずに Athena で使用するテーブルを作成し、`SHOW CREATE TABLE` または `MSCK REPAIR TABLE` などの DDL クエリを実行すると、「失敗: NullPointerException 名は null です」というエラーメッセージを受け取る場合があります。

このエラーを解決するには、[TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性の値を AWS Glue `CreateTable` API コール、または [CloudFormation テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)の一部として指定します。`TableType` に使用できる値には、`EXTERNAL_TABLE` や `VIRTUAL_VIEW` が含まれます。

この要件は、AWS Glue `CreateTable` API 操作や `AWS::Glue::Table` テンプレートを使用してテーブルを作成する場合にだけ適用されます。DDL ステートメントや AWS Glue クローラを使用して Athena のテーブルを作成すると、`TableType` プロパティが自動的に定義されます。

# SHOW CREATE VIEW
<a name="show-create-view"></a>

指定された Athena またはデータカタログビューを作成した SQL ステートメントを表示します。返される SQL には、Athena で使用されているビュー作成構文が表示されます。データカタログビューで `SHOW CREATE VIEW` を呼び出すには、Lake Formation 管理者またはビュー定義者の許可が必要です。

## 概要
<a name="synopsis"></a>

```
SHOW CREATE VIEW view_name
```

## 例
<a name="examples"></a>

```
SHOW CREATE VIEW orders_by_date
```

「[CREATE VIEW および CREATE PROTECTED MULTI DIALECT VIEW](create-view.md)」および「[DROP VIEW](drop-view.md)」も参照してください。

# SHOW DATABASES
<a name="show-databases"></a>

メタストアに定義されているすべてのデータベースを一覧表示します。`DATABASES` または `SCHEMAS` を使用できます。どちらも同じ意味です。

`SHOW DATABASES` と同等の動作をプログラム的に行うのは、[ListDatabases](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDatabases.html) Athena API アクションです。AWS SDK for Python (Boto3) での同等のメソッドは、[list\$1databases](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena/client/list_databases.html) です。

## 概要
<a name="synopsis"></a>

```
SHOW {DATABASES | SCHEMAS} [LIKE 'regular_expression']
```

## パラメータ
<a name="parameters"></a>

**[LIKE '*regular\$1expression*']**  
データベースのリストをフィルタ処理して、指定した `regular_expression` と一致するものに絞り込みます。ワイルドカード文字の照合では、組み合わせ `.*` を使用できます。この組み合わせは、任意のゼロ文字に無制限に一致します。

## 例
<a name="examples"></a>

```
SHOW SCHEMAS;
```

```
SHOW DATABASES LIKE '.*analytics';
```

# SHOW PARTITIONS
<a name="show-partitions"></a>

Athena テーブルのすべてのパーティションをソートせずに表示します。

## 概要
<a name="synopsis"></a>

```
SHOW PARTITIONS table_name
```
+ テーブル内のパーティションを表示し、特定の順序で一覧表示するには、[AWS Glue Data Catalog をクエリする](querying-glue-catalog.md) ページの「[特定のテーブルのパーティションを一覧表示する](querying-glue-catalog-listing-partitions.md)」セクションを参照してください。
+ パーティションの内容を表示するには、[データのパーティション化](partitions.md) ページの「[データのクエリ](partitions.md#query-the-data)」セクションを参照してください。
+ `SHOW PARTITIONS` は、Athena によって射影されていても、AWS Glue カタログに登録されていないパーティションをリストしません。パーティション射影の詳細については、「[Amazon Athena でパーティション射影を使用する](partition-projection.md)」を参照してください。
+  `SHOW PARTITIONS` はメタデータのパーティションをリストしますが、実際のファイルシステムにあるパーティションはリストしません。Amazon S3 でパーティションを手動で削除してからメタデータを更新するには、[ALTER TABLE DROP PARTITION](alter-table-drop-partition.md) を実行してください。

## 例
<a name="examples"></a>

次のクエリの例では、`flight_delays_csv` テーブルのパーティションが表示されます。このテーブルには、米国運輸省のフライトテーブルデータが表示されます。この `flight_delays_csv` テーブルの例の詳細については、「[CSV、TSV、カスタム区切りファイル用の Lazy Simple SerDe](lazy-simple-serde.md)」を参照してください。テーブルは、年ごとにパーティション化されます。

```
SHOW PARTITIONS flight_delays_csv
```

**結果**

```
year=2007
year=2015
year=1999
year=1993
year=1991
year=2003
year=1996
year=2014
year=2004
year=2011
...
```

次のクエリの例では、`impressions` テーブルのパーティションが表示されます。このテーブルには、ウェブ閲覧データのサンプルが含まれています。この `impressions` テーブルの例の詳細については、「[データのパーティション化](partitions.md)」を参照してください。テーブルは、`dt` (datetime) 列によってパーティション化されています。

```
SHOW PARTITIONS impressions
```

**結果**

```
dt=2009-04-12-16-00
dt=2009-04-13-18-15
dt=2009-04-14-00-20
dt=2009-04-12-13-00
dt=2009-04-13-02-15
dt=2009-04-14-12-05
dt=2009-04-14-06-15
dt=2009-04-12-21-15
dt=2009-04-13-22-15
...
```

### パーティションをソートしてリストする
<a name="show-partitions-examples-ordering"></a>

結果リストでパーティションを整列させるには、`SHOW PARTITIONS` の代わりに次の `SELECT` 構文を使用します。

```
SELECT * FROM database_name."table_name$partitions" ORDER BY column_name
```

次のクエリでは、`flight_delays_csv` の例のパーティションの一覧を表示しますが、ソートされます。

```
SELECT * FROM "flight_delays_csv$partitions" ORDER BY year
```

**結果**

```
year
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
...
```

詳細については、[AWS Glue Data Catalog をクエリする](querying-glue-catalog.md) ページの「[特定のテーブルのパーティションを一覧表示する](querying-glue-catalog-listing-partitions.md)」セクションを参照してください。

# SHOW TABLES
<a name="show-tables"></a>

データベース内のすべての基本テーブルとビューを一覧表示します。

**注記**  
[GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API オペレーションの `SHOW TABLES` の [StatementType](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html#athena-Type-QueryExecution-StatementType) パラメータは `DDL` ではなく `UTILITY` に分類されます。

## 概要
<a name="synopsis"></a>

```
SHOW TABLES [IN database_name] ['regular_expression']
```

## パラメータ
<a name="parameters"></a>

**[IN database\$1name]**  
テーブルを一覧表示する `database_name` を指定します。省略すると、現在のコンテキストのデータベースが使用されます。  
`database_name` がハイフンなどの[サポートされていない文字](tables-databases-columns-names.md)を使用すると、`SHOW TABLES` は失敗する可能性があります。回避策として、データベース名をバッククォートで囲んでみてください。

**['regular\$1expression']**  
テーブルのリストをフィルタして、指定した `regular_expression` と一致するものに絞り込みます。`AWSDataCatalog` テーブルの任意の文字を示すには、`*` または `.*` ワイルドカード式を使用できます。Apache Hive データベースの場合は、`.*` ワイルドカード式を使用します。文字間の選択を示すには、`|` 文字を使用します。

## 例
<a name="examples"></a>

**Example – データベース `sampledb` 内のすべてのテーブルを表示します**  

```
SHOW TABLES IN sampledb
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example – `sampledb` 内にある「flights」という単語を含むすべてのテーブルの名前を表示します**  

```
SHOW TABLES IN sampledb '*flights*'
```
`Results`  

```
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example – `sampledb` 内にある「logs」という単語で終わるすべてのテーブルの名前を表示します**  

```
SHOW TABLES IN sampledb '*logs'
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
```

# SHOW TBLPROPERTIES
<a name="show-tblproperties"></a>

指定されたテーブルのテーブルプロパティを一覧表示します。

## 概要
<a name="synopsis"></a>

```
SHOW TBLPROPERTIES table_name [('property_name')]
```

## パラメータ
<a name="parameters"></a>

**[('property\$1name')]**  
このパラメータを含めると、`property_name` というプロパティの値のみが表示されます。

## 例
<a name="examples"></a>

```
SHOW TBLPROPERTIES orders;
```

```
SHOW TBLPROPERTIES orders('comment');
```

# SHOW VIEWS
<a name="show-views"></a>

`STRING` タイプの値のリストに Athena またはデータカタログビューを一覧表示します。リスト内の各値は、指定されたデータベース内のビューの名前、またはデータベース名を省略した場合は現在のデータベース内のビューの名前です。オプションの `LIKE` 句を正規表現で使用して、ビュー名のリストを制限します。データカタログビューの場合、Athena SQL 構文を使用するビューのみを一覧表示します。他のデータカタログビューは除外されます。

## 概要
<a name="synopsis"></a>

```
SHOW VIEWS [IN database_name] [LIKE 'regular_expression']
```

### パラメータ
<a name="parameters"></a>

**[IN database\$1name]**  
ビューを一覧表示する `database_name` を指定します。省略すると、現在のコンテキストのデータベースが使用されます。

**[LIKE 'regular\$1expression']**  
ビューのリストをフィルタして、指定した `regular_expression` と一致するものに絞り込みます。使用できるのは、任意の文字を示すワイルドカードの `*`、または複数の文字からの選択を示す `|` のみです。

## 例
<a name="examples"></a>

```
SHOW VIEWS
```

```
SHOW VIEWS IN marketing_analytics LIKE 'orders*'
```

「[SHOW COLUMNS](show-columns.md)」、「[SHOW CREATE VIEW](show-create-view.md)」、「[DESCRIBE VIEW](describe-view.md)」、「[DROP VIEW](drop-view.md)」も参照してください。

# Amazon Athena での SQL クエリに関する考慮事項と制約事項
<a name="other-notable-limitations"></a>

Athena でクエリを実行するときは、以下の考慮事項と制限事項に留意してください。
+ **ストアドプロシージャ** – ストアドプロシージャはサポートされていません。
+ **パーティションの最大数** – `CREATE TABLE AS SELECT` (CTAS) ステートメントで作成できるパーティションの最大数は 100 です。詳細については、「[CREATE TABLE AS](create-table-as.md)」を参照してください。回避策については、「[CTAS および INSERT INTO を使用して 100 パーティションの制限を回避する](ctas-insert-into.md)」を参照してください。
+ **サポートされていないステートメント** – サポートされていないステートメントには次が含まれます。Athena でサポートされていない DDL ステートメントの完全なリストについては、「[サポートされない DDL](unsupported-ddl.md)」を参照してください。
  + `CREATE TABLE LIKE` はサポートされていません。
  + `DESCRIBE INPUT` と `DESCRIBE OUTPUT` はサポートされていません。
  + `MERGE` ステートメントは、トランザクションテーブル形式でのみサポートされています。詳細については、「[MERGE INTO](merge-into-statement.md)」を参照してください。
  + `UPDATE` ステートメントはサポートされません。
  + `DELETE FROM` はサポートされていません。
+ **Trino および Presto コネクタ** – [Trino](https://trino.io/docs/current/connector.html) コネクタも [Presto](https://prestodb.io/docs/current/connector.html) コネクタもサポートされていません。データソースの接続には Amazon Athena のフェデレーティッドクエリを使用します。詳細については、「[Amazon Athena フェデレーティッドクエリを使用する](federated-queries.md)」を参照してください。
+ **多数のパーティションがあるテーブルでのタイムアウト** – Athena は、何千ものパーティションがあるテーブルをクエリするときにタイムアウトする場合があります。これは、テーブルに `string` 型ではないパーティションが多数ある場合に発生する可能性があります。`string` 型を使用すると、Athena はメタストアレベルでパーティションをプルーニングします ただし、他のデータ型を使用する場合、Athena はサーバー側のパーティションをプルーニングします。パーティションの数が多いほど、このプロセスにかかる時間が長くなり、クエリがタイムアウトする可能性が高くなります。この問題を解決するには、パーティションの型を `string` に設定して、Athena がメタストアレベルでパーティションをプルーニングするようにします。これにより、オーバーヘッドが軽減され、クエリがタイムアウトするのを防ぐことができます。
+ **Amazon Glacier** のサポート – 復元された Amazon Glacier オブジェクトをクエリするための詳細については、「[復元された Amazon Glacier オブジェクトをクエリする](querying-glacier.md)」を参照してください。
+ **非表示として扱われるファイル** – Athena は、アンダースコア (`_`) またはドット (`.`) で始まるソースファイルを非表示として扱います。この制限を回避するには、ファイルの名前を変更します。
+ **行または列サイズの制限** – 単一の行、またはその列を 32 MB を超えるサイズにすることはできません。この制限は、例えば、1 行に 35 MB の単一の列が含まれる場合に超過する可能性があります。これはサービスのハードリミットであり、変更できません。
+ **テキストファイルの最大行長** – テキストファイル内の 1 行のサイズには 200 MB の上限があります。この制限を超えると、「TextLineLengthLimitExceededException: Too many bytes before newline」(TextLineLengthLimitExceededException: 改行の前のバイト数が多すぎます) というエラーメッセージが表示される場合があります。この制限を回避するには、テキストファイルに 200 MB を超える単一の行が含まれないようにします。
+ **LIMIT 句の最大値** — `LIMIT` 句に指定できる最大行数は 

  9223372036854775807 です。`ORDER BY` を使用するとき、LIMIT 句でサポートされる行の最大数は 2147483647 です。この制限を超えると、NOT\$1SUPPORTED: ORDER BY LIMIT > 2147483647 is not supported (NOT\$1SUPPORTED: ORDER BY LIMIT > 2147483647 はサポートされていません) というエラーメッセージが表示されます。
+ **information\$1schema** – `information_schema` のクエリのパフォーマンスは、AWS Glue メタデータの量が少ない、または中程度の場合に最も高くなります。大量のメタデータがある場合は、エラーが発生する可能性があります。AWS Glue メタデータのための `information_schema` データベースのクエリについては、「[AWS Glue Data Catalog をクエリする](querying-glue-catalog.md)」を参照してください。
+  **配列初期化**— Java の制限により、254 個を超える引数を持つ配列を Athena で初期化することはできません。
+ **非表示メタデータ列** — Hive または Iceberg の非表示メタデータ列 `$bucket`、`$file_modified_time`、`$file_size`、および `$partition` は、ビューでサポートされていません。Athena の `$path`メタデータ列の使用方法については「[Amazon S3 内にあるソースデータのファイルの場所の取得](select.md#select-path)」を参照してください。

クエリ文字列の最大長、クエリタイムアウトのクォータ、アクティブな DML クエリ数のクォータについては、「[サービスクォータ](service-limits.md)」を参照してください。