

# 创建数据库和表
<a name="work-with-data"></a>

Amazon Athena 支持一部分数据定义语言 (DDL) 语句以及 ANSI SQL 函数和运算符，用以定义和查询数据在 Amazon Simple Storage Service 中的外部表。

当您在 Athena 中创建数据库和表时，您需要描述数据的架构和位置，使表中的数据为实时查询做好准备。

为了提高查询性能并降低成本，我们建议您对数据进行分区，并使用开源列式格式存储在 Simple Storage Service (Amazon S3) 中，如 [Apache Parquet](https://parquet.apache.org) 或 [ORC](https://orc.apache.org/)。

**Topics**
+ [创建数据库](creating-databases.md)
+ [创建表](creating-tables.md)
+ [

# 命名数据库、表和列
](tables-databases-columns-names.md)
+ [转义保留关键字](reserved-words.md)

# 在 Athena 中创建数据库
<a name="creating-databases"></a>

Athena 中的数据库是您在其中创建的表的逻辑分组。在创建数据库之前，请创建查询输出位置。

**Topics**
+ [

# 创建查询输出位置
](creating-databases-prerequisites.md)
+ [

# 创建数据库
](creating-databases-query-editor.md)

# 创建查询输出位置
<a name="creating-databases-prerequisites"></a>

如果您尚未在 Amazon S3 中设置查询输出位置，执行以下先决条件步骤进行设置。

**创建查询输出位置**

1. 使用在 Athena 中使用的 AWS 区域 和账户，按照相应的步骤（例如，通过使用 Amazon S3 控制台）[在 Amazon S3 中创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)以保存您的 Athena 查询结果。您需要将此存储桶配置为查询输出位置。

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 如果这是您首次在此 AWS 区域 中访问 Athena 控制台，选择**浏览查询编辑器**打开查询编辑器。否则，Athena 会在查询编辑器中打开。

1. 选择 **Edit Settings**（编辑设置）以在 Amazon S3 中设置查询结果位置。  
![\[选择编辑设置。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/getting-started-choose-view-settings.png)

1. 对于 **Manage settings**（管理设置），执行以下操作之一：
   + 在 **Location of query result**（查询结果位置）文本框中，输入您在 Amazon S3 中为查询结果创建的存储桶路径。在路径前添加前缀 `s3://`。
   + 选择 **Browse S3**（浏览 S3），选择您为当前区域创建的 Amazon S3 存储桶，然后选择 **Choose**（选择）。  
![\[指定 Amazon S3 中的位置用于接收来自 Athena 的查询结果。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/getting-started-setting-results-location.png)

1. 选择**保存**。

1. 选择 **Editor**（编辑器）以切换到查询编辑器。  
![\[选择 Editor（编辑器）。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/getting-started-choose-editor.png)

# 创建数据库
<a name="creating-databases-query-editor"></a>

在设置查询结果位置后，即可在 Athena 控制台查询编辑器中轻松创建数据库。

**使用 Athena 查询编辑器创建数据库**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在**编辑器**选项卡的查询编辑器中，输入 Hive 数据定义语言（DDL）命令 `CREATE DATABASE myDataBase`。将 *myDatabase* 替换为要使用的名称。有关数据库名称的限制，请参阅 [命名数据库、表和列](tables-databases-columns-names.md)。

1. 选择 **Run**（运行）或者按 **Ctrl\$1ENTER**。

1. 要将数据库设为当前数据库，请从查询编辑器左侧的 **Database**（数据库）菜单中选择该数据库。

有关控制 Athena 数据库权限的信息，请参阅 [在 AWS Glue Data Catalog 中配置对数据库和表的访问](fine-grained-access-to-glue-resources.md)。

# 在 Athena 中创建表
<a name="creating-tables"></a>

要创建表，您可以在 Athena 控制台中运行 DDL 语句，使用 Athena [**创建表**表单](creating-tables-how-to.md#to-create-a-table-using-the-wizard)或使用 JDBC 或 ODBC 驱动器。Athena 使用 Apache Hive 定义表和创建在本质上为表的逻辑命名空间的数据库。Athena 支持各种序列化器-反序列化器（SerDe）库来为特定数据格式创建表。有关受支持的 SerDe 库的列表，请参阅[为您的数据选择 SerDE](supported-serdes.md)。

当您在 Athena 中创建数据库和表时，只需描述架构和表数据在 Amazon S3 中的位置，以便进行读取时查询。Athena 不修改您在 Amazon S3 中存储的数据。因此，数据库和表与传统关系数据库系统的含义稍有不同，因为数据不与数据库和表的架构定义一起存储。

Athena 将架构存储在 AWS Glue Data Catalog 中，并在您使用 SQL 查询表时使用它来读取数据。这种 *schema-on-read* 方法可在您运行查询时将架构投射到您的数据上，从而无需加载或转换数据。

## 注意事项和限制
<a name="creating-tables-considerations-and-limitations"></a>

以下是 Athena 中表的一些重要限制和注意事项。

### Amazon S3 注意事项
<a name="s3-considerations"></a>

创建表时，请使用 `LOCATION` 子句指定底层数据在 Amazon S3 存储桶中的位置。请考虑以下事项：
+ Athena 只能在版本化的 Amazon S3 存储桶中查询最新版本的数据，并且无法查询以前版本的数据。
+ 您必须拥有权限才能使用 Amazon S3 位置的数据。有关更多信息，请参阅 [控制从 Athena 对 Amazon S3 的访问](s3-permissions.md)。
+ Athena 支持查询使用多个存储类存储在由 `LOCATION` 子句指定的相同存储桶中的对象。例如，您可以查询存储在 Amazon S3 中不同存储类（标准、标准 IA 和智能分层）的对象中的数据。
+ Athena 支持[申请方付款存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html)。要了解如何为包含您计划在 Athena 中查询的源数据的存储桶启用申请方付款，请参阅[创建工作组](creating-workgroups.md)。
+ 您可以使用 Athena 查询从 Amazon Glacier Flexible Retrieval（以前称为 Glacier）和 Amazon Glacier Deep Archive [Amazon S3 存储类别](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier)还原的对象，但您必须针对每个表启用该功能。如果您在运行查询之前未在表上启用该功能，Athena 将在查询执行期间跳过该表的所有 Amazon Glacier Flexible Retrieval 和 Amazon Glacier Deep Archive 对象。有关更多信息，请参阅 [查询还原的 Amazon Glacier 对象](querying-glacier.md)。

  有关存储类的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[存储类](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html)、[更改 Simple Storage Service（Amazon S3）中的对象的存储类](https://docs.aws.amazon.com/AmazonS3/latest/dev/ChgStoClsOfObj.html)、[转换为 GLACIER 存储类（对象归档）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#before-deciding-to-archive-objects)和[申请方付款存储桶](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html)。
+ 如果您针对包含大量对象且数据未分区的 Amazon S3 存储桶发出查询，则此类查询可能影响 Amazon S3 中的 Get 请求速率限制并导致 Amazon S3 异常。为防止错误发生，请将数据分区。另外，考虑调整 Amazon S3 的请求速率。有关更多信息，请参阅[请求速率和性能注意事项](https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html)。

有关在 Amazon S3 中指定数据位置的更多信息，请参阅[指定 Amazon S3 中的表位置](tables-location-format.md)。

### 其他考虑因素
<a name="creating-tables-other-considerations"></a>
+ **不支持事务数据转换**：Athena 不支持对表数据执行基于事务的操作（例如，在 Hive 或 Presto 中找到的操作）。有关不支持的关键字的完整列表，请参阅[不支持的 DDL](unsupported-ddl.md)。
+ **表上的操作为 ACID**：当您创建、更新或删除表时，这些操作保证与 ACID 兼容。例如，如果多个用户或客户端同时尝试创建或更改现有的表，则只有一个会成功。
+ **表是 EXTERNAL**：除非是创建 [Iceberg](querying-iceberg-creating-tables.md) 表，否则请始终使用 `EXTERNAL` 关键字。如果您将没有 `EXTERNAL` 关键字的 `CREATE TABLE` 用于非 Iceberg 表，Athena 会发出错误。当您在 Athena 中删除表时，仅删除表元数据；数据将保留在 Amazon S3 中。
+ **最大查询字符串长度**：最大查询字符串长度为 256 KB。
+ 如果您将 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) 模板创建用于 Athena 的表，而不指定 `TableType` 属性，然后运行 DDL 查询，如 `SHOW CREATE TABLE` 或者 `MSCK REPAIR TABLE`，则您将收到错误消息失败：NullPointerException 名称为空。

  要纠正该错误，请为 [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` 属性将自动定义。

**Topics**
+ [

## 注意事项和限制
](#creating-tables-considerations-and-limitations)
+ [

# 使用 AWS Glue 或 Athena 控制台创建表
](creating-tables-how-to.md)
+ [

# 指定 Amazon S3 中的表位置
](tables-location-format.md)
+ [

# 显示创建后的表信息
](creating-tables-showing-table-information.md)

# 使用 AWS Glue 或 Athena 控制台创建表
<a name="creating-tables-how-to"></a>

您可以使用 AWS Glue、“添加表”表单或在 Athena 查询编辑器中运行 DDL 语句，从而在 Athena 中创建表。

## 使用 AWS Glue 爬网程序创建表
<a name="to-create-a-table-using-the-aws-glue-data-catalog"></a>

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在查询编辑器中，选择 **Tables and views**（表和视图）旁的 **Create**（创建），然后选择 **AWS Glue crawler**（爬网程序）。

1. 按照 AWS Glue 控制台的 **Add crawler**（添加爬网程序）页面上的步骤，添加爬网程序。

   有关更多信息，请参阅 [使用爬网程序添加表](schema-crawlers.md)。

## 使用 Athena“创建表”表单创建表
<a name="to-create-a-table-using-the-wizard"></a>

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在查询编辑器中，选择 **Tables and views**（表和视图）旁边的 **Create**（创建），然后选择 **S3 bucket data**（S3 存储桶数据）。

1. 在 **Create Table From S3 bucket data**（从 S3 存储桶数据创建表）表单中，输入创建表所需的信息，然后选择 **Create table**（创建表）。有关表单中字段的更多信息，请参阅 [在 Athena 控制台中使用表单添加 AWS Glue 表](data-sources-glue-manual-table.md)。

## 要在 Athena 查询编辑器中使用 CREATE TABLE 语句创建表
<a name="to-create-a-table-using-hive-ddl"></a>

1. 从 **Database (数据库)** 菜单，选择要为其创建表的数据库。如果您未在 `CREATE TABLE` 语句中指定数据库，则将在查询编辑器中当前选定的数据库内创建表。

1. 在查询编辑器中输入以下示例中显示的语句，然后选择**运行**。

   ```
   CREATE EXTERNAL TABLE myopencsvtable (
      firstname string,
      lastname string,
      job string,
      country string
   )
   ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
   WITH SERDEPROPERTIES (
      'separatorChar' = ',',
      'quoteChar' = '"',
      'escapeChar' = '\\'
      )
   STORED AS TEXTFILE
   LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
   ```

# 指定 Amazon S3 中的表位置
<a name="tables-location-format"></a>

在 Athena 中运行 `CREATE TABLE` 查询时，Athena 将您的表注册到 AWS Glue Data Catalog 中，这是 Athena 存储元数据的地方。

要在 Amazon S3 中指定数据的路径，请使用 `CREATE TABLE` 语句中的 `LOCATION` 属性，如以下示例中所示：

```
CREATE EXTERNAL TABLE `test_table`(
...
)
ROW FORMAT ...
STORED AS INPUTFORMAT ...
OUTPUTFORMAT ...
LOCATION s3://amzn-s3-demo-bucket/folder/
```
+ 有关命名存储桶的信息，请参阅《Amazon Simple Storage Service 用户指南**》中的 [存储桶限制和局限](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)。
+ 有关在 Amazon S3 中使用文件夹的信息，请参阅《Amazon Simple Storage Service 用户指南**》中的 [使用文件夹](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)。

Amazon S3 中的 `LOCATION` 指定表示您的表的*所有*文件。

**重要**  
Athena 会读取存储在您指定的 Amazon S3 文件夹中的*全部*数据。如果您有*不*希望 Athena 读取的数据，请不要在与您希望 Athena 读取的数据所在的相同 Amazon S3 文件夹中存储这些数据。

在 `CREATE TABLE` 语句中指定 `LOCATION` 时，请使用以下准则：
+ 使用尾部斜杠。
+ 您可以使用 Amazon S3 文件夹或 Amazon S3 访问点别名的路径。有关 Amazon S3 访问点别名的信息，请参阅《*Amazon S3 用户指南*》中的[为您的访问点使用存储桶式别名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)。

 **使用**:

```
s3://amzn-s3-demo-bucket/folder/
```

```
s3://amzn-s3-demo-bucket-metadata-s3alias/folder/
```

请勿使用以下任何项目来指定数据的 `LOCATION`。
+ 请勿使用文件名、下划线、通配符或 glob 模式来指定文件位置。
+ 请勿将完整 HTTP 表示法（例如 `s3.amazon.com`）添加到 Amazon S3 存储桶路径。
+ 请勿在路径中使用空文件夹（如 `//`），如下所示：`S3://amzn-s3-demo-bucket/folder//folder/`。
+ 不要使用如下路径：

  ```
  s3://amzn-s3-demo-bucket
  s3://amzn-s3-demo-bucket/*
  s3://amzn-s3-demo-bucket/mySpecialFile.dat
  s3://amzn-s3-demo-bucket/prefix/filename.csv
  s3://amzn-s3-demo-bucket.s3.amazon.com
  S3://amzn-s3-demo-bucket/prefix//prefix/
  arn:aws:s3:::amzn-s3-demo-bucket/prefix
  s3://arn:aws:s3:<region>:<account_id>:accesspoint/<accesspointname>
  https://<accesspointname>-<number>.s3-accesspoint.<region>.amazonaws.com
  ```

# 显示创建后的表信息
<a name="creating-tables-showing-table-information"></a>

在 Athena 中创建表后，其名称将显示在 Athena 控制台左侧的**表**列表中。要显示有关该表的信息并对其进行管理，在 Athena 控制台中选择表名称旁边的垂直三个点。
+ **Preview Table**（预览表）– 通过在 Athena 查询编辑器中运行 `SELECT * FROM "database_name"."table_name" LIMIT 10` 语句来显示所有列的前 10 行。
+ **Generate table DDL**（生成表 DDL）– 生成 DDL 语句，您可以使用该语句通过在 Athena 查询编辑器中运行 `SHOW CREATE TABLE` *table\$1name* 语句来重新创建表。
+ **Load partitions**（加载分区）– 在 Athena 查询编辑器中运行 `MSCK REPAIR TABLE table_name` 语句。仅当表具有分区时，此选项才可用。
+ **Insert into editor**（插入编辑器）– 将表名称插入当前编辑位置的查询编辑器中。
+ **删除表** – 显示一个确认对话框，询问是否要删除表。如果您同意，请在 Athena 查询编辑器中运行 `DROP TABLE table_name` 语句。
+ **表属性** – 显示表名称、数据库名称、创建的时间以及表是否包含已加密数据。

# 命名数据库、表和列
<a name="tables-databases-columns-names"></a>

使用这些准则来命名 Athena 中的数据库、表和列。

## 数据库名称、表名和列名的要求
<a name="tables-databases-columns-names-requirements"></a>
+ AWS Glue 中数据库名称、表名和列名的可接受字符必须是 UTF-8 字符串，并且应使用小写。请注意，当 Athena 创建数据库、表或列时，它会自动将 DDL 查询中的任何大写名称改为小写。字符串长度不得少于 1 个字节，也不得超过 255 个字节。
+ 目前，可以在名称的开头使用前导空格。因为这些前导空格可能很难检测到，并且在创建后可能会导致可用性问题，所以请避免无意中创建带有前导空格的对象名称。
+ 如果您使用 [AWS::Glue::Database](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html) CloudFormation 模板创建 AWS Glue 数据库而未指定数据库名称，AWS Glue 会自动以与 Athena 不兼容的 *resource\$1name–random\$1string* 格式生成数据库名称。
+ 您可以使用 AWS Glue Catalog Manager 重命名列，但不重命名表名称或数据库名称。要解决此限制，必须使用旧数据库的定义来创建具有新名称的数据库。然后，使用旧数据库中的表定义在新数据库中重新创建表。为此，您可以使用 AWS CLI 或 AWS Glue 软件开发工具包。要查看步骤，请参阅[使用 AWS CLI 重新创建 AWS Glue 数据库及其表](glue-recreate-db-and-tables-cli.md)。

## Athena 中的表名称和表列名称使用小写
<a name="table-names-and-table-column-names-in-ate-must-be-lowercase"></a>

Athena 在 DDL 和 DML 查询中接受混合大小写，但在执行查询时使用小写名称。因此，请避免使用混合大小写表或列名称，并且不要单独依赖 Athena 中的大小写来区分这些名称。例如，如果您使用 DDL 语句创建名为 `Castle` 的列，则创建的列将被转换成小写，`castle`。如果您随后将 DML 查询中的列名指定为 `Castle` 或者 `CASTLE`，Athena 会将名称转换为小写以为您运行查询，但使用您在查询中选择的大小写显示列标题。

数据库、表和列名的长度必须小于或等于 255 个字符。

## 以下划线开头的名称
<a name="names-that-begin-with-an-underscore"></a>

创建表时，使用反引号将以下划线开头的表、视图或列名称括起来。例如：

```
CREATE EXTERNAL TABLE IF NOT EXISTS `_myunderscoretable`(
  `_id` string, `_index` string)
LOCATION 's3://amzn-s3-demo-bucket/'
```

## 以数字开头的表、视图或列名称
<a name="table-names-that-include-numbers"></a>

在运行 `SELECT`、`CTAS` 或 `VIEW` 查询中，用引号将以数字开头的表、视图或列名称等标识符括起来。例如：

```
CREATE OR REPLACE VIEW "123view" AS
SELECT "123columnone", "123columntwo"
FROM "234table"
```

## 列名和复杂类型
<a name="tables-databases-columns-names-complex-types"></a>

对于复杂类型，只有字母数字字符、下划线 (`_`) 和句号 (`.`) 允许在列名称中使用。要为包含受限字符的键创建表和映射，可以使用自定义 DDL 语句。有关更多信息，请参阅 *AWS 大数据博客*文章：[使用 JSONSerDe 在 Amazon Athena 中通过嵌套 JSON 和映射来创建表](https://aws.amazon.com/blogs/big-data/create-tables-in-amazon-athena-from-nested-json-and-mappings-using-jsonserde/)。

## 保留字
<a name="tables-databases-columns-names-reserved-words"></a>

必须对 Athena 中的某些预留字进行转义。要对 DDL 语句中的保留关键字进行转义，请使用反引号 (`) 将其括起来。要对 SQL `SELECT` 语句以及[视图](views.md)的查询中的保留关键字进行转义，请使用双引号 ('') 将其括起来。

有关更多信息，请参阅 [转义查询中的保留关键字](reserved-words.md)。

## 其他资源
<a name="tables-databases-columns-names-additional-resources"></a>

有关完整的数据库和表创建语法，请参阅以下页面。
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)

有关 AWS Glue 中数据库和表的更多信息，请参阅《AWS Glue Developer Guide》**中的 [Databases](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-databases.html) 和 [Tables](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html)。

# 转义查询中的保留关键字
<a name="reserved-words"></a>

当您在 Athena 中运行包含保留关键字的查询时，必须用特殊字符将保留关键字括起来以便对它们进行转义。可使用本主题中的列表检查 Athena 中保留的关键字。

要对 DDL 语句中的保留关键字进行转义，请使用反引号 (`) 将其括起来。要对 SQL `SELECT` 语句以及[视图](views.md)的查询中的保留关键字进行转义，请使用双引号 ('') 将其括起来。
+  [要在 DDL 语句中转义的保留关键字](#list-of-ddl-reserved-words) 
+  [要在 SQL SELECT 语句中转义的保留关键字](#list-of-reserved-words-sql-select) 
+  [保留关键字的查询示例](#examples-reserved-words) 

## 要在 DDL 语句中转义的保留关键字
<a name="list-of-ddl-reserved-words"></a>

Athena 在其 DDL 语句中使用以下保留关键字列表。如果您未经转义即使用它们，Athena 会发出错误。要进行转义，请使用反引号 (`) 将其括起来。

如果未使用反引号 (`) 将 DDL 保留关键字括起来，则不能在 DDL 语句中将这些保留关键字用作标识符名称。

```
ALL, ALTER, AND, ARRAY, AS, AUTHORIZATION, BETWEEN, BIGINT, 
BINARY, BOOLEAN, BOTH, BY, CASE, CASHE, CAST, CHAR, COLUMN, 
CONF, CONSTRAINT, COMMIT, CREATE, CROSS, CUBE, CURRENT, 
CURRENT_DATE, CURRENT_TIMESTAMP, CURSOR, DATABASE, DATE, 
DAYOFWEEK, DECIMAL, DELETE, DESCRIBE, DISTINCT, DIV, DOUBLE, 
DROP, ELSE, END, EXCHANGE, EXISTS, EXTENDED, EXTERNAL, EXTRACT, 
FALSE, FETCH, FLOAT, FLOOR, FOLLOWING, FOR, FOREIGN, FROM, 
FULL, FUNCTION, GRANT, GROUP, GROUPING, HAVING, IF, IMPORT, 
IN, INNER, INSERT, INT, INTEGER, INTERSECT, INTERVAL, INTO, 
IS, JOIN, LATERAL, LEFT, LESS, LIKE, LOCAL, MACRO, MAP, MORE, 
NONE, NOT, NULL, NUMERIC, OF, ON, ONLY, OR, ORDER, OUT, 
OUTER, OVER, PARTIALSCAN, PARTITION, PERCENT, PRECEDING, 
PRECISION, PRESERVE, PRIMARY, PROCEDURE, RANGE, READS, 
REDUCE, REGEXP, REFERENCES, REVOKE, RIGHT, RLIKE, ROLLBACK, 
ROLLUP, ROW, ROWS, SELECT, SET, SMALLINT, START,TABLE, 
TABLESAMPLE, THEN, TIME, TIMESTAMP, TO, TRANSFORM, TRIGGER, 
TRUE, TRUNCATE, UNBOUNDED,UNION, UNIQUEJOIN, UPDATE, USER, 
USING, UTC_TIMESTAMP, VALUES, VARCHAR, VIEWS, WHEN, WHERE, 
WINDOW, WITH
```

## 要在 SQL SELECT 语句中转义的保留关键字
<a name="list-of-reserved-words-sql-select"></a>

Athena 在 SQL `SELECT` 语句以及视图查询中使用以下保留关键字列表。

如果您将这些关键字用作标识符，则必须在查询语句中使用双引号 (") 将它们括起来。

```
ALTER, AND, AS, BETWEEN, BY, CASE, CAST, CONSTRAINT, CREATE, 
CROSS, CUBE, CURRENT_CATALOG, CURRENT_DATE, CURRENT_PATH, 
CURRENT_SCHEMA, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, 
DEALLOCATE, DELETE, DESCRIBE, DISTINCT, DROP, ELSE, END, ESCAPE, 
EXCEPT, EXECUTE, EXISTS, EXTRACT, FALSE, FIRST, FOR, FROM, 
FULL, GROUP, GROUPING, HAVING, IN, INNER, INSERT, INTERSECT, 
INTO, IS, JOIN, JSON_ARRAY, JSON_EXISTS, JSON_OBJECT, 
JSON_QUERY, JSON_TABLE, JSON_VALUE, LAST, LEFT, LIKE, 
LISTAGG, LOCALTIME, LOCALTIMESTAMP, NATURAL, NORMALIZE, 
NOT, NULL, OF, ON, OR, ORDER, OUTER, PREPARE, RECURSIVE, RIGHT, 
ROLLUP, SELECT, SKIP, TABLE, THEN, TRIM, TRUE, UESCAPE, UNION, 
UNNEST, USING, VALUES, WHEN, WHERE, WITH
```

## 保留关键字的查询示例
<a name="examples-reserved-words"></a>

以下示例中的查询使用反引号 (`) 来转义 DDL 相关的保留关键字 *partition* 和 *date*（用于表名称和其中一个列名称）：

```
CREATE EXTERNAL TABLE `partition` (
`date` INT, 
col2 STRING
)
PARTITIONED BY (year STRING)
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/test_examples/';
```

以下示例查询包含一个列名称，此列名称在 `ALTER TABLE ADD PARTITION` 和 `ALTER TABLE DROP PARTITION` 语句中包含 DDL 相关的保留关键字。DDL 保留关键字括在反引号 (`) 中：

```
ALTER TABLE test_table 
ADD PARTITION (`date` = '2018-05-14')
```

```
ALTER TABLE test_table 
DROP PARTITION (`partition` = 'test_partition_value')
```

以下查询示例包含一个保留关键字 (end) 作为 `SELECT` 语句中的标识符。此关键字用双引号进行转义：

```
SELECT * 
FROM TestTable
WHERE "end" != nil;
```

以下查询示例在 `SELECT` 语句中包含一个保留关键字 (first)。此关键字用双引号进行转义：

```
SELECT "itemId"."first" 
FROM testTable 
LIMIT 10;
```