

# 데이터베이스 및 테이블 생성
<a name="work-with-data"></a>

Amazon Athena는 Amazon Simple Storage Service에 데이터가 존재하는 외부 테이블을 정의하고 쿼리할 수 있도록 데이터 정의 언어(DDL) 문과 ANSI SQL 함수 및 연산자의 하위 집합을 지원합니다.

Athena에서 데이터베이스와 테이블을 생성할 때는 테이블의 데이터가 실시간 쿼리가 가능한 상태가 되도록 데이터의 스키마와 위치를 설명합니다.

쿼리 성능을 향상시키고 비용을 줄이려면 데이터를 분할하고 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. Amazon S3에서 쿼리 결과 위치를 설정하려면 **Edit Settings**(설정 편집)를 선택합니다.  
![\[설정 편집을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/getting-started-choose-view-settings.png)

1. **설정 관리(Manage settings)**에서 다음 중 하나를 수행합니다.
   + **쿼리 결과 위치(Location of query result)** 상자에서 Amazon S3에서 쿼리 결과를 위해 생성한 버킷의 경로를 입력합니다. 경로 앞에 `s3://`를 붙입니다.
   + **S3 검색(Browse S3)** 아이콘을 선택하고 현재 리전에서 생성한 Amazon S3 버킷을 선택한 다음 **선택(Choose)**을 선택합니다.  
![\[Athena의 쿼리 결과를 수신하려는 Amazon S3의 위치를 지정합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/getting-started-setting-results-location.png)

1. **저장**을 선택합니다.

1. **편집기(Editor)**를 선택하여 쿼리 편집기로 전환합니다.  
![\[편집기(Editor)를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/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(serializer-deserializer) 라이브러리를 지원합니다. 지원되는 SerDe 라이브러리 목록은 [데이터에 적합한 SerDe 선택](supported-serdes.md) 단원을 참조하세요.

Athena에서 데이터베이스와 테이블을 생성할 때, 읽기 시간 쿼리를 위해 Amazon S3에서 테이블 데이터가 있는 스키마와 위치를 간단히 설명합니다. Athena는 Amazon S3의 데이터를 수정하지 않습니다. 따라서 데이터베이스와 테이블이 데이터베이스와 테이블의 스키마 정의와 함께 저장되지 않으므로 기존 관계형 데이터베이스 시스템에서와 의미가 약간 다릅니다.

Athena는 AWS Glue Data Catalog에 스키마를 저장하고 사용자가 SQL을 사용하여 테이블을 쿼리할 때 이 스키마를 사용하여 데이터를 읽습니다. 쿼리를 실행할 때 데이터에 스키마를 프로젝션하는 이 *스키마 온 리드* 접근 방식을 사용하면 데이터를 로드하거나 변환할 필요가 없습니다.

## 고려 사항 및 제한 사항
<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의 서로 다른 스토리지 클래스(Standard, Standard-IA, Intelligent-Tiering)에 저장된 객체의 데이터를 쿼리할 수 있습니다.
+ 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), [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를 준수합니다. 예를 들어, 여러 사용자 또는 클라이언트가 동시에 테이블을 생성하거나 기존 테이블을 변경하려고 할 경우 그 중 하나만 성공합니다.
+ **테이블이 외부** - [Iceberg](querying-iceberg-creating-tables.md) 테이블을 생성할 때를 제외하고 항상 `EXTERNAL` 키워드를 사용하세요. Iceberg가 아닌 테이블에 대해 `EXTERNAL` 키워드 없이 `CREATE TABLE`을 사용하는 경우 Athena에서 오류가 발생합니다. Athena에 테이블을 놓으면 테이블 메타데이터만 제거됩니다. 데이터는 Amazon S3에 유지됩니다.
+ **최대 쿼리 문자열 길이** - 최대 쿼리 문자열 길이는 256KB입니다.
+ `TableType` 속성을 지정하지 않고 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에서 사용할 테이블을 만든 다음 `SHOW CREATE TABLE` 또는 `MSCK REPAIR TABLE` 같은 DDL 쿼리를 실행하면, 실패: NullPointerException Name이 null임(FAILED: NullPointerException Name is null)이라는 오류 메시지가 표시될 수 있습니다.

  이 오류를 해결하려면 AWS Glue `CreateTable` API 호출 또는 [CloudFormation 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)의 일부로 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 속성의 값을 지정하세요. `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>

Athena에서 AWS Glue 또는 테이블 추가 양식을 사용하거나 Athena 쿼리 편집기에서 DDL 문을 실행하여 테이블을 생성할 수 있습니다.

## 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 크롤러(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 버킷 데이터(S3 bucket data)**를 선택합니다.

1. **S3 버킷 데이터에서 테이블 생성(Create Table From S3 bucket data)** 양식에 테이블 생성을 위한 정보를 입력한 다음 **테이블 생성(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 데이터 카탈로그에 테이블을 등록합니다.

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 폴더와 동일한 폴더에 해당 데이터를 저장하지 않아야 합니다.

`LOCATION` 문에서 `CREATE TABLE`을 지정하는 경우 다음 지침을 따르세요.
+ 후행 슬래시를 사용하세요.
+ 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 패턴을 사용하지 마세요.
+ Amazon S3 버킷 경로에 `s3.amazon.com` 등의 전체 HTTP 표기법을 추가하지 마세요.
+ `//`와 같이 경로에서 `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 콘솔의 왼쪽에 있는 **테이블(Tables)** 목록에 표시됩니다. 테이블에 대한 정보를 표시하고 관리하려면 Athena 콘솔에서 테이블 이름 옆에 있는 세로 점 3개를 선택합니다.
+ **테이블 미리 보기** - Athena 쿼리 편집기에서 `SELECT * FROM "database_name"."table_name" LIMIT 10` 문을 실행하여 모든 열의 첫 10개 행을 표시합니다.
+ **테이블 DDL 생성** - Athena 쿼리 편집기에서 `SHOW CREATE TABLE` *table\$1name* 문을 실행하여 테이블을 다시 생성하는 데 사용할 수 있는 DDL 문을 생성합니다.
+ **파티션 로드** - Athena 쿼리 편집기에서 `MSCK REPAIR TABLE table_name` 문이 실행됩니다. 이 옵션은 테이블에 파티션이 있는 경우에만 사용할 수 있습니다.
+ **편집기에 삽입** - 현재 편집 위치의 쿼리 편집기에 테이블 이름을 삽입합니다.
+ **테이블 삭제** - 테이블을 삭제할지 묻는 확인 대화 상자를 표시합니다. 동의하면 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 카탈로그 관리자를 사용하여 열 이름을 바꿀 수 있지만 테이블 이름이나 데이터베이스 이름은 바꿀 수 없습니다. 이 제한을 해결하려면 이전 데이터베이스의 정의를 사용하여 새 이름으로 데이터베이스를 생성해야 합니다. 그런 다음 이전 데이터베이스의 테이블 정의를 사용하여 새 데이터베이스에서 테이블을 다시 생성합니다. 이렇게 하려면 AWS CLI 또는 AWS Glue SDK를 사용하면 됩니다. 단계는 [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 빅 데이터 블로그*의 [Create tables in Amazon Athena from nested JSON and mappings using JSONSerDe](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 문에서 예약어를 이스케이프하려면 해당 문을 악센트 부호(`)로 묶습니다. [뷰](views.md)에 대한 SQL `SELECT` 문과 쿼리에서 예약어를 이스케이프하려면 예약어를 큰 따옴표('')로 묶습니다.

자세한 내용은 [쿼리에서 예약어 이스케이프](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 개발자 안내서의 [데이터베이스](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-databases.html) 및 [테이블](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html)을 참조하세요.

# 쿼리에서 예약어 이스케이프
<a name="reserved-words"></a>

Athena에서 예약어가 포함된 쿼리를 실행할 때는 쿼리를 특수 문자로 묶어서 이스케이프해야 합니다. 어떤 키워드가 Athena에 예약되어 있는지 확인하려면 이 주제에 있는 목록을 사용하세요.

DDL 문에서 예약어를 이스케이프하려면 해당 문을 악센트 부호(`)로 묶습니다. [뷰](views.md)에 대한 SQL `SELECT` 문과 쿼리에서 예약어를 이스케이프하려면 예약어를 큰 따옴표('')로 묶습니다.
+  [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')
```

다음 예제 쿼리는 `SELECT` 문에 예약어(end)를 식별자로 포함합니다. 키워드는 큰따옴표로 이스케이프되어 있습니다.

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

다음 예제 쿼리는 `SELECT` 문에 예약어(first)를 포함합니다. 키워드는 큰따옴표로 이스케이프되어 있습니다.

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