

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# SQL 참조
<a name="cm_chap_SQLCommandRef"></a>

Amazon Redshift를 사용하면 SQL을 활용하여 데이터 웨어하우스에 저장된 방대한 양의 데이터를 효율적으로 쿼리하고 분석할 수 있습니다. SQL 참조에서는 SQL 명령, 데이터 유형, 함수, 연산자 등의 구문 및 사용량을 다루므로 인사이트를 추출하고 데이터 기반 의사 결정을 내릴 수 있습니다. 이 참조를 통해 최적화된 쿼리를 작성하고, 데이터베이스 객체를 생성 및 관리하고, 복잡한 데이터 변환을 수행할 수 있습니다. 다음 참조에서는 Amazon Redshift 환경 내에서 SQL을 활용하여 데이터 분석 요구 사항을 충족하는 방법에 대한 포괄적인 세부 정보를 제공합니다.

**Topics**
+ [Amazon Redshift SQL](c_redshift-sql.md)
+ [SQL 사용](c_SQL_reference.md)
+ [SQL 명령](c_SQL_commands.md)
+ [SQL 함수 참조](c_SQL_functions.md)
+ [예약어](r_pg_keywords.md)

# Amazon Redshift SQL
<a name="c_redshift-sql"></a>

**Topics**
+ [리더 노드에서 지원되는 SQL 함수](c_sql-functions-leader-node.md)
+ [Amazon Redshift 및 PostgreSQL](c_redshift-and-postgres-sql.md)

Amazon Redshift는 업계 표준 SQL을 중심으로 개발되었으며, 여기에 대용량 데이터 집합을 관리할 뿐만 아니라 이러한 데이터에 대한 고성능 분석 및 보고를 지원하는 기능까지 추가되었습니다.

**참고**  
단일 Amazon Redshift SQL 문의 최대 크기는 16MB입니다.

# 리더 노드에서 지원되는 SQL 함수
<a name="c_sql-functions-leader-node"></a>

일부 Amazon Redshift 쿼리는 분산을 통해 컴퓨팅 노드에서 실행되는 반면 리더 노드에서만 실행되는 쿼리도 있습니다.

리더 노드는 쿼리가 사용자 생성 테이블 또는 시스템 테이블(STL 또는 STV 접두사가 첨부된 테이블과 SVL 또는 SVV 접두사가 첨부된 시스템 뷰)을 참조할 때마다 SQL을 컴퓨팅 노드로 분산시킵니다. 카탈로그 테이블(PG\$1TABLE\$1DEF처럼 PG 접두사가 첨부되어 리더 노드에 저장되는 테이블)만 참조하거나 어떤 테이블도 참조하지 않는 쿼리는 리더 노드에서만 실행됩니다.

일부 Amazon Redshift SQL 함수는 리더 노드에서만 지원되고, 컴퓨팅 노드에서는 지원되지 않습니다. 따라서 리더 노드 함수를 사용하는 쿼리는 컴퓨팅 노드가 아닌 리더 노드에서만 실행해야 합니다. 그렇지 않으면 오류를 반환합니다.

리더 노드에서만 실행해야 하는 각 함수의 설명서에는 이 함수가 사용자 정의 테이블이나 Amazon Redshift 시스템 테이블을 참조할 경우 오류를 반환한다는 설명이 포함되어 있습니다. 리더 노드에서만 실행해야 하는 함수 목록은 [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md) 섹션을 참조하세요.

## 예제
<a name="c_sql-functions-leader-node-examples"></a>

다음 예제에서는 샘플 TICKIT 데이터베이스를 사용합니다. 샘플 데이터베이스에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

**CURRENT\$1SCHEMA**

CURRENT\$1SCHEMA 함수는 리더 노드 전용 함수입니다. 다음 예에서는 쿼리가 테이블을 참조하지 않기 때문에 리더 노드에서만 실행됩니다.

```
select current_schema();
            
current_schema
---------------
public
```

다음 예에서는 쿼리가 시스템 카탈로그 테이블을 참조하기 때문에 리더 노드에서만 실행됩니다.

```
select * from pg_table_def
where schemaname = current_schema() limit 1;

 schemaname | tablename | column |   type   | encoding | distkey | sortkey | notnull
------------+-----------+--------+----------+----------+---------+---------+---------
 public     | category  | catid  | smallint | none     | t       |       1 | t
```

다음 예에서는 쿼리가 컴퓨팅 노드에 저장되는 Amazon Redshift 시스템 테이블을 참조하기 때문에 오류를 반환합니다.

```
select current_schema(), userid from users;

INFO:  Function "current_schema()" not supported.
ERROR:  Specified types or functions (one per INFO message) not supported on Amazon Redshift tables.
```

**SUBSTR**

SUBSTR 또한 리더 노드 전용 함수입니다. 다음 예에서는 쿼리가 테이블을 참조하지 않기 때문에 리더 노드에서만 실행됩니다.

```
SELECT SUBSTR('amazon', 5);
            
+--------+
| substr |
+--------+
| on     |
+--------+
```

다음 예에서는 쿼리가 컴퓨팅 노드에 있는 테이블을 참조합니다. 이 코드를 실행하면 오류가 발생합니다.

```
SELECT SUBSTR(catdesc, 1) FROM category LIMIT 1;
            
ERROR: SUBSTR() function is not supported (Hint: use SUBSTRING instead)
```

이전 쿼리를 성공적으로 실행하려면 [SUBSTRING](https://docs.aws.amazon.com/redshift/latest/dg/r_SUBSTRING.html)을 사용하세요.

```
SELECT SUBSTRING(catdesc, 1) FROM category LIMIT 1;
            
+---------------------------------+
|            substring            |
+---------------------------------+
| National Basketball Association |
+---------------------------------+
```

**FACTORIAL()**

FACTORIAL()은 리더 노드 전용 함수입니다. 다음 예에서는 쿼리가 테이블을 참조하지 않기 때문에 리더 노드에서만 실행됩니다.

```
SELECT FACTORIAL(5);           

 factorial 
-------------
 120
```

다음 예에서는 쿼리가 컴퓨팅 노드에 있는 테이블을 참조합니다. 쿼리 에디터 v2를 사용하여 실행하면 오류가 발생합니다.

```
create table t(a int);
insert into t values (5);
select factorial(a) from t;           

ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
Info: Function "factorial(bigint)" not supported.
```

# Amazon Redshift 및 PostgreSQL
<a name="c_redshift-and-postgres-sql"></a>

**Topics**
+ [Amazon Redshift와 PostgreSQL JDBC 및 ODBC](c_redshift-postgres-jdbc.md)
+ [다르게 구현되는 기능](c_redshift-sql-implementated-differently.md)
+ [지원되지 않는 PostgreSQL 기능](c_unsupported-postgresql-features.md)
+ [지원되지 않는 PostgreSQL 데이터 유형](c_unsupported-postgresql-datatypes.md)
+ [지원되지 않는 PostgreSQL 함수](c_unsupported-postgresql-functions.md)

Amazon Redshift는 PostgreSQL을 기반으로 합니다. Amazon Redshift와 PostgreSQL은 데이터웨어 하우스 애플리케이션을 설계하고 개발할 때 숙지해야 할 몇 가지 매우 중요한 차이점이 있습니다.

Amazon Redshift는 대용량 데이터 집합을 대상으로 복잡한 쿼리가 필요한 온라인 분석 처리(OLAP) 또는 비즈니스 인텔리전스(BI) 애플리케이션 전용으로 설계되었습니다. 해결하는 요건도 매우 다양하기 때문에 Amazon Redshift의 전용 데이터 스토리지 스키마 및 쿼리 실행 엔진도 PostgreSQL 구현체와 완전히 다릅니다. 예를 들어 OLTP(온라인 트랜잭션 처리) 애플리케이션이 일반적으로 데이터를 행에 저장하는 반면 Amazon Redshift는 최적의 메모리 사용 및 디스크 I/O를 위한 특수 데이터 압축 인코딩을 사용하여 데이터를 열에 저장합니다. 보조 인덱스 및 효율적인 단일 행 데이터 조작 작업과 같이 소규모 OLTP 처리에 적합한 일부 PostgreSQL 기능은 성능 향상을 위해 생략되었습니다.

Amazon Redshift 데이터 웨어하우스 시스템 아키텍처에 대한 자세한 내용은 [Amazon Redshift 아키텍처](c_redshift_system_overview.md) 섹션을 참조하세요.

PostgreSQL 9.x에는 Amazon Redshift에서 지원되지 않는 기능이 일부 포함되어 있습니다. 그 밖에도 Amazon Redshift SQL과 PostgreSQL 사이에는 반드시 알고 있어야 할 중요한 차이점들이 있습니다. 이번 섹션에서는 Amazon Redshift와 PostgreSQL의 차이점에 대해 살펴보고, Amazon Redshift SQL 구현체를 최대한 이용하여 데이터 웨어하우스를 개발할 수 있는 지침까지 제공합니다.

# Amazon Redshift와 PostgreSQL JDBC 및 ODBC
<a name="c_redshift-postgres-jdbc"></a>

 Amazon Redshift는 PostgreSQL을 기반으로 하기 때문에 이전에는 JDBC4 Postgresql 드라이버 버전 8.4.703 및 psqlODBC 버전 9.x 드라이버 사용이 권장되었습니다. 현재 이러한 드라이버를 사용하는 경우 앞으로 새로운 Amazon Redshift 전용 드라이버로 옮기는 것이 좋습니다. 드라이버 및 연결 구성에 대한 자세한 내용은 *Amazon Redshift 관리 가이드*의 [Amazon Redshift JDBC 또는 ODBC 드라이버](https://docs.aws.amazon.com/redshift/latest/mgmt/configuring-connections.html#connecting-drivers) 섹션을 참조하세요.

JDBC를 사용하여 대용량 데이터 세트를 가져올 때 클라이언트 측 메모리 부족 오류를 방지하려면 클라이언트에서 JDBC fetch size 파라미터를 설정하여 데이터를 일괄적으로 가져올 수 있습니다. 자세한 내용은 [JDBC Fetch Size 파라미터 설정](set-the-JDBC-fetch-size-parameter.md) 섹션을 참조하세요.

Amazon Redshift는 JDBC maxRows 파라미터를 인식하지 못합니다. 따라서 결과 집합을 제한할 때는 [LIMIT](r_ORDER_BY_clause.md#order-by-clause-limit) 절을 지정하세요. 또한 [OFFSET](r_ORDER_BY_clause.md#order-by-clause-offset) 절을 사용하여 결과 집합에서 특정 시작점으로 건너뛸 수도 있습니다.

# 다르게 구현되는 기능
<a name="c_redshift-sql-implementated-differently"></a>

Amazon Redshift SQL 언어 요소는 서로 성능 특성이 다를 뿐만 아니라 상응하는 PostgreSQL 구현체와 완전히 다른 구문과 의미를 사용합니다.

**중요**  
Amazon Redshift와 PostgreSQL의 공통 요소라고 해서 의미가 동일할 것이라고 미리 짐작해서는 안 됩니다. 반드시 *Amazon Redshift 개발자 안내서 * [SQL 명령](c_SQL_commands.md) 섹션을 참조하여 미묘한 차이가 무엇인지 확인하세요.

한 가지 특정한 예가 테이블을 정리하여 재구성할 때 사용되는 [VACUUM](r_VACUUM_command.md) 명령입니다. VACUUM은 PostgreSQL 버전과 다르게 동작할 뿐만 아니라 사용하는 파라미터 집합도 다릅니다. Amazon Redshift에서 VACUUM 사용에 대한 자세한 내용은 [테이블 Vacuum](t_Reclaiming_storage_space202.md) 섹션을 참조하세요.

종종 데이터베이스 관리 및 운영 기능과 도구도 다릅니다. 예를 들어 Amazon Redshift는 시스템 작동 방식에 대한 정보가 저장되어 있는 시스템 테이블 및 뷰가 많습니다. 자세한 정보는 [SYS 모니터링 뷰](serverless_views-monitoring.md)을 참조하세요.

다음은 Amazon Redshift에서 다르게 구현되는 SQL 기능 중 몇 가지 예입니다.
+  [CREATE TABLE](r_CREATE_TABLE_NEW.md) 

  Amazon Redshift는 테이블스페이스, 테이블 분할, 상속 및 일부 제약 조건을 지원하지 않습니다. CREATE TABLE 기능을 Amazon Redshift에서 구현하면 테이블을 정렬 및 분산 알고리즘을 정의하여 병렬 처리를 최적화할 수 있습니다.

  Amazon Redshift Spectrum은 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 명령을 사용하여 테이블 파티셔닝을 지원합니다.
+  [ALTER TABLE](r_ALTER_TABLE.md) 

  ALTER COLUMN 작업의 하위 집합만 지원됩니다.

  ADD COLUMN은 각 ALTER TABLE 문마다 열을 하나만 추가할 수 있도록 지원합니다.
+  [COPY](r_COPY.md) 

  Amazon Redshift COPY 명령은 Amazon S3 버킷 및 Amazon DynamoDB 테이블에서 데이터를 로드하여 자동 압축을 지원할 수 있도록 고도로 특화되었습니다. 자세한 내용은 [Amazon Redshift에서 데이터 로드](t_Loading_data.md) 및 COPY 명령 참조를 참조하세요.
+  [VACUUM](r_VACUUM_command.md) 

  VACUUM 파라미터는 완전히 다릅니다. 예를 들어 PostgreSQL에서는 기본적으로 VACUUM 작업이 스페이스를 재사용할 수 있도록 회수하는 데 그치는 반면 Amazon Redshift에서는 VACUUM FULL이 기본 VACUUM 작업으로서 디스크 스페이스를 회수한 후 모든 행을 재정렬합니다.
+ 문자열 값을 서로 비교할 때 VARCHAR 값의 후행 공백은 무시됩니다. 자세한 내용은 [후행 공백의 중요성](r_Character_types.md#r_Character_types-significance-of-trailing-blanks) 섹션을 참조하세요.

# 지원되지 않는 PostgreSQL 기능
<a name="c_unsupported-postgresql-features"></a>

다음 PostgreSQL 기능은 Amazon Redshift에서 지원되지 않습니다.

**중요**  
Amazon Redshift와 PostgreSQL의 공통 요소라고 해서 의미가 동일할 것이라고 미리 짐작해서는 안 됩니다. 반드시 *Amazon Redshift 개발자 안내서 * [SQL 명령](c_SQL_commands.md) 섹션을 참조하여 미묘한 차이가 무엇인지 확인하세요.
+ 쿼리 도구 psql은** 지원되지 않습니다. [Amazon Redshift RSQL](https://docs.aws.amazon.com/redshift/latest/mgmt/rsql-query-tool.html) 클라이언트가 지원됩니다.
+ 테이블 분할(범위 및 목록 분할)
+ 테이블스페이스
+ 제약 조건
  + 고유
  + 외래 키
  + 프라이머리 키
  + 제약 조건 확인
  + 예외 제약 조건

  고유성, 기본 키 및 외래 키 제약 조건은 허용되지만 오직 참고용입니다. 따라서 시스템에서 적용되지는 않지만 쿼리 플래너에서 사용할 수는 있습니다.
+ 상속
+ PostgreSQL 시스템 열

  Amazon Redshift SQL은 시스템 열을 묵시적으로 정의하지 않습니다. 하지만 다음 PostgreSQL 시스템 열 이름은 사용자 정의 열인 `oid`, `tableoid`, `xmin`, `cmin`, `xmax`, `cmax`, `ctid`의 이름으로 사용할 수 없습니다. 자세한 내용은 [https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html](https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html)에서 확인할 수 있습니다.
+ 인덱스
+ 창 함수의 NULLS 절
+ 콜레이션

  Amazon Redshift는 로케일 또는 사용자 정의 데이터 정렬 순서를 지원하지 않습니다. [콜레이션 시퀀스](c_collation_sequences.md)을(를) 참조하세요.
+ 값 표현식
  + 구독 표현식
  + 배열 생성자
  + 행 생성자
+ 트리거
+ 외부 데이터 관리(SQL/MED)
+ 테이블 함수
+ 상수 테이블로 사용되는 VALUES 목록
+ 시퀀스
+ 시퀀스
+ RULE 및 TRIGGER 권한

  Amazon Redshift는 GRANT ALL 또는 REVOKE ALL를 실행할 때 이러한 권한을 부여하거나 취소하지만, RULE 및 TRIGGER 권한의 유무는 피부여자의 액세스 권한에 어떤 식으로든 영향을 미치지 않습니다.

# 지원되지 않는 PostgreSQL 데이터 유형
<a name="c_unsupported-postgresql-datatypes"></a>

일반적으로 쿼리가 명시적 또는 묵시적 변환을 포함하여 지원되지 않는 데이터 형식을 사용하려고 하면 오류가 반환됩니다. 하지만 지원되지 않는 데이터 형식을 사용하는 쿼리 중에는 컴퓨팅 노드가 아닌 리더 노드에서 실행되는 쿼리도 있습니다. [리더 노드에서 지원되는 SQL 함수](c_sql-functions-leader-node.md)을(를) 참조하세요.

 지원되는 데이터 형식의 전체 목록은 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.

다음 PostgreSQL 데이터 형식은 Amazon Redshift에서 지원되지 않습니다.
+ 배열
+ BIT, BIT VARYING
+ BYTEA
+ 복합 형식
+ 열거 형식
+ 기하학적 유형(기하학적 유형의 Amazon Redshift 구현은 PostgreSQL과 다름)
+ HSTORE
+ JSON
+ 네트워크 주소 형식
+ 숫자형
  + SERIAL, BIGSERIAL, SMALLSERIAL
  + MONEY
+ 객체 식별자 형식
+ 의사 형식
+ 범위 형식
+ 특수 문자 유형
  + "char" - 단일 바이트 내부 유형(여기서 char라는 데이터 형식은 인용 부호로 묶입니다).
  + 이름 - 객체 이름의 내부 형식.

  이러한 유형에 대한 자세한 내용은 PostgreSQL 설명서의 [Special Character Types](https://www.postgresql.org/docs/8.0/datatype-character.html)를 참조하세요.
+ 텍스트 검색 형식
+ TXID\$1SNAPSHOT
+ UUID
+ XML

# 지원되지 않는 PostgreSQL 함수
<a name="c_unsupported-postgresql-functions"></a>

여기에서 언급하는 함수들도 의미 또는 사용법이 서로 다릅니다. 예를 들어 지원되는 함수 중 일부는 리더 노드에서만 실행됩니다. 또한 지원되지 않는 함수라고 해도 일부는 리더 노드에서 실행할 경우 오류를 반환하지 않습니다. 이러한 함수들이 일부 경우 오류를 반환하지 않는다고 해서 Amazon Redshift에서 지원되는 함수라고 간주해서는 안 됩니다.

**중요**  
Amazon Redshift와 PostgreSQL의 공통 요소라고 해서 의미가 동일할 것이라고 미리 짐작해서는 안 됩니다. 반드시 *Amazon Redshift 데이터베이스 개발자 안내서 * [SQL 명령](c_SQL_commands.md) 섹션을 참조하여 미묘한 차이가 무엇인지 확인하세요.

 자세한 내용은 [리더 노드에서 지원되는 SQL 함수](c_sql-functions-leader-node.md) 섹션을 참조하세요.

다음 PostgreSQL 함수는 Amazon Redshift에서 지원되지 않습니다.
+ 액세스 권한 조회 함수
+ 권고 잠금 함수
+ 집계 함수
  + STRING\$1AGG()
  + ARRAY\$1AGG()
  + EVERY()
  + XML\$1AGG()
  + CORR()
  + COVAR\$1POP()
  + COVAR\$1SAMP()
  + REGR\$1AVGX(), REGR\$1AVGY()
  + REGR\$1COUNT()
  + REGR\$1INTERCEPT()
  + REGR\$1R2()
  + REGR\$1SLOPE()
  + REGR\$1SXX(), REGR\$1SXY(), REGR\$1SYY()
+ 배열 함수 및 연산자
+ 백업 제어 함수
+ 주석 정보 함수
+ 데이터베이스 객체 위치 함수
+ 데이터베이스 객체 크기 함수
+ 날짜/시간 함수 및 연산자
  + CLOCK\$1TIMESTAMP()
  + JUSTIFY\$1DAYS(), JUSTIFY\$1HOURS(), JUSTIFY\$1INTERVAL()
  + PG\$1SLEEP()
  + TRANSACTION\$1TIMESTAMP()
+ ENUM 지원 함수
+ 기하 함수 및 연산자
+ 제네릭 파일 액세스 함수
+ IS DISTINCT FROM
+ 네트워크 주소 함수 및 연산자
+ 수학 함수
  + DIV()
  + SETSEED()
  + WIDTH\$1BUCKET()
+ 설정 반환 함수
  + GENERATE\$1SERIES()
  + GENERATE\$1SUBSCRIPTS()
+ 범위 함수 및 연산자
+ 복구 제어 함수
+ 복구 정보 함수
+ ROLLBACK TO SAVEPOINT 함수
+ 스키마 가시성 조회 함수
+ 서버 신호 전송 함수
+ 스냅샷 동기화 함수
+ 시퀀스 조작 함수
+ 문자열 함수
  + BIT\$1LENGTH()
  + OVERLAY()
  + CONVERT(), CONVERT\$1FROM(), CONVERT\$1TO()
  + ENCODE()
  + FORMAT()
  + QUOTE\$1NULLABLE()
  + REGEXP\$1MATCHES()
  + REGEXP\$1SPLIT\$1TO\$1ARRAY()
  + REGEXP\$1SPLIT\$1TO\$1TABLE()
+ 시스템 카탈로그 정보 함수
+ 시스템 정보 함수
  + CURRENT\$1CATALOG CURRENT\$1QUERY()
  + INET\$1CLIENT\$1ADDR()
  + INET\$1CLIENT\$1PORT()
  + INET\$1SERVER\$1ADDR() INET\$1SERVER\$1PORT()
  + PG\$1CONF\$1LOAD\$1TIME()
  + PG\$1IS\$1OTHER\$1TEMP\$1SCHEMA()
  + PG\$1LISTENING\$1CHANNELS()
  + PG\$1MY\$1TEMP\$1SCHEMA()
  + PG\$1POSTMASTER\$1START\$1TIME()
  + PG\$1TRIGGER\$1DEPTH()
  + SHOW VERSION()
+ 텍스트 검색 함수 및 연산자
+ 트랜잭션 ID 및 스냅샷 함수
+ 트리거 함수
+ XML 함수

# SQL 사용
<a name="c_SQL_reference"></a>

**Topics**
+ [SQL 참조 규칙](c_SQL_reference_conventions.md)
+ [기본 요소](c_Basic_elements.md)
+ [Expressions](r_expressions.md)
+ [조건](r_conditions.md)

SQL 언어는 데이터베이스 및 데이터베이스 객체 작업 시 사용하는 명령과 함수로 구성되어 있습니다. 또한 데이터 형식, 표현식 및 리터럴의 사용에 대한 규칙을 적용하기도 합니다.

# SQL 참조 규칙
<a name="c_SQL_reference_conventions"></a>

이번 섹션에서는 SQL 참조 섹션에서 설명한 SQL 표현식, 명령 및 함수의 구문을 작성하는 데 사용되는 규칙에 대해 설명합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_SQL_reference_conventions.html)

# 기본 요소
<a name="c_Basic_elements"></a>

**Topics**
+ [이름 및 식별자](r_names.md)
+ [Literal](r_Literals.md)
+ [NULL](r_Nulls.md)
+ [데이터 타입](c_Supported_data_types.md)
+ [콜레이션 시퀀스](c_collation_sequences.md)

이번 섹션에서는 데이터베이스 객체 이름, 리터럴, NULL, 데이터 형식 등의 작업 규칙에 대해서 설명합니다.

# 이름 및 식별자
<a name="r_names"></a>

이름은 사용자와 암호 외에도 테이블이나 열 같은 데이터베이스 객체를 식별하는 역할을 합니다. *이름*과 *식별자*는 서로 통용되는 용어입니다. 식별자는 표준 식별자와 인용 또는 구분 식별자, 2가지 유형이 있습니다. 또한 인쇄 가능한 UTF-8 문자로만 구성되어야 합니다. 표준 및 구분 식별자의 ASCII 문자는 대/소문자를 구분하지 않고 데이터베이스에서 모두 소문자로 변환됩니다. 쿼리 결과에서 열 이름은 기본적으로 소문자로 반환됩니다. 열 이름을 대문자로 반환하려면 [describe\$1field\$1name\$1in\$1uppercase](r_describe_field_name_in_uppercase.md) 구성 파라미터를 **true**로 설정하세요.

## 표준 식별자
<a name="r_names-standard-identifiers"></a>

표준 SQL 식별자는 규칙 집합을 준수하고, 다음과 같이 따라야 합니다.
+ ASCII 단일 바이트 알파벳 문자 또는 밑줄 문자나, 2\$14바이트 길이의 UTF-8 멀티바이트 문자로 시작합니다.
+ 후속 문자는 ASCII 단일 바이트 영숫자 문자, 밑줄 또는 달러 기호, 혹은 2\$14바이트 길이의 UTF-8 멀티바이트 문자가 될 수 있습니다.
+ 길이는 1\$1127바이트가 되어야 하며, 여기에 구분 식별자의 인용 부호는 포함되지 않습니다.
+ 인용 부호나 공백이 포함되어서는 안 됩니다.
+ 예약된 SQL 키워드가 되어서는 안 됩니다.

## 구분 식별자
<a name="r_names-delimited-identifiers"></a>

구분 식별자(인용 식별자로도 불림)는 큰 따옴표(")로 시작해서 끝납니다. 구분 식별자를 사용하는 경우에는 해당하는 객체 참조마다 큰 따옴표를 사용해야 합니다. 이 식별자에는 큰따옴표 외에 인쇄 가능한 표준 UTF-8 문자라면 무엇이든 포함될 수 있습니다. 따라서 그 밖에 공백이나 퍼센트 기호 같이 잘못된 문자까지 포함한 열 또는 테이블 이름도 생성할 수 있습니다.

구분 식별자의 ASCII 문자는 대/소문자를 구분하지 않고 모두 소문자로 변환됩니다. 문자열에 큰따옴표를 사용하려면 다른 큰따옴표를 앞에 입력해야 합니다.

## 대/소문자 구분 식별자
<a name="r_names-case-sensitive-identifiers"></a>

대/소문자 구분 식별자(대/소문자 혼합 식별자라고도 함)에는 대문자와 소문자가 모두 포함될 수 있습니다. 대/소문자 구분 식별자를 사용하려면 구성 `enable_case_sensitive_identifier`를 `true`로 설정합니다. 클러스터나 세션에 대해 이 구성을 설정할 수 있습니다. 자세한 내용은 [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md) 및 *Amazon Redshift 관리 가이드*의 [기본 파라미터 값](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html#default-param-group-values) 섹션을 참조하세요.

## 시스템 열 이름
<a name="r_names-system-column-names"></a>

다음 PostgreSQL 시스템 열 이름은 사용자 정의 열의 열 이름으로 사용할 수 없습니다. 자세한 내용은 [https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html](https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html)에서 확인할 수 있습니다.
+ `oid`
+ `tableoid`
+ `xmin`
+ `cmin`
+ `xmax`
+ `cmax`
+ `ctid`

## 예제
<a name="r_names-examples"></a>

다음 표에 구분 식별자의 예, 출력 결과 및 설명이 나와 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_names.html)

다음은 이 "is it"이라는 열을 포함하여 group이라는 이름의 테이블을 생성하는 예입니다.

```
create table "group" (
"This ""IS IT""" char(10));
```

다음은 동일한 결과를 반환하는 쿼리입니다.

```
select "This ""IS IT"""
from "group";

this "is it"
--------------
(0 rows)
```

```
select "this ""is it"""
from "group";

this "is it"
--------------
(0 rows)
```

다음은 동일한 결과를 반환하도록 정규화된 `table.column` 구문입니다.

```
select "group"."this ""is it"""
from "group";

this "is it"
--------------
(0 rows)
```

다음은 열 이름에 슬래시가 있는 테이블을 생성하는 CREATE TABLE 명령입니다.

```
create table if not exists city_slash_id(
                  "city/id" integer not null,
                  state char(2) not null);
```

# Literal
<a name="r_Literals"></a>

리터럴 또는 상수는 연속된 문자 또는 숫자 상수로 구성된 데이터 고정 값입니다. Amazon Redshift는 다음과 같은 여러 가지 형식의 리터럴을 지원합니다.
+ 숫자 리터럴(정수, 소수, 부동 소수점 수) 자세한 내용은 [정수 및 부동 소수점 리터럴](r_numeric_literals201.md) 섹션을 참조하세요.
+ 문자 리터럴(문자열, 문자 문자열 또는 문자 상수)
+ 날짜/시간 및 간격 리터럴(날짜/시간 데이터 형식과 함께 사용됨) 자세한 내용은 [날짜, 시간 및 타임스탬프 리터럴](r_Date_and_time_literals.md) 및 [간격 데이터 유형 및 리터럴](r_interval_data_types.md) 섹션을 참조하세요.

# NULL
<a name="r_Nulls"></a>

행의 열이 누락되었거나, 알 수 없거나, 혹은 적용되지 않는 경우에는 NULL 값이거나, NULL을 포함한다고 얘기합니다. NULL은 모든 데이터 형식에서 기본 키 또는 NOT NULL 제약 조건의 제한을 받지 않는 필드에 나타날 수 있습니다. 0의 값이나 빈 문자열하고는 다릅니다.

NULL이 포함된 산술 표현식은 항상 NULL로 평가됩니다. NULL 인수 또는 피연산자가 지정되면 모든 연산자가 NULL을 반환합니다.

NULL 유무를 테스트할 때는 비교 조건인 IS NULL과 IS NOT NULL을 사용합니다. NULL은 데이터 부족을 의미하기 때문에 임의의 값이나 다른 NULL과 같을 수는 없습니다.

# 데이터 타입
<a name="c_Supported_data_types"></a>

**Topics**
+ [멀티바이트 문자](#c_Supported_data_types-multi-byte-characters)
+ [숫자형](r_Numeric_types201.md)
+ [문자 형식](r_Character_types.md)
+ [날짜/시간 형식](r_Datetime_types.md)
+ [부울 유형](r_Boolean_type.md)
+ [HLLSKETCH 형식](r_HLLSKTECH_type.md)
+ [SUPER 형식](r_SUPER_type.md)
+ [VARBYTE 형식](r_VARBYTE_type.md)
+ [형식 호환성 및 변환](#r_Type_conversion)

Amazon Redshift가 저장하거나 가져오는 값은 각각 고정적으로 연결된 속성 집합이 포함된 데이터 형식을 가지고 있습니다. 데이터 형식은 테이블을 생성할 때 선언됩니다. 열이나 인수에 포함될 수 있는 값도 이 데이터 형식에 따라 결정됩니다.

다음 표는 Amazon Redshift 테이블에서 사용할 수 있는 데이터 형식을 나열한 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_Supported_data_types.html)

**참고**  
“char”(char는 인용 부호로 묶임) 등 지원되지 않는 데이터 형식에 대한 자세한 내용은 [지원되지 않는 PostgreSQL 데이터 유형](c_unsupported-postgresql-datatypes.md) 섹션을 참조하세요.

## 멀티바이트 문자
<a name="c_Supported_data_types-multi-byte-characters"></a>

VARCHAR 데이터 형식은 최대 4바이트의 UTF-8 멀티바이트 문자를 지원합니다. 5바이트 이상의 문자는 지원되지 않습니다. 멀티바이트 문자가 포함된 VARCHAR 열의 크기를 계산하려면 문자 수를 문자당 바이트 수와 곱셈합니다. 예를 들어 문자열에 한자가 4개 포함되어 있고, 각 문자의 길이가 3바이트라면 문자열을 저장하는 데 VARCHAR(12) 열이 필요합니다.

VARCHAR 데이터 유형은 다음과 같이 잘못된 UTF-8 코드포인트를 지원하지 않습니다.

`0xD800 – 0xDFFF`(바이트 시퀀스:`ED A0 80` \$1`ED BF BF`)

CHAR 데이터 유형은 멀티바이트 문자를 지원하지 않습니다.

# 숫자형
<a name="r_Numeric_types201"></a>

**Topics**
+ [정수 형식](#r_Numeric_types201-integer-types)
+ [DECIMAL 또는 NUMERIC 형식](#r_Numeric_types201-decimal-or-numeric-type)
+ [128비트 DECIMAL 또는 NUMERIC 열 사용에 대한 주의 사항](#r_Numeric_types201-notes-about-using-128-bit-decimal-or-numeric-columns)
+ [부동 소수점 형식](#r_Numeric_types201-floating-point-types)
+ [숫자 값 계산](r_numeric_computations201.md)
+ [정수 및 부동 소수점 리터럴](r_numeric_literals201.md)
+ [숫자 형식의 예제](r_Examples_with_numeric_types201.md)

숫자 데이터 형식으로는 정수, 소수 및 부동 소수점 수가 있습니다.

## 정수 형식
<a name="r_Numeric_types201-integer-types"></a>

SMALLINT, INTEGER 및 BIGINT 데이터 형식을 사용하여 다양한 범위의 정수를 저장합니다. 각 형식마다 허용 범위를 벗어나는 값은 저장할 수 없습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Numeric_types201.html)

## DECIMAL 또는 NUMERIC 형식
<a name="r_Numeric_types201-decimal-or-numeric-type"></a>

소수 또는 숫자 데이터 형식을 사용하여 *사용자 정의 정밀도*가 포함된 값을 저장합니다. 여기에서 소수와 숫자 키워드는 동일한 의미로 통용됩니다. 하지만 본 문서에서는 *소수*가 이 데이터 형식에서 우선적으로 사용되는 용어입니다. 실제로 *숫자*는 일반적으로 정수, 소수 및 부동 소수점 데이터 형식을 일컬을 때 사용됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Numeric_types201.html)

테이블에서 DECIMAL 열은 *precision*과 *scale*을 지정하여 다음과 같이 정의합니다.

```
decimal(precision, scale)
```

 *precision*   
정수에서 전체 유효 자릿수, 즉 소수점 양변의 자릿수를 말합니다. 예를 들어 숫자 `48.2891`의 정밀도는 6이고, 소수점 자릿수는 4입니다. 정밀도를 따로 지정하지 않을 경우 기본 정밀도는 18입니다. 최대 정밀도는 38입니다.  
 입력 값에서 소수점 왼쪽의 자릿수가 열 정밀도에서 소수점 자릿수를 뺀 값보다 큰 경우에는 값을 열에 복사하거나, 삽입하거나 혹은 업데이트할 수 없습니다. 이 규칙은 열 정의의 범위를 벗어나는 모든 값에 적용됩니다. 예를 들어 `numeric(5,2)` 열에서는 허용되는 값의 범위가 `-999.99`\$1`999.99`입니다.

 *\$1/scale*   
값의 소수부, 즉 소수점 오른쪽의 소수 자릿수를 말합니다. 정수는 소수 자릿수가 0입니다. 열 명세에서 소수점 자릿수 값은 정밀도 값보다 작거나 같아야 합니다. 소수점 자릿수를 따로 지정하지 않을 경우 기본 소수점 자릿수는 18입니다. 최대 소수점 자릿수는 37입니다.  
테이블에 로드되는 입력 값의 소수점 자릿수가 열의 소수점 자릿수보다 큰 경우에는 값이 지정한 자릿수로 반올림됩니다. 예를 들어 SALES 테이블의 PRICEPAID 열이 DECIMAL(8,2) 열이라고 가정하겠습니다. 이때 DECIMAL(8,4) 값이 PRICEPAID 열에 삽입되면 값의 소수점 자릿수가 2로 반올림됩니다.  

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 하지만 테이블에서 선택한 값의 명시적인 변환 결과는 반올림되지 않습니다.

**참고**  
DECIMAL(19,0) 열에 삽입할 수 있는 최대 양의 값은 `9223372036854775807`(263 -1)입니다. 음의 최댓값은 `-9223372036854775808`입니다. 예를 들어 `9999999999999999999`(9 19개) 값을 삽입하려고 하면 오버플로우 오류가 발생합니다. 소수점 위치에 상관없이 Amazon Redshift에서 DECIMAL 숫자로 표현할 수 있는 가장 큰 문자열은 `9223372036854775807`입니다. 예를 들어 DECIMAL(19,18) 열에 로드할 수 있는 가장 큰 값은 `9.223372036854775807`입니다.  
유효 자릿수가 19자리 이하인 DECIMAL 값은 내부적으로 8바이트 정수로 저장되지만, 유효 자릿수가 20\$138자리인 DECIMAL 값은 16바이트 정수로 저장되기 때문에 이러한 규칙이 적용됩니다.

## 128비트 DECIMAL 또는 NUMERIC 열 사용에 대한 주의 사항
<a name="r_Numeric_types201-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

애플리케이션에 해당 전체 자릿수가 필요한지 확실하지 않은 경우 DECIMAL 열에 최대 전체 자릿수를 임의로 지정하지 않도록 합니다. 128비트 값은 64비트 값보다 두 배 많은 디스크 공간을 사용하므로 쿼리 실행 시간이 느려질 수 있습니다.

## 부동 소수점 형식
<a name="r_Numeric_types201-floating-point-types"></a>

REAL 및 DOUBLE PRECISION 데이터 형식을 사용하여 *가변 정밀도*의 숫자 값을 저장합니다. 부동 소수점 형식은 *부정확합니다*. 이 말은 일부 값이 근사치로 저장되어 특정 값을 저장하거나 반환할 때 약간 불일치가 발생할 수 있다는 것을 의미합니다. 따라서 정확한 저장 및 계산이 필요하다면(금전적 액수 등) DECIMAL 데이터 형식을 사용하세요.

REAL은 이진 부동 소수점 산술에 대한 IEEE 표준 754에 따른 단정밀도 부동 소수점 형식을 나타냅니다. 정밀도는 약 6자리이며 범위는 약 1E-37\$11E\$137입니다. 이 데이터 유형을 FLOAT4로 지정할 수도 있습니다.

DOUBLE PRECISION은 이진 부동 소수점 산술에 대한 IEEE 표준 754에 따른 배정밀도 부동 소수점 형식을 나타냅니다. 정밀도는 약 15자리이며 범위는 약 1E-307\$11E\$1308입니다. 이 데이터 유형을 FLOAT 또는 FLOAT8로 지정할 수도 있습니다.

부동 소수점 유형에는 일반 숫자 값 외에도 몇 가지 특수 값이 있습니다. SQL에서 이러한 값을 사용할 때는 다음 값 주위에 작은따옴표를 사용하세요.
+ `NaN` – 숫자가 아님
+ `Infinity` - 무한대
+ `-Infinity` - 음의 무한대

예를 들어, `customer_activity` 테이블의 `day_charge` 열에 숫자가 아닌 항목을 삽입하려면 다음 SQL을 실행합니다.

```
insert into customer_activity(day_charge) values('NaN');
```

# 숫자 값 계산
<a name="r_numeric_computations201"></a>

여기에서 *계산*이란 더하기, 빼기, 곱하기, 나누기 등 수학적인 이진 연산을 말합니다. 이번 섹션에서는 이러한 연산에 따라 예상되는 반환 형식을 비롯해 DECIMAL 데이터 형식이 포함되어 있을 경우 정밀도와 소수점 자릿수의 계산 공식에 대해서 설명합니다.

쿼리 처리 시 숫자 값을 계산할 때는 계산이 불가능하거나 쿼리가 숫자 오버플로우 오류를 반환하는 상황이 발생할 수 있습니다. 그 밖에도 계산된 값의 소수점 자릿수가 바뀌거나 예상과 다를 수도 있습니다. 일부 연산에서는 명시적 캐스팅(형식 승격) 또는 Amazon Redshift 구성 파라미터를 사용하여 이러한 문제를 피할 수 있습니다.

SQL 함수를 사용하는 비슷한 계산 결과에 대한 자세한 내용은 [집계 함수](c_Aggregate_Functions.md) 섹션을 참조하세요.

## 계산 반환 형식
<a name="r_numeric_computations201-return-types-for-computations"></a>

다음 표는 Amazon Redshift에서 지원되는 숫자 데이터 형식을 고려하여 더하기, 빼기, 곱하기 및 나누기 연산에 따라 예상되는 반환 형식을 나타낸 것입니다. 표 왼쪽에서 첫 번째 열은 계산에 포함되는 첫 번째 피연산자이고, 맨 위의 행은 두 번째 피연산자를 의미합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_numeric_computations201.html)

## 계산된 DECIMAL 결과의 정밀도와 소수점 자릿수
<a name="r_numeric_computations201-precision-and-scale-of-computed-decimal-results"></a>

다음 표는 수학 연산이 DECIMAL 결과를 반환할 때 정밀도와 소수점 자릿수를 계산하는 규칙을 요약한 것입니다. 이 표에서 `p1`과 `s1`은 계산 시 첫 번째 피연산자의 정밀도 및 소수점 자릿수를, 그리고 `p2`와 `s2`는 두 번째 피연산자의 정밀도 및 소수점 자릿수를 의미합니다. 이 계산과 상관없이 최대 결과 정밀도는 38이고, 최대 결과 소수점 자릿수도 38입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_numeric_computations201.html)

예를 들어 SALES 테이블의 PRICEPAID 열과 COMMISSION 열이 모두 DECIMAL(8,2) 열이라고 가정하겠습니다. 이때 PRICEPAID를 COMMISSION으로(혹은 그 반대로) 나누면 다음과 같은 공식이 적용됩니다.

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

다음 계산은 UNION, INTERSECT, EXCEPT 같은 집합 연산자나 COALESCE, DECODE 같은 함수를 사용해 DECIMAL 값에 대한 연산 결과 정밀도와 소수점 자릿수를 계산하기 위한 일반 규칙입니다.

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

예를 들어 DECIMAL(7,2) 열 1개가 포함된 DEC1 테이블이 DECIMAL(15,3) 열 1개가 포함된 DEC2 테이블과 조인되어 DEC3 테이블을 생성한다고 가정할 때, DEC3의 스키마를 보면 NUMERIC(15,3) 열이 되는 것을 알 수 있습니다.

```
create table dec3 as select * from dec1 union select * from dec2;
```

결과 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'dec3';

column |     type      | encoding | distkey | sortkey 
-------+---------------+----------+---------+---------
c1     | numeric(15,3) | none     | f       | 0
```

위 예에서 적용되는 공식은 다음과 같습니다.

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## 나누기 연산에 대한 주의 사항
<a name="r_numeric_computations201-notes-on-division-operations"></a>

나누기 연산에서 0으로 나누는(divide-by-zero) 조건은 오류를 반환합니다.

정밀도와 소수점 자릿수를 계산한 후에는 소수점 자릿수 한계로 100이 적용됩니다. 계산된 결과 소수점 자릿수가 100보다 크면 나누기 결과가 다음과 같이 조정됩니다.
+ precision = ` precision - (scale - max_scale)` 
+ Scale = ` max_scale ` 

계산된 정밀도가 최대 정밀도(38)보다 크면 정밀도가 38로 줄어들고, 소수점 자릿수는 다음 공식의 결과 값이 됩니다. `max((38 + scale - precision), min(4, 100))` 

## 오버플로우 조건
<a name="r_numeric_computations201-overflow-conditions"></a>

모든 수치 계산에서는 오버플로우 여부를 확인합니다. 정밀도가 19 이하인 DECIMAL 데이터는 64비트 정수로 저장됩니다. 정밀도가 19보다 큰 DECIMAL 데이터는 128비트 정수로 저장됩니다. DECIMAL 값은 모두 최대 정밀도가 38이고, 최대 소수점 자릿수가 37입니다. 오버플로우 오류는 값이 이러한 제한을 초과할 때 발생하며, 중간 결과 집합과 최종 결과 집합 모두에 적용됩니다.
+ 특정 데이터 값이 CAST 함수에서 지정하는 정밀도 또는 소수점 자릿수와 맞지 않으면 명시적 변환을 실행해도 오버플로우 오류를 반환합니다. 예를 들어 SALES 테이블의 PRICEPAID 열(DECIMAL(8,2) 열)에 있는 값을 모두 변환할 수는 없기 때문에 다음과 같이 DECIMAL(7,3) 결과를 반환합니다.

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  이러한 오류가 발생하는 이유는 PRICEPAID 열에서 *일부* 더 큰 값은 변환할 수 없기 때문입니다.
+ 곱하기 연산은 결과 소수점 자릿수가 각 피연산자의 소수점 자릿수 합인 결과를 산출합니다. 예를 들어 두 피연산자의 소수점 자릿수가 4라고 한다면 결과 소수점 자릿수는 8이 되고 소수점 왼쪽에는 10자리만 남게 됩니다. 따라서 둘 다 유효 소수점 자릿수를 가지고 있는 큰 수 2개를 곱할 경우에는 비교적 오버플로우 조건이 발생하기 쉽습니다.

  다음 예는 오버플로 오류를 유발합니다.

  ```
  SELECT CAST(1 AS DECIMAL(38, 20)) * CAST(10 AS DECIMAL(38, 20));
  ERROR: 128 bit numeric data overflow (multiplication)
  ```

  곱하기 대신 나누기를 사용하여 오버플로 오류를 해결할 수 있습니다. 다음 예를 사용하여 원래 제수로 나눈 1로 나눕니다.

  ```
  SELECT CAST(1 AS DECIMAL(38, 20)) / (1 / CAST(10 AS DECIMAL(38, 20)));
  +----------+
  | ?column? |
  +----------+
  | 10       |
  +----------+
  ```

## INTEGER 및 DECIMAL 형식을 사용한 숫자 계산
<a name="r_numeric_computations201-numeric-calculations-with-integer-and-decimal-types"></a>

계산 시 피연산자 하나가 INTEGER 데이터 형식이고, 나머지 피연산자가 DECIMAL 데이터 형식인 경우에는 INTEGER 피연산자가 묵시적으로 DECIMAL로 변환됩니다.
+ INT2(SMALLINT)는 DECIMAL(5,0)로 변환됨 
+ INT4(INTEGER)는 DECIMAL(10,0)로 변환됨 
+ INT8(BIGINT)은 DECIMAL(19,0)로 변환됨 

예를 들어 SALES.COMMISSION(DECIMAL(8,2) 열)과 SALES.QTYSOLD(SMALLINT 열)를 곱하면 다음과 같이 변환됩니다.

```
DECIMAL(8,2) * DECIMAL(5,0)
```

# 정수 및 부동 소수점 리터럴
<a name="r_numeric_literals201"></a>

숫자를 나타내는 리터럴이나 상수는 정수 또는 부동 소수점이 될 수 있습니다.

## 정수 리터럴
<a name="r_numeric_literals201-integer-literals"></a>

정수 상수는 0부터 9까지 연속된 숫자로서 옵션으로 양(\$1) 또는 음(-)의 부호가 숫자 앞에 추가됩니다.

## 구문
<a name="r_numeric_literals201-synopsis"></a>

```
[ + | - ] digit ...
```

## 예제
<a name="r_numeric_literals201-examples"></a>

유효한 정수를 예로 들면 다음과 같습니다.

```
23
-555
+17
```

## 부동 소수점 리터럴
<a name="r_numeric_literals201-floating-point-literals"></a>

부동 소수점 리터럴(소수, 숫자 또는 분수 리터럴)은 소수점과 옵션으로 지수 표시(e)까지 포함할 수 있는 연속된 숫자입니다.

## 구문
<a name="r_numeric_literals201-synopsis2"></a>

```
[ + | - ] digit ... [ . ] [ digit ...]
[ e | E [ + | - ] digit ... ]
```

## 인수
<a name="r_numeric_literals201-arguments"></a>

ee  
e 또는 E는 숫자가 유효숫자 표기법으로 지정되는 것을 나타냅니다.

## 예제
<a name="r_numeric_literals201-examples2"></a>

유효한 부동 소수점 리터럴을 예로 들면 다음과 같습니다.

```
3.14159
-37.
2.0e19
-2E-19
```

# 숫자 형식의 예제
<a name="r_Examples_with_numeric_types201"></a>



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

다음은 여러 가지 숫자 데이터 형식을 선언하는 CREATE TABLE 문입니다.

```
create table film (
film_id integer,
language_id smallint,
original_language_id smallint,
rental_duration smallint default 3,
rental_rate numeric(4,2) default 4.99,
length smallint,
replacement_cost real default 25.00);
```

## 범위를 벗어난 정수를 삽입하려고 시도
<a name="r_Examples_with_numeric_types201-attempt-to-insert-an-integer-that-is-out-of-range"></a>

다음은 값 33000을 SMALLINT 열에 삽입하는 예입니다.

```
insert into film(language_id) values(33000);
```

SMALLINT의 범위가 -32768\$1\$132767이기 때문에 Amazon Redshift가 오류를 반환합니다.

```
An error occurred when executing the SQL command:
insert into film(language_id) values(33000)

ERROR: smallint out of range [SQL State=22003]
```

## 소수 값을 정수 열에 삽입
<a name="r_Examples_with_numeric_types201-insert-a-decimal-value-into-an-integer-column"></a>

다음은 소수 값을 INT 열에 삽입하는 예입니다.

```
insert into film(language_id) values(1.5);
```

이 값은 정수 값 2로 반올림하여 삽입됩니다.

## 소수점 자릿수를 반올림하여 소수 값 삽입
<a name="r_Examples_with_numeric_types201-insert-a-decimal-that-succeeds-because-its-scale-is-rounded"></a>

다음은 정밀도가 열보다 높은 소수 값을 삽입하는 예입니다.

```
insert into film(rental_rate) values(35.512);
```

이 경우에는 `35.51` 값이 열에 삽입됩니다.

## 범위를 벗어나는 소수 값을 삽입하려고 시도
<a name="r_Examples_with_numeric_types201-attempt-to-insert-a-decimal-value-that-is-out-of-range"></a>

이 경우에는 `350.10` 값이 범위를 벗어납니다. DECIMAL 열에서 값의 자릿수는 열의 정밀도에서 소수점 자릿수를 뺀 값과 동일합니다(RENTAL\$1RATE의 경우 4 - 2). 다시 말해서 `DECIMAL(4,2)` 열의 허용 범위는 `-99.99`\$1`99.99`입니다.

```
insert into film(rental_rate) values (350.10);
ERROR:  numeric field overflow
DETAIL:  The absolute value is greater than or equal to 10^2 for field with precision 4, scale 2.
```

## REAL 열에 가변 정밀도 값 삽입
<a name="r_Examples_with_numeric_types201-insert-variable-precision-values-into-a-real-column"></a>

다음은 가변 정밀도 값을 REAL 열에 삽입하는 예입니다.

```
insert into film(replacement_cost) values(1999999.99);

insert into film(replacement_cost) values(1999.99);

select replacement_cost from film;

+------------------+
| replacement_cost |
+------------------+
| 2000000          |
| 1999.99          |
+------------------+
```

`1999999.99` 값은 `REAL`으로 변환되어 `2000000` 열의 정밀도 요건을 충족합니다. `1999.99` 값은 그대로 로드됩니다.

# 문자 형식
<a name="r_Character_types"></a>

**Topics**
+ [스토리지 및 범위](#r_Character_types-storage-and-ranges)
+ [CHAR 또는 CHARACTER](#r_Character_types-char-or-character)
+ [VARCHAR 또는 CHARACTER VARYING](#r_Character_types-varchar-or-character-varying)
+ [NCHAR 및 NVARCHAR 형식](#r_Character_types-nchar-and-nvarchar-types)
+ [TEXT 및 BPCHAR 형식](#r_Character_types-text-and-bpchar-types)
+ [후행 공백의 중요성](#r_Character_types-significance-of-trailing-blanks)
+ [문자 형식의 예제](r_Examples_with_character_types.md)

문자 데이터 형식에는 CHAR(문자)와 VARCHAR(가변 문자)가 포함됩니다.

## 스토리지 및 범위
<a name="r_Character_types-storage-and-ranges"></a>

CHAR 및 VARCHAR 데이터 형식은 문자가 아닌 바이트로 정의됩니다. CHAR 열에는 단일 바이트 문자만 포함되기 때문에 예를 들어 CHAR(10) 열이라고 하면 최대 10바이트의 문자열이 포함될 수 있습니다. VARCHAR에는 멀티바이트 문자가 포함되어 문자당 최대 4바이트까지 가능합니다. 예를 들어 VARCHAR(12)라고 하면 단일 바이트 문자 12개, 2바이트 문자 6개, 3바이트 문자 4개, 또는 4바이트 문자 3개가 포함될 수 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Character_types.html)

**참고**  
CREATE TABLE 구문은 문자 데이터 형식에 MAX 키워드를 지원합니다. 예제:  

```
create table test(col1 varchar(max));
```
CHAR의 경우 MAX는 열 너비를 4096바이트로 정의합니다.  
VARCHAR의 경우 MAX는 CREATE TABLE 문에서 열 너비를 65,535바이트로 정의합니다. 인 메모리 작업의 경우 VARCHAR(MAX)는 최대 16,000,000바이트를 지원합니다.

## CHAR 또는 CHARACTER
<a name="r_Character_types-char-or-character"></a>

CHAR 또는 CHARACTER 열은 고정 길이 문자열을 저장하는 데 사용됩니다. 이 문자열은 공백으로 채워지므로 CHAR(10) 열은 항상 10바이트의 스토리지를 차지합니다.

```
char(10)
```

 길이 명세가 없는 CHAR 열은 CHAR(1) 열이 됩니다.

## VARCHAR 또는 CHARACTER VARYING
<a name="r_Character_types-varchar-or-character-varying"></a>

VARCHAR 또는 CHARACTER VARYING 열은 제한이 고정되어 있는 가변 길이 문자열을 저장하는 데 사용됩니다. 이 문자열은 공백으로 채워지지 않으므로 VARCHAR(120) 열은 단일 바이트 문자 120개, 2바이트 문자 60개, 3바이트 문자 40개 또는 4바이트 문자 30개까지 구성됩니다.

```
varchar(120)
```

CREATE TABLE 문에서 길이 지정자 없이 VARCHAR 데이터 형식을 사용하는 경우 기본 길이는 256입니다.

[문자열 함수](String_functions_header.md)는 이제 최대 16,000,000바이트를 지원합니다. 예를 들어 CONCAT 함수 출력은 이전에는 65,535바이트로 제한되었지만 이제는 최대 16,000,000바이트를 지원합니다.

```
SELECT LEN(CONCAT(REPEAT('A', 5000000), REPEAT('B', 5000000))) AS total_length;

 total_length
--------------
     10000000
```

## NCHAR 및 NVARCHAR 형식
<a name="r_Character_types-nchar-and-nvarchar-types"></a>

NCHAR 및 NVARCHAR 형식(NATIONAL CHARACTER 및 NATIONAL CHARACTER VARYING 형식으로도 불림)의 열을 생성할 수 있습니다. 이 두 형식은 각각 CHAR 및 VARCHAR 형식으로 변환된 후 지정한 바이트 수로 저장됩니다.

길이 명세가 없는 NCHAR 열은 CHAR(1) 열로 변환됩니다.

길이 명세가 없는 NVARCHAR 열은 VARCHAR(256) 열로 변환됩니다.

## TEXT 및 BPCHAR 형식
<a name="r_Character_types-text-and-bpchar-types"></a>

TEXT 열이 포함된 Amazon Redshift 테이블을 생성할 수는 있지만 이 열은 VARCHAR(256) 열로 변환되어 최대 256개 문자까지 가변 길이 값을 허용합니다.

BPCHAR(공백 채움 문자) 형식의 Amazon Redshift 열을 생성할 수 있으며, 이 열은 Amazon Redshift에서 고정 길이 CHAR(256) 열로 변환됩니다.

## 후행 공백의 중요성
<a name="r_Character_types-significance-of-trailing-blanks"></a>

CHAR 및 VARCHAR 데이터 형식은 모두 *n* 바이트 길이까지 문자열을 저장합니다. 더욱 긴 문자열을 이러한 형식의 열에 저장하려고 하면 오류를 반환합니다. 단, 추가 문자가 모두 공백일 경우에는 문자열이 최대 길이까지 잘립니다. 문자열이 최대 길이보다 짧을 경우 CHAR 값은 공백으로 채워지지만 VARCHAR 값은 공백 없이 문자열을 저장합니다.

CHAR 값에서 후행 공백은 언제나 의미상 유의적이지 않습니다. CHAR 값 2개를 비교할 때는 무시되고, LENGTH 계산에 포함되지 않으며, 그리고 CHAR 값을 다른 문자열 형식으로 변환할 때는 제거됩니다.

값을 서로 비교할 경우 VARCHAR 값과 CHAR 값의 후행 공백은 의미상 유의적이지 않습니다.

LENGTH 계산을 실행하면 길이에 포함된 후행 공백까지 합쳐서 VARCHAR 문자열의 길이를 반환합니다. 하지만 고정 길이 문자열에서는 후행 공백을 길이에 포함하여 계산하지 않습니다.

# 문자 형식의 예제
<a name="r_Examples_with_character_types"></a>

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

다음은 VARCHAR 및 CHAR 데이터 형식을 사용하는 CREATE TABLE 문입니다.

```
create table address(
address_id integer,
address1 varchar(100),
address2 varchar(50),
district varchar(20),
city_name char(20),
state char(2),
postal_code char(5)
);
```

다음 예부터는 위에서 생성한 테이블을 사용합니다.

## 가변 길이 문자열의 후행 공백
<a name="r_Examples_with_character_types-trailing-blanks-in-variable-length-character-strings"></a>

ADDRESS1이 VARCHAR 열이기 때문에 두 번째 삽입된 주소의 후행 공백은 의미상 유의적이지 않습니다. 다시 말해서 삽입된 주소 2개 모두 *일치합니다*.

```
insert into address(address1) values('9516 Magnolia Boulevard');

insert into address(address1) values('9516 Magnolia Boulevard  ');
```

```
select count(*) from address
where address1='9516 Magnolia Boulevard';

count
-------
2
(1 row)
```

ADDRESS1 열이 CHAR 열이고 동일한 값이 삽입되었다면 COUNT(\$1) 쿼리는 문자열을 동일하게 인식하여 `2`를 반환할 것입니다.

## LENGTH 함수의 결과
<a name="r_Examples_with_character_types-results-of-the-length-function"></a>

LENGTH 함수는 VARCHAR 열의 후행 공백을 인식합니다.

```
select length(address1) from address;

length
--------
23
25
(2 rows)
```

CITY\$1NAME 열(CHAR 열)에서 `Augusta` 값은 입력 문자열의 후행 공백 유무에 상관없이 항상 7자의 문자 길이를 반환합니다.

## 열의 길이를 초과하는 값
<a name="r_Examples_with_character_types-values-that-exceed-the-length-of-the-column"></a>

다음과 같은 경우에는 문자열이 선언한 열의 폭에 맞춰 잘리지 않습니다.

```
insert into address(city_name) values('City of South San Francisco');
ERROR: value too long for type character(20)
```

이러한 문제는 아래와 같이 값을 열의 크기로 변환하여 해결할 수 있습니다.

```
insert into address(city_name)
values('City of South San Francisco'::char(20));
```

이 경우 문자열의 첫 20자(`City of South San Fr`)가 열에 로드됩니다.

# 날짜/시간 형식
<a name="r_Datetime_types"></a>

**Topics**
+ [스토리지 및 범위](#r_Datetime_types-storage-and-ranges)
+ [DATE](#r_Datetime_types-date)
+ [TIME](#r_Datetime_types-time)
+ [TIMETZ](#r_Datetime_types-timetz)
+ [TIMESTAMP](#r_Datetime_types-timestamp)
+ [TIMESTAMPTZ](#r_Datetime_types-timestamptz)
+ [날짜/시간 형식의 예제](r_Examples_with_datetime_types.md)
+ [날짜, 시간 및 타임스탬프 리터럴](r_Date_and_time_literals.md)
+ [간격 데이터 유형 및 리터럴](r_interval_data_types.md)

날짜/시간 데이터 형식으로는 DATE, TIME, TIMETZ, TIMESTAMP 및 TIMESTAMPTZ가 있습니다.

## 스토리지 및 범위
<a name="r_Datetime_types-storage-and-ranges"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Datetime_types.html)

## DATE
<a name="r_Datetime_types-date"></a>

DATE 데이터 형식은 타임스탬프 없이 날짜만 저장하는 데 사용됩니다.

## TIME
<a name="r_Datetime_types-time"></a>

TIME은 TIME WITHOUT TIME ZONE의 별칭입니다.

TIME 데이터 형식을 사용하여 시간을 저장합니다.

TIME 열에는 초의 소수점 이하 자릿수가 최대 6자리인 값이 저장됩니다.

기본적으로 TIME 값은 사용자 테이블과 Amazon Redshift 시스템 테이블 모두에서 협정 세계시(UTC)입니다.

## TIMETZ
<a name="r_Datetime_types-timetz"></a>

TIMETZ는 TIME WITH TIME ZONE의 별칭입니다.

TIMETZ 데이터 형식을 사용하여 시간대와 함께 시간을 저장합니다.

TIMETZ 열에는 초의 소수점 이하 자릿수가 최대 6자리인 값이 저장됩니다.

기본적으로 TIMETZ 값은 사용자 테이블과 Amazon Redshift 시스템 테이블 모두에서 UTC입니다.

## TIMESTAMP
<a name="r_Datetime_types-timestamp"></a>

TIMESTAMP는 TIMESTAMP WITHOUT TIME ZONE의 별칭입니다.

TIMESTAMP 데이터 형식은 날짜와 시간이 모두 포함된 완전한 타임스탬프 값을 저장하는 데 사용됩니다.

TIMESTAMP 열에는 초의 소수점 이하 자릿수가 최대 6자리인 값이 저장됩니다.

TIMESTAMP 열에 날짜를 삽입하거나 일부 타임스탬프 값이 있는 날짜를 삽입하면 값이 암시적으로 전체 타임스탬프 값으로 변환됩니다. 이 전체 타임스탬프 값에는 누락된 시간, 분, 초에 대한 기본값(00)이 있습니다. 입력 문자열의 시간대 값은 무시됩니다.

기본적으로 TIMESTAMP 값은 사용자 테이블과 Amazon Redshift 시스템 테이블 모두에서 UTC입니다.

## TIMESTAMPTZ
<a name="r_Datetime_types-timestamptz"></a>

TIMESTAMPTZ는 TIMESTAMP WITH TIME ZONE의 별칭입니다.

TIMESTAMPTZ 데이터 형식은 날짜, 시간 및 시간대가 모두 포함된 완전한 타임스탬프 값을 입력하는 데 사용됩니다. 입력 값에 시간대가 포함되어 있으면 Amazon Redshift가 해당 시간대를 사용하여 값을 UTC로 변환하여 UTC 값을 저장합니다.

지원되는 시간대 이름 목록을 보려면 다음 명령을 실행합니다.

```
select pg_timezone_names();
```

 지원되는 시간대 이름 약어 목록을 보려면 다음 명령을 실행합니다.

```
select pg_timezone_abbrevs();
```

시간대에 대한 현재 정보는 [IANA Time Zone Database](https://www.iana.org/time-zones)에서도 확인할 수 있습니다.

다음 표는 각 시간대 형식의 예를 나타낸 것입니다.


| 형식 | 예제 | 
| --- | --- | 
|  dd mon hh:mi:ss yyyy tz  |  17 Dec 07:37:16 1997 PST   | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 PST  | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 US/Pacific  | 
|  yyyy-mm-dd hh:mi:ss\$1/-tz  |  1997-12-17 07:37:16-08   | 
| dd.mm.yyyy hh:mi:ss tz |  17.12.1997 07:37:16.00 PST  | 

TIMESTAMPTZ 열에는 초의 소수점 이하 자릿수가 최대 6자리인 값이 저장됩니다.

TIMESTAMPTZ 열에 날짜를 삽입하거나 일부 타임스탬프가 있는 날짜를 삽입하면 값이 암시적으로 전체 타임스탬프 값으로 변환됩니다. 이 전체 타임스탬프 값에는 누락된 시간, 분, 초에 대한 기본값(00)이 있습니다.

TIMESTAMPTZ 값은 사용자 테이블에서 UTC입니다.

# 날짜/시간 형식의 예제
<a name="r_Examples_with_datetime_types"></a>

다음으로 Amazon Redshift에서 지원되는 날짜/시간 형식 작업 예를 찾아봅니다.

## 날짜 예제
<a name="r_Examples_with_datetime_types-date-examples"></a>

다음은 다른 형식의 날짜를 삽입한 후 출력을 표시하는 예입니다.

```
create table datetable (start_date date, end_date date);
```

```
insert into datetable values ('2008-06-01','2008-12-31');

insert into datetable values ('Jun 1,2008','20081231');
```

```
select * from datetable order by 1;

start_date |  end_date
-----------------------
2008-06-01 | 2008-12-31
2008-06-01 | 2008-12-31
```

타임스탬프 값을 DATE 열에 삽입하면 시간 구간은 무시하고 날짜만 로드됩니다.

## 시간 예제
<a name="r_Examples_with_datetime_types-time-examples"></a>

다음은 다른 형식의 TIME 및 TIMETZ 값을 삽입한 후 출력을 표시하는 예입니다.

```
create table timetable (start_time time, end_time timetz);
```

```
insert into timetable values ('19:11:19','20:41:19 UTC');
insert into timetable values ('191119', '204119 UTC');
```

```
select * from timetable order by 1;
start_time |  end_time
------------------------
 19:11:19  | 20:41:19+00
 19:11:19  | 20:41:19+00
```

## 타임스탬프 예제
<a name="r_Examples_with_datetime_types-timestamp-examples"></a>

날짜를 TIMESTAMP 또는 TIMESTAMPTZ 열에 삽입할 경우 시간이 자정으로 기본 설정됩니다. 예를 들어 `20081231` 리터럴을 삽입하면 `2008-12-31 00:00:00`으로 값이 저장됩니다.

현재 세션의 시간대를 변경하려면 [SET](r_SET.md) 명령을 사용하여 [timezone](r_timezone_config.md) 구성 파라미터를 설정하면 됩니다.

다음은 다른 형식의 타임스탬프를 삽입한 후 결과 테이블을 표시하는 예입니다.

```
create table tstamp(timeofday timestamp, timeofdaytz timestamptz);

insert into tstamp values('Jun 1,2008  09:59:59', 'Jun 1,2008 09:59:59 EST' );
insert into tstamp values('Dec 31,2008 18:20','Dec 31,2008 18:20');
insert into tstamp values('Jun 1,2008  09:59:59 EST', 'Jun 1,2008 09:59:59');

SELECT * FROM tstamp;

+---------------------+------------------------+
|      timeofday      |      timeofdaytz       |
+---------------------+------------------------+
| 2008-06-01 09:59:59 | 2008-06-01 14:59:59+00 |
| 2008-12-31 18:20:00 | 2008-12-31 18:20:00+00 |
| 2008-06-01 09:59:59 | 2008-06-01 09:59:59+00 |
+---------------------+------------------------+
```

# 날짜, 시간 및 타임스탬프 리터럴
<a name="r_Date_and_time_literals"></a>

다음은 Amazon Redshift에서 지원하는 날짜, 시간 및 타임스탬프 리터럴 작업 규칙입니다.

## 날짜
<a name="r_Date_and_time_literals-dates"></a>

다음 입력 날짜는 모두 Amazon Redshift 테이블에 로드할 수 있는 DATE 날짜 유형에 대한 리터럴 날짜 값의 유효한 예입니다. 기본 `MDY DateStyle` 모드가 유효한 것으로 간주됩니다. 이 모드는 `1999-01-08`, `01/02/00`과 같은 문자열에서 월 값이 일 값에 선행함을 의미합니다.

**참고**  
날짜 또는 타임스탬프 리터럴은 테이블에 로드할 때 인용 부호로 묶어야 합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Date_and_time_literals.html)

## Times
<a name="r_Date_and_time_literals-times"></a>

다음 입력 시간은 모두 Amazon Redshift 테이블에 로드할 수 있는 TIME 및 TIMETZ 데이터 유형에 대한 리터럴 시간 값의 유효한 예입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Date_and_time_literals.html)

## 타임스탬프
<a name="r_Date_and_time_literals-timestamps"></a>

다음 입력 타임스탬프는 모두 Amazon Redshift 테이블에 로드할 수 있는 TIMESTAMP 및 TIMESTAMPTZ 데이터 유형에 대한 리터럴 시간 값의 유효한 예입니다. 날짜 리터럴만 유효하다면 모두 아래 시간 리터럴과 함께 사용할 수 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Date_and_time_literals.html)

## 특수한 날짜/시간 값
<a name="r_Date_and_time_literals-special-datetime-values"></a>

다음 특수 값은 날짜/시간 리터럴로, 혹은 날짜 함수의 인수로 사용됩니다. 이 특수 값을 사용하려면 작은따옴표가 필요하며, 쿼리 처리 시 타임스탬프 정규 값으로 변환됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Date_and_time_literals.html)

다음은 `now` 및 `today`가 DATEADD 함수와 함께 작동하는 방식을 보여주는 예입니다.

```
select dateadd(day,1,'today');

date_add
---------------------
2009-11-17 00:00:00
(1 row)

select dateadd(day,1,'now');

date_add
----------------------------
2009-11-17 10:45:32.021394
(1 row)
```

# 간격 데이터 유형 및 리터럴
<a name="r_interval_data_types"></a>

간격 데이터 유형을 사용하여 기간을 `seconds`, `minutes`, `hours`, `days`, `months` 및 `years` 단위로 저장할 수 있습니다. 날짜 및 타임스탬프에 간격 추가, 간격 합산, 날짜 또는 타임스탬프에서 간격 빼기 등 날짜/시간 계산에 간격 데이터 유형 및 리터럴을 사용할 수 있습니다. 간격 리터럴은 테이블의 간격 데이터 유형 열에 대한 입력 값으로 사용할 수 있습니다.

## 간격 데이터 유형 구문
<a name="r_interval_data_types-syntax"></a>

기간을 년 및 월 단위로 저장하도록 간격 데이터 유형을 지정하려면:

```
INTERVAL year_to_month_qualifier
```

기간을 일, 시간, 분, 초 단위로 저장하도록 간격 데이터 유형을 지정하려면:

```
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
```

## 간격 리터럴 구문
<a name="r_interval_data_types-syntax-literal"></a>

기간을 년 및 월 단위로 정의하도록 간격 리터럴을 지정하려면:

```
INTERVAL quoted-string year_to_month_qualifier
```

기간을 일, 시간, 분, 초 단위로 정의하도록 간격 리터럴을 지정하려면:

```
INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]
```

## 인수
<a name="r_interval_data_types-arguments"></a>

 *quoted-string*   
수량과 날짜/시간 단위를 입력 문자열로 지정하여 양수 또는 음수 값을 지정합니다. *quoted-string*에 숫자만 포함된 경우 Amazon Redshift는 *year\$1to\$1month\$1qualifier* 또는 *day\$1to\$1second\$1qualifier*에서 단위를 결정합니다. 예를 들어 `'23' MONTH`는 `1 year 11 months`를 나타내고, `'-2' DAY`는 `-2 days 0 hours 0 minutes 0.0 seconds`를 나타내며, `'1-2' MONTH`는 `1 year 2 months`를 나타내고, `'13 day 1 hour 1 minute 1.123 seconds' SECOND`는 `13 days 1 hour 1 minute 1.123 seconds`를 나타냅니다. 간격 출력 형식에 대한 자세한 내용은 [간격 스타일](#r_interval_data_types-interval-styles) 섹션을 참조하세요.

 *year\$1to\$1month\$1qualifier*   
간격 범위를 지정합니다. 한정자를 사용하고 시간 단위가 한정자보다 작은 간격을 생성하면 Amazon Redshift는 간격의 더 작은 부분을 잘라서 삭제합니다. *year\$1to\$1month\$1qualifier*의 유효한 값은 다음과 같습니다.  
+ `YEAR`
+ `MONTH`
+ `YEAR TO MONTH`

 *day\$1to\$1second\$1qualifier*   
간격 범위를 지정합니다. 한정자를 사용하고 시간 단위가 한정자보다 작은 간격을 생성하면 Amazon Redshift는 간격의 더 작은 부분을 잘라서 삭제합니다. *day\$1to\$1second\$1qualifier*의 유효한 값은 다음과 같습니다.  
+ `DAY`
+ `HOUR`
+ `MINUTE`
+ `SECOND`
+ `DAY TO HOUR`
+ `DAY TO MINUTE`
+ `DAY TO SECOND`
+ `HOUR TO MINUTE`
+ `HOUR TO SECOND`
+ `MINUTE TO SECOND`
INTERVAL 리터럴의 출력은 지정된 가장 작은 INTERVAL 구성 요소까지 잘립니다. 예를 들어 MINUTE 한정자를 사용하는 경우 Amazon Redshift는 MINUTE 미만의 시간 단위를 삭제합니다.  

```
select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE
```
결과 값은 `'1 day 01:01:00'`까지 잘립니다.

 *fractional\$1precision*   
간격에 허용되는 소수 자릿수를 지정하는 파라미터 옵션입니다. *fractional\$1precision* 인수는 간격에 SECOND가 포함된 경우에만 지정해야 합니다. 예를 들어 `SECOND(3)`는 세 자리 소수만 허용하는 간격을 생성합니다(예: 1.234초). 최대 소수 자릿수는 6자리입니다.

세션 구성 `interval_forbid_composite_literals`는 YEAR TO MONTH 및 DAY TO SECOND 부분을 모두 사용하여 간격을 지정하는 경우 오류가 반환되는지 여부를 결정합니다. 자세한 내용은 [interval\$1forbid\$1composite\$1literals](r_interval_forbid_composite_literals.md) 섹션을 참조하세요.

## 간격 산술
<a name="r_interval_data_types-arithmetic"></a>

간격 값을 다른 날짜/시간 값과 함께 사용하여 산술 연산을 수행할 수 있습니다. 다음 테이블에는 사용 가능한 작업과 각 작업에서 얻을 수 있는 데이터 유형이 설명되어 있습니다.

**참고**  
 `date` 및 `timestamp` 결과를 모두 생성할 수 있는 작업은 방정식과 관련된 최소 시간 단위를 기반으로 합니다. 예를 들어, `interval`을 `date`에 추가하는 경우 YEAR TO MONTH 간격이면 `date`이 반환되고, DAY TO SECOND 간격이면 timestamp가 반환됩니다.

첫 번째 피연산자가 `interval`인 작업은 지정된 두 번째 피연산자에 대해 다음과 같은 결과를 생성합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_interval_data_types.html)

첫 번째 피연산자가 `date`인 작업은 지정된 두 번째 피연산자에 대해 다음과 같은 결과를 생성합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_interval_data_types.html)

첫 번째 피연산자가 `timestamp`인 작업은 지정된 두 번째 피연산자에 대해 다음과 같은 결과를 생성합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_interval_data_types.html)

## 간격 스타일
<a name="r_interval_data_types-interval-styles"></a>

SQL [SET](r_SET.md) 명령을 사용하여 간격 값의 출력 표시 형식을 변경할 수 있습니다. SQL에서 간격 데이터 유형을 사용하는 경우 텍스트로 변환하여 예상 간격 스타일(예: `YEAR TO MONTH::text`)을 확인합니다. `IntervalStyle` 값을 설정하는 데 사용할 수 있는 값은 다음과 같습니다.
+ `postgres` - PostgreSQL 스타일을 따릅니다. 이 값이 기본값입니다.
+ `postgres_verbose` - PostgreSQL 상세 정보 표시 스타일을 따릅니다.
+ `sql_standard` - SQL 표준 간격 리터럴 스타일을 따릅니다.

다음 명령은 간격 스타일을 `sql_standard`로 설정합니다.

```
SET IntervalStyle to 'sql_standard';
```

**postgres 출력 형식**

다음은 `postgres` 간격 스타일의 출력 형식입니다. 각 숫자 값은 음수일 수 있습니다.

```
'<numeric> <unit> [, <numeric> <unit> ...]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
---------------
1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
------------------
1 day 02:03:04.5678
```

**postgres\$1verbose 출력 형식**

postgres\$1verbose 구문은 postgres와 비슷하지만 postgres\$1verbose 출력에는 시간 단위도 포함됩니다.

```
'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
-----------------
@ 1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
---------------------------
@ 1 day 2 hours 3 mins 4.56 secs
```

**sql\$1standard 출력 형식**

간격 연도-월 값의 형식은 다음과 같습니다. 간격 앞에 음수 부호를 지정하면 간격이 음수임을 나타내며 전체 간격에 적용됩니다.

```
'[-]yy-mm'
```

간격 일-초 값의 형식은 다음과 같습니다.

```
'[-]dd hh:mm:ss.ffffff'
```

```
SELECT INTERVAL '1-2' YEAR TO MONTH::text 
  
varchar   
-------
1-2
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text 

varchar
---------------
1 2:03:04.5678
```

## 간격 데이터 유형의 예
<a name="r_interval_data_types-examples"></a>

다음 예제에서는 테이블을 사용해 INTERVAL 데이터 유형을 사용하는 방법을 보여 줍니다.

```
create table sample_intervals (y2m interval month, h2m interval hour to minute);
insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second);
select y2m::text, h2m::text from sample_intervals;


      y2m      |       h2m      
---------------+-----------------
 1 year 8 mons | 2 days 01:01:00
```

```
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month;
select * from sample_intervals;

   y2m   |       h2m       
---------+-----------------
 2 years | 2 days 01:01:00
```

```
delete from sample_intervals where h2m = interval '2 1:1:0' day to second;
select * from sample_intervals;

 y2m | h2m 
-----+-----
```

## 간격 리터럴의 예
<a name="r_interval_data_types_literals-examples"></a>

다음 예제는 간격 스타일을 `postgres`로 설정한 상태에서 실행됩니다.

다음 예제에서는 1년의 INTERVAL 리터럴을 생성하는 방법을 보여 줍니다.

```
select INTERVAL '1' YEAR 

intervaly2m
---------------
1 years 0 mons
```

한정자를 초과하는 *quoted-string*을 지정하면 간격에서 남은 시간 단위가 잘립니다. 다음 예제에서는 13개월의 간격이 1년 1개월이 되지만 나머지 1개월은 YEAR 한정자로 인해 제외됩니다.

```
select INTERVAL '13 months' YEAR

intervaly2m
---------------
1 years 0 mons
```

간격 문자열보다 낮은 한정어를 사용하는 경우 남은 단위가 포함됩니다.

```
select INTERVAL '13 months' MONTH

intervaly2m
---------------
1 years 1 mons
```

간격에 정밀도를 지정하면 소수 자릿수가 잘려 지정된 정밀도까지 줄어듭니다.

```
select INTERVAL '1.234567' SECOND (3)

intervald2s
--------------------------------
0 days 0 hours 0 mins 1.235 secs
```

정밀도를 지정하지 않는 경우 Amazon Redshift는 최대 정밀도 6을 사용합니다.

```
select INTERVAL '1.23456789' SECOND

intervald2s
-----------------------------------
0 days 0 hours 0 mins 1.234567 secs
```

다음 예제에서는 범위가 지정된 간격을 생성하는 방법을 보여 줍니다.

```
select INTERVAL '2:2' MINUTE TO SECOND

intervald2s
------------------------------
0 days 0 hours 2 mins 2.0 secs
```

한정자에 따라 지정하는 단위가 결정됩니다. 예를 들어 다음 예제가 이전 예제와 동일한 ‘2:2’ *quoted-string*을 사용하더라도 Amazon Redshift는 한정자 때문에 다른 시간 단위를 사용한다고 인식합니다.

```
select INTERVAL '2:2' HOUR TO MINUTE

intervald2s
------------------------------
0 days 2 hours 2 mins 0.0 secs
```

각 단위의 약어 및 복수형도 지원됩니다. 예를 들어 `5s`, `5 second`, `5 seconds`는 동일한 간격입니다. 지원되는 단위는 연, 월, 시간, 분, 초입니다.

```
select INTERVAL '5s' SECOND

intervald2s
------------------------------
0 days 0 hours 0 mins 5.0 secs
```

```
select INTERVAL '5 HOURS' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```

```
select INTERVAL '5 h' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```

# 한정자 구문이 없는 간격 리터럴의 예
<a name="r_interval_literals"></a>

**참고**  
다음 예에서는 `YEAR TO MONTH` 또는 `DAY TO SECOND` 한정자 없이 간격 리터럴을 사용하는 방법을 보여줍니다. 한정자와 함께 권장 간격 리터럴을 사용하는 방법에 대한 자세한 내용은 [간격 데이터 유형 및 리터럴](r_interval_data_types.md) 섹션을 참조하세요.

간격 리티럴은 `12 hours` 또는 `6 months` 같이 일정한 기간을 구분할 때 사용됩니다. 또한 날짜/시간 표현식이 포함된 조건이나 계산에서도 간격 리터럴을 사용할 수 있습니다.

 간격 리터럴은 INTERVAL 키워드와 숫자 기간, 그리고 지원되는 날짜 부분으로 표현됩니다. 예를 들면 `INTERVAL '7 days'` 또는 `INTERVAL '59 minutes'`와 같습니다. 더욱 정확한 간격을 표현하기 위해 여러 수량과 단위를 연결할 수도 있습니다(예: `INTERVAL '7 days, 3 hours, 59 minutes'`). 각 단위의 약어와 복수 표현도 지원됩니다. 예를 들어 `5 s`, `5 second` 및 `5 seconds` 모두 동일한 간격입니다.

날짜 부분을 지정하지 않을 경우 간격 값은 초를 의미합니다. 기간 값은 소수로 지정할 수도 있습니다(예: `0.5 days`).

다음은 모두 간격 값을 다르게 하여 계산하는 예들입니다.

다음은 지정된 날짜에 1초를 더합니다.

```
select caldate + interval '1 second' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:00:01
(1 row)
```

다음은 지정된 날짜에 1분을 더합니다.

```
select caldate + interval '1 minute' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:01:00
(1 row)
```

다음은 지정한 날짜에 3시간 35분을 더합니다.

```
select caldate + interval '3 hours, 35 minutes' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 03:35:00
(1 row)
```

다음은 지정된 날짜에 52주를 더합니다.

```
select caldate + interval '52 weeks' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-12-30 00:00:00
(1 row)
```

다음은 지정한 날짜에 1주, 1시간, 1분, 1초를 더합니다.

```
select caldate + interval '1w, 1h, 1m, 1s' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-01-07 01:01:01
(1 row)
```

다음은 지정한 날짜에 12시간(반일)을 더합니다.

```
select caldate + interval '0.5 days' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 12:00:00
(1 row)
```

다음은 2023년 2월 15일에서 4개월을 뺀 값이며 결과는 2022년 10월 15일입니다.

```
select date '2023-02-15' - interval '4 months';

?column?
---------------------
2022-10-15 00:00:00
```

다음은 2023년 3월 31일에서 4개월을 뺀 값이며 결과는 2022년 11월 30일입니다. 계산에서는 한 달의 일수를 고려합니다.

```
select date '2023-03-31' - interval '4 months';

?column?
---------------------
2022-11-30 00:00:00
```

# 부울 유형
<a name="r_Boolean_type"></a>

부울 데이터 형식은 단일 바이트 열에 true 또는 false 값을 저장하는 데 사용됩니다. 다음 표는 부울 값에서 가능한 세 가지 상태와 이러한 상태를 나타내는 리터럴 값에 대해 설명한 것입니다. 입력 문자열에 상관없이 Boolean 열은 true일 때는 "t"를, 그리고 false일 때는 "f"를 저장 및 출력합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Boolean_type.html)

IS 비교를 사용해 WHERE 절의 조건자로 부울 값만 확인할 수 있습니다. IS 비교는 SELECT 목록의 부울 값에는 사용할 수 없습니다.

## 예제
<a name="r_Boolean_type-examples"></a>

BOOLEAN 열을 사용하여 각 고객의 "Active/Inactive" 상태를 CUSTOMER 테이블에 저장할 수 있습니다.

```
create table customer(
custid int,
active_flag boolean default true);
```

```
insert into customer values(100, default);
```

```
select * from customer;
custid | active_flag
-------+--------------
   100 | t
```

CREATE TABLE 문에서 기본값(`true` 또는 `false`)을 지정하지 않은 경우에는 기본값을 삽입하더라도 NULL 값을 삽입하는 것과 똑같습니다.

다음은 USERS 테이블에서 스포츠는 좋아하지만 영화를 좋아하지 않는 사용자를 선택하는 쿼리 예입니다.

```
select firstname, lastname, likesports, liketheatre
from users
where likesports is true and liketheatre is false
order by userid limit 10;

firstname |  lastname  | likesports | liketheatre
----------+------------+------------+-------------
Lars      | Ratliff    | t          | f
Mufutau   | Watkins    | t          | f
Scarlett  | Mayer      | t          | f
Shafira   | Glenn      | t          | f
Winifred  | Cherry     | t          | f
Chase     | Lamb       | t          | f
Liberty   | Ellison    | t          | f
Aladdin   | Haney      | t          | f
Tashya    | Michael    | t          | f
Lucian    | Montgomery | t          | f
(10 rows)
```

다음은 USERS 테이블에서 록 음악을 좋아하는지 알 수 없는 사용자를 선택하는 예입니다.

```
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;

firstname | lastname | likerock
----------+----------+----------
Rafael    | Taylor   |
Vladimir  | Humphrey |
Barry     | Roy      |
Tamekah   | Juarez   |
Mufutau   | Watkins  |
Naida     | Calderon |
Anika     | Huff     |
Bruce     | Beck     |
Mallory   | Farrell  |
Scarlett  | Mayer    |
(10 rows)
```

다음 예에서는 SELECT 목록에 IS 비교를 사용했기 때문에 오류를 반환합니다.

```
select firstname, lastname, likerock is true as "check"
from users
order by userid limit 10;

[Amazon](500310) Invalid operation: Not implemented
```

다음 예는 SELECT 목록에서 IS 비교 대신에 같음 비교( = )를 사용했기 때문에 성공합니다.

```
select firstname, lastname, likerock = true as "check"
from users
order by userid limit 10;

firstname | lastname  | check
----------+-----------+------
Rafael    | Taylor    |      
Vladimir  | Humphrey  |      
Lars      | Ratliff   | true 
Barry     | Roy       |      
Reagan    | Hodge     | true 
Victor    | Hernandez | true 
Tamekah   | Juarez    |      
Colton    | Roy       | false
Mufutau   | Watkins   |      
Naida     | Calderon  |
```

# HLLSKETCH 형식
<a name="r_HLLSKTECH_type"></a>

HyperLogLog 스케치에 HLLSKETCH 데이터 형식을 사용합니다. Amazon Redshift는 희소 또는 밀집 HyperLogLog 스케치 표현을 지원합니다. 스케치는 희소로 시작하여 밀집 형식이 사용되는 메모리 공간을 최소화하는 데 더 효율적일 때 밀집으로 전환됩니다.

 Amazon Redshift는 다음 JSON 형식으로 스케치를 가져오거나 내보내거나 인쇄할 때 희소 HyperLogLog 스케치를 자동으로 전환합니다.

```
{"logm":15,"sparse":{"indices":[4878,9559,14523],"values":[1,2,1]}}
```

Amazon Redshift는 Base64 형식의 문자열 표현을 사용하여 밀집 HyperLogLog 스케치를 표현합니다.

Amazon Redshift는 Base64 형식의 다음 문자열 표현을 사용하여 밀집 HyperLogLog 스케치를 표현합니다.

```
"ABAABA..."
```

HLLSKETCH 객체의 최대 크기는 원시 압축에 사용 시 24,580바이트입니다.

# SUPER 형식
<a name="r_SUPER_type"></a>

SUPER 데이터 형식을 사용하여 반정형 데이터나 문서를 값으로 저장합니다. Amazon Redshift는 VARCHAR를 사용하여 이러한 값을 저장할 수 있지만 SUPER 데이터 형식을 대신 사용하는 것이 좋습니다.

반정형 데이터는 SQL 데이터베이스에 사용되는 관계형 데이터 모델의 엄격한 테이블형 구조를 따르지 않습니다. 여기에는 데이터 내의 고유한 엔티티를 참조하는 태그가 포함됩니다. 여기에는 배열, 중첩 구조 및 JSON과 같은 직렬화 형식과 연결된 기타 복잡한 구조와 같은 복소수 값이 포함될 수 있습니다. SUPER 데이터 형식은 Amazon Redshift의 다른 모든 스칼라 형식을 포함하는 스키마 없는 배열 및 구조 값 집합입니다.

SUPER 데이터 형식은 개별 SUPER 객체에 대해 최대 16MB의 데이터를 지원합니다. 테이블에 이를 구현하는 예를 포함하여 SUPER 데이터 유형에 대한 자세한 내용은 [Amazon Redshift의 반정형 데이터](super-overview.md)을 참조하세요.

Amazon Redshift는 COPY 명령을 사용하여 다음과 같은 반정형 데이터 형식을 수집할 수 있도록 기본적으로 지원합니다.
+  JSON 
+  ARRAY 
+  TEXT 
+  CSV 

1MB보다 큰 SUPER 객체는 다음 파일 형식에서만 수집할 수 있습니다.
+  Parquet 
+  JSON 
+  TEXT 
+  CSV 

SUPEWER 데이터 형식은 다음과 같은 속성을 가집니다.
+ Amazon Redshift 스칼라 값:
  + null
  + 부울
  + smallint, integer, bigint, decimal 또는 부동 소수점(예: float4 또는 float8)과 같은 숫자
  + varchar 또는 char와 같은 문자열 값
+ 복소수 값:
  + 스칼라 또는 복소수를 포함한 값의 배열
  + 속성 이름 및 값(스칼라 또는 복소수)의 맵인 구조체(튜플 또는 객체라고도 함)

두 가지 형식의 복소수 값은 규칙성에 대한 제한 없이 자체 스칼라 또는 복소수 값을 포함합니다.

SUPER 데이터 형식의 기본 압축 인코딩은 ZSTD입니다. 압축 인코딩에 대한 자세한 내용은 [압축 인코딩](c_Compression_encodings.md) 섹션을 참조하세요.

SUPER 데이터 형식은 스키마 없는 형태로 반정형 데이터의 지속성을 지원합니다. 계층적 데이터 모델은 변경될 수 있지만 이전 버전의 데이터는 동일한 SUPER 열에 공존할 수 있습니다.

Amazon Redshift는 PartiQL을 사용하여 배열 및 구조체에 대한 탐색을 활성화합니다. Amazon Redshift는 SUPER 배열을 반복하는 데도 PartiQL 구문을 사용합니다. 자세한 내용은 [PartiQL - Amazon Redshift용 SQL 호환 쿼리 언어](super-partiql.md) 섹션을 참조하세요.

Amazon Redshift는 동적 형식 지정을 사용하여 쿼리에 사용하기 전에 데이터 유형을 선언할 필요 없이 스키마 없는 SUPER 데이터를 처리합니다. 자세한 내용은 [동적 형식 지정](query-super.md#dynamic-typing-lax-processing) 섹션을 참조하세요.

SUPER 형식 열의 경로에 있는 스칼라 값에 동적 데이터 마스킹 정책을 적용할 수 있습니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md) 섹션을 참조하세요. SUPER 데이터 유형에 동적 데이터 마스킹을 사용하는 방법에 대한 자세한 내용은 [SUPER 데이터 유형 경로와 함께 동적 데이터 마스킹 사용](t_ddm-super.md) 섹션을 참조하세요.

SUPER 데이터로 작업할 때는 `r_enable_case_sensitive_super_attribute` 구성 옵션을 true로 설정하는 것이 좋습니다. 자세한 내용은 [enable\$1case\$1sensitive\$1super\$1attribute](r_enable_case_sensitive_super_attribute.md) 섹션을 참조하세요.

# VARBYTE 형식
<a name="r_VARBYTE_type"></a>

VARBYTE, VARBINARY 또는 BINARY VARYING 열을 사용하여 고정 제한이 있는 가변 길이 이진 값을 저장합니다.

```
varbyte [ (n) ]
```

최대 바이트 수(*n*)의 범위는 1\$116,777,216입니다. 기본값은 64,000입니다.

VARBYTE 데이터 유형을 사용할 수 있는 몇 가지 예는 다음과 같습니다.
+ VARBYTE 열의 테이블 조인.
+ VARBYTE 열을 포함하는 구체화된 보기 생성. VARBYTE 열을 포함하는 구체화된 보기의 증분 새로 고침이 지원됩니다. 그러나 VARBYTE 열의 COUNT, MIN, MAX 및 GROUP BY 이외의 집계 함수는 증분 새로 고침을 지원하지 않습니다.

모든 바이트가 인쇄 가능한 문자인지 확인하기 위해 Amazon Redshift는 16진수 형식을 사용하여 VARBYTE 값을 인쇄합니다. 예를 들어 다음 SQL은 16진수 문자열 `6162`를 이진 값으로 변환합니다. 반환된 값이 이진 값이더라도 결과는 16진수 `6162`로 출력됩니다.

```
select from_hex('6162');
                      
 from_hex
----------
 6162
```

Amazon Redshift는 VARBYTE와 다음 데이터 유형 간의 캐스팅을 지원합니다.
+ CHAR
+ VARCHAR
+ SMALLINT
+ INTEGER
+ BIGINT

CHAR 및 VARCHAR로 캐스팅할 때 UTF-8 형식이 사용됩니다. UTF-8 형식에 대한 자세한 내용은 [TO\$1VARBYTE](r_TO_VARBYTE.md) 섹션을 참조하세요. SMALLINT, INTEGER 및 BIGINT에서 캐스팅할 때 원래 데이터 유형의 바이트 수가 유지됩니다. SMALLINT의 경우 2바이트, INTEGER의 경우 4바이트, BIGINT의 경우 8바이트입니다.

다음 SQL 문은 VARCHAR 문자열을 VARBYTE로 캐스팅합니다. 반환된 값이 이진 값이더라도 결과는 16진수 `616263`로 출력됩니다.

```
select 'abc'::varbyte;
                      
 varbyte
---------
 616263
```

다음 SQL 문은 열의 CHAR 값을 VARBYTE로 캐스팅합니다. 이 예에서는 CHAR(10) 열(c)이 있는 테이블을 생성하고 길이가 10보다 짧은 문자 값을 삽입합니다. 결과 캐스트는 결과를 정의된 열 크기로 공백 문자(hex'20')로 채웁니다. 반환된 값이 이진 값이더라도 결과는 16진수로 출력됩니다.

```
create table t (c char(10));
insert into t values ('aa'), ('abc');                 
select c::varbyte from t;
          c
----------------------
 61612020202020202020
 61626320202020202020
```

다음 SQL 문은 SMALLINT 문자열을 VARBYTE로 캐스팅합니다. 반환된 값이 이진 값이더라도 결과는 2바이트 또는 4개의 16진수 문자인 16진수 `0005`로 인쇄됩니다.

```
select 5::smallint::varbyte;
                  
 varbyte
---------
 0005
```

다음 SQL 문은 INTEGER를 VARBYTE로 캐스팅합니다. 반환된 값이 이진 값이더라도 결과는 4바이트 또는 8개의 16진수 문자인 16진수 `00000005`로 인쇄됩니다.

```
select 5::int::varbyte;
                  
 varbyte
----------
 00000005
```

다음 SQL 문은 BIGINT를 VARBYTE로 캐스팅합니다. 반환된 값이 이진 값이더라도 결과는 8바이트 또는 16개의 16진수 문자인 16진수 `0000000000000005`로 인쇄됩니다.

```
select 5::bigint::varbyte;
                  
     varbyte
------------------
 0000000000000005
```

VARBYTE 데이터 유형을 지원하는 Amazon Redshift 특성은 다음과 같습니다.
+ [VARBYTE 연산자](r_VARBYTE_OPERATORS.md)
+ [CONCAT](r_CONCAT.md)
+ [LEN](r_LEN.md)
+ [LENGTH 함수](r_LENGTH.md)
+ [OCTET\$1LENGTH](r_OCTET_LENGTH.md)
+ [SUBSTRING 함수](r_SUBSTRING.md)
+ [FROM\$1HEX](r_FROM_HEX.md)
+ [TO\$1HEX](r_TO_HEX.md)
+ [FROM\$1VARBYTE](r_FROM_VARBYTE.md)
+ [TO\$1VARBYTE](r_TO_VARBYTE.md)
+ [GETBIT](r_GETBIT.md)
+ [VARBYTE 데이터 유형의 열 로드](copy-usage-varbyte.md)
+ [VARBYTE 데이터 유형의 열 언로드](r_UNLOAD.md#unload-usage-notes)

## Amazon Redshift와 함께 VARBYTE 데이터 유형을 사용할 때의 제한 사항
<a name="varbyte-limitations"></a>

다음은 Amazon Redshift와 함께 VARBYTE 데이터 유형을 사용할 때의 제한 사항입니다.
+ Amazon Redshift Spectrum은 Parquet 및 ORC 파일에 대해서만 VARBYTE 데이터 형식을 지원합니다.
+ Amazon Redshift 쿼리 편집기와 Amazon Redshift 쿼리 편집기 v2는 아직 VARBYTE 데이터 유형을 완전히 지원하지 않습니다. 따라서 VARBYTE 표현식으로 작업할 때는 다른 SQL 클라이언트를 사용합니다.

  쿼리 편집기를 사용하기 위한 해결 방법으로 데이터 길이가 16,000,000바이트 이하이고 콘텐츠가 유효한 UTF-8인 경우 VARBYTE 값을 VARCHAR로 캐스팅할 수 있습니다. 예를 들면 다음과 같습니다.

  ```
  select to_varbyte('6162', 'hex')::varchar;
  ```
+ Python 또는 Lambda 사용자 정의 함수(UDF)에는 VARBYTE 데이터 유형을 사용할 수 없습니다.
+ VARBYTE 열에서 HLLSKETCH 열을 생성하거나 VARBYTE 열에서 APPROXIMATE COUNT DISTINCT를 사용할 수 없습니다.
+ 1MB보다 큰 VARBYTE 값은 다음 파일 형식에서만 수집할 수 있습니다.
  + Parquet
  + 텍스트
  + CSV(쉼표로 분리된 값)

## 형식 호환성 및 변환
<a name="r_Type_conversion"></a>

이번 섹션에서는 Amazon Redshift의 형식 변환 규칙과 데이터 형식 호환성의 적용 방식에 대한 설명을 살펴볼 수 있습니다.

### 호환성
<a name="r_Type_conversion-compatibility"></a>

 데이터 형식 일치, 즉 리터럴 값 및 상수를 데이터 형식과 일치시키는 것은 아래 작업을 포함해 다양한 데이터베이스 작업에서 발생합니다.
+ 테이블에 대한 데이터 조작 언어(DML) 작업 
+ UNION, INTERSECT 및 EXCEPT 쿼리 
+ CASE 표현식 
+ LIKE, IN 등 조건자 평가 
+ 데이터를 비교하거나 추출하는 SQL 함수에 대한 평가 
+ 수학 연산자를 사용한 비교 

위의 작업 결과는 형식 변환 규칙과 데이터 형식 호환성에 따라 달라집니다. *호환성*에는 특정 값과 특정 데이터 형식의 1대 1 일치가 항상 필요한 것은 아니라는 의미가 내포되어 있습니다. 일부 데이터 형식은 *호환이 가능하기* 때문에 묵시적 변환, 즉 *강제 변환*이 가능합니다(자세한 내용은 [묵시적인 변환 형식](#implicit-conversion-types) 섹션 참조). 데이터 형식이 호환되지 않을 때는 명시적인 변환 함수를 사용하여 다른 데이터 형식으로 값을 변환할 수 있는 경우도 있습니다.

### 일번적인 호환성 및 변환 규칙
<a name="r_Type_conversion-general-compatibility-and-conversion-rules"></a>

호환성 및 변환 규칙은 다음과 같습니다.
+ 일반적으로 동일한 형식 카테고리에 해당하는 데이터 형식(여러 가지 숫자 데이터 형식 등)은 서로 호환이 가능하기 때문에 묵시적으로 변환할 수 있습니다.

  예를 들어 묵시적인 변환을 통해 소수 값을 정수 열에 삽입할 수 있습니다. 이때 소수는 정수로 반올림됩니다. 또는 날짜에서 `2008` 같은 숫자 값을 추출하여 정수 열에 삽입하는 것도 가능합니다.
+ 숫자 데이터 형식은 범위 외 값을 삽입하려고 할 때 오버플로우 조건이 발생할 가능성이 높습니다. 예를 들어 정밀도가 5인 소수 값은 정밀도가 4로 정의된 DECIMAL 열에 맞지 않습니다. 소수에서 정수부는 절대로 잘리지 않지만 소수부는 상황에 따라 반올림 또는 내림 처리할 수 있습니다. 하지만 테이블에서 선택한 값의 명시적인 변환 결과는 반올림되지 않습니다.
+ 다른 형식의 문자열도 호환이 가능합니다. 예를 들어 단일 바이트 데이터가 포함된 VARCHAR 열과 CHAR 열 문자열은 서로 호환이 되어 묵시적으로 변환할 수 있습니다. 멀티바이트 데이터가 포함되는 VARCHAR 문자열은 호환되지 않습니다. 그 밖에 문자열이 적합한 리터럴 값인 경우에는 문자열을 날짜, 시간, 타임스탬프 또는 숫자 값으로 변환할 수도 있습니다. 이때 선행 또는 후행 공백은 무시됩니다. 반대로 날짜, 시간, 타임스탬프 및 숫자 값을 고정 길이 또는 가변 길이 문자열로 변환하는 것도 가능합니다.
**참고**  
문자열을 숫자 형식으로 변환하려면 문자열에 숫자를 표현한 문자가 있어야 합니다. 예를 들어 `'1.0'`이나 `'5.9'` 같은 문자열은 소수 값으로 변환할 수 있지만 문자열 `'ABC'`는 어떤 숫자 형식으로도 변환할 수 없습니다.
+ DECIMAL 값을 문자열과 비교하면 Amazon Redshift는 문자열을 DECIMAL 값으로 변환하려고 시도합니다. 모든 다른 숫자 값을 문자열과 비교하는 경우 숫자 값이 문자열로 변환됩니다. 반대 변환(예: 문자열을 정수로 변환하거나 DECIMAL 값을 문자열로 변환)을 적용하려면 [CAST](r_CAST_function.md)와 같은 명시적 함수를 사용하세요.
+ 64비트 DECIMAL 또는 NUMERIC 값의 정밀도를 높여서 변환하려면 CAST 또는 CONVERT 같은 명시적인 변환 함수를 사용해야 합니다.
+ DATE 또는 TIMESTAMP를 TIMESTAMPTZ로 변환하거나 TIME을 TIMETZ로 변환할 때 시간대는 현재 세션 시간대로 설정됩니다. 세션 시간대는 기본적으로 UTC입니다. 세션 시간대 설정에 대한 자세한 내용은 [timezone](r_timezone_config.md) 섹션을 참조하세요.
+ 마찬가지로 TIMESTAMPTZ 역시 현재 세션 시간대에 따라 DATE, TIME 또는 TIMESTAMP로 변환됩니다. 세션 시간대는 기본적으로 UTC입니다. 변환 후에는 시간대 정보가 삭제됩니다.
+ 시간대를 지정하여 타임스탬프를 표현한 문자열은 현재 세션 시간대(기본적으로 UTC)에 따라 TIMESTAMPTZ로 변환됩니다. 마찬가지로 시간대가 지정된 시간을 표현하는 문자열은 현재 세션 시간대(기본값 UTC)를 사용하여 TIMETZ로 변환됩니다.

### 묵시적인 변환 형식
<a name="implicit-conversion-types"></a>

묵시적인 변환 유형은 다음과 같이 두 가지입니다.
+ 인수의 묵시적 변환(INSERT 또는 UPDATE 명령의 값 설정 등)
+ 표현식의 묵시적 변환(WHERE 절의 비교 등)

다음 표는 인수 또는 표현식에서 묵시적으로 변환할 수 있는 데이터 형식을 나열한 것입니다. 그 밖에 명시적인 변환 함수를 통한 변환도 가능합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_Supported_data_types.html)

**참고**  
TIMESTAMPTZ, TIMESTAMP, DATE, TIME, TIMETZ 또는 문자열 사이의 묵시적인 변환은 현재 세션 시간대를 사용합니다. 현재 시간대 설정에 대한 자세한 내용은 [timezone](r_timezone_config.md) 섹션을 참조하세요.  
GEOMETRY 및 GEOGRAPHY 데이터 유형은 서로를 제외하고 다른 데이터 유형으로 암시적으로 변환될 수 없습니다. 자세한 내용은 [CAST 함수](r_CAST_function.md) 섹션을 참조하세요.  
VARBYTE 데이터 유형은 암시적으로 다른 데이터 유형으로 변환될 수 없습니다. 자세한 내용은 [CAST 함수](r_CAST_function.md) 섹션을 참조하세요.

### SUPER 데이터 형식에 동적 형식 지정 사용
<a name="r_dynamic_typing_SUPER"></a>

Amazon Redshift는 동적 형식 지정을 사용하여 쿼리에 사용하기 전에 데이터 형식을 선언할 필요 없이 스키마 없는 SUPER 데이터를 처리합니다. 동적 형식 지정은 Amazon Redshift 형식으로 명시적으로 캐스팅하지 않고도 SUPER 데이터 열로 이동한 결과를 사용합니다. SUPER 데이터 형식에 동적 입력 사용에 대한 자세한 내용은 [동적 형식 지정](query-super.md#dynamic-typing-lax-processing) 섹션을 참조하세요.

몇 가지 예외를 제외하고는 SUPER 값을 다른 데이터 형식과 캐스팅할 수 있습니다. 자세한 내용은 [제한 사항](limitations-super.md) 섹션을 참조하세요.

# 콜레이션 시퀀스
<a name="c_collation_sequences"></a>

Amazon Redshift는 로케일 또는 사용자 정의 데이터 정렬 순서를 지원하지 않습니다. 일반적으로 어떤 상황에서든지 데이터 값을 정렬하여 비교하는 로케일 규칙이 없으면 조건자의 결과에 영향을 미칠 수 있습니다. 예를 들어 MIN, MAX, RANK 같은 ORDER BY 표현식과 함수는 데이터의 이진 UTF8 순서에 따라 로케일 문자를 고려하지 않고 결과를 반환합니다.

# Expressions
<a name="r_expressions"></a>

**Topics**
+ [단순 표현식](#r_expressions-simple-expressions)
+ [복합 표현식](r_compound_expressions.md)
+ [표현식 목록](r_expression_lists.md)
+ [스칼라 하위 쿼리](r_scalar_subqueries.md)
+ [함수 표현식](r_function_expressions.md)

표현식이란 하나 이상의 값, 연산자 또는 값으로 평가되는 함수의 조합을 말합니다. 표현식의 데이터 형식은 일반적으로 구성하는 각 요소의 데이터 형식과 일치합니다.

## 단순 표현식
<a name="r_expressions-simple-expressions"></a>

단순 표현식은 다음과 같습니다.
+ 상수 또는 리터럴 값 
+ 열 이름 또는 열 참조 
+ 스칼라 함수 
+ 집계(집합) 함수 
+ 창 함수 
+ 스칼라 하위 쿼리 

단순 표현식의 예는 다음과 같습니다.

```
5+12
dateid
sales.qtysold * 100
sqrt (4)
max (qtysold)
(select max (qtysold) from sales)
```

# 복합 표현식
<a name="r_compound_expressions"></a>

복합 표현식이란 연속된 단순 표현식이 산술 연산자로 결합되어 있는 것을 말합니다. 복합 표현식에 사용되는 단순 표현식은 숫자 값을 반환해야 합니다.

## 구문
<a name="r_compound_expressions-synopsis"></a>

```
expression 
operator 
expression | (compound_expression)
```

## 인수
<a name="r_compound_expressions-arguments"></a>

 * expression*   
값으로 평가되는 단순 표현식입니다.

 * 연산자*   
 복합 산술 표현식은 다음 연산자의 순서에 따라 작성할 수 있습니다.  
+ ( ) : 평가 순서를 제어하기 위한 괄호
+ \$1 , - : 양 및 음의 부호/연산자
+  ^ , \$1/ , \$1\$1/ : 지수, 제곱근, 세제곱근
+ \$1 , / , % : 곱하기, 나누기 및 모듈로 연산자
+  @ : 절대값
+ \$1 , - : 더하기, 빼기
+ & , \$1, \$1, \$1, <<, >> : AND, OR, NOT, 왼쪽 이동, 오른쪽 이동 비트 연산자
+ \$1\$1: 연결

 *(compound\$1expression)*   
복합 표현식은 괄호를 사용해 중첩될 수 있습니다.

## 예제
<a name="r_compound_expressions-examples"></a>

복합 표현식의 예는 다음과 같습니다.

```
('SMITH' || 'JONES')
sum(x) / y
sqrt(256) * avg(column)
rank() over (order by qtysold) / 100
(select (pricepaid - commission) from sales where dateid = 1882) * (qtysold)
```

일부 함수는 다른 함수 내에서 중첩될 수도 있습니다. 예를 들어 스칼라 함수는 다른 스칼라 함수 내에서 중첩이 가능합니다. 다음은 숫자 집합의 절대값 총합을 반환하는 예입니다.

```
sum(abs(qtysold))
```

창 함수는 집계 함수 또는 기타 창 함수의 인수로 사용할 수 없습니다. 다음과 같은 표현식은 오류를 반환합니다.

```
avg(rank() over (order by qtysold))
```

창 함수에 중첩된 집계 함수가 포함될 수 있습니다. 다음은 값 집합의 총합을 구한 후 순위를 정하는 표현식입니다.

```
rank() over (order by sum(qtysold))
```

# 표현식 목록
<a name="r_expression_lists"></a>

표현식 목록이란 표현식의 조합을 말하며, 멤버십 및 비교 조건(WHERE 절)과 GROUP BY 절에서 지정할 수 있습니다.

## 구문
<a name="r_expression_lists-synopsis"></a>

```
expression , expression , ... | (expression, expression, ...)
```

## 인수
<a name="r_expression_lists-arguments"></a>

 * expression*   
값으로 평가되는 단순 표현식입니다. 표현식 목록에는 쉼표로 구분된 표현식 또는 쉼표로 구분된 표현식 집합이 1개 이상 포함됩니다. 표현식 집합이 다수일 때는 각 집합마다 표현식의 수가 동일하고, 괄호를 사용하여 집합을 구분해야 합니다. 각 집합의 표현식 수는 조건에서 연산자 앞에 있는 표현식 수와 일치해야 합니다.

## 예제
<a name="r_expression_lists-examples"></a>

다음은 조건에서 지정하는 표현식 목록의 예입니다.

```
(1, 5, 10)
('THESE', 'ARE', 'STRINGS')
(('one', 'two', 'three'), ('blue', 'yellow', 'green'))
```

각 집합의 표현식 수는 문의 첫 번째 부분에 있는 수와 일치해야 합니다.

```
select * from venue
where (venuecity, venuestate) in (('Miami', 'FL'), ('Tampa', 'FL'))
order by venueid;

venueid |        venuename        | venuecity | venuestate | venueseats
---------+-------------------------+-----------+------------+------------
28 | American Airlines Arena | Miami     | FL         |          0
54 | St. Pete Times Forum    | Tampa     | FL         |          0
91 | Raymond James Stadium   | Tampa     | FL         |      65647
(3 rows)
```

# 스칼라 하위 쿼리
<a name="r_scalar_subqueries"></a>

스칼라 하위 쿼리는 정확히 1개의 값, 즉 열 1개가 포함된 행 1개를 반환하는 정규 SELECT 쿼리이며, 괄호로 묶입니다. 쿼리를 실행하여 반환되는 값은 바깥쪽 쿼리에 사용됩니다. 하위 쿼리가 행을 0개 반환하는 경우 하위 쿼리 표현식의 값은 NULL입니다. 행을 2개 이상 반환하면 Amazon Redshift가 오류를 반환합니다. 하위 쿼리는 상위 쿼리의 변수를 참조할 수 있으며, 하위 쿼리를 한 번 호출할 때마다 상수 역할을 합니다.

스칼라 하위 쿼리는 표현식이 필요한 대부분 문에서 사용됩니다. 하지만 다음과 같은 경우에는 유효한 표현식이 아닙니다.
+ 표현식의 기본값으로 사용되는 경우
+ GROUP BY 및 HAVING 절에서 사용되는 경우

## 예제
<a name="r_scalar_subqueries-example"></a>

다음은 2008년 한 해 판매 한 건당 지불된 평균 가격을 계산하는 하위 쿼리입니다. 그러면 바깥쪽 쿼리가 출력 값을 사용하여 분기별로 판매 한 건당 평균 가격과 비교합니다.

```
select qtr, avg(pricepaid) as avg_saleprice_per_qtr,
(select avg(pricepaid)
from sales join date on sales.dateid=date.dateid
where year = 2008) as avg_saleprice_yearly
from sales join date on sales.dateid=date.dateid
where year = 2008
group by qtr
order by qtr;
qtr  | avg_saleprice_per_qtr | avg_saleprice_yearly
-------+-----------------------+----------------------
1     |                647.64 |               642.28
2     |                646.86 |               642.28
3     |                636.79 |               642.28
4     |                638.26 |               642.28
(4 rows)
```

# 함수 표현식
<a name="r_function_expressions"></a>

## 구문
<a name="r_function_expressions-syntax"></a>

내장 함수는 모두 표현식으로 사용할 수 있습니다. 함수 호출 구문이 함수의 이름이며, 그 뒤에 인수 목록이 괄호로 묶여서 입력됩니다.

```
function ( [expression [, expression...]] )
```

## 인수
<a name="r_function_expressions-arguments"></a>

 * 함수*   
내장 함수입니다. 예시 함수에 대한 자세한 내용은 [SQL 함수 참조](c_SQL_functions.md)  섹션을 참조하세요.

 * expression*   
함수에서 예상되는 데이터 형식 및 파라미터 수와 일치하는 표현식입니다.

## 예제
<a name="r_function_expressions-examples"></a>

```
abs (variable)
select avg (qtysold + 3) from sales;
select dateadd (day,30,caldate) as plus30days from date;
```

# 조건
<a name="r_conditions"></a>

**Topics**
+ [구문](#r_conditions-synopsis)
+ [비교 조건](r_comparison_condition.md)
+ [논리 조건](r_logical_condition.md)
+ [패턴 일치 조건](pattern-matching-conditions.md)
+ [BETWEEN 범위 조건](r_range_condition.md)
+ [NULL 조건](r_null_condition.md)
+ [EXISTS 조건](r_exists_condition.md)
+ [IN 조건](r_in_condition.md)

 조건이란 1개 이상의 표현식과 true, false 또는 unknown으로 평가되는 논리 연산자로 구성된 하나의 문을 말합니다. 조건은 종종 조건자로 불리기도 합니다.

**참고**  
모든 문자열 비교와 LIKE 패턴 일치는 대/소문자를 구분합니다. 예를 들어 'A'와 'a'는 일치하지 않습니다. 하지만 ILIKE 조건자를 사용하면 패턴 일치에서 대/소문자를 구분하지 않을 수도 있습니다.

## 구문
<a name="r_conditions-synopsis"></a>

```
comparison_condition
| logical_condition
| range_condition
| pattern_matching_condition
| null_condition
| EXISTS_condition
| IN_condition
```

# 비교 조건
<a name="r_comparison_condition"></a>

비교 조건이란 두 값의 논리적 관계를 말합니다. 모든 비교 조건은 반환 형식이 부울인 이진 연산자입니다. Amazon Redshift는 다음 표에 설명된 비교 연산자를 지원합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_comparison_condition.html)

## 사용 노트
<a name="r_comparison_condition_usage_notes"></a>

= ANY \$1 SOME   
ANY 및 SOME 키워드는 *IN* 조건과 동의어입니다. 즉, 반환 값이 1개 이상인 하위 쿼리에서 반환되는 값 중에서 1개라도 비교 결과가 true라면 true를 반환합니다. Amazon Redshift는 ANY와 SOME일 때 =(같음) 조건만 지원합니다. 부등식 조건은 지원하지 않습니다.  
ALL 조건자는 지원되지 않습니다.

<> ALL  
ALL 키워드는 NOT IN([IN 조건](r_in_condition.md) 조건 참조)과 동의어이기 때문에 하위 쿼리 결과에 표현식이 포함되어 있지 않을 때 true를 반환합니다. Amazon Redshift는 ALL일 때 <> 또는 \$1=(같지 않음) 조건만 지원합니다. 기타 비교 조건은 지원하지 않습니다.

IS TRUE/FALSE/UNKNOWN  
0이 아닌 값은 TRUE와, 0은 FALSE와, 그리고 NULL은 UNKNOWN과 같습니다. [부울 유형HLLSKETCH 형식](r_Boolean_type.md) 데이터 형식을 참조하세요.

## 예제
<a name="r_comparison_condition-examples"></a>

다음은 몇 가지 간단한 비교 조건 예입니다.

```
a = 5
a < b
min(x) >= 5
qtysold = any (select qtysold from sales where dateid = 1882
```

다음은 VENUE 테이블에서 좌석 수가 10000석 이상인 장소를 반환하는 쿼리입니다.

```
select venueid, venuename, venueseats from venue
where venueseats > 10000
order by venueseats desc;

venueid |           venuename            | venueseats
---------+--------------------------------+------------
83 | FedExField                     |      91704
 6 | New York Giants Stadium        |      80242
79 | Arrowhead Stadium              |      79451
78 | INVESCO Field                  |      76125
69 | Dolphin Stadium                |      74916
67 | Ralph Wilson Stadium           |      73967
76 | Jacksonville Municipal Stadium |      73800
89 | Bank of America Stadium        |      73298
72 | Cleveland Browns Stadium       |      73200
86 | Lambeau Field                  |      72922
...
(57 rows)
```

다음은 USERS 테이블에서 록 음악을 좋아하는 사용자(USERID)를 선택하는 예입니다.

```
select userid from users where likerock = 't' order by 1 limit 5;

userid
--------
3
5
6
13
16
(5 rows)
```

다음은 USER 테이블에서 록 음악을 좋아하는지 알 수 없는 사용자(USERID)를 선택하는 예입니다.

```
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;

firstname | lastname | likerock
----------+----------+----------
Rafael    | Taylor   |
Vladimir  | Humphrey |
Barry     | Roy      |
Tamekah   | Juarez   |
Mufutau   | Watkins  |
Naida     | Calderon |
Anika     | Huff     |
Bruce     | Beck     |
Mallory   | Farrell  |
Scarlett  | Mayer    |
(10 rows
```

## TIME 열이 있는 예
<a name="r_comparison_condition-examples-time"></a>

다음 예제 테이블 TIME\$1TEST에는 3개의 값이 삽입된 TIME\$1VAL(TIME 형식) 열이 있습니다.

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

다음 예에서는 각 timetz\$1val에서 시간을 추출합니다.

```
select time_val from time_test where time_val < '3:00';
   time_val
---------------
 00:00:00.5550
 00:58:00
```

다음 예에서는 2개의 시간 리터럴을 비교합니다.

```
select time '18:25:33.123456' = time '18:25:33.123456';
 ?column?
----------
 t
```

## TIMETZ 열이 있는 예
<a name="r_comparison_condition-examples-timetz"></a>

다음 예제 테이블 TIMETZ\$1TEST에는 3개의 값이 삽입된 TIMETZ\$1VAL(TIMETZ 형식) 열이 있습니다.

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

다음 예에서는 `3:00:00 UTC`보다 작은 TIMETZ 값만 선택합니다. 값을 UTC로 변환한 후 비교합니다.

```
select timetz_val from timetz_test where timetz_val < '3:00:00 UTC';
                  
   timetz_val
---------------
 00:00:00.5550+00
```

다음 예에서는 2개의 TIMETZ 리터럴을 비교합니다. 비교를 위해 시간대는 무시됩니다.

```
select time '18:25:33.123456 PST' < time '19:25:33.123456 EST';
                  
 ?column?
----------
 t
```

# 논리 조건
<a name="r_logical_condition"></a>

논리 조건은 두 조건 결과를 결합하여 단일 결과를 산출합니다. 모든 논리 조건은 반환 형식이 부울인 이진 연산자입니다.

## 구문
<a name="r_logical_condition-synopsis"></a>

```
expression
{ AND | OR }
expression
NOT expression
```

논리 조건은 값이 3개인 부울 논리를 사용하며, 여기에서 NULL 값은 알 수 없는 관계를 의미합니다. 다음 표는 논리 조건 결과를 설명한 것으로서 `E1`과 `E2`는 표현식을 의미합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_logical_condition.html)

NOT 연산자는 AND 이전에, 그리고 AND 연산자는 OR 이전에 평가됩니다. 하지만 괄호를 사용하면 이러한 기본 평가 순서를 재정의할 수 있습니다.

### 예제
<a name="r_logical_condition-examples"></a>

다음은 USERS 테이블에서 Las Vegas와 스포츠를 모두 좋아하는 사용자의 USERID 및 USERNAME을 반환하는 예입니다.

```
select userid, username from users
where likevegas = 1 and likesports = 1
order by userid;

userid | username
--------+----------
1 | JSG99FHE
67 | TWU10MZT
87 | DUF19VXU
92 | HYP36WEQ
109 | FPL38HZK
120 | DMJ24GUZ
123 | QZR22XGQ
130 | ZQC82ALK
133 | LBN45WCH
144 | UCX04JKN
165 | TEY68OEB
169 | AYQ83HGO
184 | TVX65AZX
...
(2128 rows)
```

다음은 USERS 테이블에서 Las Vegas 또는 스포츠를, 혹은 둘 다 좋아하는 사용자의 USERID 및 USERNAME을 반환하는 예입니다. 이 쿼리는 이전 예의 모든 출력에 더하여 Las Vegas 또는 스포츠만 좋아하는 사용자까지 반환합니다.

```
select userid, username from users
where likevegas = 1 or likesports = 1
order by userid;

userid | username
--------+----------
1 | JSG99FHE
2 | PGL08LJI
3 | IFT66TXU
5 | AEB55QTM
6 | NDQ15VBM
9 | MSD36KVR
10 | WKW41AIW
13 | QTF33MCG
15 | OWU78MTR
16 | ZMG93CDD
22 | RHT62AGI
27 | KOY02CVE
29 | HUH27PKK
...
(18968 rows)
```

다음은 `OR` 조건에 괄호를 사용하여 New York 또는 California에서 Macbeth를 공연한 장소를 찾는 예입니다.

```
select distinct venuename, venuecity
from venue join event on venue.venueid=event.venueid
where (venuestate = 'NY' or venuestate = 'CA') and eventname='Macbeth'
order by 2,1;

venuename                |   venuecity
----------------------------------------+---------------
Geffen Playhouse                       | Los Angeles
Greek Theatre                          | Los Angeles
Royce Hall                             | Los Angeles
American Airlines Theatre              | New York City
August Wilson Theatre                  | New York City
Belasco Theatre                        | New York City
Bernard B. Jacobs Theatre              | New York City
...
```

위 예에서 괄호를 제거하면 쿼리의 논리 및 결과가 바뀝니다.

다음 예에서는 `NOT` 스크립트를 사용합니다: 

```
select * from category
where not catid=1
order by 1;

catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
2 | Sports   | NHL       | National Hockey League
3 | Sports   | NFL       | National Football League
4 | Sports   | NBA       | National Basketball Association
5 | Sports   | MLS       | Major League Soccer
...
```

다음은 `NOT` 조건에 이어 `AND` 조건을 사용하는 예입니다.

```
select * from category
where (not catid=1) and catgroup='Sports'
order by catid;

catid | catgroup | catname |             catdesc
-------+----------+---------+---------------------------------
2 | Sports   | NHL     | National Hockey League
3 | Sports   | NFL     | National Football League
4 | Sports   | NBA     | National Basketball Association
5 | Sports   | MLS     | Major League Soccer
(4 rows)
```

# 패턴 일치 조건
<a name="pattern-matching-conditions"></a>

**Topics**
+ [LIKE](r_patternmatching_condition_like.md)
+ [SIMILAR TO](pattern-matching-conditions-similar-to.md)
+ [POSIX 연산자](pattern-matching-conditions-posix.md)

패턴 일치 연산자는 조건 표현식에서 지정한 패턴을 문자열에서 검색하여 일치하는 패턴 유무에 따라 true 또는 false를 반환합니다. Amazon Redshift는 패턴 일치에 세 가지 방법을 사용합니다.
+ LIKE 표현식

  LIKE 연산자는 열 이름 같은 문자열 표현식과 `%`(퍼센트) 및 `_`(밑줄) 와일드카드 문자의 사용 패턴을 서로 비교합니다. LIKE 패턴 일치는 항상 전체 문자열을 검색합니다. LIKE는 대/소문자를 구분하여 패턴을 일치시키는 반면 ILIKE는 대/소문자를 구분하지 않고 패턴을 일치시킵니다.
+ SIMILAR TO 정규 표현식

  SIMILAR TO 연산자는 문자열 표현식과 SQL 표준 정규 표현식 패턴을 일치시킵니다. 여기에는 LIKE 연산자에서 지원하는 문자 2개는 물론이고 패턴 일치 메타 문자까지 포함될 수 있습니다. SIMILAR TO는 전체 문자열을 일치시키며, 대/소문자를 구분합니다.
+ POSIX-스타일 정규 표현식 

  POSIX 정규 표현식은 LIKE 및 SIMILAR TO 연산자보다 더욱 강력한 패턴 일치 수단을 제공합니다. POSIX 정규 표현식 패턴은 대/소문자를 구분하여 문자열의 어느 구간이든 일치시킬 수 있습니다.

SIMILAR TO 또는 POSIX 연산자를 사용하는 정규 표현식 일치는 계산에 따른 리소스 비용이 높습니다. 따라서 특히 다수의 행을 처리할 때는 최대한 LIKE를 사용하는 것이 좋습니다. 예를 들어 다음 두 쿼리는 기능면에서 동일하지만 LIKE를 사용하는 쿼리의 실행 속도가 정규 표현식을 사용하는 쿼리보다 몇 배 더 빠릅니다.

```
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

# LIKE
<a name="r_patternmatching_condition_like"></a>

LIKE 연산자는 열 이름 같은 문자열 표현식과 %(퍼센트) 및 \$1(밑줄) 와일드카드 문자의 사용 패턴을 서로 비교합니다. LIKE 패턴 일치는 항상 전체 문자열을 검색합니다. 문자열 내 아무 곳에서나 시퀀스를 일치시키려면 패턴이 퍼센트 기호로 시작해서 끝나야 합니다.

LIKE는 대/소문자를 구분하지만 ILIKE는 대/소문자를 구분하지 않습니다.

## 구문
<a name="r_patternmatching_condition_like-synopsis"></a>

```
expression [ NOT ] LIKE | ILIKE pattern [ ESCAPE 'escape_char' ]
```

## 인수
<a name="r_patternmatching_condition_like-arguments"></a>

 * expression*   
열 이름 같이 유효한 UTF-8 문자 표현식입니다.

LIKE \$1 ILIKE   
LIKE는 대/소문자를 구분하여 패턴을 일치시킵니다. ILIKE는 단일 바이트 UTF-8(ASCII) 문자일 때 대/소문자를 구분하지 않고 패턴을 일치시킵니다. 멀티바이트 문자에 대해 대/소문자를 구분하지 않는 패턴 일치를 수행하려면 LIKE 조건이 있는 *expression* 및 *pattern*에 [LOWER](r_LOWER.md) 함수를 사용합니다.  
비교 조건자(예: = 및 <>)와 달리 LIKE 및 ILIKE 조건자는 후행 공백을 묵시적으로 무시하지 않습니다. 후행 공백을 무시하려면 RTRIM을 사용하거나 CHAR 열을 VARCHAR로 명시적으로 캐스트합니다.  
`~~` 연산자는 LIKE와 동일하며 `~~*`는 ILIKE와 동일합니다. 또한 `!~~` 및 `!~~*` 연산자는 NOT LIKE 및 NOT ILIKE와 동일합니다.

 *pattern*   
일치시킬 패턴이 포함된, 유효한 UTF-8 문자 표현식입니다.

 *escape\$1char*   
패턴의 메타 문자를 이스케이프 처리하는 문자 표현식입니다. 기본값은 백슬래시 2개('\$1\$1')입니다.

*pattern*에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.

문자 표현식 중 하나는 CHAR 또는 VARCHAR 데이터 형식이 될 수 있습니다. 데이터 형식이 서로 다른 경우에는 Amazon Redshift가 *pattern*을 *expression*의 데이터 형식으로 변환합니다.

LIKE에서 지원되는 패턴 일치 메타 문자는 다음과 같습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_patternmatching_condition_like.html)

## 예제
<a name="r_patternmatching_condition_like-examples"></a>

다음 표는 LIKE를 사용한 패턴 일치의 예를 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_patternmatching_condition_like.html)

다음은 이름이 "E"로 시작하는 도시를 모두 찾는 예입니다.

```
select distinct city from users
where city like 'E%' order by city;
city
---------------
East Hartford
East Lansing
East Rutherford
East St. Louis
Easthampton
Easton
Eatontown
Eau Claire
...
```

다음은 성에 "ten"이 포함된 사용자를 찾는 예입니다.

```
select distinct lastname from users
where lastname like '%ten%' order by lastname;
lastname
-------------
Christensen
Wooten
...
```

다음 예제에서는 여러 패턴을 매칭하는 방법을 보여줍니다.

```
select distinct lastname from tickit.users
where lastname like 'Chris%' or lastname like '%Wooten' order by lastname;
lastname
-------------
Christensen
Christian
Wooten
...
```

다음은 세 번째와 네 번째 문자가 "ea"인 도시를 찾는 예입니다. 이 명령에서는 ILIKE를 사용하여 대/소문자를 구분하지 않고 있습니다.

```
select distinct city from users where city ilike '__EA%' order by city;
city
-------------
Brea
Clearwater
Great Falls
Ocean City
Olean
Wheaton
(6 rows)
```

다음은 기본 이스케이프 문자열(\$1\$1)을 사용하여 'start\$1'(텍스트 `start` 뒤에 밑줄 `_`가 붙음)가 포함된 문자열을 찾는 예입니다.

```
select tablename, "column" from pg_table_def 
where "column" like '%start\\_%'
limit 5;

     tablename     |    column
-------------------+---------------
 stl_s3client      | start_time
 stl_tr_conflict   | xact_start_ts
 stl_undone        | undo_start_ts
 stl_unload_log    | start_time
 stl_vacuum_detail | start_row
(5 rows)
```

다음은 '^'을 이스케이프 문자로 지정한 후 이 이스케이프 문자를 사용하여 'start\$1'(텍스트 `start` 뒤에 밑줄 `_`가 붙음)가 포함된 문자열을 찾는 예입니다.

```
select tablename, "column" from pg_table_def 
where "column" like '%start^_%' escape '^' 
limit 5;

     tablename     |    column
-------------------+---------------
 stl_s3client      | start_time
 stl_tr_conflict   | xact_start_ts
 stl_undone        | undo_start_ts
 stl_unload_log    | start_time
 stl_vacuum_detail | start_row
(5 rows)
```

다음 예시에서는 `~~*` 연산자를 사용하여 'Ag'로 시작하는 도시에 대해 대소문자를 구분하지 않는(ILIKE) 검색을 수행합니다.

```
select distinct city from users where city ~~* 'Ag%' order by city;
                   
city
------------
Agat	
Agawam	
Agoura Hills	
Aguadilla
```

# SIMILAR TO
<a name="pattern-matching-conditions-similar-to"></a>

SIMILAR TO 연산자는 열 이름 같은 문자열 표현식과 SQL 표준 정규 표현식 패턴을 일치시킵니다. SQL 정규 표현식 패턴에는 [LIKE](r_patternmatching_condition_like.md) 연산자에서 지원되는 문자 2개는 물론이고 패턴 일치 문자까지 포함될 수 있습니다.

SIMILAR TO 연산자는 패턴이 문자열 구간과 일치하는 POSIX 정규 표현식과 달리 패턴이 전체 문자열과 일치하는 경우에만 true를 반환합니다.

SIMILAR TO는 대/소문자를 구분하여 패턴을 일치시킵니다.

**참고**  
SIMILAR TO를 사용하는 정규 표현식 일치는 계산에 따른 리소스 비용이 높습니다. 따라서 특히 다수의 행을 처리할 때는 최대한 LIKE를 사용하는 것이 좋습니다. 예를 들어 다음 두 쿼리는 기능면에서 동일하지만 LIKE를 사용하는 쿼리의 실행 속도가 정규 표현식을 사용하는 쿼리보다 몇 배 더 빠릅니다.  

```
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

## 구문
<a name="pattern-matching-conditions-similar-to-synopsis"></a>

```
expression [ NOT ] SIMILAR TO pattern [ ESCAPE 'escape_char' ]
```

## 인수
<a name="pattern-matching-conditions-similar-to-arguments"></a>

 * expression*   
열 이름 같이 유효한 UTF-8 문자 표현식입니다.

SIMILAR TO  
SIMILAR TO는 대/소문자를 구분하여 *expression*의 전체 문자열과 패턴을 일치시킵니다.

 *pattern*   
SQL 표준 정규 표현식 패턴을 나타내는, 유효한 UTF-8 문자 표현식입니다.

 *escape\$1char*   
패턴의 메타 문자를 이스케이프 처리하는 문자 표현식입니다. 기본값은 백슬래시 2개('\$1\$1')입니다.

*pattern*에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다.

문자 표현식 중 하나는 CHAR 또는 VARCHAR 데이터 형식이 될 수 있습니다. 데이터 형식이 서로 다른 경우에는 Amazon Redshift가 *pattern*을 *expression*의 데이터 형식으로 변환합니다.

SIMILAR TO에서 지원되는 패턴 일치 메타 문자는 다음과 같습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-similar-to.html)

## 예제
<a name="pattern-matching-conditions-similar-to-examples"></a>

다음 표는 SIMILAR TO를 사용한 패턴 일치의 예를 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-similar-to.html)

다음은 이름에 "E" 또는 "H"가 포함되는 도시를 찾는 예입니다.

```
SELECT DISTINCT city FROM users
WHERE city SIMILAR TO '%E%|%H%' ORDER BY city LIMIT 5;

      city
-----------------
 Agoura Hills
 Auburn Hills
 Benton Harbor
 Beverly Hills
 Chicago Heights
```

다음은 기본 이스케이프 문자열('`\\`')을 사용하여 "`_`"이 포함된 문자열을 찾는 예입니다.

```
SELECT tablename, "column" FROM pg_table_def
WHERE "column" SIMILAR TO '%start\\_%'
ORDER BY tablename, "column" LIMIT 5;

        tablename         |       column
--------------------------+---------------------
 stcs_abort_idle          | idle_start_time
 stcs_abort_idle          | txn_start_time
 stcs_analyze_compression | start_time
 stcs_auto_worker_levels  | start_level
 stcs_auto_worker_levels  | start_wlm_occupancy
```

다음은 '`^`'을 이스케이프 문자열로 지정한 후 이 이스케이프 문자열을 사용하여 "`_`"이 포함된 문자열을 찾는 예입니다.

```
SELECT tablename, "column" FROM pg_table_def
WHERE "column" SIMILAR TO '%start^_%' ESCAPE '^'
ORDER BY tablename, "column" LIMIT 5;

        tablename         |       column
--------------------------+---------------------
 stcs_abort_idle          | idle_start_time
 stcs_abort_idle          | txn_start_time
 stcs_analyze_compression | start_time
 stcs_auto_worker_levels  | start_level
 stcs_auto_worker_levels  | start_wlm_occupancy
```

# POSIX 연산자
<a name="pattern-matching-conditions-posix"></a>

POSIX 정규 표현식은 일치 패턴을 지정하는 일련의 문자입니다. 문자열이 정규 표현식에 설명된 정규 집합의 멤버인 경우 해당 문자열은 정규 표현식과 일치합니다.

POSIX 정규 표현식은 [LIKE](r_patternmatching_condition_like.md) 및 [SIMILAR TO](pattern-matching-conditions-similar-to.md) 연산자보다 더욱 강력한 패턴 일치 수단을 제공합니다. POSIX 정규 표현식은 패턴은 전체 문자열과 일치하는 경우에만 true를 반환하는 SIMILAR TO 연산자와 달리 문자열 구간과 일치시킬 수 있습니다.

**참고**  
POSIX 연산자를 사용하는 정규 표현식 일치는 계산에 따른 리소스 비용이 높습니다. 따라서 특히 다수의 행을 처리할 때는 최대한 LIKE를 사용하는 것이 좋습니다. 예를 들어 다음 두 쿼리는 기능면에서 동일하지만 LIKE를 사용하는 쿼리의 실행 속도가 정규 표현식을 사용하는 쿼리보다 몇 배 더 빠릅니다.  

```
select count(*) from event where eventname ~ '.*(Ring|Die).*'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

## 구문
<a name="pattern-matching-conditions-posix-synopsis"></a>

```
expression [ ! ] ~ pattern
```

## 인수
<a name="pattern-matching-conditions-posix-arguments"></a>

 * expression*   
열 이름 같이 유효한 UTF-8 문자 표현식입니다.

\$1  
부정 연산자입니다. 정규 표현식과 일치하지 않습니다.

\$1  
대/소문자를 구분하여 *expression*의 하위 문자열과 일치시킵니다.  
`~~`는 [LIKE](r_patternmatching_condition_like.md)의 동의어입니다.

 *pattern*   
정규 표현식 패턴을 나타내는 문자열 리터럴입니다.

*pattern*에 와일드카드 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다.

‘`. * | ? `‘ 등 메타 문자가 포함된 문자열을 찾으려면 백슬래시 2개('` \\`')를 사용하여 문자를 이스케이프 처리하세요. `SIMILAR TO`나 `LIKE`와 달리 POSIX 정규 표현식 구문은 사용자 정의 이스케이프 문자를 지원하지 않습니다.

문자 표현식 중 하나는 CHAR 또는 VARCHAR 데이터 형식이 될 수 있습니다. 데이터 형식이 서로 다른 경우에는 Amazon Redshift가 *pattern*을 *expression*의 데이터 형식으로 변환합니다.

문자 표현식 모두 CHAR 또는 VARCHAR 데이터 형식이 될 수 있습니다. 표현식의 데이터 형식이 다르면 Amazon Redshift가 *expression*의 데이터 형식으로 변환합니다.

POSIX 패턴 일치에서 지원되는 메타 문자는 다음과 같습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)

다음은 Amazon Redshift에서 지원되는 POSIX 문자 클래스입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)

 Amazon Redshift는 정규 표현식에서 다음과 같이 Perl의 영향을 받는 연산자를 지원합니다. 이러한 연산자는 백슬래시 2개(‘`\\`’)를 사용하여 이스케이프 처리합니다.  

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)

## 예제
<a name="pattern-matching-conditions-posix-synopsis-examples"></a>

다음 표는 POSIX 연산자를 사용한 패턴 일치의 예를 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/pattern-matching-conditions-posix.html)

다음은 이름에 `E` 또는 `H`가 포함된 도시를 찾는 예입니다.

```
SELECT DISTINCT city FROM users
WHERE city ~ '.*E.*|.*H.*' ORDER BY city LIMIT 5;

      city
-----------------
 Agoura Hills
 Auburn Hills
 Benton Harbor
 Beverly Hills
 Chicago Heights
```

다음 예는 이름에 `E` 또는 `H`가 포함되지 않은 도시를 찾습니다.

```
SELECT DISTINCT city FROM users WHERE city !~ '.*E.*|.*H.*' ORDER BY city LIMIT 5;

      city
-----------------
 Aberdeen	
 Abilene	
 Ada	
 Agat	
 Agawam
```

다음은 기본 이스케이프 문자열('`\\`')을 사용하여 "마침표"가 포함된 문자열을 찾는 예입니다.

```
SELECT venuename FROM venue
WHERE venuename ~ '.*\\..*'
ORDER BY venueid;

          venuename
------------------------------
 St. Pete Times Forum
 Jobing.com Arena
 Hubert H. Humphrey Metrodome
 U.S. Cellular Field
 Superpages.com Center
 E.J. Nutter Center
 Bernard B. Jacobs Theatre
 St. James Theatre
```

# BETWEEN 범위 조건
<a name="r_range_condition"></a>

`BETWEEN` 조건은 키워드 `BETWEEN`과 `AND`를 사용하여 값의 범위에 대한 표현식의 포함 여부를 테스트합니다.

## 구문
<a name="r_range_condition-synopsis"></a>

```
expression [ NOT ] BETWEEN expression AND expression
```

표현식은 숫자, 문자 또는 날짜/시간 데이터 형식이 될 수 있지만 서로 호환 가능해야 합니다. 범위는 모든 값을 포함합니다.

## 예제
<a name="r_range_condition-examples"></a>

다음은 티켓 2장, 3장 또는 4장 중에서 판매가 등록된 티켓의 거래 수를 계산하는 예입니다.

```
select count(*) from sales
where qtysold between 2 and 4;

count
--------
104021
(1 row)
```

범위 조건에는 시작 값과 종료 값이 모두 포함됩니다.

```
select min(dateid), max(dateid) from sales
where dateid between 1900 and 1910;

min  | max 
-----+-----
1900 | 1910
```

범위 조건에서 첫 번째 표현식은 두 번째 표현식보다 값이 작아야 하고, 두 번째 표현식은 첫 번째 표현식보다 값이 커야 합니다. 다음은 표현식의 값으로 인해 항상 0개의 행을 반환하는 예입니다.

```
select count(*) from sales
where qtysold between 4 and 2;

count
-------
0
(1 row)
```

하지만 NOT 한정자를 적용하면 논리가 반전되어 모든 행의 수를 반환합니다.

```
select count(*) from sales
where qtysold not between 4 and 2;

count
--------
172456
(1 row)
```

다음은 좌석 수가 20,000\$150,000석인 장소 목록을 반환하는 쿼리입니다.

```
select venueid, venuename, venueseats from venue
where venueseats between 20000 and 50000
order by venueseats desc;

venueid |       venuename               | venueseats
---------+-------------------------------+------------
116 | Busch Stadium                 |      49660
106 | Rangers BallPark in Arlington |      49115
96 | Oriole Park at Camden Yards   |      48876
...
(22 rows)
```

다음 예에서는 날짜 값에 BETWEEN을 사용하는 방법을 보여 줍니다.

```
select salesid, qtysold, pricepaid, commission, saletime 
from sales 
where eventid between 1000 and 2000 
   and saletime between '2008-01-01' and '2008-01-03'
order by saletime asc;

salesid | qtysold | pricepaid | commission |   saletime
--------+---------+-----------+------------+---------------
  65082 |       4 |       472 |       70.8 | 1/1/2008 06:06
 110917 |       1 |       337 |      50.55 | 1/1/2008 07:05
 112103 |       1 |       241 |      36.15 | 1/2/2008 03:15
 137882 |       3 |      1473 |     220.95 | 1/2/2008 05:18
  40331 |       2 |        58 |        8.7 | 1/2/2008 05:57
 110918 |       3 |      1011 |     151.65 | 1/2/2008 07:17
  96274 |       1 |       104 |       15.6 | 1/2/2008 07:18
 150499 |       3 |       135 |      20.25 | 1/2/2008 07:20
  68413 |       2 |       158 |       23.7 | 1/2/2008 08:12
```

BETWEEN의 범위는 포함되지만 날짜는 기본적으로 00:00:00의 시간 값을 가집니다. 샘플 쿼리에 대해 유일하게 유효한 1월 3일 행은 판매 시간이 `1/3/2008 00:00:00`인 행입니다.

# NULL 조건
<a name="r_null_condition"></a>

NULL 조건은 값이 누락되거나 알 수 없는 경우 NULL 여부를 테스트합니다.

## 구문
<a name="r_null_condition-synopsis"></a>

```
expression IS [ NOT ] NULL
```

## 인수
<a name="r_null_condition-arguments"></a>

 * expression*   
열 같은 모든 표현식입니다.

IS NULL   
표현식의 값이 NULL일 때는 true이고, 표현식에 값이 있을 때는 false입니다.

 IS NOT NULL   
표현식의 값이 NULL일 때는 false이고, 표현식에 값이 있을 때는 true입니다.

## 예제
<a name="r_null_condition-example"></a>

다음은 SALES 테이블의 QTYSOLD 필드에 NULL이 포함된 횟수를 나타내는 예입니다.

```
select count(*) from sales
where qtysold is null;
count
-------
0
(1 row)
```

# EXISTS 조건
<a name="r_exists_condition"></a>

EXISTS 조건은 하위 쿼리에 대한 행의 존재 유무를 테스트한 후 하위 쿼리에서 행이 1개 이상 존재하면 true를 반환합니다. NOT을 지정하는 경우에는 하위 쿼리에 행이 없을 때 true를 반환합니다.

## 구문
<a name="r_exists_condition-synopsis"></a>

```
[ NOT ] EXISTS (table_subquery)
```

## 인수
<a name="r_exists_condition-arguments"></a>

 exists   
*table\$1subquery*가 행을 1개 이상 반환하면 true입니다.

not\$1exists   
*table\$1subquery*가 행을 하나도 반환하지 않으면 true입니다.

 *table\$1subquery*   
열이 1개 이상, 그리고 행이 1개 이상 포함된 테이블로 평가되는 하위 쿼리입니다.

## 예제
<a name="r_exists_condition-example"></a>

다음은 유형에 상관없이 판매가 이루어진 날짜마다 각각 한 번씩 날짜 식별자를 모두 반환하는 예입니다.

```
select dateid from date
where exists (
select 1 from sales
where date.dateid = sales.dateid
)
order by dateid;

dateid
--------
1827
1828
1829
...
```

# IN 조건
<a name="r_in_condition"></a>

IN 조건은 값 집합 또는 하위 쿼리에서 값의 멤버십 여부를 테스트합니다.

## 구문
<a name="r_in_condition-synopsis"></a>

```
expression [ NOT ] IN (expr_list | table_subquery)
```

## 인수
<a name="r_in_condition-arguments"></a>

 * expression*   
*expr\$1list* 또는 *table\$1subquery*를 대상으로 평가되는 숫자, 문자 또는 날짜/시간 표현식으로서 해당 목록이나 하위 쿼리의 데이터 형식과 호환되어야 합니다.

 *expr\$1list*   
쉼표로 구분된 표현식 1개 이상, 또는 쉼표로 구분된 표현식 집합 1개 이상이며 괄호로 경계를 표시합니다.

 *table\$1subquery*   
행이 1개 이상 포함되어 있지만 select 목록의 열은 1개로 제한된 테이블로 평가되는 하위 쿼리입니다.

IN \$1 NOT IN   
IN은 표현식이 표현식 목록 또는 쿼리의 멤버일 때 true를 반환합니다. NOT IN은 표현식이 멤버가 아닐 때 true를 반환합니다. IN과 NOT IN은 *expression*이 NULL을 산출하는 경우, 혹은 *expr\$1list* 또는 *table\$1subquery* 값이 하나도 일치하지 않고 두 비교 행 중 적어도 하나가 NULL을 산출하는 경우에는 NULL과 함께 아무런 행도 반환되지 않습니다.

## 예제
<a name="r_in_condition-examples"></a>

다음 조건은 나열된 값일 때만 true로 평가됩니다.

```
qtysold in (2, 4, 5)
date.day in ('Mon', 'Tues')
date.month not in ('Oct', 'Nov', 'Dec')
```

## 대용량 IN 목록의 최적화
<a name="r_in_condition-optimization-for-large-in-lists"></a>

값이 10개 이상인 IN 목록은 쿼리 성능의 최적화를 위해 내부에서 스칼라 배열로 평가됩니다. 값이 10개 미만인 IN 목록은 OR 조건자의 연속으로 평가됩니다. 이러한 최적화는 SMALLINT, INTEGER, BIGINT, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP 및 TIMESTAMPTZ 데이터 형식에서 지원됩니다.

이러한 최적화의 효과는 다음 쿼리에서 EXPLAIN 출력을 보면 알 수 있습니다. 예: 

```
explain select * from sales
QUERY PLAN
--------------------------------------------------------------------
XN Seq Scan on sales  (cost=0.00..6035.96 rows=86228 width=53)
Filter: (salesid = ANY ('{1,2,3,4,5,6,7,8,9,10,11}'::integer[]))
(2 rows)
```

# SQL 명령
<a name="c_SQL_commands"></a>

SQL 언어는 데이터베이스 객체 생성 및 조작, 쿼리 실행, 테이블 로드, 테이블에 있는 데이터 수정에 사용하는 명령으로 구성됩니다.

Amazon Redshift는 PostgreSQL을 기반으로 합니다. Amazon Redshift와 PostgreSQL은 데이터웨어 하우스 애플리케이션을 설계하고 개발할 때 숙지해야 할 몇 가지 중요한 차이점이 있습니다. Amazon Redshift SQL이 PostgreSQL과 어떻게 다른지 자세히 알아보려면 [Amazon Redshift 및 PostgreSQL](c_redshift-and-postgres-sql.md) 섹션을 참조하세요.

**참고**  
단일 SQL 문의 최대 크기는 16MB입니다.

**Topics**
+ [ABORT](r_ABORT.md)
+ [ALTER DATABASE](r_ALTER_DATABASE.md)
+ [ALTER DATASHARE](r_ALTER_DATASHARE.md)
+ [ALTER DEFAULT PRIVILEGES](r_ALTER_DEFAULT_PRIVILEGES.md)
+ [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md)
+ [ALTER EXTERNAL VIEW](r_ALTER_EXTERNAL_VIEW.md)
+ [ALTER FUNCTION](r_ALTER_FUNCTION.md)
+ [ALTER GROUP](r_ALTER_GROUP.md)
+ [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md)
+ [마스킹 정책 변경](r_ALTER_MASKING_POLICY.md)
+ [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md)
+ [ALTER RLS POLICY](r_ALTER_RLS_POLICY.md)
+ [역할 변경](r_ALTER_ROLE.md)
+ [ALTER PROCEDURE](r_ALTER_PROCEDURE.md)
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [ALTER SYSTEM](r_ALTER_SYSTEM.md)
+ [ALTER TABLE](r_ALTER_TABLE.md)
+ [ALTER TABLE APPEND](r_ALTER_TABLE_APPEND.md)
+ [ALTER TEMPLATE](r_ALTER_TEMPLATE.md)
+ [ALTER USER](r_ALTER_USER.md)
+ [ANALYZE](r_ANALYZE.md)
+ [ANALYZE COMPRESSION](r_ANALYZE_COMPRESSION.md)
+ [마스킹 정책 연결](r_ATTACH_MASKING_POLICY.md)
+ [ATTACH RLS POLICY](r_ATTACH_RLS_POLICY.md)
+ [BEGIN](r_BEGIN.md)
+ [CALL](r_CALL_procedure.md)
+ [CANCEL](r_CANCEL.md)
+ [CLOSE](close.md)
+ [COMMENT](r_COMMENT.md)
+ [COMMIT](r_COMMIT.md)
+ [COPY](r_COPY.md)
+ [데이터베이스 생성](r_CREATE_DATABASE.md)
+ [CREATE DATASHARE](r_CREATE_DATASHARE.md)
+ [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)
+ [CREATE EXTERNAL MODEL](r_create_external_model.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)
+ [CREATE EXTERNAL VIEW](r_CREATE_EXTERNAL_VIEW.md)
+ [CREATE FUNCTION](r_CREATE_FUNCTION.md)
+ [create group](r_CREATE_GROUP.md)
+ [CREATE IDENTITY PROVIDER](r_CREATE_IDENTITY_PROVIDER.md)
+ [CREATE LIBRARY](r_CREATE_LIBRARY.md)
+ [마스킹 정책 생성](r_CREATE_MASKING_POLICY.md)
+ [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)
+ [CREATE MODEL](r_CREATE_MODEL.md)
+ [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)
+ [CREATE RLS POLICY](r_CREATE_RLS_POLICY.md)
+ [CREATE ROLE](r_CREATE_ROLE.md)
+ [CREATE SCHEMA](r_CREATE_SCHEMA.md)
+ [CREATE TABLE](r_CREATE_TABLE_NEW.md)
+ [CREATE TABLE AS](r_CREATE_TABLE_AS.md)
+ [CREATE TEMPLATE](r_CREATE_TEMPLATE.md)
+ [CREATE USER](r_CREATE_USER.md)
+ [CREATE VIEW](r_CREATE_VIEW.md)
+ [DEALLOCATE](r_DEALLOCATE.md)
+ [DECLARE](declare.md)
+ [DELETE](r_DELETE.md)
+ [DESC DATASHARE](r_DESC_DATASHARE.md)
+ [DESC IDENTITY PROVIDER](r_DESC_IDENTITY_PROVIDER.md)
+ [마스킹 정책 분리](r_DETACH_MASKING_POLICY.md)
+ [DETACH RLS POLICY](r_DETACH_RLS_POLICY.md)
+ [DROP DATABASE](r_DROP_DATABASE.md)
+ [DROP DATASHARE](r_DROP_DATASHARE.md)
+ [DROP EXTERNAL VIEW](r_DROP_EXTERNAL_VIEW.md)
+ [DROP FUNCTION](r_DROP_FUNCTION.md)
+ [DROP GROUP](r_DROP_GROUP.md)
+ [DROP IDENTITY PROVIDER](r_DROP_IDENTITY_PROVIDER.md)
+ [DROP LIBRARY](r_DROP_LIBRARY.md)
+ [마스킹 정책 삭제](r_DROP_MASKING_POLICY.md)
+ [DROP MODEL](r_DROP_MODEL.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)
+ [DROP PROCEDURE](r_DROP_PROCEDURE.md)
+ [DROP RLS POLICY](r_DROP_RLS_POLICY.md)
+ [DROP ROLE](r_DROP_ROLE.md)
+ [DROP SCHEMA](r_DROP_SCHEMA.md)
+ [DROP TABLE](r_DROP_TABLE.md)
+ [DROP TEMPLATE](r_DROP_TEMPLATE.md)
+ [DROP USER](r_DROP_USER.md)
+ [DROP VIEW](r_DROP_VIEW.md)
+ [END](r_END.md)
+ [EXECUTE](r_EXECUTE.md)
+ [EXPLAIN](r_EXPLAIN.md)
+ [FETCH](fetch.md)
+ [GRANT](r_GRANT.md)
+ [INSERT](r_INSERT_30.md)
+ [INSERT(외부 테이블)](r_INSERT_external_table.md)
+ [LOCK](r_LOCK.md)
+ [MERGE](r_MERGE.md)
+ [PREPARE](r_PREPARE.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [reset](r_RESET.md)
+ [REVOKE](r_REVOKE.md)
+ [ROLLBACK](r_ROLLBACK.md)
+ [SELECT](r_SELECT_synopsis.md)
+ [SELECT INTO](r_SELECT_INTO.md)
+ [SET](r_SET.md)
+ [SET SESSION AUTHORIZATION](r_SET_SESSION_AUTHORIZATION.md)
+ [SET SESSION CHARACTERISTICS](r_SET_SESSION_CHARACTERISTICS.md)
+ [SHOW](r_SHOW.md)
+ [열 권한 부여 표시](r_SHOW_COLUMN_GRANTS.md)
+ [SHOW COLUMNS](r_SHOW_COLUMNS.md)
+ [제약 조건 표시](r_SHOW_CONSTRAINTS.md)
+ [SHOW EXTERNAL TABLE](r_SHOW_EXTERNAL_TABLE.md)
+ [SHOW DATABASES](r_SHOW_DATABASES.md)
+ [SHOW FUNCTIONS](r_SHOW_FUNCTIONS.md)
+ [SHOW GRANTS](r_SHOW_GRANTS.md)
+ [SHOW MODEL](r_SHOW_MODEL.md)
+ [SHOW DATASHARES](r_SHOW_DATASHARES.md)
+ [SHOW PARAMETERS](r_SHOW_PARAMETERS.md)
+ [SHOW POLICIES](r_SHOW_POLICIES.md)
+ [SHOW PROCEDURE](r_SHOW_PROCEDURE.md)
+ [SHOW PROCEDURES](r_SHOW_PROCEDURES.md)
+ [SHOW SCHEMAS](r_SHOW_SCHEMAS.md)
+ [SHOW TABLE](r_SHOW_TABLE.md)
+ [SHOW TABLES](r_SHOW_TABLES.md)
+ [SHOW TEMPLATE](r_SHOW_TEMPLATE.md)
+ [SHOW TEMPLATES](r_SHOW_TEMPLATES.md)
+ [SHOW VIEW](r_SHOW_VIEW.md)
+ [START TRANSACTION](r_START_TRANSACTION.md)
+ [TRUNCATE](r_TRUNCATE.md)
+ [UNLOAD](r_UNLOAD.md)
+ [UPDATE](r_UPDATE.md)
+ [USE](r_USE_command.md)
+ [VACUUM](r_VACUUM_command.md)

# ABORT
<a name="r_ABORT"></a>

현재 실행 중인 트랜잭션을 중지하고 그 트랜잭션에서 이루어진 모든 업데이트를 삭제합니다. ABORT는 이미 완료된 트랜잭션에는 아무런 영향도 미치지 않습니다.

이 명령은 ROLLBACK 명령과 똑같은 기능을 수행합니다. 자세한 내용은 [ROLLBACK](r_ROLLBACK.md) 섹션을 참조하세요.

## 구문
<a name="r_ABORT-synopsis"></a>

```
ABORT [ WORK | TRANSACTION ]
```

## 파라미터
<a name="r_ABORT-parameters"></a>

Work  
선택적 키워드입니다.

TRANSACTION  
선택적 키워드: WORK와 TRANSACTION은 동의어입니다.

## 예제
<a name="r_ABORT-example"></a>

다음 예에서는 테이블을 생성한 다음에 데이터가 테이블에 삽입되는 트랜잭션을 시작합니다. 그런 다음 ABORT 명령으로 데이터 삽입을 롤백하여 테이블이 비어 있는 상태로 둡니다.

다음 명령을 실행하면 MOVIE\$1GROSS라는 예 테이블이 생성됩니다.

```
create table movie_gross( name varchar(30), gross bigint );
```

다음 명령 세트는 테이블에 2개의 데이터 행을 삽입하는 트랜잭션을 시작합니다.

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

다음으로, 아래 명령을 실행하면 데이터가 올바로 삽입되었음을 보여주기 위해 테이블에서 해당 데이터가 선택됩니다.

```
select * from movie_gross;
```

명령 출력에는 두 행 모두 올바로 삽입된 것으로 표시됩니다.

```
         name           |  gross
------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

이제는 다음 명령으로 트랜잭션이 시작된 지점으로 데이터 변경 내용을 롤백합니다.

```
abort;
```

테이블에서 데이터를 선택하면 빈 테이블이 표시됩니다.

```
select * from movie_gross;

 name | gross
------+-------
(0 rows)
```

# ALTER DATABASE
<a name="r_ALTER_DATABASE"></a>

데이터베이스의 속성을 변경합니다.

## 필수 권한
<a name="r_ALTER_DATABASE-privileges"></a>

ALTER DATABASE를 사용하려면 다음 권한 중 하나가 필요합니다.
+ 수퍼유저
+ ALTER DATABASE 권한을 가진 사용자
+ 데이터베이스 소유자

## 구문
<a name="r_ALTER_DATABASE-synopsis"></a>

```
ALTER DATABASE database_name
{ 
  RENAME TO new_name
  | OWNER TO new_owner
  | [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]
    [ ISOLATION LEVEL { SNAPSHOT | SERIALIZABLE } ]
| INTEGRATION
 { 
  REFRESH { { ALL | INERROR } TABLES [ IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] }
   | SET 
     [ QUERY_ALL_STATES [=] { TRUE | FALSE } ] 
     [ ACCEPTINVCHARS [=] { TRUE | FALSE } ] 
     [ REFRESH_INTERVAL <interval> ]
     [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ]
     [ HISTORY_MODE [=] {TRUE | FALSE} [ FOR { {ALL} TABLES [IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] } ] ]
 }
}
```

## 파라미터
<a name="r_ALTER_DATABASE-parameters"></a>

 *database\$1name*   
변경할 데이터베이스의 이름입니다. 일반적으로, 현재 연결되어 있지 않은 데이터베이스를 변경하며, 경우에 따라 후속 세션에서만 변경 사항이 적용됩니다. 현재 데이터베이스의 소유자를 변경할 수는 있지만 이름을 바꿀 수는 없습니다.  

```
alter database tickit rename to newtickit;
ERROR:  current database may not be renamed
```

RENAME TO   
지정된 데이터베이스의 이름을 바꿉니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요. dev, padb\$1harvest, template0, template1 또는 sys:internal 데이터베이스의 이름을 바꿀 수 없고, 현재 데이터베이스의 이름도 바꿀 수 없습니다. 데이터베이스 소유자 또는 [superuser](r_superusers.md#def_superusers)만이 데이터베이스 이름을 바꿀 수 있고, 수퍼유저가 아닌 소유자 역시 CREATEDB 권한을 가져야 합니다.

 *new\$1name*   
새 데이터베이스 이름입니다.

OWNER TO   
지정된 데이터베이스의 소유자를 변경합니다. 현재 데이터베이스 또는 다른 데이터베이스의 소유자를 변경할 수 있습니다. 수퍼유저만이 소유자를 변경할 수 있습니다.

 *new\$1owner*   
새 데이터베이스 소유자입니다. 새 소유자는 쓰기 권한을 가진 기존 데이터베이스 사용자여야 합니다. 사용자 권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
사용자가 동시에 열어놓을 수 있는 데이터베이스 연결의 최대 개수입니다. 수퍼유저에 대해서는 이 제한이 적용되지 않습니다. 최대 동시 연결 수를 허용하려면 UNLIMITED 키워드를 사용하세요. 각 사용자에 대한 연결 개수 제한이 적용될 수도 있습니다. 자세한 내용은 [CREATE USER](r_CREATE_USER.md) 섹션을 참조하세요. 기본값은 UNLIMITED입니다. 현재 연결을 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리하세요.  
사용자 및 데이터베이스 연결 제한이 모두 적용되는 경우 사용되지 않는 연결 슬롯은 사용자가 연결 시도 시 양쪽 제한 범위 내에서 모두 사용 가능해야 합니다.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
문자열 검색 또는 비교가 대/소문자를 구분하는지, 구분하지 않는지를 지정하는 절입니다.  
현재 데이터베이스가 비어 있더라도 대소문자 구분을 변경할 수 있습니다.  
대소문자 구분을 변경하려면 ALTER 권한이 있어야 합니다. CREATE DATABASE 권한을 가진 슈퍼 사용자 또는 데이터베이스 소유자는 데이터베이스 대소문자 구분을 변경할 수도 있습니다.  
CASE\$1SENSITIVE와 CS는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다. 마찬가지로 CASE\$1INSENSITIVE와 CI는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
데이터베이스에 대해 쿼리가 실행될 때 사용되는 격리 수준을 지정하는 절입니다. 격리 수준에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.  
+ SNAPSHOT 격리 - 업데이트 및 삭제 충돌로부터 보호하는 격리 수준을 제공합니다.
+ SERIALIZABLE 격리 - 동시 트랜잭션에 대한 완전한 직렬화 기능을 제공합니다.
데이터베이스의 격리 수준을 변경할 경우 다음 사항을 고려하세요.  
+ 데이터베이스 격리 수준을 변경하려면 현재 데이터베이스에 대해 슈퍼 사용자 또는 데이터베이스 생성 권한이 있어야 합니다.
+ `dev` 데이터베이스의 격리 수준은 변경할 수 없습니다.
+ 트랜잭션 블록 내에서는 격리 수준을 변경할 수 없습니다.
+ 다른 사용자가 데이터베이스에 연결되어 있으면 격리 수준 변경 명령이 실패합니다.
+ 격리 수준 변경 명령으로 현재 세션의 격리 수준 설정을 변경할 수 있습니다.

INTEGRATION  
제로 ETL 통합 데이터베이스를 변경합니다.

REFRESH \$1\$1 ALL \$1 INERROR \$1 TABLES [IN SCHEMA *schema* [, ...]] \$1 TABLE *schema.table* [, ...]\$1  
Amazon Redshift가 지정된 스키마 또는 테이블에서 오류가 있는 테이블을 모두 새로 고칠지를 지정하는 절입니다. 새로 고침은 지정된 스키마 또는 테이블의 테이블이 소스 데이터베이스에서 완전히 복제되도록 트리거합니다.  
자세한 내용은 *Amazon Redshift 관리 안내서*의 [제로 ETL 통합](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html)을 참조하세요. 통합 상태에 대한 자세한 내용은 [SVV\$1INTEGRATION\$1TABLE\$1STATE](r_SVV_INTEGRATION_TABLE_STATE.md) 및 [SVV\$1INTEGRATION](r_SVV_INTEGRATION.md) 섹션을 참조하세요.

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
QUERY\$1ALL\$1STATES 절은 모든 상태(`Synced`, `Failed`, `ResyncRequired`, `ResyncInitiated`)에서 제로 ETL 통합 테이블을 쿼리할 수 있는지 여부를 설정합니다. 기본적으로 제로 ETL 통합 테이블은 `Synced` 상태에서만 쿼리할 수 있습니다.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
ACCEPTINVCHARS 절은 VARCHAR 데이터 유형에 대해 유효하지 않은 문자가 감지될 때 제로 ETL 통합 테이블이 수집을 계속할지 여부를 설정합니다. 유효하지 않은 문자가 발견되면 유효하지 않은 문자가 기본 `?` 문자로 교체됩니다.

REFRESH\$1INTERVAL <interval>  
REFRESH\$1INTERVAL 절은 제로 ETL 소스에서 대상 데이터베이스로 데이터를 새로고침하기 위해 대략적인 시간 간격을 초 단위로 설정합니다. 소스 유형이 Aurora MySQL, Aurora PostgreSQL 또는 RDS for MySQL인 제로 ETL 통합의 경우 `interval`을 0\$1432,000초(5일)로 설정할 수 있습니다. Amazon DynamoDB 제로 ETL 통합의 경우 `interval`을 900\$1432,000초(15분\$15일)로 설정할 수 있습니다.  
제로 ETL 통합을 사용하여 데이터베이스를 생성하는 방법에 대한 자세한 내용은 **Amazon Redshift 관리 가이드의 [Amazon Redshift에서 대상 데이터베이스 생성](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)을 참조하세요.

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
TRUNCATECOLUMNS 절은 VARCHAR 열 또는 SUPER 열 속성의 값이 제한을 초과할 때 제로 ETL 통합 테이블이 수집을 계속할지 여부를 설정합니다. `TRUE`인 경우 값이 열에 맞게 잘리고 오버플로되는 JSON 속성의 값이 SUPER 열에 맞게 잘립니다.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1 [ FOR \$1 \$1ALL\$1 TABLES [IN SCHEMA schema [, ...]] \$1 TABLE schema.table [, ...]\$1 ]  
Amazon Redshift가 제로 ETL 통합에 포함되는 모든 테이블 또는 지정된 스키마의 테이블에 대해 기록 모드를 설정할지 여부를 지정하는 절입니다. 이 옵션은 제로 ETL 통합을 위해 생성된 데이터베이스에만 적용됩니다.  
HISTORY\$1MODE 절은 `TRUE` 또는 `FALSE`로 설정할 수 있습니다. 기본값은 `FALSE`입니다. 기록 모드를 켜거나 끄는 것은 `Synced` 상태인 테이블에만 적용됩니다. HISTORY\$1MODE에 대한 자세한 내용은 *Amazon Redshift 관리 안내서*의 [기록 모드](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html)를 참조하세요.

## 사용 노트
<a name="r_ALTER_DATABASE-usage-notes"></a>

ALTER DATABASE 명령은 현재 세션이 아닌 후속 세션에 적용됩니다. 변경 효과를 보려면 변경된 데이터베이스에 다시 연결해야 합니다.

## 예제
<a name="r_ALTER_DATABASE-examples"></a>

다음 예에서는 TICKIT\$1SANDBOX라는 데이터베이스 이름을 TICKIT\$1TEST로 바꿉니다.

```
alter database tickit_sandbox rename to tickit_test;
```

다음 예에서는 TICKIT 데이터베이스(현재 데이터베이스)의 소유자를 DWUSER로 변경합니다.

```
alter database tickit owner to dwuser;
```

다음 예에서는 sampledb 데이터베이스의 데이터베이스 대/소문자 구분을 변경합니다.

```
ALTER DATABASE sampledb COLLATE CASE_INSENSITIVE;
```

다음 예에서는 **sampledb** 데이터베이스를 SNAPSHOT 격리 수준으로 변경합니다.

```
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

다음 예시는 제로 ETL 통합에서 **sample\$1integration\$1db** 데이터베이스의 테이블 **schema1.sample\$1table1** 및 **schema2.sample\$1table2**를 새로 고칩니다.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH TABLE schema1.sample_table1, schema2.sample_table2;
```

다음 예시는 제로 ETL 통합 내에서 동기화된 테이블과 실패한 테이블을 모두 새로 고칩니다.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH ALL tables;
```

다음 예제에서는 제로 ETL 통합의 새로고침 간격을 600초로 설정합니다.

```
ALTER DATABASE sample_integration_db INTEGRATION SET REFRESH_INTERVAL 600;
```

다음 예제는 **sample\$1schema** 스키마에서 `ErrorState`인 모든 테이블을 새로고침합니다.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH INERROR TABLES in SCHEMA sample_schema;
```

다음 예제에서는 `myschema.table1` 테이블에 대해 기록 모드를 켭니다.

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true FOR TABLE myschema.table1
```

다음 예제에서는 `myschema`의 모든 테이블에 대해 기록 모드를 켭니다.

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true for ALL TABLES IN SCHEMA myschema
```

# ALTER DATASHARE
<a name="r_ALTER_DATASHARE"></a>

datashare의 정의를 변경합니다. ALTER DATASHARE를 사용하여 객체를 추가하거나 제거할 수 있습니다. 현재 데이터베이스의 데이터 공유만 변경할 수 있습니다. 연결된 데이터베이스에서 객체를 데이터 공유에 추가하거나 제거합니다. 추가하거나 제거할 datashare 객체에 대한 필수 권한이 있는 datashare 소유자는 datashare를 변경할 수 있습니다.

## 필수 권한
<a name="r_ALTER_DATASHARE-privileges"></a>

ALTER DATASHARE에 필요한 권한은 다음과 같습니다.
+ 슈퍼 사용자.
+ ALTER DATASHARE 권한을 가진 사용자.
+ datashare에 대한 ALTER 또는 ALL 권한을 가진 사용자.
+ datashare에 특정 객체를 추가하려면 사용자에게 객체에 대한 권한이 있어야 합니다. 이 경우 사용자는 객체 소유자이거나 객체에 대한 SELECT, USAGE 또는 ALL 권한이 있어야 합니다.

## 구문
<a name="r_ALTER_DATASHARE-synopsis"></a>

다음 구문은 datashare에 객체를 추가하거나 제거하는 방법을 보여줍니다.

```
ALTER DATASHARE datashare_name { ADD | REMOVE } {
TABLE schema.table [, ...]
| SCHEMA schema [, ...]
| FUNCTION schema.sql_udf (argtype,...) [, ...]
| ALL TABLES IN SCHEMA schema [, ...]
| ALL FUNCTIONS IN SCHEMA schema [, ...] }
```

다음 구문은 datashare의 속성을 구성하는 방법을 보여줍니다.

```
ALTER DATASHARE datashare_name {
[ SET PUBLICACCESSIBLE [=] TRUE | FALSE ]
[ SET INCLUDENEW [=] TRUE | FALSE FOR SCHEMA schema ] }
```

## 파라미터
<a name="r_ALTER_DATASHARE-parameters"></a>

*datashare\$1name*  
변경할 datashare의 이름입니다.

ADD \$1 REMOVE  
datashare에서 객체를 추가할지 아니면 제거할지 지정하는 절입니다.

TABLE *schema*.*table* [, ...]  
datashare에 추가할 지정된 스키마의 테이블 또는 뷰의 이름입니다.

SCHEMA *schema* [, ...]   
datashare에 추가할 스키마의 이름입니다.

FUNCTION *schema*.*sql\$1udf* (argtype,...) [, ...]  
datashare에 추가할 인수 유형이 있는 사용자 정의 SQL 함수의 이름입니다.

ALL TABLES IN SCHEMA *schema* [, ...]   
지정된 스키마의 모든 테이블과 뷰를 datashare에 추가할지 여부를 지정하는 절입니다.

ALL FUNCTIONS IN SCHEMA *schema* [, ...] \$1  
지정된 스키마의 모든 함수를 datashare에 추가하도록 지정하는 절입니다.

[ SET PUBLICACCESSIBLE [=] TRUE \$1 FALSE ]  
공개적으로 액세스할 수 있는 클러스터와 datashare를 공유할 수 있는지 여부를 지정하는 절입니다.

[ SET INCLUDENEW [=] TRUE \$1 FALSE FOR SCHEMA *schema* ]  
지정된 스키마에서 생성된 향후 테이블, 뷰 또는 SQL 사용자 정의 함수(UDF)를 datashare에 추가할지 여부를 지정하는 절입니다. 지정된 스키마의 현재 테이블, 뷰 또는 SQL UDF는 datashare에 추가되지 않습니다. 슈퍼 사용자만 각 datashare-스키마 페어에 대해 이 속성을 변경할 수 있습니다. 기본적으로 INCLUDENEW 절은 false입니다.

## ALTER DATASHARE 사용 참고 사항
<a name="r_ALTER_DATASHARE_usage"></a>
+ 다음 사용자가 datashare를 변경할 수 있습니다.
  + 슈퍼 사용자
  + datashare의 소유자입니다.
  + datashare에 대한 ALTER 또는 ALL 권한을 가진 사용자
+ datashare에 특정 객체를 추가하려면 이러한 사용자에게 객체에 대한 올바른 권한이 있어야 합니다. 사용자는 객체 소유자이거나 객체에 대한 SELECT, USAGE 또는 ALL 권한이 있어야 합니다.
+ 스키마, 테이블, 일반 뷰, 후기 바인딩 뷰, 구체화된 뷰 및 SQL 사용자 정의 함수(UDF)를 공유할 수 있습니다. 스키마에 객체를 추가하기 전에 먼저 datashare에 스키마를 추가합니다.

  스키마를 추가할 때 Amazon Redshift는 스키마 아래에 모든 객체를 추가하지 않습니다. 명시적으로 스키마를 추가해야 합니다.
+ 공개적으로 액세스할 수 있는 설정이 지정된 상태에서 AWS Data Exchange datashare를 생성하는 것이 좋습니다.
+ 일반적으로 ALTER DATASHARE 문을 사용하여 퍼블릭 액세스 가능성을 끄도록 AWS Data Exchange datashare를 변경하지 않는 것이 좋습니다. 그렇게 하면 클러스터에 공개적으로 액세스할 수 있는 경우 datashare에 액세스할 수 있는 AWS 계정의 액세스 권한이 상실됩니다. 이러한 유형의 변경을 수행하면 AWS Data Exchange의 데이터 제품 조건을 위반할 수 있습니다. 이 권장 사항에 대한 예외는 다음을 참조하세요.

  다음 예는 설정이 해제된 상태에서 AWS Data Exchange datashare가 생성될 경우 오류를 보여줍니다.

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ERROR:  Alter of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value 'c670ba4db22f4b'
  ```

  공개적으로 액세스 가능한 설정을 해제하도록 AWS Data Exchange datashare를 변경하려면 다음 변수를 설정하고 ALTER DATASHARE 문을 다시 실행합니다.

  ```
  SET datashare_break_glass_session_var to 'c670ba4db22f4b';
  ```

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ```

  이 경우 Amazon Redshift는 임의의 일회성 값을 생성하여 AWS Data Exchange datashare에 대해 ALTER DATASHARE SET PUBLICACCESSIBLE FALSE를 허용하도록 세션 변수를 설정합니다.

## 예제
<a name="r_ALTER_DATASHARE_examples"></a>

다음 예에서는 datashare `salesshare`에 `public` 스키마를 추가합니다.

```
ALTER DATASHARE salesshare ADD SCHEMA public;
```

다음 예에서는 datashare `salesshare`에 `public.tickit_sales_redshift` 테이블을 추가합니다.

```
ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift;
```

다음 예에서는 datashare `salesshare`에 모든 테이블을 추가합니다.

```
ALTER DATASHARE salesshare ADD ALL TABLES IN SCHEMA PUBLIC;
```

다음 예에서는 datashare `salesshare`에서 `public.tickit_sales_redshift` 테이블을 제거합니다.

```
ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
```

# ALTER DEFAULT PRIVILEGES
<a name="r_ALTER_DEFAULT_PRIVILEGES"></a>

앞으로 지정된 사용자가 생성하는 객체에 적용될 기본 액세스 권한 세트를 정의합니다. 기본적으로 사용자는 자신의 기본 액세스 권한만 변경할 수 있습니다. 수퍼유저만이 다른 사용자의 기본 권한을 지정할 수 있습니다.

역할, 사용자 또는 사용자 그룹에 기본 권한을 적용할 수 있습니다. 현재 데이터베이스에서 생성되는 모든 객체나 지정된 스키마에서만 생성되는 객체에 대해 기본 권한을 전역적으로 설정할 수 있습니다.

기본 권한은 새 객체에만 적용됩니다. ALTER DEFAULT PRIVILEGES를 실행하면 기존 객체에 대한 권한은 변경되지 않습니다. 데이터베이스 또는 스키마 내에서 사용자가 생성하는 모든 현재 및 미래 객체에 대한 권한을 부여하려면 [범위 지정 권한](https://docs.aws.amazon.com/redshift/latest/dg/t_scoped-permissions.html)을 참조하세요.

데이터베이스 사용자의 기본 권한에 대한 정보를 보려면 [PG\$1DEFAULT\$1ACL](r_PG_DEFAULT_ACL.md) 시스템 카탈로그 테이블을 쿼리하세요.

권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_ALTER_DEFAULT_PRIVILEGES-privileges"></a>

다음은 ALTER DEFAULT PRIVILEGES에 필요한 권한입니다.
+ 수퍼유저
+ ALTER DEFAULT PRIVILEGES 권한을 가진 사용자
+ 자신의 기본 액세스 권한을 변경하는 사용자
+ 액세스할 수 있는 스키마에 대한 권한을 설정하는 사용자

## 구문
<a name="r_ALTER_DEFAULT_PRIVILEGES-synopsis"></a>

```
ALTER DEFAULT PRIVILEGES
    [ FOR USER target_user [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    grant_or_revoke_clause

where grant_or_revoke_clause is one of:

GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	TO { user_name [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE  { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]
```

## 파라미터
<a name="r_ALTER_DEFAULT_PRIVILEGES-parameters"></a>

FOR USER *target\$1user*  <a name="default-for-user"></a>
선택 사항입니다. 기본 권한이 정의되는 사용자의 이름입니다. 수퍼유저만이 다른 사용자의 기본 권한을 지정할 수 있습니다. 기본값은 현재 사용자입니다.

IN SCHEMA *schema\$1name*   <a name="default-in-schema"></a>
선택 사항입니다. IN SCHEMA 절이 나타나면 지정된 *schema\$1name*에 생성되는 새 객체에 지정된 기본 권한이 적용됩니다. 이 경우, ALTER DEFAULT PRIVILEGES의 대상인 사용자 또는 사용자 그룹은 지정된 스키마에 대해 CREATE 권한을 가져야 합니다. 스키마에 특정한 기본 권한이 기존 전역 기본 권한에 추가됩니다. 기본적으로 전체 데이터베이스에 기본 권한이 전역적으로 적용됩니다.

GRANT   <a name="default-grant"></a>
지정된 사용자가 생성하는 모든 새로운 테이블, 뷰, 함수 또는 저장 프로시저에 대해 지정된 사용자나 그룹에게 부여하는 권한 세트입니다. [GRANT](r_GRANT.md) 명령과 함께 사용할 수 있는 GRANT 절을 이용해 동일한 권한과 옵션을 설정할 수 있습니다.

WITH GRANT OPTION   <a name="default-grant-option"></a>
권한을 받은 사용자가 이번에는 똑같은 권한을 다른 사용자에게 허용할 수 있음을 나타내는 절입니다. 그룹 또는 PUBLIC에는 WITH GRANT OPTION을 허용할 수 없습니다.

TO *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*   <a name="default-to"></a>
지정된 기본 권한이 적용될 사용자, 역할 또는 사용자 그룹의 이름입니다.

REVOKE   <a name="default-revoke"></a>
지정된 사용자가 생성하는 모든 새로운 테이블, 함수 또는 저장 프로시저에 대해 지정된 사용자나 그룹에서 취소하는 권한 세트입니다. [REVOKE](r_REVOKE.md) 명령과 함께 사용할 수 있는 REVOKE 절을 이용해 동일한 권한과 옵션을 설정할 수 있습니다.

GRANT OPTION FOR  <a name="default-revoke-option"></a>
 다른 사용자에게 지정된 권한을 허용하는 옵션만 취소하고 권한 자체를 취소하지는 않는 절입니다. 그룹 또는 PUBLIC에서 GRANT OPTION을 취소할 수 없습니다.

FROM *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*  <a name="default-from"></a>
지정된 권한이 기본적으로 취소되는 사용자, 역할 또는 사용자 그룹의 이름입니다.

RESTRICT   <a name="default-restrict"></a>
RESTRICT 옵션은 사용자가 직접 허용한 권한만 취소합니다. 이 값이 기본값입니다.

## 예제
<a name="r_ALTER_DEFAULT_PRIVILEGES-examples"></a>

사용자 그룹 `report_readers`의 사용자가 사용자 `report_admin`에 의해 생성된 모든 테이블과 뷰를 볼 수 있도록 허용하려는 경우를 생각해 봅시다. 이 경우에는 슈퍼 사용자 권한으로 다음 명령을 실행합니다.

```
alter default privileges for user report_admin grant select on tables to group report_readers; 
```

다음 예에서 첫 번째 명령은 사용자가 생성하는 모든 새 테이블에 SELECT 권한을 부여합니다. 새 보기를 생성할 때마다 보기에 권한을 명시적으로 부여하거나 `alter default privileges` 명령을 다시 실행해야 합니다.

```
alter default privileges grant select on tables to public; 
```

다음 예에서는 사용자 자신이 `sales_admin` 스키마에서 생성하는 모든 새로운 테이블과 뷰에 대해 `sales` 사용자 그룹에 INSERT 권한을 허용합니다.

```
alter default privileges in schema sales grant insert on tables to group sales_admin; 
```

다음 예에서는 이전 예의 ALTER DEFAULT PRIVILEGES 명령을 반전합니다.

```
alter default privileges in schema sales revoke insert on tables from group sales_admin;
```

기본적으로, PUBLIC 사용자 그룹은 모든 새로운 사용자 정의 함수에 대한 실행 권한이 있습니다. 새 함수에 대한 `public` 실행 권한을 취소한 다음 `dev_test` 사용자 그룹에만 실행 권한을 허용하려면 다음 명령을 실행합니다.

```
alter default privileges revoke execute on functions from public;
alter default privileges grant execute on functions to group dev_test;
```

# ALTER EXTERNAL SCHEMA
<a name="r_ALTER_EXTERNAL_SCHEMA"></a>

현재 데이터베이스에서 기존 외부 스키마를 변경합니다. 스키마 소유자, 수퍼유저 또는 스키마에 대한 ALTER 권한이 있는 사용자만 스키마를 변경할 수 있습니다. DATA CATALOG, KAFKA 또는 MSK에서 생성된 외부 스키마만 변경할 수 있습니다.

이 스키마의 소유자는 CREATE EXTERNAL SCHEMA 명령의 발행자입니다. 외부 스키마의 소유권을 이전하려면 ALTER SCHEMA를 사용해 소유자를 변경합니다. 다른 사용자 또는 사용자 그룹에 스키마에 대한 액세스를 허용하려면 GRANT 명령을 사용합니다.

외부 테이블에서 권한에 대한 GRANT 또는 REVOKE 명령을 사용할 수 없습니다. 대신에, 외부 스키마에 대한 권한을 허용하거나 취소합니다.

자세한 내용은 다음을 참조하세요.
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [GRANT](r_GRANT.md)
+ [REVOKE](r_REVOKE.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [기존 외부 스키마에 대한 mTLS 인증 사용](materialized-view-streaming-ingestion-mtls.md#materialized-view-streaming-ingestion-mtls-alter)

외부 스키마에 대한 세부 정보를 보려면 SVV\$1EXTERNAL\$1SCHEMAS 시스템 뷰를 쿼리하세요. 자세한 내용은 [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 섹션을 참조하세요.

## 구문
<a name="r_ALTER_EXTERNAL_SCHEMA-synopsis"></a>

```
ALTER EXTERNAL SCHEMA schema_name
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'asm-secret-arn' ]
[ URI 'Kafka bootstrap URL' ]
```

스트리밍 수집 시 사용하는 기존 외부 스키마가 있고 인증을 위해 상호 TLS를 구현하려는 경우 ACM에서 mTLS 인증 및 ACM 인증서 ARN을 지정하는 다음과 같은 명령을 실행할 수 있습니다.

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID';
```

또는 Secrets Manager의 시크릿 ARN을 참조하여 mTLS 인증을 수정할 수 있습니다.

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

다음 예제에서는 ALTER EXTERNAL SCHEMA의 URI를 수정하는 방법을 보여줍니다.

```
ALTER EXTERNAL SCHEMA schema_name  
URI 'lkc-ghidef-67890.centralus.azure.glb.confluent.cloud:9092';
```

다음 예제에서는 ALTER EXTERNAL SCHEMA의 IAM 역할을 수정하는 방법을 보여줍니다.

```
ALTER EXTERNAL SCHEMA schema_name  
IAM_ROLE 'arn:aws:iam::012345678901:role/testrole';
```

## 파라미터
<a name="r_ALTER_EXTERNAL_SCHEMA-parameters"></a>

 IAM\$1ROLE[ default \$1 'SESSION' \$1 'arn:aws:iam::<AWS account-id>:role/<role-name>' ]   
`default` 키워드를 사용하여 Amazon Redshift가 기본값으로 설정된 IAM 역할을 사용하도록 합니다.  
페더레이션형 ID를 사용하여 Amazon Redshift 클러스터에 연결하고 이 명령을 사용하여 생성된 외부 스키마에서 테이블에 액세스하는 경우에 `'SESSION'`을 사용합니다.  
자세한 내용은 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

인증  
스트리밍 수집에 대해 정의된 인증 유형입니다. 인증 유형이 있는 스트리밍 수집은 Apache Kafka, Confluent Cloud, Amazon Managed Streaming for Apache Kafka와 함께 작동합니다. 자세한 내용은 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

AUTHENTICATION\$1ARN  
Amazon Redshift가 Apache Kafka, Confluent Cloud 또는 Amazon Managed Streaming for Apache Kafka(Amazon MSK)를 사용한 mtls 인증에 사용하는 AWS Certificate Manager 인증서의 ARN입니다. ARN은 발급된 인증서를 선택하면 ACM 콘솔에서 사용할 수 있습니다.

SECRET\$1ARN  
AWS Secrets Manager를 사용하여 생성한 지원되는 시크릿의 Amazon 리소스 이름(ARN)입니다. 시크릿의 ARN을 생성하고 검색하는 방법에 대한 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager를 사용하여 시크릿 관리](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) 및 [Amazon Redshift에서 시크릿의 Amazon 리소스 이름(ARN) 검색](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html)을 참조하세요.

URI  
Apache Kafka, Confluent Cloud 또는 Amazon Managed Streaming for Apache Kafka(Amazon MSK) 클러스터의 부트스트랩 URL입니다. 엔드포인트는 Amazon Redshift 클러스터에서 연결(라우팅)할 수 있어야 합니다. 자세한 내용은 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

# ALTER EXTERNAL VIEW
<a name="r_ALTER_EXTERNAL_VIEW"></a>

ALTER EXTERNAL VIEW 명령을 사용하여 외부 뷰를 업데이트하세요. 사용하는 파라미터에 따라 이 뷰를 참조할 수 있는 Amazon Athena 및 Amazon EMR Spark와 같은 다른 SQL 엔진도 영향을 받을 수 있습니다. Data Catalog 뷰에 대한 자세한 내용은 [AWS Glue Data Catalog 뷰](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)를 참조하세요.

## 구문
<a name="r_ALTER_EXTERNAL_VIEW-synopsis"></a>

```
ALTER EXTERNAL VIEW schema_name.view_name
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
[FORCE] { AS (query_definition) | REMOVE DEFINITION }
```

## 파라미터
<a name="r_ALTER_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
AWS Glue 데이터베이스에 연결된 스키마이며, 뷰 이름이 뒤따릅니다.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
뷰를 변경할 때 사용하는 스키마의 표기법입니다. 직접 만든 Glue 데이터베이스인 AWS Glue Data Catalog 또는 직접 만든 외부 스키마를 사용하도록 지정할 수 있습니다. 자세한 내용은 [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 및 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

FORCE  
테이블에서 참조된 객체가 다른 SQL 엔진과 일치하지 않는 경우에도 AWS Lake Formation이 뷰의 정의를 업데이트해야 하는지를 나타냅니다. Lake Formation이 뷰를 업데이트하면 다른 SQL 엔진도 업데이트하기 전까지는 다른 SQL 엔진에 대해서도 해당 뷰가 유효하지 않은 것으로 간주됩니다.

 *AS query\$1definition*   
뷰를 변경하기 위해 Amazon Redshift가 실행하는 SQL 쿼리의 정의입니다.

REMOVE DEFINITION  
뷰를 삭제하고 다시 만들지를 나타냅니다. 뷰를 `PROTECTED`로 표시하려면 삭제한 후 다시 만들어야 합니다.

## 예제
<a name="r_ALTER_EXTERNAL_VIEW-examples"></a>

다음 예시에서는 sample\$1schema.glue\$1data\$1catalog\$1view라는 데이터 카탈로그 뷰를 변경합니다.

```
ALTER EXTERNAL VIEW sample_schema.glue_data_catalog_view
FORCE
REMOVE DEFINITION
```

# ALTER FUNCTION
<a name="r_ALTER_FUNCTION"></a>

함수의 이름을 바꾸거나 소유자를 변경합니다. 함수 이름과 데이터 형식은 모두 필수입니다. 소유자 또는 수퍼유저만 함수 이름을 바꿀 수 있습니다. 수퍼유저만 함수의 소유자를 변경할 수 있습니다.

## 구문
<a name="r_ALTER_FUNCTION-synopsis"></a>

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     RENAME TO new_name
```

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## 파라미터
<a name="r_ALTER_FUNCTION-parameters"></a>

 *function\$1name*   
대체할 함수의 이름입니다. 특정 스키마를 사용하려면 현재 검색 경로에 함수의 이름만 지정하거나, `schema_name.function_name` 형식을 사용합니다.

*py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
선택 사항입니다. Python 사용자 정의 함수의 입력 인수 이름 및 데이터 유형 목록 또는 SQL 사용자 정의 함수의 입력 인수 데이터 유형 목록입니다.

 *new\$1name*   
사용자 정의 함수의 새 이름입니다.

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
사용자 정의 함수의 새 소유자입니다.

## 예제
<a name="r_ALTER_FUNCTION-examples"></a>

다음 예에서는 함수의 이름을 `first_quarter_revenue`에서 `quarterly_revenue`로 변경합니다.

```
ALTER FUNCTION first_quarter_revenue(bigint, numeric, int) 
         RENAME TO quarterly_revenue;
```

다음 예에서는 `quarterly_revenue` 함수의 소유자를 `etl_user`로 바꿉니다.

```
ALTER FUNCTION quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER GROUP
<a name="r_ALTER_GROUP"></a>

사용자 그룹을 변경합니다. 이 명령을 사용하여 그룹에 사용자를 추가하거나, 그룹에서 사용자를 삭제하거나, 그룹의 이름을 바꿀 수 있습니다.

## 구문
<a name="r_ALTER_GROUP-synopsis"></a>

```
ALTER GROUP group_name
{
ADD USER username [, ... ] |
DROP USER username [, ... ] |
RENAME TO new_name
}
```

## 파라미터
<a name="r_ALTER_GROUP-parameters"></a>

 *group\$1name*   
수정할 사용자 그룹의 이름입니다.

ADD   
사용자 그룹에 사용자를 추가합니다.

DROP   
사용자 그룹에서 사용자를 제거합니다.

 * 사용자 이름*   
그룹에 추가하거나 그룹에서 삭제할 사용자의 이름입니다.

RENAME TO   
사용자 그룹의 이름을 바꿉니다. 2개의 밑줄로 시작하는 그룹 이름은 Amazon Redshift 내부 용도로 예약되어 있습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

 *new\$1name*   
사용자 그룹의 새 이름입니다.

## 예제
<a name="r_ALTER_GROUP-examples"></a>

다음 예에서는 DWUSER로 명명된 사용자를 ADMIN\$1GROUP 그룹에 추가합니다.

```
ALTER GROUP admin_group
ADD USER dwuser;
```

다음 예에서는 그룹 ADMIN\$1GROUP의 이름을 ADMINISTRATORS로 바꿉니다.

```
ALTER GROUP admin_group
RENAME TO administrators;
```

다음 예에서는 ADMIN\$1GROUP 그룹에 두 명의 사용자를 추가합니다.

```
ALTER GROUP admin_group
ADD USER u1, u2;
```

다음 예에서는 ADMIN\$1GROUP 그룹에서 두 명의 사용자를 삭제합니다.

```
ALTER GROUP admin_group
DROP USER u1, u2;
```

# ALTER IDENTITY PROVIDER
<a name="r_ALTER_IDENTITY_PROVIDER"></a>

자격 증명 공급자를 변경하여 새 파라미터 및 값을 할당합니다. 이 명령을 실행하면 새 값이 할당되기 전에 이전에 설정한 모든 파라미터 값이 삭제됩니다. 슈퍼 사용자만 자격 증명 공급자를 변경할 수 있습니다.

## 구문
<a name="r_ALTER_IDENTITY_PROVIDER-synopsis"></a>

```
ALTER IDENTITY PROVIDER identity_provider_name
[PARAMETERS parameter_string]
[NAMESPACE namespace]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
[DISABLE | ENABLE]
```

## 파라미터
<a name="r_ALTER_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
새 자격 증명 공급자 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

 *parameter\$1string*   
특정 자격 증명 공급자에 필요한 파라미터와 값이 포함된 올바른 형식의 JSON 객체를 포함하는 문자열입니다.

 * 네임스페이스*   
조직 네임스페이스입니다.

 *iam\$1role*   
IAM Identity Center에 대한 연결 권한을 제공하는 IAM 역할입니다. 이 파라미터는 ID 제공업체 유형이 AWSIDC인 경우에만 적용됩니다.

 *auto\$1create\$1roles*   
역할 자동 생성 기능을 활성화하거나 비활성화합니다. 값이 TRUE이면 Amazon Redshift가 역할 자동 생성 기능을 활성화합니다. 값이 FALSE이면 Amazon Redshift가 역할 자동 생성 기능을 비활성화합니다. 이 파라미터의 값을 지정하지 않으면 Amazon Redshift가 다음 로직을 사용하여 값을 결정합니다.  
+  `AUTO_CREATE_ROLES`를 제공했지만 값을 지정하지 않은 경우 값이 TRUE로 설정됩니다.
+  `AUTO_CREATE_ROLES`를 제공하지 않고 ID 제공업체가 AWSIDC인 경우 값이 FALSE로 설정됩니다.
+  `AUTO_CREATE_ROLES`를 제공하지 않고 ID 제공업체가 Azure인 경우 값이 TRUE로 설정됩니다.
그룹을 포함하려면 `INCLUDE`를 지정합니다. 기본값은 비어 있습니다. 즉, `AUTO_CREATE_ROLES`가 켜져 있는 경우 모든 그룹이 포함됩니다.  
그룹을 제외하려면 `EXCLUDE`를 지정합니다. 기본값은 비어 있습니다. 즉, `AUTO_CREATE_ROLES`가 켜져 있는 경우 그룹을 제외하지 않습니다.

 *filter\$1pattern*   
그룹 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.  
*filter\$1pattern*은 다음 문자를 지원합니다.  
+  대문자 및 소문자 알파벳 문자(A\$1Z 및 a\$1z) 
+  숫자(0\$19) 
+  다음 특수 문자: 

  ```
  _ % ^ * + ? { } , $
  ```

 *DISABLE 또는 ENABLE*   
ID 제공업체를 켜거나 끕니다. 기본값은 ENABLE입니다.

## 예제
<a name="r_ALTER_IDENTITY_PROVIDER-examples"></a>

다음 예에서는 *oauth\$1standard*라는 자격 증명 공급자를 변경합니다. 이는 특히 Microsoft Azure AD가 ID 제공업체인 경우에 적용됩니다.

```
ALTER IDENTITY PROVIDER oauth_standard
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

다음 샘플은 ID 제공업체 네임스페이스를 설정하는 방법을 보여줍니다. 이는 Microsoft Azure AD(이전 샘플과 같은 명령문을 따르는 경우) 또는 다른 ID 제공업체에 적용될 수 있습니다. 또한 관리형 애플리케이션을 통해 연결을 설정한 경우 기존 Amazon Redshift 프로비저닝된 클러스터 또는 Amazon Redshift Serverless 작업 그룹을 IAM Identity Center에 연결하는 경우에도 적용할 수 있습니다.

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
NAMESPACE 'MYCO';
```

다음 샘플은 IAM 역할을 설정하며 IAM Identity Center와의 Redshift 통합을 구성하는 사용 사례에서 작동합니다.

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
IAM_ROLE 'arn:aws:iam::123456789012:role/myadministratorrole';
```

Redshift에서 IAM Identity Center에 대한 연결을 설정하는 방법에 대한 자세한 내용은 [Redshift를 IAM Identity Center와 연결하여 사용자에게 Single Sign-On 경험을 제공합니다](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)를 참조하세요.

**ID 제공업체 비활성화**

다음 샘플은 ID 제공업체를 비활성화하는 방법을 보여줍니다. 비활성화되면 ID 제공업체의 페더레이션 사용자는 클러스터가 다시 활성화될 때까지 클러스터에 로그인할 수 없습니다.

```
ALTER IDENTITY PROVIDER "redshift-idc-app" DISABLE;
```

# 마스킹 정책 변경
<a name="r_ALTER_MASKING_POLICY"></a>

기존 동적 데이터 마스킹 정책을 변경합니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md)(동적 데이터 마스킹(미리 보기)을 참조하세요.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 마스킹 정책을 변경할 수 있습니다.

## 구문
<a name="r_ALTER_MASKING_POLICY-synopsis"></a>

```
ALTER MASKING POLICY
{ policy_name | database_name.policy_name }
USING (masking_expression);
```

## 파라미터
<a name="r_ALTER_MASKING_POLICY-parameters"></a>

*policy\$1name*   
 마스킹 정책의 이름입니다. 이는 데이터베이스에 이미 있는 마스킹 정책의 이름이어야 합니다.

database\$1name  
정책이 생성되는 데이터베이스의 이름입니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

*masking\$1expression*  
대상 열을 변환하는 데 사용되는 SQL 표현식입니다. 문자열 조작 함수와 같은 데이터 조작 함수를 사용하거나 SQL, Python 또는 AWS Lambda로 작성된 사용자 정의 함수와 함께 작성할 수 있습니다.  
 표현식은 원래 표현식의 입력 열 및 데이터 유형과 일치해야 합니다. 예를 들어 원래 마스킹 정책의 입력 열이 `sample_1 FLOAT` 및 `sample_2 VARCHAR(10)`인 경우 세 번째 열을 사용하거나 정책이 FLOAT 및 BOOLEAN을 사용하도록 마스킹 정책을 변경할 수 없습니다. 상수를 마스킹 표현식으로 사용하는 경우 입력 유형과 일치하는 유형으로 상수를 명시적으로 변환해야 합니다.  
 마스킹 표현식에서 사용하는 모든 사용자 정의 함수에 대한 USAGE 권한이 있어야 합니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 ALTER MASKING POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

# ALTER MATERIALIZED VIEW
<a name="r_ALTER_MATERIALIZED_VIEW"></a>

구체화된 뷰의 속성을 변경합니다.

## 구문
<a name="r_ALTER_MATERIALIZED_VIEW-synopsis"></a>

```
ALTER MATERIALIZED VIEW mv_name
{
AUTO REFRESH { YES | NO } 
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [FOR DATASHARES]
};
```

## 파라미터
<a name="r_ALTER_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
변경할 구체화된 뷰의 이름입니다.

AUTO REFRESH \$1 YES \$1 NO \$1  
구체화된 뷰의 자동 새로 고침을 켜거나 끄는 절입니다. 구체화된 뷰의 자동 새로 고침에 대한 자세한 내용은 [구체화된 뷰 새로 고침](materialized-view-refresh.md) 섹션을 참조하세요.

ALTER DISTSTYLE ALL  
관계의 기존 분산 스타일을 `ALL`로 변경하는 절입니다. 다음을 고려하세요.  
+ ALTER DISTSTYLE, ALTER SORTKEY, VACUUM은 동일한 관계에서 동시에 실행할 수 없습니다.
  + VACUUM이 현재 실행 중인 경우 ALTER DISTSTYLE ALL을 실행하면 오류가 반환됩니다.
  + ALTER DISTSTYLE ALL이 실행 중인 경우 백그라운드 VACCUM이 관계에서 시작되지 않습니다.
+ 인터리브 정렬 키 및 임시 테이블이 있는 관계에는 ALTER DISTYLE ALL 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 관계는 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE ALL에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.

ALTER DISTSTYLE EVEN  
관계의 기존 분산 스타일을 `EVEN`으로 변경하는 절입니다. 다음을 고려하세요.  
+ ALTER DISTSYTLE, ALTER SORTKEY, VACUUM은 동일한 관계에서 동시에 실행할 수 없습니다.
  + VACUUM이 현재 실행 중인 경우 ALTER DISTSTYLE EVEN을 실행하면 오류가 반환됩니다.
  + ALTER DISTSTYLE EVEN이 실행 중인 경우 백그라운드 VACCUM이 관계에서 시작되지 않습니다.
+ 인터리브 정렬 키 및 임시 테이블이 있는 관계에는 ALTER DISTYLE EVEN 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 관계는 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE EVEN에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.

ALTER DISTKEY *column\$1name* 또는 ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
관계의 배포 키로 사용되는 열을 변경하는 절입니다. 다음을 고려하세요.  
+ VACUUM 및 ALTER DISTKEY는 동일한 관계에서 동시에 실행할 수 없습니다.
  + VACUUM이 이미 실행 중인 경우 ALTER DISTKEY가 오류를 반환합니다.
  + ALTER DISTKEY가 실행 중인 경우 백그라운드 VACCUM이 관계에서 시작되지 않습니다.
  + ALTER DISTKEY가 실행 중인 경우 포그라운드 VACCUM이 오류를 반환합니다.
+ 관계에서 한 번에 하나의 ALTER DISTKEY 명령만 실행할 수 있습니다.
+ 인터리브 정렬 키가 있는 관계에는 ALTER DISTKEY 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 관계는 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE KEY를 지정할 때 데이터는 DISTKEY 열에 있는 값을 기준으로 배포됩니다. DISTSTYLE에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.

ALTER DISTSTYLE AUTO  
관계의 기존 분산 스타일을 AUTO로 변경하는 절입니다.  
배포 스타일을 AUTO로 변경하면 관계의 배포 스타일이 다음과 같이 설정됩니다.  
+ DISTSTYLE ALL이 있는 작은 관계는 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE EVEN이 있는 작은 관계는 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE KEY가 있는 작은 관계는 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE ALL이 있는 큰 관계는 AUTO(EVEN)로 변환됩니다.
+ DISTSTYLE EVEN이 있는 큰 관계는 AUTO(EVEN)로 변환됩니다.
+ DISTSTYLE KEY가 있는 큰 관계는 AUTO(KEY)로 변환되고 DISTKEY는 보존됩니다. 이 경우 Amazon Redshift는 관계를 변경하지 않습니다.
새로운 배포 스타일 또는 키가 쿼리 성능을 향상시킬 것이라고 판단되면 Amazon Redshift는 향후 관계의 배포 스타일이나 키를 변경할 수 있습니다. 예를 들어 Amazon Redshift는 DISTSTYLE이 AUTO(KEY)인 관계를 AUTO(EVEN)로 또는 그 반대로 변환할 수 있습니다. 데이터 재배포 및 잠금을 포함하여 배포 키가 변경될 때의 동작에 대한 자세한 내용은 [Amazon Redshift Advisor 권장 사항](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation)으로 이동하세요.  
DISTSTYLE AUTO에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.  
관계의 배포 스타일을 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요. 관계에 대한 Amazon Redshift Advisor 권장 사항을 보려면 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md) 섹션을 참조하세요. Amazon Redshift에서 수행한 작업을 보려면 SVL\$1AUTO\$1WORKER\$1ACTION 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md) 섹션을 참조하세요.

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
관계에 사용되는 정렬 키를 변경하거나 추가하는 절입니다. 임시 테이블에는 ALTER SORTKEY가 지원되지 않습니다.  
정렬 키를 변경하면 새 정렬 키 또는 원래 정렬 키에 있는 열의 압축 인코딩이 변경될 수 있습니다. 관계에 대해 명시적으로 정의된 인코딩이 없는 경우 Amazon Redshift는 다음과 같이 압축 인코딩을 자동으로 할당합니다.  
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL 또는 DOUBLE PRECISION 데이터 형식으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR 또는 VARCHAR로 정의된 열에는 LZO 압축이 할당됩니다.
다음을 고려하세요.  
+ 관계당 정렬 키에 최대 400개의 열을 정의할 수 있습니다.
+ 인터리브 정렬 키를 복합 정렬 키 또는 정렬 키 없음으로 변경할 수 있습니다. 그러나 복합 정렬 키를 인터리브 정렬 키로 변경할 수는 없습니다.
+ 정렬 키가 이전에 AUTO로 정의된 경우 관계는 더 이상 자동 테이블 최적화의 후보가 아닙니다.
+ Amazon Redshift는 정렬 키로 정의된 열에 대해 RAW 인코딩(압축 없음)을 사용하는 것이 좋습니다. 열을 변경하여 정렬 키로 선택하면 열의 압축이 RAW 압축(압축 없음)으로 변경됩니다. 이렇게 하면 관계에 필요한 스토리지 양이 늘어날 수 있습니다. 관계 크기 증가량은 특정 관계 정의와 관계 내용에 따라 다릅니다. 압축에 대한 자세한 내용은 [압축 인코딩](c_Compression_encodings.md) 섹션으로 이동하세요.
데이터가 관계에 로드되면 데이터는 정렬 키의 순서로 로드됩니다. 정렬 키를 변경하면 Amazon Redshift는 데이터를 재정렬합니다. SORTKEY에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.

ALTER SORTKEY AUTO  
대상 관계의 정렬 키를 AUTO로 변경하거나 추가하는 절입니다. 임시 테이블에는 ALTER SORTKEY AUTO가 지원되지 않습니다.  
정렬 키를 AUTO로 변경하면 Amazon Redshift는 관계의 기존 정렬 키를 보존합니다.  
새로운 정렬 키가 쿼리 성능을 향상시킬 것이라고 판단되면 Amazon Redshift는 향후 관계의 정렬 키를 변경할 수 있습니다.  
SORTKEY AUTO에 대한 자세한 내용은 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md) 섹션으로 이동하세요.  
관계의 정렬 키를 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요. 관계에 대한 Amazon Redshift Advisor 권장 사항을 보려면 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md) 섹션을 참조하세요. Amazon Redshift에서 수행한 작업을 보려면 SVL\$1AUTO\$1WORKER\$1ACTION 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md) 섹션을 참조하세요.

ALTER SORTKEY NONE  
대상 관계의 정렬 키를 제거하는 절입니다.  
정렬 키가 이전에 AUTO로 정의된 경우 관계는 더 이상 자동 테이블 최적화의 후보가 아닙니다.

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
관계에 대한 행 수준 보안을 켜거나 끄는 절입니다.  
관계에 대해 행 수준 보안이 켜 있으면 행 수준 보안 정책에서 액세스를 허용하는 행만 읽을 수 있습니다. 관계에 대한 액세스 권한을 부여하는 정책이 없으면 관계에서 행을 볼 수 없습니다. 수퍼유저 및 `sys:secadmin` 역할을 가진 사용자 또는 역할만 ROW LEVEL SECURITY 절을 설정할 수 있습니다. 자세한 내용은 [행 수준 보안](t_rls.md) 섹션을 참조하세요.  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  관계에 대해 행 수준 보안 정책의 접속사 유형을 선택할 수 있도록 하는 절입니다. 여러 행 수준 보안 정책이 관계에 연결된 경우 정책을 AND 또는 OR 절과 결합할 수 있습니다. 기본적으로 Amazon Redshift는 RLS 정책을 AND 절과 결합합니다. `sys:secadmin` 역할이 있는 슈퍼 사용자, 사용자 또는 역할은 이 절을 사용하여 관계에 대한 행 수준 보안 정책의 접속사 유형을 정의할 수 있습니다. 자세한 내용은 [사용자별로 여러 정책 결합](t_rls_combine_policies.md) 섹션을 참조하세요.
+ FOR DATASHARES

   RLS로 보호되는 관계에 데이터 공유를 통해 액세스할 수 있는지를 결정하는 절입니다. 기본적으로 RLS로 보호되는 관계는 데이터 공유를 통해 액세스할 수 없습니다. ALTER MATERIALIZED VIEW ROW LEVEL SECURITY 명령을 이 절과 함께 실행하면 관계의 데이터 공유 접근성 속성에만 영향을 줍니다. ROW LEVEL SECURITY 속성은 변경되지 않습니다.

   RLS로 보호되는 관계에 데이터 공유를 통해 액세스할 수 있도록 설정하면 소비자 측 데이터 공유 데이터베이스에서 해당 관계에 행 수준 보안이 적용되지 않습니다. 이 관계는 생산자 측에서 해당 RLS 속성을 유지합니다.

## 예제
<a name="r_ALTER_MATERIALIZED_VIEW-examples"></a>

다음 예에서는 `tickets_mv` 구체화된 뷰를 자동으로 새로 고칠 수 있게 합니다.

```
ALTER MATERIALIZED VIEW tickets_mv AUTO REFRESH YES
```

# ALTER MATERIALIZED VIEW에 대한 DISTSTYLE 및 SORTKEY 예시
<a name="r_ALTER_MATERIALIZED_VIEW-DISTSTYLE-SORTKEY-examples"></a>

이 주제의 예제는 ALTER MATERIALIZED VIEW를 사용하여 DISTSTYLE 및 SORTKEY 변경을 수행하는 방법을 보여줍니다.

다음 예제 쿼리는 샘플 기본 테이블을 사용하여 DISTSTYLE KEY DISTKEY 열을 변경하는 방법을 보여줍니다.

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER diststyle KEY distkey inv_warehouse_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER distkey inv_item_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

구체화된 뷰를 DISTSTYLE ALL로 변경:

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER MATERIALIZED VIEW inventory ALTER diststyle ALL;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

다음 명령은 샘플 기본 테이블을 사용한 ALTER MARTIALIZED VIEW SORTKEY 예시를 보여줍니다.

```
CREATE TABLE base_inventory (c0 int, c1 int);

INSERT INTO base_inventory VALUES(1,1);

CREATE materialized VIEW inventory interleaved sortkey(c0, c1) AS SELECT * FROM base_inventory;
SELECT "table", sortkey1 FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0, c1);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey NONE;
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

# ALTER RLS POLICY
<a name="r_ALTER_RLS_POLICY"></a>

테이블의 기존 행 수준 보안 정책을 변경합니다.

슈퍼유저와 `sys:secadmin` 역할이 부여된 사용자 또는 역할은 정책을 변경할 수 있습니다.

## 구문
<a name="r_ALTER_RLS_POLICY-synopsis"></a>

```
ALTER RLS POLICY
{ policy_name | database_name.policy_name }
USING ( using_predicate_exp );
```

## 파라미터
<a name="r_ALTER_RLS_POLICY-parameters"></a>

 *policy\$1name*   
정책의 이름입니다.

database\$1name  
정책이 생성되는 데이터베이스의 이름입니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

USING (* using\$1predicate\$1exp *)  
쿼리의 WHERE 절에 적용되는 필터를 지정합니다. Amazon Redshift는 쿼리 수준 사용자 조건자를 지정하기 전에 정책 조건자를 적용합니다. 예를 들어 **current\$1user = ‘joe’ and price > 10**은 가격이 10 USD보다 큰 레코드만 Joe에게 표시하도록 제한합니다.  
표현식에서는 이름이 policy\$1name인 정책을 생성하는 데 사용된 CREATE RLS POLICY 명령문의 WITH 절에 선언된 변수에 액세스할 수 있습니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 ALTER RLS POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

## 예제
<a name="r_ALTER_RLS_POLICY-examples"></a>

다음 예에서는 RLS 정책을 변경합니다.

```
-- First create an RLS policy that limits access to rows where catgroup is 'concerts'.
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'concerts');

-- Then, alter the RLS policy to only show rows where catgroup is 'piano concerts'.
ALTER RLS POLICY policy_concerts
USING (catgroup = 'piano concerts');
```

# 역할 변경
<a name="r_ALTER_ROLE"></a>

역할의 이름을 바꾸거나 소유자를 변경합니다. Amazon Redshift 시스템 정의 역할 목록은 [Amazon Redshift 시스템 정의 역할](r_roles-default.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_ALTER_ROLE-privileges"></a>

ALTER ROLE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ ALTER USER 권한이 있는 사용자

## 구문
<a name="r_ALTER_ROLE-synopsis"></a>

```
ALTER ROLE role [ WITH ]
  { { RENAME TO role } | { OWNER TO user_name } }[, ...]
  [ EXTERNALID TO external_id ]
```

## 파라미터
<a name="r_ALTER_ROLE-parameters"></a>

 *역할*   
변경할 역할의 이름.

RENAME TO  
역할의 새 이름.

*user\$1name* 소유자  
역할의 새 소유자.

EXTERNALID TO *external\$1id*  
자격 증명 공급자와 연결된 역할의 새 외부 ID입니다. 자세한 내용은 [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)(Amazon Redshift용 네이티브 자격 증명 공급자(IdP) 페더레이션)를 참조하세요.

## 예제
<a name="r_ALTER_ROLE-examples"></a>

다음 예에서는 역할의 이름을 `sample_role1`에서 `sample_role2`로 변경합니다.

```
ALTER ROLE sample_role1 RENAME TO sample_role2;
```

다음 예에서는 역할의 소유자를 바꿉니다.

```
ALTER ROLE sample_role1 WITH OWNER TO user1
```

ALTER ROLE의 구문은 다음과 같이 ALTER PROCEDURE와 유사합니다.

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

다음 예에서는 프로시저의 소유자를 `etl_user`로 변경합니다.

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

다음 예에서는 자격 증명 공급자와 연결된 새 외부 ID로 역할 `sample_role1`을 업데이트합니다.

```
ALTER ROLE sample_role1 EXTERNALID TO "XYZ456";
```

# ALTER PROCEDURE
<a name="r_ALTER_PROCEDURE"></a>

프로시저의 이름을 바꾸거나 소유자를 변경합니다. 프로시저 이름과 데이터 형식 또는 서명은 모두 필수입니다. 소유자 또는 수퍼유저만 프로시저의 이름을 바꿀 수 있습니다. 수퍼유저만 프로시저의 소유자를 변경할 수 있습니다.

## 구문
<a name="r_ALTER_PROCEDURE-synopsis"></a>

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    RENAME TO new_name
```

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## 파라미터
<a name="r_ALTER_PROCEDURE-parameters"></a>

 *sp\$1name*   
변경할 프로시저의 이름입니다. 특정 스키마를 사용하려면 현재 검색 경로에 프로시저의 이름만 지정하거나, `schema_name.sp_procedure_name` 형식을 사용하세요.

*[argname] [argmode] argtype*   
인수 이름, 인수 모드 및 데이터 형식의 목록입니다. 입력 데이터 형식만 필수입니다. 입력 데이터 형식은 저장 프로시저를 식별하는 데 사용됩니다. 모드와 함께 입력 및 출력 파라미터를 포함하여 프로시저를 생성하는 데 사용된 전체 서명을 제공할 수도 있습니다.

 *new\$1name*   
저장 프로시저의 새 이름입니다.

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
저장 프로시저의 새 소유자입니다.

## 예제
<a name="r_ALTER_PROCEDURE-examples"></a>

다음 예제에서는 프로시저의 이름을 `first_quarter_revenue`에서 `quarterly_revenue`로 변경합니다.

```
ALTER PROCEDURE first_quarter_revenue(volume INOUT bigint, at_price IN numeric,
 result OUT int) RENAME TO quarterly_revenue;
```

이 예는 다음과 동일합니다.

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

다음 예에서는 프로시저의 소유자를 `etl_user`로 변경합니다.

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER SCHEMA
<a name="r_ALTER_SCHEMA"></a>

기존 스키마의 정의를 변경합니다. 스키마의 소유자를 변경하거나 스키마의 이름을 바꾸려면 이 명령을 사용하세요. 예를 들어, 기존 스키마의 새 버전을 만들 계획인 경우 그 스키마의 백업 복사본을 보존하기 위해 스키마의 이름을 바꿉니다. 스키마에 대한 자세한 내용은 [CREATE SCHEMA](r_CREATE_SCHEMA.md) 섹션을 참조하세요.

구성된 스키마 할당량을 보려면 [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md) 섹션을 참조하세요.

스키마 할당량이 초과된 레코드를 보려면 [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_ALTER_SCHEMA-privileges"></a>

ALTER SCHEMA에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ ALTER SCHEMA 권한이 있는 사용자
+ 스키마 소유자

스키마 이름을 변경할 때는 저장 프로시저나 구체화된 뷰와 같이 이전 이름을 사용하는 객체를 새 이름을 사용하도록 업데이트해야 한다는 점에 유의하세요.

## 구문
<a name="r_ALTER_SCHEMA-synopsis"></a>

```
ALTER SCHEMA schema_name
{
RENAME TO new_name |
OWNER TO new_owner |
QUOTA { quota [MB | GB | TB] | UNLIMITED }
}
```

## 파라미터
<a name="r_ALTER_SCHEMA-parameters"></a>

 *schema\$1name*   
변경할 데이터베이스 스키마의 이름입니다.

RENAME TO   
스키마의 이름을 바꾸는 절입니다.

 *new\$1name*   
스키마의 새 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

OWNER TO   
스키마의 소유자를 변경하는 절입니다.

 *new\$1owner*   
스키마의 새 소유자입니다.

QUOTA   
지정된 스키마에서 사용할 수 있는 최대 디스크 공간 양입니다. 이 공간은 지정된 스키마 아래에 있는 모든 테이블의 총체적 크기입니다. Amazon Redshift는 선택한 값을 메가바이트로 변환합니다. 값을 지정하지 않으면 기가바이트가 기본 측정 단위입니다.  
스키마 할당량 구성에 대한 자세한 내용은 [CREATE SCHEMA](r_CREATE_SCHEMA.md) 섹션을 참조하세요.

## 예제
<a name="r_ALTER_SCHEMA-examples"></a>

다음 예에서는 SALES 스키마의 이름을 US\$1SALES로 바꿉니다.

```
alter schema sales
rename to us_sales;
```

다음 예에서는 US\$1SALES 스키마의 소유권을 사용자 DWUSER에게 제공합니다.

```
alter schema us_sales
owner to dwuser;
```

다음 예에서는 할당량을 300GB로 변경하고 할당량을 제거합니다.

```
alter schema us_sales QUOTA 300 GB;
alter schema us_sales QUOTA UNLIMITED;
```

# ALTER SYSTEM
<a name="r_ALTER_SYSTEM"></a>

Amazon Redshift 클러스터 또는 Redshift Serverless 작업 그룹에 대한 시스템 수준 구성 옵션을 변경합니다.

## 필수 권한
<a name="r_ALTER_SYSTEM-privileges"></a>

다음 사용자 유형 중 하나가 ALTER SYSTEM 명령을 실행할 수 있습니다.
+ 수퍼유저
+ 관리자

## 구문
<a name="r_ALTER_SYSTEM-synopsis"></a>

```
ALTER SYSTEM SET system-level-configuration = {true| t | on | false | f | off}
```

## 파라미터
<a name="r_ALTER_SYSTEM-parameters"></a>

 *시스템 수준 구성*   
시스템 수준 구성입니다. 유효한 값: `data_catalog_auto_mount` 및 `metadata_security`.

\$1true\$1 t \$1 on \$1 false \$1 f \$1 off\$1   
시스템 수준 구성을 활성화 또는 비활성화할 값입니다. `true`,`t` 또는`on`은 구성을 활성화함을 나타냅니다. `false`,`f` 또는`off`는 구성을 비활성화함을 나타냅니다.

## 사용 노트
<a name="r_ALTER_SYSTEM-usage-notes"></a>

프로비저닝된 클러스터의 경우 `data_catalog_auto_mount`의 변경 사항은 클러스터를 다음에 재부팅할 때 적용됩니다. 자세한 내용은 **Amazon Redshift 관리 안내서의 [클러스터 재부팅](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#reboot-cluster) 섹션을 참조하세요.

서버가 없는 작업 그룹의 경우 `data_catalog_auto_mount` 변경 사항이 즉시 적용되지 않습니다.

## 예제
<a name="r_ALTER_SYSTEM-examples"></a>

다음 예제에서는 AWS Glue Data Catalog 자동 마운트를 활성화합니다.

```
ALTER SYSTEM SET data_catalog_auto_mount = true;
```

다음 예시에서는 메타데이터 보안을 활성화합니다.

```
ALTER SYSTEM SET metadata_security = true;
```

### 기본 ID 네임스페이스 설정
<a name="r_ALTER_SYSTEM-identity"></a>

이 예는 ID 제공업체 작업과 관련된 것입니다. Redshift를 IAM Identity Center 및 ID 제공업체와 통합하여 Redshift 및 기타 AWS 서비스에 대한 ID 관리를 중앙 집중화할 수 있습니다.

다음 샘플은 시스템의 기본 ID 네임스페이스를 설정하는 방법을 보여줍니다. 이렇게 하면 각 ID의 접두사로 네임스페이스를 포함할 필요가 없기 때문에 이후에 GRANT 및 CREATE 문을 더 간단하게 실행할 수 있습니다.

```
ALTER SYSTEM SET default_identity_namespace = 'MYCO';
```

이 명령을 실행한 후 다음과 같은 명령문을 실행할 수 있습니다.

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
               
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

기본 ID 네임스페이스를 설정하면 각 ID에 접두사로 네임스페이스가 필요 없게 되는 효과가 있습니다. 이 예제에서는 `alice`가 `MYCO:alice`로 대체됩니다. 이는 ID가 포함된 모든 경우에 발생합니다. Redshift에서 ID 제공업체를 사용하는 방법에 대한 자세한 내용은 [Redshift를 IAM Identity Center와 연결하여 사용자에게 Single Sign-On 경험을 제공합니다](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)를 참조하세요.

IAM Identity Center를 사용한 Redshift 구성과 관련된 설정에 대한 자세한 내용은 [SET](r_SET.md) 및 [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md) 섹션을 참조하세요.

# ALTER TABLE
<a name="r_ALTER_TABLE"></a>

이 명령은 Amazon Redshift 테이블 또는 Amazon Redshift Spectrum 외부 테이블의 정의를 변경합니다. 이 명령은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 또는 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)에서 설정한 값과 속성을 업데이트합니다. 행 수준 보안(RLS)을 위해 뷰에서 ALTER TABLE을 사용할 수 있습니다.

트랜잭션 블록(BEGIN ... END) 내의 외부 테이블에서 ALTER TABLE을 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

ALTER TABLE은 ALTER TABLE 작업 관련한 트랜잭션이 완료될 때까지 테이블 읽기 및 쓰기 을 잠금 설정합니다. 다만 변경하는 동안 테이블에서 데이터를 쿼리하거나 다른 작업을 수행할 수 있다고 설명서에 나와 있는 경우는 예외입니다.

## 필수 권한
<a name="r_ALTER_TABLE-privileges"></a>

명령이 성공하려면 테이블을 변경하는 사용자에게 적절한 권한이 있어야 합니다. ALTER TABLE 명령에 따라 다음 권한 중 하나가 필요합니다.
+ 수퍼유저
+ ALTER TABLE 권한이 있는 사용자
+ 스키마에 대한 USAGE 권한이 있는 테이블 소유자

## 구문
<a name="r_ALTER_TABLE-synopsis"></a>

```
ALTER TABLE table_name
{
ADD table_constraint
| DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
| OWNER TO new_owner
| RENAME TO new_name
| RENAME COLUMN column_name TO new_name
| ALTER COLUMN column_name TYPE updated_varchar_data_type_size
| ALTER COLUMN column_name ENCODE new_encode_type
| ALTER COLUMN column_name ENCODE encode_type,
| ALTER COLUMN column_name ENCODE encode_type, .....;
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ALTER ENCODE AUTO
| ADD [ COLUMN ] column_name column_type
  [ DEFAULT default_expr ]
  [ ENCODE encoding ]
  [ NOT NULL | NULL ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ] |
| DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] 
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [ FOR DATASHARES ]
| MASKING { ON | OFF } FOR DATASHARES }

where table_constraint is:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] )
| PRIMARY KEY ( column_name [, ... ] )
| FOREIGN KEY (column_name [, ... ] )
   REFERENCES  reftable [ ( refcolumn ) ]}

The following options apply only to external tables:

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
| SET FILE FORMAT format |
| SET TABLE PROPERTIES ('property_name'='property_value')
| PARTITION ( partition_column=partition_value [, ...] )
  SET LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
| ADD [IF NOT EXISTS]
    PARTITION ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
    [, ... ]
| DROP PARTITION ( partition_column=partition_value [, ...] )
```

ALTER TABLE 명령을 실행하는 시간을 줄이려면 ALTER TABLE 명령의 일부 절을 결합할 수 있습니다.

Amazon Redshift는 ALTER TABLE 절의 다음 조합을 지원합니다.

```
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTKEY column_Id;
ALTER TABLE tablename ALTER DISTKEY column_Id, ALTER SORTKEY (column_list);
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTSTYLE ALL;
ALTER TABLE tablename ALTER DISTSTYLE ALL, ALTER SORTKEY (column_list);
```

## 파라미터
<a name="r_ALTER_TABLE-parameters"></a>

 *table\$1name*   
수정할 테이블 이름. 특정 스키마를 사용하려면 테이블의 이름만 지정하거나 *schema\$1name.table\$1name* 형식을 사용하세요. 외부 테이블은 외부 스키마 이름으로 정규화해야 합니다. ALTER TABLE 문을 사용하여 뷰의 이름을 바꾸거나 그 소유자를 변경하려는 경우 뷰 이름을 지정할 수도 있습니다. 테이블 이름의 최대 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 최대 4바이트까지 UTF-8 멀티바이트 문자를 사용할 수 있습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

ADD *table\$1constraint*   
테이블에 지정된 제약 조건을 추가하는 절입니다. 유효한 *table\$1constraint* 값에 대한 설명은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.  
Null 허용 열에 기본 키 제약 조건을 추가할 수 없습니다. 이 열이 원래 NOT NULL 제약 조건으로 생성된 경우에는 기본 키 제약 조건을 추가할 수 있습니다.

DROP CONSTRAINT *constraint\$1name*   
테이블에서 명명된 제약 조건을 삭제하는 절입니다. 제약 조건을 삭제하려면 제약 조건 유형이 아니라 제약 조건 이름을 지정하세요. 테이블 제약 조건 이름을 보려면 다음 쿼리를 실행합니다.  

```
select constraint_name, constraint_type
from information_schema.table_constraints;
```

RESTRICT   
지정된 제약 조건만 제거하는 절입니다. RESTRICT는 DROP CONSTRAINT에 대한 옵션입니다. RESTRICT는 CASCADE와 함께 사용할 수 없습니다.

CASCADE   
지정된 제약 조건과 그 제약 조건에 종속된 모든 것을 제거하는 절입니다. CASCADE는 DROP CONSTRAINT에 대한 옵션입니다. CASCADE는 RESTRICT와 함께 사용할 수 없습니다.

OWNER TO *new\$1owner*   
테이블(또는 뷰)의 소유자를 *new\$1owner* 값으로 변경하는 절입니다.

RENAME TO *new\$1name*   
테이블(또는 뷰)의 이름을 *new\$1name*에 지정된 값으로 바꾸는 절입니다. 최대 테이블 이름 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다.  
영구 테이블 이름을 '\$1'로 시작하는 이름으로 바꿀 수 없습니다. '\$1'로 시작하는 테이블 이름은 임시 테이블을 나타냅니다.  
외부 테이블의 이름을 변경할 수 없습니다.

ALTER COLUMN *column\$1name* TYPE *updated\$1varchar\$1data\$1type\$1size*   
VARCHAR 데이터 형식으로 정의된 열 크기를 변경하는 절입니다. 이 절은 VARCHAR 데이터 유형의 크기 변경만 지원합니다. 다음 제한을 고려하세요.  
+ 압축 인코딩 BYTEDICT, RUNLENGTH, TEXT255 또는 TEXT32K를 사용하는 열은 변경할 수 없습니다.
+ 기존 데이터의 최대 크기보다 작게 크기를 줄일 수 없습니다.
+ 기본값이 있는 열은 변경할 수 없습니다.
+ UNIQUE, PRIMARY KEY 또는 FOREIGN KEY가 있는 열은 변경할 수 없습니다.
+ 트랜잭션 블록(BEGIN ... END) 내에서 열을 변경할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
열의 압축 인코딩을 변경하는 절입니다. 열에 압축 인코딩을 지정하면 테이블이 더 이상 ENCODE AUTO로 설정되지 않습니다. 압축 인코딩에 대한 자세한 내용은 [열 압축으로 저장된 데이터 크기 축소](t_Compressing_data_on_disk.md) 섹션을 참조하세요.  
열에 압축 인코딩을 변경하면 테이블을 쿼리할 수 있습니다.  
다음 제한을 고려하세요.  
+ 열에 대해 현재 정의된 것과 동일한 인코딩으로 열을 변경할 수 없습니다.
+ 인터리브 정렬 키가 있는 테이블의 열에 대한 인코딩을 변경할 수 없습니다.

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;  
단일 명령에서 여러 열의 압축 인코딩을 변경하는 절입니다. 압축 인코딩에 대한 자세한 내용은 [열 압축으로 저장된 데이터 크기 축소](t_Compressing_data_on_disk.md) 섹션을 참조하세요.  
열에 압축 인코딩을 변경하면 테이블을 쿼리할 수 있습니다.  
 다음 제한을 고려하세요.  
+ 단일 명령에서 열을 동일하거나 다른 인코딩 형식으로 여러 번 변경할 수 없습니다.
+ 열에 대해 현재 정의된 것과 동일한 인코딩으로 열을 변경할 수 없습니다.
+ 인터리브 정렬 키가 있는 테이블의 열에 대한 인코딩을 변경할 수 없습니다.

ALTER DISTSTYLE ALL  
테이블의 기존 분산 스타일을 `ALL`으로 변경하는 절입니다. 다음을 고려하세요.  
+ ALTER DISTSTYLE, ALTER SORTKEY, VACUUM은 동일한 테이블에서 동시에 실행할 수 없습니다.
  + VACUUM이 현재 실행 중인 경우 ALTER DISTSTYLE ALL을 실행하면 오류가 반환됩니다.
  + ALTER DISTSTYLE ALL이 실행 중인 경우 백그라운드 VACCUM이 테이블에서 시작되지 않습니다.
+ 인터리브 정렬 키 및 임시 테이블이 있는 테이블에는 ALTER DISTYLE ALL 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 테이블은 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE ALL에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

ALTER DISTSTYLE EVEN  
테이블의 기존 분산 스타일을 `EVEN`으로 변경하는 절입니다. 다음을 고려하세요.  
+ ALTER DISTSYTLE, ALTER SORTKEY, VACUUM은 동일한 테이블에서 동시에 실행할 수 없습니다.
  + VACUUM이 현재 실행 중인 경우 ALTER DISTSTYLE EVEN을 실행하면 오류가 반환됩니다.
  + ALTER DISTSTYLE EVEN이 실행 중인 경우 백그라운드 VACCUM이 테이블에서 시작되지 않습니다.
+ 인터리브 정렬 키 및 임시 테이블이 있는 테이블에는 ALTER DISTYLE EVEN 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 테이블은 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE EVEN에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

ALTER DISTKEY *column\$1name* 또는 ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
테이블의 배포 키로 사용되는 열을 변경하는 절입니다. 다음을 고려하세요.  
+ VACUUM 및 ALTER DISTKEY는 동일한 테이블 상에서 동시에 실행할 수 없습니다.
  + VACUUM이 이미 실행 중인 경우 ALTER DISTKEY가 오류를 반환합니다.
  + ALTER DISTKEY가 실행 중인 경우 백그라운드 VACCUM이 테이블에서 시작되지 않습니다.
  + ALTER DISTKEY가 실행 중인 경우 포그라운드 VACCUM이 오류를 반환합니다.
+ 테이블에서 한 번에 하나의 ALTER DISTKEY 명령만 실행할 수 있습니다.
+ 인터리브 정렬 키가 있는 테이블에는 ALTER DISTKEY 명령이 지원되지 않습니다.
+ 배포 스타일이 이전에 AUTO로 정의된 경우 테이블은 더 이상 자동 테이블 최적화의 후보가 아닙니다.
DISTSTYLE KEY를 지정할 때 데이터는 DISTKEY 열에 있는 값을 기준으로 배포됩니다. DISTSTYLE에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

ALTER DISTSTYLE AUTO  
테이블의 기존 배포 스타일을 AUTO로 변경하는 절입니다.  
배포 스타일을 AUTO로 변경하면 테이블의 배포 스타일이 다음과 같이 설정됩니다.  
+ DISTSTYLE ALL이 있는 작은 테이블은 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE EVEN이 있는 작은 테이블은 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE KEY가 있는 작은 테이블은 AUTO(ALL)로 변환됩니다.
+ DISTSTYLE ALL이 있는 큰 테이블은 AUTO(EVEN)로 변환됩니다.
+ DISTSTYLE EVEN이 있는 큰 테이블은 AUTO(EVEN)로 변환됩니다.
+ DISTSTYLE KEY가 있는 큰 테이블은 AUTO(KEY)로 변환되고 DISTKEY는 보존됩니다. 이 경우 Amazon Redshift는 테이블을 변경하지 않습니다.
새로운 배포 스타일 또는 키가 쿼리 성능을 향상시킬 것이라고 판단되면 Amazon Redshift는 향후 테이블의 배포 스타일이나 키를 변경할 수 있습니다. 예를 들어 Amazon Redshift는 DISTSTYLE이 AUTO(KEY)인 테이블을 AUTO(EVEN)로 또는 그 반대로 변환할 수 있습니다. 데이터 재배포 및 잠금을 포함하여 배포 키가 변경될 때의 동작에 대한 자세한 내용은 [Amazon Redshift Advisor 권장 사항](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation)을 참조하세요.  
DISTSTYLE AUTO에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.  
테이블의 배포 스타일을 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요. 테이블에 대한 Amazon Redshift Advisor 권장 사항을 보려면 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md) 섹션을 참조하세요. Amazon Redshift에서 수행한 작업을 보려면 SVL\$1AUTO\$1WORKER\$1ACTION 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md) 섹션을 참조하세요.

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
테이블에 사용되는 정렬 키를 변경하거나 추가하는 절입니다. 임시 테이블에는 ALTER SORTKEY가 지원되지 않습니다.  
정렬 키를 변경하면 새 정렬 키 또는 원래 정렬 키에 있는 열의 압축 인코딩이 변경될 수 있습니다. 테이블에 대해 명시적으로 정의된 인코딩이 없는 경우 Amazon Redshift는 다음과 같이 압축 인코딩을 자동으로 할당합니다.  
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL 또는 DOUBLE PRECISION 데이터 형식으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR 또는 VARCHAR로 정의된 열에는 LZO 압축이 할당됩니다.
다음을 고려하세요.  
+ 테이블당 정렬 키에 최대 400개의 열을 정의할 수 있습니다.
+ 인터리브 정렬 키를 복합 정렬 키 또는 정렬 키 없음으로 변경할 수 있습니다. 그러나 복합 정렬 키를 인터리브 정렬 키로 변경할 수는 없습니다.
+ 정렬 키가 이전에 AUTO로 정의된 경우 테이블은 더 이상 자동 테이블 최적화의 후보가 아닙니다.
+ Amazon Redshift는 정렬 키로 정의된 열에 대해 RAW 인코딩(압축 없음)을 사용하는 것이 좋습니다. 열을 변경하여 정렬 키로 선택하면 열의 압축이 RAW 압축(압축 없음)으로 변경됩니다. 이렇게 하면 테이블에 필요한 스토리지 양이 늘어날 수 있습니다. 테이블 크기 증가량은 특정 테이블 정의와 테이블 내용에 따라 다릅니다. 압축에 대한 자세한 내용은 [압축 인코딩](c_Compression_encodings.md) 섹션을 참조하세요.
데이터가 테이블에 로드되면 데이터는 정렬 키의 순서로 로드됩니다. 정렬 키를 변경하면 Amazon Redshift는 데이터를 재정렬합니다. SORTKEY에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

ALTER SORTKEY AUTO  
대상 테이블의 정렬 키를 AUTO로 변경하거나 추가하는 절입니다. 임시 테이블에는 ALTER SORTKEY AUTO가 지원되지 않습니다.  
정렬 키를 AUTO로 변경하면 Amazon Redshift는 테이블의 기존 정렬 키를 보존합니다.  
새로운 정렬 키가 쿼리 성능을 향상시킬 것이라고 판단되면 Amazon Redshift는 향후 테이블의 정렬 키를 변경할 수 있습니다.  
SORTKEY AUTO에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.  
테이블의 정렬 키를 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요. 테이블에 대한 Amazon Redshift Advisor 권장 사항을 보려면 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md) 섹션을 참조하세요. Amazon Redshift에서 수행한 작업을 보려면 SVL\$1AUTO\$1WORKER\$1ACTION 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md) 섹션을 참조하세요.

ALTER SORTKEY NONE  
대상 테이블의 정렬 키를 제거하는 절입니다.  
정렬 키가 이전에 AUTO로 정의된 경우 테이블은 더 이상 자동 테이블 최적화의 후보가 아닙니다.

ALTER ENCODE AUTO  
대상 테이블 열의 인코딩 형식을 AUTO로 변경하는 절입니다. 인코딩을 AUTO로 변경하면 Amazon Redshift는 테이블에 있는 열의 기존 인코딩 형식이 보존됩니다. 그런 다음 새 인코딩 형식이 쿼리 성능을 향상시킬 수 있다고 판단되면 Amazon Redshift가 테이블 열의 인코딩 형식을 변경할 수 있습니다.  
인코딩을 지정하기 위해 하나 이상의 열을 변경하는 경우 Amazon Redshift는 더 이상 테이블의 모든 열에 대한 인코딩을 자동으로 조정하지 않습니다. 열은 현재 인코딩 설정을 유지합니다.  
다음 작업은 테이블의 ENCODE AUTO 설정에 영향을 주지 않습니다.  
+ 테이블 이름 바꾸기.
+ 테이블에 대한 DISTSTYLE 또는 SORTKEY 설정 변경.
+ ENCODE 설정으로 열 추가 또는 삭제.
+ COPY 명령의 COMPUPDATE 옵션 사용. 자세한 내용은 [데이터 로드 작업](copy-parameters-data-load.md) 섹션을 참조하세요.
테이블의 인코딩을 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요.

RENAME COLUMN *column\$1name* TO *new\$1name*   
열의 이름을 *new\$1name*에 지정된 값으로 바꾸는 절입니다. 최대 열 이름 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

ADD [ COLUMN ] *column\$1name*   
테이블에 지정된 이름과 함께 열을 추가하는 절입니다. 각각의 ALTER TABLE 문에 한 개의 열만 추가할 수 있습니다.  
테이블의 배포 키(DISTKEY) 또는 정렬 키(SORTKEY)인 열은 추가할 수 없습니다.  
 ALTER TABLE ADD COLUMN 명령을 사용하여 다음 테이블 및 열 속성을 수정할 수 없습니다.  
+ UNIQUE
+ PRIMARY KEY
+ REFERENCES(외래 키)
+ IDENTITY 또는 GENERATED BY DEFAULT AS IDENTITY
최대 열 이름 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 단일 테이블에서 정의할 수 있는 최대 열 수는 1,600개입니다.  
외부 테이블에 열을 추가할 때는 다음과 같은 제한 사항이 적용됩니다.  
+ 열 제약 조건 DEFAULT, ENCODE, NOT NULL, NULL이 있는 외부 테이블에 열을 추가할 수 없습니다.
+ AVRO 파일 형식으로 정의된 외부 테이블에 열을 추가할 수 없습니다.
+ 가상 열이 활성화되어 있으면 외부 테이블 하나에서 정의할 수 있는 최대 열 개수는 1,598개입니다. 가상 열이 활성화되어 있지 않으면 테이블 하나에서 정의할 수 있는 최대 열 개수는 1,600개입니다.
자세한 내용은 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 섹션을 참조하세요.

 *column\$1type*   
추가되는 열의 데이터 형식입니다. CHAR 및 VARCHAR 열의 경우 최대 길이를 선언하는 대신 MAX 키워드를 사용할 수 있습니다. MAX는 최대 길이를 CHAR의 경우 4,096바이트, VARCHAR의 경우 65,535바이트로 설정합니다. GEOMETRY 객체의 최대 크기는 1,048,447바이트입니다.  
Amazon Redshift에서 지원하는 데이터 형식에 대한 자세한 내용은 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
열의 기본 데이터 값을 할당하는 절입니다. *default\$1expr*의 데이터 형식은 열의 데이터 형식과 일치해야 합니다. DEFAULT 값은 변수가 없는 표현식이어야 합니다. 하위 쿼리, 현재 테이블에 있는 다른 열과의 상호 참조, 사용자 정의 함수는 허용되지 않습니다.  
*default\$1expr*은 열의 값을 지정하지 않는 INSERT 작업에 사용됩니다. 기본값이 지정되지 않은 경우 열의 기본값은 Null입니다.  
COPY 작업에서 DEFAULT 값과 NOT NULL 제약 조건을 가진 열에 null 필드가 나타나는 경우 COPY 명령은 *default\$1expr*의 값을 삽입합니다.  
외부 테이블에는 DEFAULT가 지원되지 않습니다.

ENCODE *encoding*   
열에 대한 압축 인코딩입니다. 기본적으로 Amazon Redshift는 테이블의 열에 대해 압축 인코딩을 지정하지 않거나 테이블에 대해 ENCODE AUTO 옵션을 지정하는 경우 테이블의 모든 열에 대한 압축 인코딩을 자동으로 관리합니다.  
테이블의 열에 대해 압축 인코딩을 지정하거나 테이블에 대해 ENCODE AUTO 옵션을 지정하지 않으면 Amazon Redshift는 다음과 같이 압축 인코딩을 지정하지 않은 열에 압축 인코딩을 자동으로 할당합니다.  
+ 임시 테이블의 모든 열은 기본적으로 RAW 압축으로 할당됩니다.
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY 또는 GEOGRAPHY 데이터 유형으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR, VARCHAR 또는 VARBYTE로 정의된 열에는 LZO 압축이 할당됩니다.
열을 압축하지 않으려면 RAW 인코딩을 명시적으로 지정하세요.
다음 모듈을 지원합니다.[compression encodings](c_Compression_encodings.md#compression-encoding-list)  
+ AZ64
+ BYTEDICT
+ 델타
+ 델타
+ LZO
+ LZO
+ LZO
+ LZO
+ RAW(압축 없음)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD
외부 테이블에는 ENCODE가 지원되지 않습니다.

NOT NULL \$1 NULL   
NOT NULL은 열이 null 값을 포함하도록 허용되지 않도록 지정합니다. 기본값인 NULL은 열이 null 값을 허용하도록 지정합니다.  
외부 테이블에는 NOT NULL 및 NULL가 지원되지 않습니다.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
열의 문자열 검색 또는 비교가 대소문자를 구분하는지, 구분하지 않는지를 지정하는 절입니다. 기본값은 데이터베이스의 현재 대/소문자 구분 구성과 동일합니다.  
데이터베이스 데이터 정렬 정보를 찾으려면 다음 명령을 사용합니다.  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE와 CS는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다. 마찬가지로 CASE\$1INSENSITIVE와 CI는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다.

DROP [ COLUMN ] *column\$1name*   
테이블에서 삭제할 열의 이름입니다.  
테이블의 마지막 열은 삭제할 수 없습니다. 테이블에는 열이 하나 이상 있어야 합니다.  
테이블의 배포 키(DISTKEY) 또는 정렬 키(SORTKEY)인 열은 삭제할 수 없습니다. 열에 뷰, 기본 키, 외래 키 또는 UNIQUE 제한과 같이 종속적 객체가 있는 경우 DROP COLUMN의 기본 동작은 RESTRICT입니다.  
외부 테이블에서 열을 삭제할 경우 다음과 같은 제한 사항이 적용됩니다.  
+ 외부 테이블에서 파티션 열로 사용되는 열은 삭제할 수 없습니다.
+ AVRO 파일 형식으로 정의된 외부 테이블에서는 열을 삭제할 수 없습니다.
+ 외부 테이블에서는 RESTRICT 및 CASCADE를 무시합니다.
+ 정책을 삭제하거나 분리하지 않으면 정책 정의 내에서 참조되는 정책 테이블의 열을 삭제할 수 없습니다. 이는 CASCADE 옵션이 지정된 경우에도 적용됩니다. 정책 테이블의 다른 열은 삭제할 수 있습니다.
자세한 내용은 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 섹션을 참조하세요.

RESTRICT   
DROP COLUMN과 함께 사용하는 경우 RESTRICT는 다음과 같은 경우 삭제하려는 열이 삭제되지 않음을 나타냅니다.  
+ 정의된 보기가 삭제할 열을 참조하는 경우
+ 외래 키가 삭제할 열을 참조하는 경우
+ 삭제할 열이 멀티파트 키에 포함된 경우
RESTRICT는 CASCADE와 함께 사용할 수 없습니다.  
외부 테이블에서는 RESTRICT 및 CASCADE를 무시합니다.

CASCADE   
DROP COLUMN과 함께 사용될 때, 지정된 열과 그 열에 종속된 모든 것을 제거합니다. CASCADE는 RESTRICT와 함께 사용할 수 없습니다.  
외부 테이블에서는 RESTRICT 및 CASCADE를 무시합니다.

다음 옵션은 외부 테이블에만 적용됩니다.

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
데이터 파일이 포함된 Amazon S3 폴더 또는 Amazon S3 객체 경로 목록이 포함된 매니페스트 파일의 경로. 버킷은 Amazon Redshift 클러스터와 동일한 AWS 리전에 있어야 합니다. 지원되는 AWS 리전 목록은 [Amazon Redshift Spectrum 제한 사항](c-spectrum-considerations.md) 섹션을 참조하세요. 매니페스트 파일 사용에 대한 자세한 내용은 CREATE EXTERNAL TABLE [파라미터](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters) 참조의 LOCATION을 참조하세요.

SET FILE FORMAT *format*  
외부 데이터 파일의 파일 형식입니다.  
유효한 형식은 다음과 같습니다.  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
외부 테이블에 대한 테이블 속성의 테이블 정의를 설정하는 절입니다.  
테이블 속성은 대/소문자를 구분합니다.  
'numRows'='*row\$1count*'  
테이블 정의를 위해 numRows 값을 설정하는 속성입니다. 외부 테이블의 통계를 명시적으로 업데이트하려면 테이블의 크기를 나타내도록 numRows 속성을 설정합니다. Amazon Redshift는 쿼리 옵티마이저가 쿼리 계획을 생성하는 데 사용하는 테이블 통계를 생성하기 위해 외부 테이블을 분석하지 않습니다. 테이블 통계가 외부 테이블에 대해 설정되지 않은 경우 Amazon Redshift는 쿼리 실행 계획을 실행합니다. 이 계획은 외부 테이블이 더 큰 테이블이고 로컬 테이블이 더 작은 테이블이라는 가정에 기초하여 생성됩니다.  
'skip.header.line.count'='*line\$1count*'  
각 원본 파일의 시작 부분에서 건너 뛸 행 개수를 설정하는 속성입니다.

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
하나 이상의 파티션 열의 위치를 새로 설정하는 절입니다.

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
파티션을 하나 이상 추가하는 절입니다. 단일 ALTER TABLE … ADD 문을 사용하여 여러 PARTITION 절을 지정할 수 있습니다.  
AWS Glue 카탈로그를 사용하는 경우 단일 ALTER TABLE 문을 사용하여 파티션을 최대 100개까지 추가할 수 있습니다.
IF NOT EXISTS 절은 지정한 파티션이 이미 있으면 명령이 아무 것도 변경하지 않아야 함을 나타냅니다. 또한 명령 실행 시 오류 메시지와 함께 종료되지 않고 파티션이 존재한다는 메시지를 반환해야 함을 나타냅니다. 이 절은 스크립트 작성 시 유용하므로, ALTER TABLE이 이미 존재하는 파티션의 추가를 시도하는 경우 스크립트가 실패하지 않습니다.

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
지정된 파티션을 삭제하는 절입니다. 파티션을 삭제하는 외부 테이블 메타데이터만 변경됩니다. Amazon S3의 데이터는 영향을 받지 않습니다.

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
관계에 대한 행 수준 보안을 켜거나 끄는 절입니다.  
관계에 대해 행 수준 보안이 켜 있으면 행 수준 보안 정책에서 액세스를 허용하는 행만 읽을 수 있습니다. 관계에 대한 액세스 권한을 부여하는 정책이 없으면 관계에서 행을 볼 수 없습니다. 수퍼유저 및 `sys:secadmin` 역할을 가진 사용자 또는 역할만 ROW LEVEL SECURITY 절을 설정할 수 있습니다. 자세한 내용은 [행 수준 보안](t_rls.md) 섹션을 참조하세요. 이 문은 연결된 데이터베이스 또는 Amazon Redshift 페더레이션 권한이 있는 데이터베이스에서 지원됩니다. FOR DATASHARES 절은 Amazon Redshift 페더레이션 권한이 있는 데이터베이스에서는 지원되지 않습니다.  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  관계에 대해 행 수준 보안 정책의 접속사 유형을 선택할 수 있도록 하는 절입니다. 여러 행 수준 보안 정책이 관계에 연결된 경우 정책을 AND 또는 OR 절과 결합할 수 있습니다. 기본적으로 Amazon Redshift는 RLS 정책을 AND 절과 결합합니다. `sys:secadmin` 역할이 있는 슈퍼 사용자, 사용자 또는 역할은 이 절을 사용하여 관계에 대한 행 수준 보안 정책의 접속사 유형을 정의할 수 있습니다. 자세한 내용은 [사용자별로 여러 정책 결합](t_rls_combine_policies.md) 섹션을 참조하세요.
+ FOR DATASHARES

  RLS로 보호되는 관계에 데이터 공유를 통해 액세스할 수 있는지를 결정하는 절입니다. 기본적으로 RLS로 보호되는 관계는 데이터 공유를 통해 액세스할 수 없습니다. ALTER TABLE ROW LEVEL SECURITY 명령을 이 절과 함께 실행하면 관계의 데이터 공유 접근성 속성에만 영향을 줍니다. ROW LEVEL SECURITY 속성은 변경되지 않습니다.

   RLS로 보호되는 관계에 데이터 공유를 통해 액세스할 수 있도록 설정하면 소비자 측 데이터 공유 데이터베이스에서 해당 관계에 행 수준 보안이 적용되지 않습니다. 이 관계는 생산자 측에서 해당 RLS 속성을 유지합니다.

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
DDM으로 보호되는 관계를 데이터 공유를 통해 액세스할 수 있는지를 결정하는 절입니다. 기본적으로 DDM으로 보호되는 관계는 데이터 공유를 통해 액세스할 수 없습니다. DDM으로 보호되는 관계를 데이터 공유를 통해 액세스할 수 있도록 설정하면 소비자측 데이터 공유 데이터베이스에서 마스킹 보호가 적용되지 않습니다. 이 관계는 생산자측에서 해당 마스킹 속성을 유지합니다. 수퍼유저 및 `sys:secadmin` 역할을 가진 사용자 또는 역할만 MASKING FOR DATASHARES 절을 설정할 수 있습니다. 자세한 내용은 [동적 데이터 마스킹](t_ddm.md) 섹션을 참조하세요.

## 예제
<a name="r_ALTER_TABLE-examples"></a>

ALTER TABLE 명령을 사용하는 방법을 보여주는 예제는 다음을 참조하세요.
+ [ALTER TABLE 예](r_ALTER_TABLE_examples_basic.md)
+ [ALTER EXTERNAL TABLE 예](r_ALTER_TABLE_external-table.md)
+ [ALTER TABLE ADD 및 DROP COLUMN 예](r_ALTER_TABLE_COL_ex-add-drop.md)

# ALTER TABLE 예
<a name="r_ALTER_TABLE_examples_basic"></a>

다음은 ALTER TABLE 명령의 기본적인 사용법을 보여주는 예입니다.

## 테이블 또는 뷰의 이름 바꾸기
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

다음 명령을 실행하면 USERS 테이블의 이름이 USERS\$1BKUP로 바뀝니다.

```
alter table users
rename to users_bkup;
```

 이 형식의 명령을 사용하여 뷰의 이름을 바꿀 수도 있습니다.

## 테이블 또는 뷰의 소유자 변경
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

다음 명령을 실행하면 VENUE 테이블 소유자가 사용자 DWUSER로 변경됩니다.

```
alter table venue
owner to dwuser;
```

다음 명령을 실행하면 뷰가 생성된 다음, 소유자가 변경됩니다.

```
create view vdate as select * from date;
alter table vdate owner to vuser;
```

## 열 이름 바꾸기
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

다음 명령을 실행하면 VENUE 테이블에 있는 VENUESEATS 열의 이름이 VENUESIZE로 바뀝니다.

```
alter table venue
rename column venueseats to venuesize;
```

## 테이블 제약 조건 삭제
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

기본 키, 외래 키 또는 고유한 제약 조건과 같은 테이블 제약 조건을 삭제하려면, 먼저 제약 조건의 내부 이름을 찾습니다. 그런 다음 ALTER TABLE 명령에서 제약 이름을 지정합니다. 다음 예제에서는 CATEGORY 테이블에 대한 제약 조건을 찾은 다음, 이름이 `category_pkey`인 기본 키를 삭제합니다.

```
select constraint_name, constraint_type
from information_schema.table_constraints
where constraint_schema ='public'
and table_name = 'category';

constraint_name | constraint_type
----------------+----------------
category_pkey   | PRIMARY KEY

alter table category
drop constraint category_pkey;
```

## VARCHAR 열 변경
<a name="r_ALTER_TABLE_examples_alter-column"></a>

스토리지를 절약하려면 처음에 현재 데이터 요구 사항에 필요한 최소 크기인 VARCHAR 열로 테이블을 정의하면 됩니다. 나중에 더 긴 문자열을 수용해야 하는 경우 테이블을 변경하여 열 크기를 늘릴 수 있습니다.

다음 예에서는 EVENTNAME 열 크기를 VARCHAR(300)로 변경합니다.

```
alter table event alter column eventname type varchar(300);
```

## VARBYTE 열 변경
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

스토리지를 절약하려면 처음에 현재 데이터 요구 사항에 필요한 최소 크기인 VARBYTE 열로 테이블을 정의하면 됩니다. 나중에 더 긴 문자열을 수용해야 하는 경우 테이블을 변경하여 열 크기를 늘릴 수 있습니다.

다음 예에서는 EVENTNAME 열 크기를 VARBYTE(300)로 변경합니다.

```
alter table event alter column eventname type varbyte(300);
```

## 열에 대한 압축 인코딩 변경
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

열의 압축 인코딩을 변경할 수 있습니다. 아래에서 이 접근 방식을 보여주는 일련의 예를 찾아볼 수 있습니다. 이러한 예에 대한 테이블 정의는 다음과 같습니다.

```
create table t1(c0 int encode lzo, c1 bigint encode zstd, c2 varchar(16) encode lzo, c3 varchar(32) encode zstd);
```

다음 문은 열 c0에 대한 압축 인코딩을 LZO 인코딩에서 AZ64 인코딩으로 변경합니다.

```
alter table t1 alter column c0 encode az64;
```

다음 문은 열 c1에 대한 압축 인코딩을 Zstandard 인코딩에서 AZ64 인코딩으로 변경합니다.

```
alter table t1 alter column c1 encode az64;
```

다음 문은 열 c2에 대한 압축 인코딩을 LZO 인코딩에서 Byte-dictionary 인코딩으로 변경합니다.

```
alter table t1 alter column c2 encode bytedict;
```

다음 문은 열 c3에 대한 압축 인코딩을 Zstandard 인코딩에서 Runlength 인코딩으로 변경합니다.

```
alter table t1 alter column c3 encode runlength;
```

## DISTSTYLE KEY DISTKEY 열 변경
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

다음 예에서는 테이블의 DISTSTYLE 및 DISTKEY를 변경하는 방법을 보여 줍니다.

EVEN 배포 스타일의 테이블을 생성합니다. SVV\$1TABLE\$1INFO 보기는 DISTSTYLE이 EVEN임을 보여 줍니다.

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

DISTKEY 테이블을 `inv_warehouse_sk`로 변경합니다. SVV\$1TABLE\$1INFO 보기는 `inv_warehouse_sk` 열을 결과 배포 키로 보여 줍니다.

```
alter table inventory alter diststyle key distkey inv_warehouse_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_warehouse_sk)
```

DISTKEY 테이블을 `inv_item_sk`로 변경합니다. SVV\$1TABLE\$1INFO 보기는 `inv_item_sk` 열을 결과 배포 키로 보여 줍니다.

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_item_sk)
```

## 테이블을 DISTSTYLE ALL로 변경
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

다음 예에서는 테이블을 DISTSTYLE ALL로 변경하는 방법을 보여 줍니다.

EVEN 배포 스타일의 테이블을 생성합니다. SVV\$1TABLE\$1INFO 보기는 DISTSTYLE이 EVEN임을 보여 줍니다.

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

DISTSTYLE 테이블을 ALL로 변경합니다. SVV\$1TABLE\$1INFO 보기에는 변경된 DISTSYTLE이 표시됩니다.

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     ALL
```

## 테이블 SORTKEY 변경
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

복합 정렬 키가 있거나 정렬 키가 없도록 테이블을 변경할 수 있습니다.

다음 테이블 정의에서 테이블 `t1`은 인터리브 정렬 키로 정의됩니다.

```
create table t1 (c0 int, c1 int) interleaved sortkey(c0, c1);
```

다음 명령은 테이블을 인터리브 정렬 키에서 복합 정렬 키로 변경합니다.

```
alter table t1 alter sortkey(c0, c1);
```

다음 명령은 인터리브 정렬 키를 제거하도록 테이블을 변경합니다.

```
alter table t1 alter sortkey none;
```

다음 테이블 정의에서 테이블 `t1`은 정렬 키로 열 `c0`을 사용하여 정의됩니다.

```
create table t1 (c0 int, c1 int) sortkey(c0);
```

다음 명령은 테이블 `t1`을 복합 정렬 키로 변경합니다.

```
alter table t1 alter sortkey(c0, c1);
```

## 테이블을 ENCODE AUTO로 변경
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

다음 예에서는 테이블을 ENCODE AUTO로 변경하는 방법을 보여줍니다.

이 예에 대한 테이블 정의는 다음과 같습니다. 열 `c0`은 인코딩 형식 AZ64로 정의되고 열 `c1`은 인코딩 형식 LZO로 정의됩니다.

```
create table t1(c0 int encode AZ64, c1 varchar encode LZO);
```

이 테이블의 경우 다음 문은 인코딩을 AUTO로 변경합니다.

```
alter table t1 alter encode auto;
```

다음 예에서는 ENCODE AUTO 설정을 제거하기 위해 테이블을 변경하는 방법을 보여줍니다.

이 예에 대한 테이블 정의는 다음과 같습니다. 테이블 열은 인코딩 없이 정의됩니다. 이 경우 인코딩은 ENCODE AUTO로 기본 설정됩니다.

```
create table t2(c0 int, c1 varchar);
```

이 테이블의 경우 다음 문은 c0 열의 인코딩을 LZO로 변경합니다. 테이블 인코딩이 더 이상 ENCODE AUTO로 설정되지 않습니다.

```
alter table t2 alter column c0 encode lzo;;
```

## 행 수준 보안 통제 변경
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

다음 명령은 테이블에 대해 RLS를 해제합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY OFF;
```

다음 명령은 테이블에 대해 RLS를 설정합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
```

다음 명령은 테이블에 대해 RLS를 활성화하고 데이터 공유를 통해 액세스할 수 있도록 합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES OFF;
```

다음 명령은 테이블에 대해 RLS를 활성화하고 데이터 공유를 통해 액세스할 수 없도록 합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES ON;
```

다음 명령은 테이블에 대해 RLS를 활성화하고 RLS 접속사 유형을 OR로 설정합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE OR;
```

다음 명령은 테이블에 대해 RLS를 활성화하고 RLS 접속사 유형을 AND로 설정합니다.

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE AND;
```

# ALTER EXTERNAL TABLE 예
<a name="r_ALTER_TABLE_external-table"></a>

다음 예시에서는 미국 동부(버지니아 북부) 리전(`us-east-1`) AWS 리전에 있는 Amazon S3 버킷과 [예제](r_CREATE_EXTERNAL_TABLE_examples.md)에서 CREATE TABLE에 대해 생성한 예시 테이블을 사용합니다. 이 외부 테이블 포함 파티션을 사용하는 방법에 대한 자세한 내용은 [Redshift Spectrum 외부 테이블 파티셔닝](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning) 섹션을 참조하세요.

다음 예에서는 SPECTRUM.SALES 외부 테이블의 numRows 테이블 속성을 170,000개 행으로 설정합니다.

```
alter table spectrum.sales
set table properties ('numRows'='170000');
```

다음 예에서는 SPECTRUM.SALES 외부 테이블의 위치를 변경합니다.

```
alter table spectrum.sales
set location 's3://redshift-downloads/tickit/spectrum/sales/';
```

다음 예에서는 SPECTRUM.SALES 외부 테이블의 형식을 Parquet로 변경합니다.

```
alter table spectrum.sales
set file format parquet;
```

다음 예에서는 테이블 SPECTRUM.SALES\$1PART에 대한 파티션을 한 개 추가합니다.

```
alter table spectrum.sales_part
add if not exists partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
```

다음 예에서는 테이블 SPECTRUM.SALES\$1PART에 대한 파티션을 세 개 추가합니다.

```
alter table spectrum.sales_part add if not exists
partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'
partition(saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/'
partition(saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
```

다음 예에서는 `saledate='2008-01-01''`를 포함한 파티션을 삭제하도록 SPECTRUM.SALES\$1PART를 변경합니다.

```
alter table spectrum.sales_part
drop partition(saledate='2008-01-01');
```

다음 예에서는 `saledate='2008-01-01'`을 포함한 파티션에 대한 Amazon S3 경로를 새로 설정합니다.

```
alter table spectrum.sales_part
partition(saledate='2008-01-01')
set location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01-01/';
```

다음 예에서는 `sales_date`의 이름을 `transaction_date`로 바꿉니다.

```
alter table spectrum.sales rename column sales_date to transaction_date;
```

다음 예에서는 열 매핑을 ORC(Optimized Row Columnar) 형식을 사용하는 외부 테이블의 위치 매핑으로 설정합니다.

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='position');
```

다음 예에서는 열 매핑을 ORC 형식을 사용하는 외부 테이블의 이름 매핑으로 설정합니다.

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='name');
```

# ALTER TABLE ADD 및 DROP COLUMN 예
<a name="r_ALTER_TABLE_COL_ex-add-drop"></a>

다음 예에서는 ALTER TABLE을 사용하여 기본 테이블 열을 추가한 다음에 삭제하는 방법과 종속 객체가 있는 열을 삭제하는 방법을 보여줍니다.

## 기본 열을 ADD한 다음 DROP
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

다음 예에서는 독립형 FEEDBACK\$1SCORE 열을 USERS 테이블에 추가합니다. 이 열에는 간단하게 정수만 포함되어 있는데, 이 열의 기본값은 NULL(피드백 점수 없음)입니다.

먼저, PG\$1TABLE\$1DEF 카탈로그 테이블을 쿼리하여 USERS 테이블의 스키마를 봅니다.

```
column        | type                   | encoding | distkey | sortkey
--------------+------------------------+----------+---------+--------
userid        | integer                | delta    | true    |       1
username      | character(8)           | lzo      | false   |       0
firstname     | character varying(30)  | text32k  | false   |       0
lastname      | character varying(30)  | text32k  | false   |       0
city          | character varying(30)  | text32k  | false   |       0
state         | character(2)           | bytedict | false   |       0
email         | character varying(100) | lzo      | false   |       0
phone         | character(14)          | lzo      | false   |       0
likesports    | boolean                | none     | false   |       0
liketheatre   | boolean                | none     | false   |       0
likeconcerts  | boolean                | none     | false   |       0
likejazz      | boolean                | none     | false   |       0
likeclassical | boolean                | none     | false   |       0
likeopera     | boolean                | none     | false   |       0
likerock      | boolean                | none     | false   |       0
likevegas     | boolean                | none     | false   |       0
likebroadway  | boolean                | none     | false   |       0
likemusicals  | boolean                | none     | false   |       0
```

이제 feedback\$1score 열을 추가합니다.

```
alter table users
add column feedback_score int
default NULL;
```

USERS에서 FEEDBACK\$1SCORE 열을 선택하여 열이 추가되었는지 확인합니다.

```
select feedback_score from users limit 5;

feedback_score
----------------
NULL
NULL
NULL
NULL
NULL
```

열을 삭제하여 원래 DDL을 복구합니다.

```
alter table users drop column feedback_score;
```

## 종속 객체가 있는 열 삭제
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

다음 예에서는 종속 객체가 있는 열을 삭제합니다. 결과적으로, 종속 객체도 삭제됩니다.

시작하려면 FEEDBACK\$1SCORE 열을 USERS 테이블에 다시 추가합니다.

```
alter table users
add column feedback_score int
default NULL;
```

다음으로, USERS\$1VIEW라는 USERS 테이블에서 뷰를 생성합니다.

```
create view users_view as select * from users;
```

이제, FEEDBACK\$1SCORE 열을 USERS 테이블에서 삭제해 봅니다. 다음 DROP 문에서는 기본 동작(RESTRICT)을 사용합니다.

```
alter table users drop column feedback_score;
```

다른 객체가 이 열에 종속되어 있으므로 Amazon Redshift가 이 열을 삭제할 수 없다는 오류 메시지를 표시합니다.

이번에는 모든 종속 객체를 삭제하도록 CASCADE를 지정하여 FEEDBACK\$1SCORE 열을 다시 삭제해 봅니다.

```
alter table users
drop column feedback_score cascade;
```

# ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND"></a>

기존 원본 테이블에서 데이터를 이동시켜 대상 테이블에 행을 추가합니다. 원본 테이블의 데이터가 대상 테이블에서 일치하는 열로 이동됩니다. 열 순서는 중요하지 않습니다. 대상 테이블에 데이터가 성공적으로 추가되면 원본 테이블은 비게 됩니다. ALTER TABLE APPEND는 일반적으로 데이터가 복제되지 않고 이동되므로 유사한 [CREATE TABLE AS](r_CREATE_TABLE_AS.md) 또는 [INSERT](r_INSERT_30.md) INTO 작업보다 훨씬 빠릅니다.

**참고**  
ALTER TABLE APPEND는 원본 테이블과 대상 테이블 간에 데이터 블록을 이동합니다. 성능 개선을 위해 ALTER TABLE APPEND는 추가 작업을 수행할 때 스토리지를 압축하지 않습니다. 따라서 스토리지 사용량이 일시적으로 증가합니다. 스페이스를 회수하려면 [VACUUM](r_VACUUM_command.md) 작업을 실행합니다.

이름이 같은 열은 열 속성도 같아야 합니다. 원본 테이블 또는 대상 테이블에 다른 테이블에는 없는 열이 포함되어 있는 경우, IGNOREEXTRA 또는 FILLTARGET 파라미터를 사용하여 추가 열을 관리하는 방법을 지정하세요.

자격 증명 열을 추가할 수 없습니다. 두 테이블 모두 자격 증명 열을 포함한 경우 이 명령은 실패합니다. 한 테이블에만 자격 증명 열이 있는 경우 FILLTARGET 또는 IGNOREEXTRA 파라미터를 포함하세요. 자세한 내용은 [ALTER TABLE APPEND 사용 시 주의 사항](#r_ALTER_TABLE_APPEND_usage) 섹션을 참조하세요.

GENERATED BY DEFAULT AS IDENTITY 열을 추가할 수 있습니다. GENERATED BY DEFAULT AS IDENTITY로 정의된 열을 직접 입력하는 값으로 업데이트할 수 있습니다. 자세한 내용은 [ALTER TABLE APPEND 사용 시 주의 사항](#r_ALTER_TABLE_APPEND_usage) 섹션을 참조하세요.

대상 테이블은 영구 테이블이어야 합니다. 그러나 소스는 영구 테이블이거나 스트리밍 수집을 위해 구성된 구체화된 뷰일 수 있습니다. 두 객체 모두 동일한 배포 스타일과 배포 키(정의된 경우)를 사용해야 합니다. 객체가 정렬되어 있는 경우 두 객체 모두 동일한 정렬 스타일을 사용하고 정렬 키와 동일한 열을 정의해야 합니다.

ALTER TABLE APPEND 명령은 작업 완료 즉시 자동으로 커밋합니다. 롤백할 수 없습니다. 트랜잭션 블록(BEGIN ... END) 내에서 ALTER TABLE APPEND를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

ALTER TABLE APPEND 명령에 따라 다음 권한 중 하나가 필요합니다.
+ 수퍼유저
+ ALTER TABLE 시스템 권한이 있는 사용자
+ 원본 테이블에 대한 DELETE 및 SELECT 권한과 대상 테이블에 대한 INSERT 권한을 가진 사용자

## 구문
<a name="r_ALTER_TABLE_APPEND-synopsis"></a>

```
ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ]
[ IGNOREEXTRA | FILLTARGET ]
```

구체화된 뷰에서 추가하는 것은 구체화된 뷰가 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md)에 대해 구성된 경우에만 작동합니다.

## 파라미터
<a name="r_ALTER_TABLE_APPEND-parameters"></a>

 *target\$1table\$1name*   
행이 추가된 테이블의 이름입니다. 특정 스키마를 사용하려면 테이블의 이름만 지정하거나 *schema\$1name.table\$1name* 형식을 사용하세요. 대상 테이블은 기존의 영구 테이블이어야 합니다.

 FROM *source\$1table\$1name*   
추가될 행을 제공하는 테이블의 이름입니다. 특정 스키마를 사용하려면 테이블의 이름만 지정하거나 *schema\$1name.table\$1name* 형식을 사용하세요. 원본 테이블은 기존의 영구 테이블이어야 합니다.

 FROM *source\$1materialized\$1view\$1name*   
추가될 행을 제공하는 구체화된 뷰의 이름입니다. 구체화된 뷰에서 추가하는 것은 구체화된 뷰가 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md)에 대해 구성된 경우에만 작동합니다. 소스 구체화된 뷰가 이미 있어야 합니다.

IGNOREEXTRA   
원본 테이블이 대상 테이블에 없는 열을 포함하는 경우 추가 열에 있는 데이터를 삭제해야 함을 지정하는 키워드입니다. FILLTARGET과 함께 IGNOREEXTRA를 사용할 수 없습니다.

FILLTARGET   
대상 테이블이 원본 테이블에 없는 열을 포함하는 경우 해당 열을 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 열 값으로 채워야 함을 지정하는 키워드입니다(하나가 정의되어 있거나 NULL인 경우). FILLTARGET과 함께 IGNOREEXTRA를 사용할 수 없습니다.

## ALTER TABLE APPEND 사용 시 주의 사항
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND는 원본 테이블에서 대상 테이블로 동일한 열만 이동합니다. 열 순서는 중요하지 않습니다.
+  원본 테이블 또는 대상 테이블에 추가 열이 포함되어 있는 경우 다음 규칙에 따라 FILLTARGET 또는 IGNOREEXTRA를 사용합니다.
  + 대상 테이블에 없는 열이 원본 테이블에 있는 경우 IGNOREEXTRA를 포함합니다. 이 명령은 원본 테이블에 있는 여분의 열은 무시합니다.
  + 원본 테이블에 없는 열이 대상 테이블에 있는 경우 FILLTARGET을 포함합니다. 이 명령을 실행하면 대상 테이블의 추가 열에 기본 열 값이나 IDENTITY 값이 채워집니다(하나가 정의되어 있거나 NULL인 경우).
  + 원본 테이블과 대상 테이블에 모두 추가 열이 있는 경우에는 명령이 실패합니다. FILLTARGET과 IGNOREEXTRA를 모두 사용할 수는 없습니다.
+ 두 테이블에 모두 이름은 같지만 속성이 다른 열이 있는 경우 명령은 실패합니다. 이름이 같은 열들은 다음의 공통된 속성을 가져야 합니다.
  + 데이터 유형
  + 열 크기
  + 압축 인코딩
  + Null이 아님
  + 정렬 스타일
  + 정렬 키 열
  + 분산 스타일
  + 분산 키 열
+ 자격 증명 열을 추가할 수 없습니다. 원본 테이블과 대상 테이블에 모두 자격 증명 열이 있는 경우에는 명령이 실패합니다. 원본 테이블에만 자격 증명 열이 있는 경우 자격 증명 열이 무시되도록 IGNOREEXTRA 파라미터를 포함하세요. 대상 테이블에만 자격 증명 열이 있는 경우 테이블에 대해 정의된 IDENTITY 절에 따라 자격 증명 열이 채워지도록 FILLTARGET 파라미터를 포함하세요. 자세한 내용은 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 섹션을 참조하세요.
+ ALTER TABLE APPEND 문으로 기본 자격 증명 열을 추가할 수 있습니다. 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.
+ ALTER TABLE APPEND 작업은 다음 중 하나에 연결된 Amazon Redshift 스트리밍 구체화된 뷰에서 실행될 때 배타적 잠금을 유지합니다.
  +  Amazon Kinesis 데이터 스트림 
  +  Amazon Managed Streaming for Apache Kafka 주제 
  +  Confluent Cloud Kafka 주제와 같은 지원되는 외부 스트림 

  자세한 내용은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md) 섹션을 참조하세요.

## ALTER TABLE APPEND 예
<a name="r_ALTER_TABLE_APPEND_examples"></a>

회사에서 현재의 판매 거래를 파악하기 위해 SALES\$1MONTHLY라는 테이블을 관리하고 있다고 해봅시다. 매달 거래 테이블에서 SALES 테이블로 데이터를 이동하려고 합니다.

이럴 때 다음과 같이 INSERT INTO 및 TRUNCATE 명령을 사용하여 이 작업을 완수할 수 있습니다.

```
insert into sales (select * from sales_monthly);
truncate sales_monthly;
```

하지만 ALTER TABLE APPEND 명령을 사용하면 같은 작업을 훨씬 더 효율적으로 수행할 수 있습니다.

먼저 [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md) 시스템 카탈로그 테이블을 쿼리하여 두 테이블에 모두 같은 열 속성을 가진 같은 열이 있는지 확인합니다.

```
select trim(tablename) as table, "column", trim(type) as type,
encoding, distkey, sortkey, "notnull"
from pg_table_def where tablename like 'sales%';

table      | column     | type                        | encoding | distkey | sortkey | notnull
-----------+------------+-----------------------------+----------+---------+---------+--------
sales      | salesid    | integer                     | lzo      | false   |       0 | true
sales      | listid     | integer                     | none     | true    |       1 | true
sales      | sellerid   | integer                     | none     | false   |       2 | true
sales      | buyerid    | integer                     | lzo      | false   |       0 | true
sales      | eventid    | integer                     | mostly16 | false   |       0 | true
sales      | dateid     | smallint                    | lzo      | false   |       0 | true
sales      | qtysold    | smallint                    | mostly8  | false   |       0 | true
sales      | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
sales      | commission | numeric(8,2)                | delta32k | false   |       0 | false
sales      | saletime   | timestamp without time zone | lzo      | false   |       0 | false
salesmonth | salesid    | integer                     | lzo      | false   |       0 | true
salesmonth | listid     | integer                     | none     | true    |       1 | true
salesmonth | sellerid   | integer                     | none     | false   |       2 | true
salesmonth | buyerid    | integer                     | lzo      | false   |       0 | true
salesmonth | eventid    | integer                     | mostly16 | false   |       0 | true
salesmonth | dateid     | smallint                    | lzo      | false   |       0 | true
salesmonth | qtysold    | smallint                    | mostly8  | false   |       0 | true
salesmonth | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | commission | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

다음으로, 각 테이블의 크기를 살펴봅니다.

```
select count(*) from sales_monthly;
 count
-------
  2000
(1 row)

select count(*) from sales;
 count
-------
 412,214
(1 row)
```

이제는 다음 ALTER TABLE APPEND 명령을 실행합니다.

```
alter table sales append from sales_monthly;         
```

각 테이블의 크기를 다시 살펴봅니다. 지금 SALES\$1MONTHLY 테이블의 행 개수는 0개인데 반해, SALES 테이블의 행 개수는 2,000개로 늘었습니다.

```
select count(*) from sales_monthly;
 count
-------
     0
(1 row)

select count(*) from sales;
 count
-------
 414214
(1 row)
```

원본 테이블의 열 개수가 대상 테이블의 열 개수보다 많은 경우 IGNOREEXTRA 파라미터를 지정합니다. 다음 예에서는 IGNOREEXTRA 파라미터를 사용하여 SALES 테이블에 추가할 때 SALES\$1LISTING 테이블에 있는 추가 열을 무시합니다.

```
alter table sales append from sales_listing ignoreextra;
```

대상 테이블의 열 개수가 원본 테이블의 열 개수보다 많은 경우 FILLTARGET 파라미터를 지정합니다. 다음 예에서는 FILLTARGET 파라미터를 사용하여 SALES\$1MONTH 테이블에는 없는 열을 SALES\$1REPORT 테이블에 채웁니다.

```
alter table sales_report append from sales_month filltarget;
```

다음 예는 구체화된 뷰를 소스로 사용하여 ALTER TABLE APPEND를 사용하는 방법을 보여줍니다.

```
ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;
```

이 예의 테이블 및 구체화된 뷰 이름은 샘플입니다. 구체화된 뷰에서 추가하는 것은 구체화된 뷰가 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md)에 대해 구성된 경우에만 작동합니다. 소스 구체화된 뷰의 모든 레코드를 구체화된 뷰와 동일한 스키마를 가진 대상 테이블로 이동하고 구체화된 뷰는 그대로 둡니다. 이는 데이터 소스가 테이블인 경우와 동일한 동작입니다.

# ALTER TEMPLATE
<a name="r_ALTER_TEMPLATE"></a>

기존 템플릿의 정의를 변경합니다. 이 명령을 사용하여 템플릿의 이름을 바꾸거나, 템플릿 소유자를 변경하거나, 템플릿 정의에서 파라미터를 추가 또는 제거하거나, 파라미터 값을 설정합니다.

## 필수 권한
<a name="r_ALTER_TEMPLATE-privileges"></a>

템플릿을 변경하려면 다음 중 하나가 있어야 합니다.
+ 수퍼유저 권한
+ 템플릿이 포함된 스키마에 대한 ALTER TEMPLATE 권한 및 USAGE 권한

## 구문
<a name="r_ALTER_TEMPLATE-synopsis"></a>

```
ALTER TEMPLATE [database_name.][schema_name.]template_name
{
RENAME TO new_name
| OWNER TO new_owner
| ADD  parameter [AS] [value]
| DROP parameter
| SET parameter TO value1 [, parameter2 TO value2 , ...]
};
```

## 파라미터
<a name="r_ALTER_TEMPLATE-parameters"></a>

 *database\$1name*   
(선택 사항) 템플릿이 생성되는 데이터베이스의 이름입니다. 지정하지 않으면 현재 데이터베이스가 사용됩니다.

 *schema\$1name*   
(선택 사항) 템플릿이 생성되는 스키마의 이름입니다. 지정하지 않으면 현재 검색 경로에서 템플릿이 검색됩니다.

 *template\$1name*   
변경할 템플릿의 이름.

RENAME TO   
템플릿의 이름을 바꾸는 절입니다.

 *new\$1name*   
템플릿의 새로운 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

OWNER TO   
템플릿의 소유자를 변경하는 절입니다.

 *new\$1owner*   
템플릿의 새 소유자입니다.

ADD *파라미터* [AS] [*값*]  
템플릿에 새 파라미터를 추가합니다.  
+ 키워드 전용 파라미터(예: CSV 또는 GZIP)의 경우 파라미터 이름만 지정합니다.
+ 값이 필요한 파라미터의 경우 파라미터 이름을 지정한 다음 값을 지정합니다. 선택적으로 파라미터와 값 사이에 AS를 포함할 수 있습니다.

DROP *파라미터*  
템플릿에서 지정된 파라미터를 제거합니다. 단일 DROP 명령을 사용하여 여러 파라미터를 삭제할 수 없습니다.

SET *파라미터* TO *값1* [, *파라미터2* TO *값2* , ...]  
기존 템플릿 파라미터의 값을 업데이트합니다. 이미 값이 있는 파라미터에만 사용합니다. 단일 명령으로 여러 파라미터를 업데이트할 수 있습니다.

## 예제
<a name="r_ALTER_TEMPLATE-examples"></a>

다음 예시에서는 test\$1template 템플릿의 이름을 demo\$1template로 바꿉니다.

```
ALTER TEMPLATE test_template
RENAME TO demo_template;
```

다음 예에서는 demo\$1template 스키마의 소유권을 사용자 bob에게 제공합니다.

```
ALTER TEMPLATE demo_template
OWNER TO bob;
```

다음 예제에서는 템플릿 demo\$1template에 파라미터 `CSV`를 추가합니다.

```
ALTER TEMPLATE demo_template
ADD CSV;
```

다음 예제에서는 템플릿 demo\$1template에 파라미터 `TIMEFORMAT 'auto'`를 추가합니다.

```
ALTER TEMPLATE demo_template
ADD TIMEFORMAT 'auto';
```

다음 예시에서는 템플릿 demo\$1template에서 파라미터 `ENCRYPTED`를 삭제합니다.

```
ALTER TEMPLATE demo_template
DROP ENCRYPTED;
```

다음 예제에서는 `DELIMITER` 파라미터를 `'|'` 기호로 설정하고 `TIMEFORMAT` 파라미터를 `'epochsecs'`로 설정합니다.

```
ALTER TEMPLATE demo_template
SET DELIMITER TO '|', TIMEFORMAT TO 'epochsecs';
```

# ALTER USER
<a name="r_ALTER_USER"></a>

데이터베이스 사용자를 변경합니다.

## 필수 권한
<a name="r_ALTER_USER-privileges"></a>

ALTER USER에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ ALTER USER 권한이 있는 사용자
+ 자신의 암호를 변경하려는 현재 사용자

## 구문
<a name="r_ALTER_USER-synopsis"></a>

```
ALTER USER username [ WITH ] option [, ... ]

where option is

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ VALID UNTIL 'expiration_date' ]
| RENAME TO new_name |
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit | RESET SESSION TIMEOUT
| SET parameter { TO | = } { value | DEFAULT }
| RESET parameter
| EXTERNALID external_id
```

## 파라미터
<a name="r_ALTER_USER-parameters"></a>

 * 사용자 이름*   
사용자의 이름입니다.

WITH   
선택적 키워드입니다.

CREATEDB \$1 NOCREATEDB   
CREATEDB 옵션을 사용하여 새 데이터베이스를 만들 수 있습니다. NOCREATEDB가 기본값입니다.

CREATEUSER \$1 NOCREATEUSER   
CREATEUSER 옵션으로 CREATE USER를 포함한 모든 데이터베이스 권한을 가진 수퍼유저를 생성합니다. 기본값은 NOCREATEUSER입니다. 자세한 내용은 [슈퍼 사용자](r_superusers.md) 섹션을 참조하세요.

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="alter-user-syslog-access"></a>
Amazon Redshift 시스템 테이블 및 뷰에 대한 사용자의 액세스 수준을 지정합니다.  
SYSLOG ACCESS RESTRICTED 권한이 있는 일반 사용자는 사용자 가시성 시스템 테이블 및 뷰에서 해당 사용자가 생성한 행만 볼 수 있습니다. 기본값은 RESTRICTED입니다.  
SYSLOG ACCESS UNRESTRICTED 권한이 있는 일반 사용자는 사용자 가시성 시스템 테이블 및 뷰에서 다른 사용자가 생성한 행을 포함한 모든 행을 볼 수 있습니다. UNRESTRICTED는 수퍼유저 가시성 테이블에 대한 일반 사용자 액세스를 부여하지 않습니다. 수퍼유저만 수퍼유저 가시성 테이블을 볼 수 있습니다.  
사용자에게 시스템 테이블에 대한 무제한 액세스를 제공하면 다른 사용자가 생성한 데이터에 대한 가시성이 사용자에게 제공됩니다. 예를 들어, STL\$1QUERY 및 STL\$1QUERYTEXT에는 INSERT, UPDATE 및 DELETE 문의 전체 텍스트가 포함되며, 여기에는 사용자가 생성한 민감한 데이터가 포함될 수 있습니다.
SVV\$1TRANSACTIONS의 모든 행은 모든 사용자에게 표시됩니다.  
자세한 내용은 [시스템 테이블 및 뷰에 있는 데이터의 가시성](cm_chap_system-tables.md#c_visibility-of-data) 섹션을 참조하세요.

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
사용자의 암호를 설정합니다.  
기본적으로, 암호가 비활성화 상태가 아닌 이상 사용자는 암호를 변경할 수 있습니다. 사용자의 암호를 비활성화하려면 DISABLE을 지정하세요. 사용자 암호를 비활성화하면 시스템에서 해당 암호가 삭제되고 사용자는 임시 AWS Identity and Access Management(IAM) 사용자 자격 증명만 이용해 로그인할 수 있습니다. 자세한 내용은 [IAM 인증을 이용한 데이터베이스 사용자 자격 증명 생성](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html)을 참조하세요. 수퍼유저만이 암호를 활성화 또는 비활성화할 수 있습니다. 수퍼유저의 암호를 비활성화할 수는 없습니다. 암호를 활성화하려면 ALTER USER를 실행하고 암호를 지정하세요.  
PASSWORD 파라미터 사용에 대한 자세한 내용은 [CREATE USER](r_CREATE_USER.md) 섹션을 참조하세요.

VALID UNTIL '*expiration\$1date*'  
암호에 만료 날짜가 있음을 지정합니다. 만료 날짜가 없도록 하려면 값 `'infinity'`를 사용하세요. 이 파라미터에 유효한 데이터 형식은 타임스탬프입니다.  
슈퍼유저만 이 파라미터를 사용할 수 있습니다.

RENAME TO   
사용자 이름을 새로 지정합니다.

 *new\$1name*   
사용자의 새 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
사용자의 이름을 재설정할 때는 사용자의 암호도 변경해야 합니다. 재설정 암호는 이전 암호와 다르지 않아도 됩니다. 사용자 이름은 암호를 암호화하는 과정의 일부로 사용되므로, 사용자 이름을 바꾸면 해당 암호가 삭제됩니다. 사용자가 암호를 재설정해야 로그인할 수 있습니다. 예:   

```
alter user newuser password 'EXAMPLENewPassword11'; 
```

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
사용자가 동시에 열어놓을 수 있는 데이터베이스 연결의 최대 개수입니다. 슈퍼 사용자에 대해서는 이 제한이 적용되지 않습니다. 최대 동시 연결 수를 허용하려면 UNLIMITED 키워드를 사용하세요. 각 데이터베이스에 대한 연결 개수 제한이 적용될 수도 있습니다. 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요. 기본값은 UNLIMITED입니다. 현재 연결을 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리하세요.  
사용자 및 데이터베이스 연결 제한이 모두 적용되는 경우 사용되지 않는 연결 슬롯은 사용자가 연결 시도 시 양쪽 제한 범위 내에서 모두 사용 가능해야 합니다.

SESSION TIMEOUT *limit* \$1 RESET SESSION TIMEOUT  
세션이 비활성 또는 유휴 상태로 유지되는 최대 시간(초)입니다. 범위는 60초(1분)\$11,728,000초(20일)입니다. 사용자에 대해 세션 시간 제한이 설정되지 않은 경우 클러스터 설정이 적용됩니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [Amazon Redshift의 할당량 및 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.  
세션 시간 제한을 설정하면 새 세션에만 적용됩니다.  
시작 시간, 사용자 이름 및 세션 시간 제한을 포함하여 활성 사용자 세션에 대한 정보를 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리합니다. 사용자 세션 기록에 대한 정보를 보려면 [STL\$1SESSIONS](r_STL_SESSIONS.md) 뷰를 쿼리합니다. 세션 시간 제한 값을 포함하여 데이터베이스 사용자에 대한 정보를 검색하려면 [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md) 뷰를 쿼리합니다.

SET   
지정된 사용자가 실행하는 모든 세션에 대한 새로운 기본값으로 구성 파라미터를 설정합니다.

reset   
지정된 사용자에 대한 원래 기본값으로 구성 파라미터를 재설정합니다.

 *파라미터*   
설정할 파라미터의 이름.

 * 값*   
파라미터의 새 값입니다.

DEFAULT   
지정된 사용자가 실행하는 모든 세션에 대한 기본값으로 구성 파라미터를 설정합니다.

EXTERNALID *external\$1id*   
자격 증명 공급자와 연결된 사용자의 식별자입니다. 사용자는 암호를 비활성화해야 합니다. 자세한 내용은 [Amazon Redshift용 네이티브 자격 증명 공급자(IdP) 페더레이션](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)을 참조하세요.

## 사용 노트
<a name="r_ALTER_USER_usage_notes"></a>
+ **rdsdb 변경 시도** - 이름이 `rdsdb`인 사용자를 변경할 수 없습니다.
+ **알 수 없는 암호 생성** - AWS Identity and Access Management(IAM) 인증을 이용해 데이터베이스 사용자 보안 인증 정보를 만들 때는 임시 보안 인증 정보만을 이용해 로그인할 수 있는 수퍼유저를 만드는 것이 좋습니다. 수퍼유저의 암호를 비활성화할 수는 없지만 임의로 생성되는 MD5 해시 문자열을 이용해 알 수 없는 암호를 만들 수는 있습니다.

  ```
  alter user iam_superuser password 'md51234567890123456780123456789012';
  ```
+ **search\$1path 설정** - ALTER USER 명령으로 [search\$1path](r_search_path.md) 파라미터를 설정하면 수정된 사항은 지정된 사용자가 다음에 로그인할 때 적용됩니다. 현재 사용자와 세션에 대해 search\$1path 값을 변경하려면 SET 명령을 사용합니다.
+ **시간대 설정** - ALTER USER 명령으로 SET TIMEZONE을 사용하면 수정된 사항은 지정된 사용자가 다음에 로그인할 때 적용됩니다.
+ **동적 데이터 마스킹 및 행 수준 보안 정책 작업** - 프로비저닝된 클러스터 또는 서버리스 네임스페이스에 동적 데이터 마스킹 또는 행 수준 보안 정책이 있는 경우, 일반 사용자에게는 다음 명령이 차단됩니다.

  ```
  ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
  ```

  슈퍼유저와 ALTER USER 권한이 있는 사용자만 이러한 구성 옵션을 설정할 수 있습니다. 행 수준 보안에 대한 자세한 내용은 [행 수준 보안](t_rls.md) 섹션을 참조하세요. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md) 섹션을 참조하세요.

## 예제
<a name="r_ALTER_USER-examples"></a>

다음 예에서는 데이터베이스 생성 권한을 사용자 ADMIN에게 부여합니다.

```
alter user admin createdb;
```

다음 예에서는 사용자 ADMIN의 암호를 `adminPass9`로 설정하고 암호에 대한 만료 날짜와 시간을 설정합니다.

```
alter user admin password 'adminPass9'
valid until '2017-12-31 23:59';
```

다음 예에서는 사용자 ADMIN의 이름을 SYSADMIN으로 바꿉니다.

```
alter user admin rename to sysadmin;
```

다음 예에서는 사용자에 대한 유휴 세션 시간 제한을 300초로 업데이트합니다.

```
ALTER USER dbuser SESSION TIMEOUT 300;
```

사용자의 유휴 세션 시간 제한을 재설정합니다. 재설정하면 클러스터 설정이 적용됩니다. 이 명령을 실행하려면 데이터베이스 슈퍼 사용자여야 합니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [Amazon Redshift의 할당량 및 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.

```
ALTER USER dbuser RESET SESSION TIMEOUT;
```

다음 예에서는 이름이 `bob`인 사용자의 외부 ID를 업데이트합니다. 네임스페이스는 `myco_aad`입니다. 네임스페이스가 등록된 자격 증명 공급자와 연결되지 않은 경우 오류가 발생합니다.

```
ALTER USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

다음 예는 특정 데이터베이스 사용자가 실행하는 모든 세션의 시간대를 설정합니다. 현재 세션이 아닌 이후 모든 세션의 시간대가 변경됩니다.

```
ALTER USER odie SET TIMEZONE TO 'Europe/Zurich';
```

다음 예시에서는 사용자 `bob`이 열 수 있는 최대 데이터베이스 연결 수를 설정합니다.

```
ALTER USER bob CONNECTION LIMIT 10;
```

# ANALYZE
<a name="r_ANALYZE"></a>

쿼리 플래너가 사용할 테이블 통계를 업데이트합니다.

## 필수 권한
<a name="r_ANALYZE-privileges"></a>

ANALYZE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ ANALYZE 권한이 있는 사용자
+ 관계 소유자
+ 테이블이 공유되는 데이터베이스 소유자

## 구문
<a name="r_ANALYZE-synopsis"></a>

```
ANALYZE [ VERBOSE ]
[ [ table_name [ ( column_name [, ...] ) ] ]
[ PREDICATE COLUMNS | ALL  COLUMNS ]
```

## 파라미터
<a name="r_ANALYZE-parameters"></a>

상세 표시   
ANALYZE 작업의 진행률 정보 메시지를 반환하는 절입니다. 이 옵션은 테이블을 지정하지 않을 때 유용합니다.

 *table\$1name*   
임시 테이블을 포함한 특정 테이블을 분석할 수 있습니다. 테이블은 테이블의 스키마 이름으로 정규화할 수 있습니다. 선택적으로 단일 테이블을 분석하도록 table\$1name을 지정할 수 있습니다. 단일 ANALYZE *table\$1name* 문으로 *table\$1name*을 여러 개 지정할 수 없습니다. *table\$1name* 값을 지정하지 않으면 시스템 카탈로그의 영구 테이블을 포함하여 현재 연결된 데이터베이스의 모든 테이블이 분석됩니다. Amazon Redshift는 마지막 ANALYZE 이후 변경된 행의 비율이 분석 임계값보다 낮은 경우 테이블 분석을 건너뜁니다. 자세한 내용은 [분석 임계값](#r_ANALYZE-threshold) 섹션을 참조하세요.  
Amazon Redshift 시스템 테이블(STL 및 STV 테이블)을 분석할 필요는 없습니다.

 *column\$1name*   
*table\$1name*을 지정하는 경우 테이블에 있는 하나 이상의 열을 지정할 수도 있습니다(괄호 안의 열로 구분된 목록으로). 열 목록을 지정하면 나열된 열만 분석됩니다.

 PREDICATE COLUMNS \$1 ALL COLUMNS   
ANALYZE에 조건자 열만 포함시킬지 나타내는 절입니다. 이전 쿼리에서 조건자로 사용되었거나 조건자로 사용될 수 있는 열만 분석하려면 PREDICATE COLUMNS를 지정합니다. 모든 열을 분석하려면 ALL COLUMNS를 지정합니다. 기본값은 ALL COLUMNS입니다.  
열이 조건자 열 집합에 포함되기 위해서는 다음 중 한 가지만 만족하면 됩니다.  
+ 열이 쿼리에서 filter, join condition 또는 group by 절의 일부로 사용되었습니다.
+ 분산 키인 열
+ 정렬 키에 포함되는 열
예를 들어 테이블에 대한 쿼리를 아직 실행하지 않아서 조건자 열로 표시되는 열이 하나도 없는 경우에는 PREDICATE COLUMNS로 지정하더라도 모든 열이 분석됩니다. 이 경우 Amazon Redshift는 '*table-name*'에 대한 조건자 열을 찾을 수 없음과 같은 메시지로 응답할 수 있습니다. 모든 열을 분석하고 있습니다. 조건자 열에 대한 자세한 내용은 [테이블 분석](t_Analyzing_tables.md) 섹션을 참조하세요.

## 사용 노트
<a name="r_ANALYZE-usage-notes"></a>

Amazon Redshift는 다음 명령으로 생성하는 테이블에서 ANALYZE를 자동으로 실행합니다.
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 외부 테이블은 분석할 수 없습니다.

이 테이블들이 처음 생성될 때는 테이블에서 ANALYZE 명령을 실행할 필요가 없습니다. 테이블을 수정하는 경우, 다른 테이블과 같은 방법으로 분석해야 합니다.

### 분석 임계값
<a name="r_ANALYZE-threshold"></a>

처리 시간을 단축하고 전체 시스템 성능을 개선하기 위해 Amazon Redshift는 마지막 ANALYZE 명령 실행 이후로 변경된 행의 비율이 [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md) 파라미터에 의해 지정된 분석 임계값보다 낮은 경우 테이블 ANALYZE를 건너뜁니다. 기본적으로 `analyze_threshold_percent`는 10입니다. 현재 세션에 대한 `analyze_threshold_percent`를 변경하려면 [SET](r_SET.md) 명령을 실행합니다. 다음 예에서는 `analyze_threshold_percent`를 20퍼센트로 변경합니다.

```
set analyze_threshold_percent to 20;
```

소수의 행만 변경되었을 때 테이블을 분석하려면 `analyze_threshold_percent`를 임의의 작은 수로 설정하세요. 예를 들어 `analyze_threshold_percent`를 0.01로 설정하면 10,000개 이상의 행이 변경된 경우 100,000,000개의 행이 있는 테이블을 건너뛰지 않습니다.

```
set analyze_threshold_percent to 0.01;
```

테이블이 분석 임계값을 충족하지 못해 ANALYZE가 테이블을 건너뛰는 경우 Amazon Redshift는 다음 메시지를 반환합니다.

```
ANALYZE SKIP
```

변경된 행이 없더라도 모든 테이블을 분석하려면 `analyze_threshold_percent`를 0으로 설정하세요.

ANALYZE 작업의 결과를 보려면 [STL\$1ANALYZE](r_STL_ANALYZE.md) 시스템 테이블을 쿼리하세요.

테이블 분석에 대한 자세한 내용은 [테이블 분석](t_Analyzing_tables.md) 섹션을 참조하세요.

## 예제
<a name="r_ANALYZE-examples"></a>

TICKIT 데이터베이스에 있는 모든 테이블을 분석하고 진행률 정보를 반환합니다.

```
analyze verbose;
```

LISTING 테이블만 분석합니다.

```
analyze listing;
```

VENUE 테이블에서 VENUEID 및 VENUENAME 열을 분석합니다.

```
analyze venue(venueid, venuename);
```

VENUE 테이블에서 조건자 열만 분석합니다.

```
analyze venue predicate columns;
```

# ANALYZE COMPRESSION
<a name="r_ANALYZE_COMPRESSION"></a>

분석 대상 테이블에 대해 제안되는 압축 인코딩으로 압축 분석을 수행하고 보고서를 생성합니다. 각각의 열에 대해, 보고서에는 원시 인코딩에 비해 디스크 공간의 잠재적 감소 추정치가 포함됩니다.

## 구문
<a name="r_ANALYZE_COMPRESSION-synopsis"></a>

```
ANALYZE COMPRESSION
[ [ table_name ]
[ ( column_name [, ...] ) ] ]
[COMPROWS numrows]
```

## 파라미터
<a name="r_ANALYZE_COMPRESSION-parameters"></a>

 *table\$1name*   
임시 테이블을 포함한 특정 테이블에 대한 압축을 분석할 수 있습니다. 테이블은 테이블의 스키마 이름으로 정규화할 수 있습니다. 선택적으로 단일 테이블을 분석하도록 *table\$1name*을 지정할 수 있습니다. *table\$1name*을 지정하지 않으면 현재 연결된 데이터베이스에 있는 모든 테이블이 분석됩니다. 단일 ANALYZE COMPRESSION 문으로 *table\$1name*을 두 개 이상 지정할 수 없습니다.

 *column\$1name*   
*table\$1name*을 지정하는 경우 테이블에 있는 하나 이상의 열을 지정할 수도 있습니다(괄호 안의 열로 구분된 목록으로).

COMPROWS  
압축 분석을 위한 샘플 크기로 사용할 행의 개수입니다. 분석은 각 데이터 조각의 행에서 실행됩니다. 예를 들어, COMPROWS 1000000(1,000,000)을 지정하고 시스템에 총 4개의 조각이 있는 경우 조각당 250,000개의 행만 읽히고 분석됩니다. COMPROWS가 지정되지 않은 경우 샘플 크기는 기본적으로 조각당 100,000개입니다. 기본값인 조각당 100,000개의 행보다 낮은 COMPROWS 값은 자동으로 기본값으로 업그레이드됩니다. 하지만 테이블에 있는 데이터의 양이 유의미한 샘플을 생성하기에 부족한 경우 압축 분석에서는 권장 사항을 제시하지 않습니다. COMPROWS 숫자가 테이블의 행 개수보다 큰 값이면 ANALYZE COMPRESSION 명령이 계속 진행하고 사용 가능한 모든 행에 대한 압축 분석을 실행합니다. 테이블이 지정되지 않은 경우 COMPROWS를 사용하면 오류가 발생합니다.

 *numrows*   
압축 분석을 위한 샘플 크기로 사용할 행의 개수입니다. *numrows*의 허용 범위는 1000과 1000000000(1,000,000,000) 사이의 수입니다.

## 사용 노트
<a name="r_ANALYZE_COMPRESSION_usage_notes"></a>

ANALYZE COMPRESSION은 배타적인 테이블 잠금을 획득하여 테이블에 대한 동시 읽기 및 쓰기를 방지합니다. 테이블이 유휴 상태일 때만 ANALYZE COMPRESSION을 실행하세요.

테이블 내용의 샘플을 바탕으로 열 인코딩 체계에 대한 권장 사항을 받으려면 ANALYZE COMPRESSION을 실행하세요. ANALYZE COMPRESSION은 자문 도구로서 테이블의 열 인코딩을 수정하지 않습니다. 테이블을 다시 생성하거나 같은 스키마를 가진 새 테이블을 생성하여 제안되는 인코딩을 적용할 수 있습니다. 적절한 인코딩 체계를 사용하여 압축되지 않은 테이블을 다시 생성하면 디스크 상의 공간을 크게 줄일 수 있습니다. 이 방법을 사용하면 디스크 공간을 절약하고 I/O 바인딩 워크로드의 쿼리 성능을 향상시킬 수 있습니다.

ANALYZE COMPRESSION은 실제 분석 단계를 건너뛰고, SORTKEY로 지정된 모든 열에서 원래 인코딩 형식을 직접 반환합니다. SORTKEY 열이 다른 열보다 훨씬 많이 압축되면 범위 제한 스캔이 제대로 수행되지 않을 수 있기 때문입니다.

## 예제
<a name="r_ANALYZE_COMPRESSION-examples"></a>

다음 예는 LISTING 테이블 내 열에 대해서만 인코딩 및 추정 백분율 감소를 보여 줍니다.

```
analyze compression listing;
  
  Table  |     Column     | Encoding | Est_reduction_pct 
---------+----------------+----------+-------------------
 listing | listid         | az64     | 40.96
 listing | sellerid       | az64     | 46.92
 listing | eventid        | az64     | 53.37
 listing | dateid         | raw      | 0.00
 listing | numtickets     | az64     | 65.66
 listing | priceperticket | az64     | 72.94
 listing | totalprice     | az64     | 68.05
 listing | listtime       | az64     | 49.74
```

다음 예는 SALES 테이블에서 QTYSOLD, COMMISSION 및 SALETIME 열을 분석합니다.

```
analyze compression sales(qtysold, commission, saletime);

 Table |   Column   | Encoding | Est_reduction_pct 
-------+------------+----------+-------------------
 sales | salesid    | N/A      | 0.00
 sales | listid     | N/A      | 0.00
 sales | sellerid   | N/A      | 0.00
 sales | buyerid    | N/A      | 0.00
 sales | eventid    | N/A      | 0.00
 sales | dateid     | N/A      | 0.00
 sales | qtysold    | az64     | 83.06
 sales | pricepaid  | N/A      | 0.00
 sales | commission | az64     | 71.85
 sales | saletime   | az64     | 49.63
```

# 마스킹 정책 연결
<a name="r_ATTACH_MASKING_POLICY"></a>

기존 동적 데이터 마스킹 정책을 열에 연결합니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md)(동적 데이터 마스킹(미리 보기)을 참조하세요.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 마스킹 정책을 연결할 수 있습니다.

## 구문
<a name="r_ATTACH_MASKING_POLICY-synopsis"></a>

```
ATTACH MASKING POLICY 
{
  policy_name ON relation_name
  | database_name.policy_name ON database_name.schema_name.relation_name
}
( { output_column_names | output_path } )
[ USING ( { input_column_names | input_path } ) ]
TO { user_name | ROLE role_name | PUBLIC }
[ PRIORITY priority ];
```

## 파라미터
<a name="r_ATTACH_MASKING_POLICY-parameters"></a>

*policy\$1name*   
연결할 마스킹 정책 이름입니다.

database\$1name  
정책 및 관계가 생성되는 데이터베이스의 이름입니다. 정책과 관계는 동일한 데이터베이스에 있어야 합니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

schema\$1name  
관계가 속하는 스키마의 이름입니다.

 *relation\$1name*   
마스킹 정책을 연결할 관계의 이름입니다.

*output\$1column\$1names*   
마스킹 정책이 적용될 열의 이름입니다.

*output\$1paths*   
열 이름을 포함하여 마스킹 정책이 적용될 SUPER 객체의 전체 경로입니다. 예를 들어 이름이 `person`인 SUPER 유형 열이 있는 관계의 경우 **output\$1path는 `person.name.first_name`일 것입니다.

*input\$1column\$1names*   
마스킹 정책에서 입력으로 사용할 열의 이름입니다. 이 파라미터는 선택 사항입니다. 지정하지 않으면 마스킹 정책은 **output\$1column\$1names를 입력으로 사용합니다.

*input\$1paths*   
마스킹 정책에서 입력으로 사용할 SUPER 객체의 전체 경로입니다. 이 파라미터는 선택 사항입니다. 지정하지 않으면 마스킹 정책은 **output\$1path를 입력으로 사용합니다.

*user\$1name*   
마스킹 정책이 연결될 사용자의 이름입니다. 사용자와 열 또는 역할과 열의 동일한 조합에 두 개의 정책을 연결할 수 없습니다. 정책을 사용자에게 연결하고 다른 정책을 사용자의 역할에 연결할 수 있습니다. 이 경우 우선 순위가 높은 정책이 적용됩니다.  
단일 ATTACH MASKING POLICY 명령에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

*role\$1name*   
마스킹 정책이 연결될 역할의 이름입니다. 동일한 열/역할 쌍에 두 개의 정책을 연결할 수 없습니다. 정책을 사용자에게 연결하고 다른 정책을 사용자의 역할에 연결할 수 있습니다. 이 경우 우선 순위가 높은 정책이 적용됩니다.  
단일 ATTACH MASKING POLICY 명령에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

*PUBLIC*   
테이블에 액세스하는 모든 사용자에게 마스킹 정책을 연결합니다. 특정 열/사용자 또는 열/역할 쌍에 연결된 다른 마스킹 정책을 적용하려면 PUBLIC 정책보다 높은 우선 순위를 부여해야 합니다.  
단일 ATTACH MASKING POLICY 명령에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

*priority*   
마스킹 정책의 우선 순위입니다. 주어진 사용자의 쿼리에 여러 마스킹 정책이 적용되는 경우 우선 순위가 가장 높은 정책이 적용됩니다.  
우선순위가 동일한 열에 서로 다른 두 개의 정책을 연결할 수 없습니다. 두 개의 정책이 서로 다른 사용자 또는 역할에 연결되어 있더라도 마찬가지입니다. 정책이 연결되는 사용자 또는 역할이 매번 다르면 동일한 테이블, 출력 열, 입력 열 및 우선순위 파라미터 세트에 동일한 정책을 여러 번 연결할 수 있습니다.  
역할이 다르더라도 해당 열에 연결된 다른 정책과 우선 순위가 같은 열에는 정책을 적용할 수 없습니다. 이 필드는 선택 사항입니다. 우선 순위를 지정하지 않을 경우 마스킹 정책의 기본값은 0입니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 ATTACH MASKING POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

# ATTACH RLS POLICY
<a name="r_ATTACH_RLS_POLICY"></a>

테이블에 대한 행 수준 보안 정책을 하나 이상의 사용자 또는 역할에 연결합니다.

`sys:secadmin` 역할이 부여된 수퍼유저와 사용자 또는 역할은 정책을 연결할 수 있습니다.

## 구문
<a name="r_ATTACH_RLS_POLICY-synopsis"></a>

```
ATTACH RLS POLICY 
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
TO { user_name | ROLE role_name | PUBLIC } [, ...]
```

## 파라미터
<a name="r_ATTACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
정책의 이름입니다.

database\$1name  
정책 및 관계가 생성되는 데이터베이스의 이름입니다. 정책과 관계는 동일한 데이터베이스에 있어야 합니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

schema\$1name  
관계가 속하는 스키마의 이름입니다.

table\$1name  
행 수준 보안 정책이 연결된 관계입니다.

TO \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
정책이 하나 이상의 지정된 사용자 또는 역할에 연결되는지 여부를 지정합니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 ATTACH RLS POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

## 사용 노트
<a name="r_ATTACH_RLS_POLICY-usage"></a>

ATTACH RLS POLICY 문과 관련한 작업을 수행할 때는 다음을 준수하세요.
+ 연결되는 테이블에는 정책 생성 문의 WITH 절에 나열된 모든 열이 있어야 합니다.
+ Amazon Redshift RLS는 RLS 정책을 다음 객체에 연결하는 것을 지원합니다.
  +  테이블 
  +  보기
  +  Late Binding 보기 
  +  구체화된 뷰
+ Amazon Redshift RLS는 RLS 정책을 다음 객체에 연결하는 것을 지원하지 않습니다.
  +  카탈로그 테이블 
  +  교차 데이터베이스 관계 
  +  외부 테이블 
  +  임시 테이블 
  +  정책 조회 테이블
  + 구체화된 뷰 기본 테이블
+ 슈퍼 사용자 또는 `sys:secadmin` 권한이 있는 사용자에게 연결된 RLS 정책은 무시됩니다.

## 예제
<a name="r_ATTACH_RLS_POLICY-examples"></a>

다음 예제에서는 RLS 정책을 지정된 테이블 및 역할 조합에 연결합니다. RLS 정책은 역할이 `analyst` 또는 `dbadmin`인 사용자가 tickit\$1category\$1redshift 테이블에 액세스할 때 적용됩니다.

```
ATTACH RLS POLICY policy_concerts ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
```

# BEGIN
<a name="r_BEGIN"></a>

트랜잭션을 시작합니다. START TRANSACTION과 동의어입니다.

트랜잭션은 하나의 명령으로 구성되든 여러 명령으로 구성되든, 단 하나의 논리적 작업 단위입니다. 일반적으로 한 트랜잭션에 있는 모든 명령은 `transaction_snapshot_begin` 시스템 구성 파라미터에 대해 설정된 값으로 시작 시간이 결정되는 데이터베이스의 스냅샷에서 실행됩니다.

기본적으로 개별 Amazon Redshift 작업(쿼리, DDL 문, 로드)은 데이터베이스에 자동으로 커밋됩니다. 이후의 작업이 완료될 때까지 작업에 대한 커밋을 일시 중단하려는 경우 BEGIN 문으로 트랜잭션을 열고 필요한 명령을 실행한 다음, [COMMIT](r_COMMIT.md) 또는 [END](r_END.md) 문으로 트랜잭션을 닫아야 합니다. 필요한 경우 [ROLLBACK](r_ROLLBACK.md) 문을 사용하여 진행 중인 트랜잭션을 중지할 수 있습니다. 이 동작에 대한 예외가 [TRUNCATE](r_TRUNCATE.md) 명령으로, 명령이 실행되는 트랜잭션을 커밋하고 롤백은 불가능합니다.

## 구문
<a name="r_BEGIN-synopsis"></a>

```
BEGIN [ WORK | TRANSACTION ] [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

START TRANSACTION [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

Where option is

SERIALIZABLE
| READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ

Note: READ UNCOMMITTED, READ COMMITTED, and REPEATABLE READ have no
operational impact and map to SERIALIZABLE in Amazon Redshift. You can see database isolation levels on your cluster 
by querying the stv_db_isolation_level table.
```

## 파라미터
<a name="r_BEGIN-parameters"></a>

Work   
선택적 키워드입니다.

TRANSACTION   
선택적 키워드: WORK와 TRANSACTION은 동의어입니다.

ISOLATION LEVEL SERIALIZABLE   
직렬화 가능 격리가 기본적으로 지원되므로, 트랜잭션의 동작은 이 구문이 명령문에 포함되어 있는지에 상관없이 동일합니다. 자세한 내용은 [동시 쓰기 작업 관리](c_Concurrent_writes.md) 섹션을 참조하세요. 다른 격리 수준은 지원되지 않습니다.  
SQL 표준에서는 *더티 읽기*(트랜잭션이 동시 커밋되지 않은 트랜잭션에 의해 쓰인 데이터를 읽는 경우), *반복 불가능한 읽기*(트랜잭션이 이전에 읽은 데이터를 다시 읽었는데 처음 읽은 이후에 커밋된 다른 트랜잭션에 의해 해당 데이터가 변경되었음을 발견하는 경우), *가상 읽기*(트랜잭션이 쿼리를 다시 실행하고, 검색 조건을 만족하는 행 집합을 반환한 다음, 최근에 커밋된 다른 트랜잭션 때문에 행 집합이 변경된 것을 발견하는 경우)를 방지하기 위해 네 가지 트랜잭션 격리 수준을 정의합니다.  
+ 커밋되지 않은 데이터 읽기: 더티 읽기, 반복 불가능한 읽기 및 가상 읽기가 가능합니다.
+ 커밋된 데이터 읽기: 반복 불가능한 읽기 및 가상 읽기가 가능합니다.
+ 반복 가능한 읽기: 가상 읽기가 가능합니다.
+ 직렬화 가능: 더티 읽기, 반복 불가능한 읽기 및 가상 읽기를 방지합니다.
4가지 트랜잭션 격리 수준 중 어떤 수준이든 사용할 수 있지만 Amazon Redshift는 모든 격리 수준을 직렬화 가능한 수준으로 처리합니다.

READ WRITE   
트랜잭션 읽기 및 쓰기 권한을 제공합니다.

READ ONLY   
트랜잭션 읽기 전용 권한을 제공합니다.

## 예제
<a name="r_BEGIN-examples"></a>

다음 예에서는 직렬화 가능 트랜잭션 블록을 시작합니다.

```
begin;
```

다음 예에서는 직렬화 가능 격리 수준과 읽기 및 쓰기 권한으로 트랜잭션 블록을 시작합니다.

```
begin read write;
```

# CALL
<a name="r_CALL_procedure"></a>

저장 프로시저를 실행합니다. CALL 명령에는 프로시저 이름과 입력 인수 값이 포함되어야 합니다. CALL 문을 사용하여 저장 프로시저를 호출해야 합니다.

**참고**  
CALL은 정규 쿼리의 일부일 수 없습니다.

## 구문
<a name="r_CALL_procedure-synopsis"></a>

```
CALL sp_name ( [ argument ] [, ...] )
```

## 파라미터
<a name="r_CALL_procedure-parameters"></a>

 *sp\$1name*   
실행할 프로시저의 이름입니다.

 *인수*   
입력 인수의 값입니다. 이 파라미터도 함수 이름일 수 있습니다(예: `pg_last_query_id()`). 쿼리를 CALL 인수로 사용할 수 없습니다.

## 사용 노트
<a name="r_CALL_procedure-usage-notes"></a>

Amazon Redshift 저장 프로시저는 다음 설명에 따라 중첩 및 재귀 호출을 지원합니다. 또한 다음 설명에 따라 드라이버 지원이 최신인지 확인합니다.

**Topics**
+ [중첩 호출](#r_CALL_procedure-nested-calls)
+ [드라이버 지원](#r_CALL_procedure-driver-support)

### 중첩 호출
<a name="r_CALL_procedure-nested-calls"></a>

Amazon Redshift 저장 프로시저는 중첩 및 재귀 호출을 지원합니다. 허용되는 중첩 수준의 최대 수는 16개입니다. 중첩 호출은 비즈니스 로직을 더 작은 프로시저로 캡슐화할 수 있습니다. 그러면 이를 여러 호출자가 공유할 수 있습니다.

출력 파라미터가 있는 중첩 프로시저를 호출하면 내부 프로시저가 INOUT 인수를 정의해야 합니다. 이 경우 내부 프로시저는 상수가 아닌 변수로 전달됩니다. OUT 인수는 허용되지 않습니다. 내부 호출의 출력을 보관하는 데 변수가 필요하기 때문에 이 동작이 발생합니다.

내부 프로시저와 외부 프로시저 간의 관계는 `from_sp_call`의 [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md) 열에 기록됩니다.

다음 예에서는 INOUT 인수를 통해 변수를 중첩 프로시저 호출로 전달하는 것을 보여 줍니다.

```
CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql
AS $$
BEGIN
  a := b * a;
  c := b * c;
END;
$$;

CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql
AS $$
DECLARE
  x int := 3;
  y int := 4;
BEGIN
  DROP TABLE IF EXISTS test_tbl;
  CREATE TEMP TABLE test_tbl(a int, b varchar(256));
  CALL inner_proc(x, multiplier, y);
  insert into test_tbl values (x, y::varchar);
END;
$$;

CALL outer_proc(5);

SELECT * from test_tbl;
 a  | b
----+----
 15 | 20
(1 row)
```

### 드라이버 지원
<a name="r_CALL_procedure-driver-support"></a>

Java Database Connectivity(JDBC) 및 Open Database Connectivity(ODBC) 드라이버를 Amazon Redshift 저장 프로시저를 지원하는 최신 버전으로 업그레이드하는 것이 좋습니다.

클라이언트 도구가 CALL 문을 통해 서버로 전달하는 드라이버 API 작업을 사용하는 경우 기존 드라이버를 사용할 수 있습니다. 출력 파라미터(있는 경우)는 한 행의 결과 세트로 반환됩니다.

Amazon Redshift JDBC 및 ODBC 드라이버의 최신 버전은 저장 프로시저 검색에 대해 메타데이터 지원을 제공합니다. 또한 사용자 지정 Java 애플리케이션에 대한 `CallableStatement` 지원도 제공합니다. 드라이버에 대한 자세한 내용은 *Amazon Redshift 관리 가이드*의 [SQL 클라이언트 도구를 사용하여 Amazon Redshift 클러스터에 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html) 섹션을 참조하세요.

다음 예제에서는 저장 프로시저 호출에 JDBC 드라이버의 여러 API 작업을 사용하는 방법을 보여 줍니다.

```
void statement_example(Connection conn) throws SQLException {
  statement.execute("CALL sp_statement_example(1)");
}

void prepared_statement_example(Connection conn) throws SQLException {
  String sql = "CALL sp_prepared_statement_example(42, 84)";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  pstmt.execute();
}

void callable_statement_example(Connection conn) throws SQLException {
  CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)");
  cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
  cstmt.setInt(2, 42);
  cstmt.executeQuery();
  Integer out_value = cstmt.getInt(1);
}
```

## 예제
<a name="r_CALL_procedure-examples"></a>

다음 예제에서는 프로시저 이름 `test_spl`을 호출합니다.

```
call test_sp1(3,'book');
INFO:  Table "tmp_tbl" does not exist and will be skipped
INFO:  min_val = 3, f2 = book
```

다음 예제에서는 프로시저 이름 `test_spl2`을 호출합니다.

```
call test_sp2(2,'2019');

         f2          | column2
---------------------+---------
 2019+2019+2019+2019 | 2
(1 row)
```

# CANCEL
<a name="r_CANCEL"></a>

현재 실행 중인 데이터베이스 쿼리를 취소합니다.

CANCEL 명령은 실행 중인 쿼리의 프로세스 ID 또는 세션 ID가 필요하고 쿼리가 취소되었는지 검증하기 위한 확인 메시지를 표시합니다.

## 필수 권한
<a name="r_CANCEL-privileges"></a>

CANCEL에 필요한 권한은 다음과 같습니다.
+ 자신의 쿼리를 취소하는 슈퍼 사용자
+ 사용자의 쿼리를 취소하는 슈퍼 사용자
+ 사용자의 쿼리를 취소하는 CANCEL 권한이 있는 사용자
+ 자신의 쿼리를 취소하는 사용자

## 구문
<a name="r_CANCEL-synopsis"></a>

```
CANCEL process_id [ 'message' ]
```

## 파라미터
<a name="r_CANCEL-parameters"></a>

 *process\$1id*   
Amazon Redshift 클러스터에서 실행 중인 쿼리를 취소하려면 취소하려는 쿼리에 해당하는 [STV\$1RECENTS](r_STV_RECENTS.md)에서 `pid`(프로세스 ID)를 사용합니다.  
Amazon Redshift Serverless 작업 그룹에서 실행 중인 쿼리를 취소하려면 취소하려는 쿼리에 해당하는 [SYS\$1QUERY\$1HISTORY](SYS_QUERY_HISTORY.md)에서 `session_id`(프로세스 ID)를 사용합니다.

'*message*'  
쿼리 취소 완료 시 표시되는 선택적 확인 메시지입니다. 메시지를 지정하지 않을 경우 Amazon Redshift는 기본 메시지를 확인으로 표시합니다. 이 메시지는 작은따옴표로 묶어야 합니다.

## 사용 노트
<a name="r_CANCEL-usage-notes"></a>

*쿼리 ID*를 지정해서는 쿼리를 취소할 수 없습니다. 반드시 쿼리의 *프로세스 ID*(PID) 또는 *세션 ID*를 지정해야 합니다. 사용자가 현재 실행하고 있는 쿼리만 취소할 수 있습니다. 수퍼유저는 모든 쿼리를 취소할 수 있습니다.

여러 세션의 쿼리가 동일한 테이블에 대한 잠금을 보유하는 경우 [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) 함수를 사용하여 세션 중 하나를 종료할 수 있습니다. 그러면 종료된 세션에서 실행 중이던 트랜잭션이 모든 잠금을 강제로 해제하여 트랜잭션을 롤백시킵니다. 현재 보유한 잠금을 보려면 [STV\$1LOCKS](r_STV_LOCKS.md) 시스템 테이블을 쿼리합니다.

Amazon Redshift는 특정한 내부 이벤트 이후에 활성 세션을 다시 시작하고 새 PID를 할당할 수도 있습니다. PID가 변경된 경우 다음 오류 메시지가 나타날 수 있습니다.

```
Session <PID> does not exist. The session PID might have changed. Check the stl_restarted_sessions system table for details.
```

새 PID를 찾으려면 [STL\$1RESTARTED\$1SESSIONS](r_STL_RESTARTED_SESSIONS.md) 시스템 테이블을 쿼리하고 `oldpid` 열에서 필터링하세요.

```
select oldpid, newpid from stl_restarted_sessions where oldpid = 1234;
```

## 예제
<a name="r_CANCEL-examples"></a>

Amazon Redshift 클러스터에서 현재 실행 중인 쿼리를 취소하려면 먼저 취소하려는 쿼리에 대한 프로세스 ID를 검색합니다. 현재 실행 중인 모든 쿼리의 프로세스 ID를 확인하려면 다음 명령을 입력하세요.

```
select pid, starttime, duration,
trim(user_name) as user,
trim (query) as querytxt
from stv_recents
where status = 'Running';

pid |         starttime          | duration |   user   |    querytxt
-----+----------------------------+----------+----------+-----------------
802 | 2008-10-14 09:19:03.550885 |      132 | dwuser | select
venuename from venue where venuestate='FL', where venuecity not in
('Miami' , 'Orlando');
834 | 2008-10-14 08:33:49.473585 |  1250414 | dwuser | select *
from listing;
964 | 2008-10-14 08:30:43.290527 |   326179 | dwuser | select
sellerid from sales where qtysold in (8, 10);
```

쿼리 텍스트를 확인하여 어떤 프로세스 ID(PID)가 취소하려는 쿼리에 해당하는지 확인합니다.

다음 명령을 입력해 PID 802를 사용하여 해당 쿼리를 취소합니다.

```
cancel 802;
```

쿼리가 실행 중이던 세션에서 다음 메시지를 표시합니다.

```
ERROR:  Query (168) cancelled on user's request
```

여기에서 `168`은 쿼리 ID입니다(쿼리 취소에 사용되는 프로세스 ID가 아님).

또는 기본 메시지 대신 표시할 사용자 지정 확인 메시지를 지정할 수 있습니다. 사용자 지정 메시지를 지정하려면 CANCEL 명령의 끝에 메시지를 작은따옴표로 묶습니다.

```
cancel 802 'Long-running query';
```

쿼리가 실행 중이던 세션에서 다음 메시지를 표시합니다.

```
ERROR:  Long-running query
```

# CLOSE
<a name="close"></a>

(선택 사항) 열려 있는 커서와 연결되어 사용 가능한 모든 리소스를 닫습니다. [COMMIT](r_COMMIT.md), [END](r_END.md) 및 [ROLLBACK](r_ROLLBACK.md)은 커서를 자동으로 닫으므로, CLOSE 명령을 사용하여 커서를 명시적으로 닫을 필요가 없습니다.

자세한 내용은 [DECLARE](declare.md), [FETCH](fetch.md) 섹션을 참조하세요.

## 구문
<a name="close-synopsis"></a>

```
CLOSE cursor
```

## 파라미터
<a name="close-parameters"></a>

*cursor*   
닫을 커서의 이름입니다.

## CLOSE 예
<a name="close-example"></a>

다음과 같은 명령은 커서를 닫고 커밋을 수행하여 트랜잭션을 종료합니다.

```
close movie_cursor;
commit;
```

# COMMENT
<a name="r_COMMENT"></a>

데이터베이스 객체에 대한 설명을 생성하거나 변경합니다.

## 구문
<a name="r_COMMENT-synopsis"></a>

```
COMMENT ON
{
TABLE object_name |
COLUMN object_name.column_name |
CONSTRAINT constraint_name ON table_name |
DATABASE object_name |
VIEW object_name
}
IS 'text' | NULL
```

## 파라미터
<a name="r_COMMENT-parameters"></a>

 *객체 이름*   
설명 대상이 되는 데이터베이스 객체의 이름입니다. 다음 객체에 설명을 추가할 수 있습니다.  
+ TABLE
+ COLUMN(*column\$1name*도 취함).
+ CONSTRAINT(*constraint\$1name* 및 *table\$1name*도 취함).
+ 데이터베이스
+ VIEW
+ SCHEMA

IS '*text*' \$1 NULL  
지정된 객체에 대해 추가하거나 바꿀 설명 텍스트입니다. *text* 문자열은 TEXT 데이터 형식입니다. 설명은 작은따옴표로 묶으세요. 설명 텍스트를 제거하려면 값을 NULL로 설정합니다.

 *column\$1name*   
설명 대상이 되는 열의 이름입니다. COLUMN의 파라미터입니다. `object_name`에 지정된 테이블을 따릅니다.

 *constraint\$1name*   
설명 대상이 되는 제약 조건의 이름입니다. CONSTRAINT의 파라미터입니다.

 *table\$1name*   
제약 조건을 포함한 테이블의 이름입니다. CONSTRAINT의 파라미터입니다.

## 사용 노트
<a name="r_COMMENT-usage-notes"></a>

슈퍼유저 또는 데이터베이스 객체의 소유자만 설명을 추가하거나 업데이트할 수 있습니다.

데이터베이스에 대한 설명은 현재 데이터베이스에만 적용될 수 있습니다. 다른 데이터베이스에 대해 설명하려는 경우 경고 메시지가 표시됩니다. 존재하지 않는 데이터베이스에 대한 설명을 하려고 할 때도 같은 경고가 표시됩니다.

외부 테이블, 외부 열 및 후기 바인딩 뷰의 열에 대한 댓글은 지원되지 않습니다.

## 예제
<a name="r_COMMENT-example"></a>

다음 예에서는 SALES 테이블에 새 열을 추가합니다.

```
COMMENT ON TABLE sales IS 'This table stores tickets sales data';
```

다음 예에서는 SALES 테이블에 설명을 표시합니다.

```
select obj_description('public.sales'::regclass);

obj_description
-------------------------------------
This table stores tickets sales data
```

다음 예에서는 SALES 테이블에서 설명을 제거합니다.

```
COMMENT ON TABLE sales IS NULL;
```

다음 예에서는 SALES 테이블의 EVENTID 열에 설명을 추가합니다.

```
COMMENT ON COLUMN sales.eventid IS 'Foreign-key reference to the EVENT table.';
```

다음 예에서는 SALES 테이블의 EVENTID 열(열 번호 5)에 설명을 표시합니다.

```
select col_description( 'public.sales'::regclass, 5::integer );

col_description
-----------------------------------------
Foreign-key reference to the EVENT table.
```

다음 예에서는 설명문을 EVENT 테이블에 추가합니다.

```
comment on table event is 'Contains listings of individual events.';
```

설명을 보려면 PG\$1DESCRIPTION 시스템 테이블을 쿼리합니다. 다음 예에서는 EVENT 테이블에 대한 설명을 반환합니다.

```
select * from pg_catalog.pg_description
where objoid =
(select oid from pg_class where relname = 'event'
and relnamespace =
(select oid from pg_catalog.pg_namespace where nspname = 'public') );

objoid | classoid | objsubid | description
-------+----------+----------+----------------------------------------
116658 |     1259 |        0 | Contains listings of individual events.
```

# COMMIT
<a name="r_COMMIT"></a>

데이터베이스에 현재 트랜잭션을 커밋합니다. 이 명령을 실행하면 트랜잭션에서의 데이터베이스 업데이트가 영구적인 것이 됩니다.

## 구문
<a name="r_COMMIT-synopsis"></a>

```
COMMIT [ WORK | TRANSACTION ]
```

## 파라미터
<a name="r_COMMIT-parameters"></a>

Work  
선택적 키워드입니다. 이 키워드는 저장 프로시저 내에서 지원되지 않습니다.

TRANSACTION  
선택적 키워드입니다. WORK와 TRANSACTION은 동의어입니다. 둘 다 저장 프로시저 내에서 지원되지 않습니다.

저장 프로시저 내의 COMMIT 사용에 대한 자세한 내용은 [트랜잭션 관리](stored-procedure-transaction-management.md)를 참조하세요.

## 예제
<a name="r_COMMIT-examples"></a>

다음 각 예에서는 데이터베이스에 현재 트랜잭션을 커밋합니다.

```
commit;
```

```
commit work;
```

```
commit transaction;
```

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
| 2025년 4월 30일부터 신규 고객에게 COPY 및 UNLOAD 명령에 대한 클라이언트 측 암호화가 더 이상 제공되지 않습니다. 2025년 4월 30일 이전 12개월 동안 COPY 및 UNLOAD 명령에 클라이언트 측 암호화를 사용한 경우, 2026년 4월 30일까지 COPY 또는 UNLOAD 명령에 클라이언트 측 암호화를 계속 사용할 수 있습니다. 2026년 4월 30일 이후에는 COPY 및 UNLOAD에 클라이언트 측 암호화를 사용할 수 없습니다. 가능한 한 빨리 COPY 및 UNLOAD에 서버 측 암호화를 사용하도록 전환하는 것이 좋습니다. 이미 COPY 및 UNLOAD에 서버 측 암호화를 사용하고 있는 경우 변경 사항이 없으며 쿼리를 변경하지 않고도 계속 사용할 수 있습니다. COPY 및 UNLOAD 암호화에 대한 자세한 내용은 아래 ENCRYPTED 파라미터를 참조하세요.   | 

데이터 파일 또는 Amazon DynamoDB 테이블의 데이터를 테이블에 로드합니다. 이 파일은 Amazon Simple Storage Service(Amazon S3) 버킷과 Amazon EMR 클러스터 또는 SSH(Secure Shell) 연결을 사용하여 액세스하는 원격 호스트에서 찾을 수 있습니다.

**참고**  
Amazon Redshift Spectrum 외부 테이블은 읽기 전용입니다. 외부 테이블로 복사할 수 없습니다.

COPY 명령은 입력 데이터를 테이블에 추가 행으로 추가합니다.

어떤 원본이든지 상관없이 단일 입력 행의 최대 크기는 4MB입니다.

**Topics**
+ [필수 권한](#r_COPY-permissions)
+ [COPY 구문](#r_COPY-syntax)
+ [필수 파라미터](#r_COPY-syntax-required-parameters)
+ [선택적 파라미터](#r_COPY-syntax-overview-optional-parameters)
+ [COPY 명령에 대한 사용 참고 사항 및 추가 리소스](#r_COPY-using-the-copy-command)
+ [COPY 명령 예시](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [템플릿으로 복사](r_COPY-WITH-TEMPLATE.md)
+ [COPY 파라미터 참조](r_COPY-parameters.md)
+ [사용 노트](r_COPY_usage_notes.md)
+ [COPY 예](r_COPY_command_examples.md)

## 필수 권한
<a name="r_COPY-permissions"></a>

COPY 명령을 사용하려면 Amazon Redshift 테이블에 대한 [INSERT](r_GRANT.md#grant-insert) 권한이 필요합니다.

## COPY 구문
<a name="r_COPY-syntax"></a>

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

COPY 작업은 테이블 이름과 데이터 원본, 그리고 데이터에 대한 액세스 권한 등 최소 3개 파라미터만 있으면 실행할 수 있습니다.

Amazon Redshift는 COPY 명령의 기능을 연장하여 다수의 데이터 원본에서 몇 가지 데이터 형식으로 데이터를 로드하거나, 데이터 로드를 위한 액세스 권한을 제어하거나, 데이터 변환 및 로드 작업을 관리하는 데도 사용 가능합니다.

이번 섹션에서는 필요한 COPY 명령 파라미터를 제시하면서 함수에 따라 옵션 파라미터를 분류합니다. 각 파라미터와 함께 다양한 옵션 조합의 사용 방법에 대해서도 설명합니다. 알파벳 순서로 정렬된 파라미터 목록을 사용해 파라미터 설명으로 직접 이동할 수 있습니다.

## 필수 파라미터
<a name="r_COPY-syntax-required-parameters"></a>

COPY 명령에는 세 가지 파라미터가 필요합니다.
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

COPY 명령을 가장 단순하게 사용하면 다음 형식과 같습니다.

```
COPY table-name 
FROM data-source
authorization;
```

다음은 CATDEMO라는 이름의 테이블을 생성한 다음 `category_pipe.txt`라는 이름의 Amazon S3 데이터 파일에서 샘플 데이터를 테이블에 로드하는 예입니다.

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

다음 예에서 COPY 명령의 데이터 원본은 이름이 `redshift-downloads`인 Amazon S3 버킷의 `tickit` 폴더에 저장된 `category_pipe.txt`라는 데이터 파일입니다. COPY 명령은 AWS Identity and Access Management(IAM) 역할을 통해 Amazon S3 버킷에 액세스할 수 있는 권한이 부여됩니다. 클러스터에 연결되어 있는 기존 IAM 역할에 Amazon S3에 액세스할 수 있는 권한이 부여되어 있으면 다음 COPY 명령에서 해당 역할의 Amazon 리소스 이름(ARN)으로 치환한 후 명령을 실행할 수 있습니다.

```
copy catdemo
from 's3://redshift-downloads/tickit/category_pipe.txt'
iam_role 'arn:aws:iam::<aws-account-id>:role/<role-name>'
region 'us-east-1';
```

다른 AWS 리전에서 데이터를 로드하기 위한 지침을 포함하여 COPY 명령으로 샘플 데이터를 로드하는 방법에 대한 전체 지침은 Amazon Redshift 시작 안내서의 [Amazon S3에서 샘플 데이터 로드](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)를 참조하세요.

*table-name*  <a name="r_COPY-syntax-overview-table-name"></a>
COPY 명령을 실행할 대상 테이블의 이름입니다. 이 테이블은 사전에 데이터베이스에 존재해야 하며, 임시 테이블일 수도 있고, 영구 테이블일 수도 있습니다. COPY 명령은 새로운 입력 데이터를 테이블의 기존 행에 추가합니다.

FROM *data-source*  <a name="r_COPY-syntax-overview-data-source"></a>
대상 테이블에 로드할 원본 테이블의 위치입니다. 일부 데이터 소스로 매니페스트 파일을 지정할 수 있습니다.  
가장 공통적으로 사용되는 데이터 리포지토리는 Amazon S3 버킷입니다. 또한 클러스터가 Amazon EMR 클러스터와 Amazon EC2 인스턴스, 또는 SSH 연결을 사용하여 액세스할 수 있는 원격 호스트에 위치한 데이터 파일에서 데이터를 로드하거나, 혹은 DynamoDB 테이블에서 직접 데이터를 로드할 수도 있습니다.  
+ [Amazon S3에서 COPY](copy-parameters-data-source-s3.md)
+ [Amazon EMR에서 COPY](copy-parameters-data-source-emr.md) 
+ [원격 호스트(SSH)에서 COPY 지원](copy-parameters-data-source-ssh.md)
+ [Amazon DynamoDB에서 COPY](copy-parameters-data-source-dynamodb.md)

승인  <a name="r_COPY-syntax-overview-credentials"></a>
클러스터가 다른 AWS 리소스에 액세스하기 위한 인증 및 권한 부여에 사용할 방법을 나타내는 절입니다. COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 이러한 권한은 클러스터에 연결되어 있는 IAM 역할을 참조하거나, 혹은 IAM 사용자의 액세스 키 ID와 보안 액세스 키를 입력하면 부여할 수 있습니다.  
+ [권한 부여 파라미터](copy-parameters-authorization.md) 
+ [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [키 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## 선택적 파라미터
<a name="r_COPY-syntax-overview-optional-parameters"></a>

또는 COPY에서 필드 데이터를 대상 테이블의 열에 매핑하는 방식을 지정하고, COPY 명령에서 원본 데이터를 제대로 읽고 구문 분석하도록 원본 데이터 속성을 정의하고, 로드 프로세스 중 COPY 명령으로 수행하는 작업을 관리할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](#r_COPY-syntax-overview-data-format)
+ [데이터 변환 파라미터](#r_COPY-syntax-overview-data-conversion)
+ [데이터 로드 작업](#r_COPY-syntax-overview-data-load)

### 열 매핑
<a name="r_COPY-syntax-overview-column-mapping"></a>

기본적으로 COPY 명령은 데이터 파일의 필드 순서와 동일하게 필드 값을 대상 테이블의 열에 삽입합니다. 기본 열 순서가 유효하지 않은 경우에는 열 목록을 지정하거나 JSONPath 표현식을 사용하여 원본 데이터 필드를 대상 열로 매핑할 수 있습니다.
+ [Column List](copy-parameters-column-mapping.md#copy-column-list)
+ [JSONPaths File](copy-parameters-column-mapping.md#copy-column-mapping-jsonpaths)

### 데이터 형식 파라미터
<a name="r_COPY-syntax-overview-data-format"></a>

데이터는 텍스트 파일에서 고정 폭, 문자 구분, 쉼표 구분 값(CSV) 또는 JSON 형식으로, 혹은 Avro 파일에서 로드할 수 있습니다.

COPY 명령에서는 기본적으로 원본 데이터가 문자로 구분된 UTF-8 텍스트 파일 형식입니다. 기본 구분자는 파이프 문자(\$1)입니다. 원본 데이터가 다른 형식인 경우에는 다른 파라미터를 사용하여 데이터 형식을 지정합니다.
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter) 
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth) 
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile) 
+ [AVRO](copy-parameters-data-format.md#copy-avro) 
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json) 
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [GZIP](copy-parameters-file-compression.md#copy-gzip) 
+ [LZOP](copy-parameters-file-compression.md#copy-lzop) 
+ [PARQUET](copy-parameters-data-format.md#copy-parquet) 
+ [ORC](copy-parameters-data-format.md#copy-orc) 
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd) 

### 데이터 변환 파라미터
<a name="r_COPY-syntax-overview-data-conversion"></a>

COPY 명령은 테이블에 데이터를 로드할 때 원본 데이터의 문자열을 묵시적으로 대상 열의 데이터 형식으로 변환합니다. 기본 동작과 다른 변환을 지정해야 하거나, 혹은 기본 변환이 오류를 일으킬 때는 다음 파라미터를 지정하여 데이터 변환을 관리할 수 있습니다.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) 
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding) 
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape) 
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord) 
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines) 
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader) 
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as) 
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes) 
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 

### 데이터 로드 작업
<a name="r_COPY-syntax-overview-data-load"></a>

문제 해결을 위해, 혹은 로드 시간을 줄일 목적으로 다음 파라미터를 지정하여 로드 작업의 기본 동작을 관리합니다.
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows) 
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate) 
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors) 
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror) 
+ [NOLOAD](copy-parameters-data-load.md#copy-noload) 
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate) 

## COPY 명령에 대한 사용 참고 사항 및 추가 리소스
<a name="r_COPY-using-the-copy-command"></a>

COPY 명령의 사용 방법에 대한 자세한 내용은 아래 주제를 참조하세요.
+ [사용 노트](r_COPY_usage_notes.md)
+ [튜토리얼: Amazon S3에서 데이터 로드](tutorial-loading-data.md)
+ [데이터 로드에 대한 Amazon Redshift 모범 사례](c_loading-data-best-practices.md)
+ [COPY 명령으로 테이블 로드](t_Loading_tables_with_the_COPY_command.md)
  + [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md)
  + [Amazon EMR에서 데이터 로드](loading-data-from-emr.md)
  + [원격 호스트에서 데이터 로드](loading-data-from-remote-hosts.md) 
  + [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md)
+ [데이터 로드 문제 해결](t_Troubleshooting_load_errors.md)

## COPY 명령 예시
<a name="r_COPY-using-the-copy-command-examples"></a>

다양한 소스에서 다양한 형식으로 다양한 COPY 옵션을 사용하여 COPY를 실행하는 방법을 보여주는 추가 예시는 [COPY 예](r_COPY_command_examples.md) 섹션을 참조하세요.

# COPY JOB
<a name="r_COPY-JOB"></a>

이 명령 사용에 대한 자세한 내용은 [Amazon S3 버킷에서 자동으로 파일을 복사하기 위해 S3 이벤트 통합 만들기](loading-data-copy-job.md) 섹션을 참조하세요.

데이터를 테이블로 로드하는 COPY 명령을 관리합니다. COPY JOB 명령은 COPY 명령의 확장이며 Amazon S3 버킷에서 데이터 로드를 자동화합니다. COPY 작업을 생성하면 Amazon Redshift는 지정된 경로에 새 Amazon S3 파일이 생성되는 시기를 감지한 다음 사용자 개입 없이 자동으로 로드합니다. 원래 COPY 명령에 사용된 것과 동일한 파라미터가 데이터를 로드할 때 사용됩니다. Amazon Redshift는 파일 이름을 기반으로 로드된 파일을 추적하여 한 번만 로드되었는지 확인합니다.

**참고**  
사용법, 파라미 및 권한을 비롯한 COPY 명령에 대한 자세한 내용은 [COPY](r_COPY.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_COPY-JOB-privileges"></a>

COPY JOB 명령을 사용하려면 COPY를 사용하는 데 필요한 모든 권한 외에도 다음 권한 중 하나가 있어야 합니다.
+ 수퍼유저
+  다음 모두: 
  +  COPY 대상 데이터베이스의 COPY JOBS에 대한 관련 CREATE, ALTER 또는 DROP 범위 지정 권한.
  +  COPY 대상 스키마에 대한 USAGE 권한 또는 COPY 대상 데이터베이스의 스키마에 대한 USAGE 범위 지정 권한.
  +  COPY 대상 테이블에 대한 INSERT 권한 또는 COPY 대상 스키마 또는 데이터베이스의 테이블에 대한 INSERT 범위 지정 권한.

COPY 명령으로 지정된 IAM 역할에는 로드할 데이터에 액세스할 수 있는 권한이 있어야 합니다. 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

## 구문
<a name="r_COPY-JOB-syntax"></a>

COPY 작업을 생성합니다. COPY 명령의 파라미터는 COPY 작업과 함께 저장됩니다.

트랜잭션 블록의 범위 내에서 COPY JOB CREATE를 실행할 수 없습니다.

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

COPY 작업의 구성을 변경합니다.

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

COPY 작업을 실행합니다. 저장된 COPY 명령 파라미터가 사용됩니다.

```
COPY JOB RUN job-name
```

모든 COPY 작업을 나열합니다.

```
COPY JOB LIST
```

COPY 작업의 세부 정보를 표시합니다.

```
COPY JOB SHOW job-name
```

COPY 작업을 삭제합니다.

트랜잭션 블록 범위 내에서 COPY JOB DROP을 실행할 수 없습니다.

```
COPY JOB DROP job-name
```

## 파라미터
<a name="r_COPY-JOB-parameters"></a>

*copy-command*  
Amazon S3에서 Amazon Redshift로 데이터를 로드하는 COPY 명령입니다. 이 절에는 데이터를 로드할 때 사용되는 Amazon S3 버킷, 대상 테이블, IAM 역할 및 기타 파라미터를 정의하는 COPY 파라미터가 포함되어 있습니다. Amazon S3 데이터 로드에 대한 모든 COPY 명령 파라미터는 다음을 제외하고 지원됩니다.  
+ COPY JOB은 COPY 명령이 가리키는 폴더에 있는 기존 파일을 수집하지 않습니다. COPY JOB 생성 타임스탬프 이후에 생성된 파일만 수집합니다.
+ MAXERROR 또는 IGNOREALLERRORS 옵션과 함께 COPY 명령을 지정할 수 없습니다.
+ 매니페스트 파일을 지정할 수 없습니다. COPY JOB에는 새로 생성된 파일을 모니터링하기 위해 지정된 Amazon S3 위치가 필요합니다.
+ 액세스 및 비밀 키와 같은 인증 유형으로 COPY 명령을 지정할 수 없습니다. 권한 부여에 `IAM_ROLE` 파라미터를 사용하는 COPY 명령만 지원됩니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.
+ COPY JOB은 클러스터와 연결된 기본 IAM 역할을 지원하지 않습니다. COPY 명령에서 `IAM_ROLE`을 지정해야 합니다.
자세한 내용은 [Amazon S3에서 COPY](copy-parameters-data-source-s3.md) 섹션을 참조하세요.

*job-name*  
COPY 작업을 참조하는 데 사용되는 작업의 이름입니다. *job-name*에는 하이픈(‐)을 사용할 수 없습니다.

 [AUTO ON \$1 OFF]   
Amazon S3 데이터가 Amazon Redshift 테이블에 자동으로 로드되는지 여부를 나타내는 절입니다.  
+ `ON`일 때 Amazon Redshift는 새로 생성된 파일의 소스 Amazon S3 경로를 모니터링하고, 파일이 발견되면 작업 정의의 COPY 파라미터와 함께 COPY 명령이 실행됩니다. 이 값이 기본값입니다.
+ `OFF`일 때 Amazon Redshift는 COPY JOB을 자동으로 실행하지 않습니다.

## 사용 노트
<a name="r_COPY-JOB-usage-notes"></a>

COPY 명령의 옵션은 런타임까지 유효성이 검사되지 않습니다. 예를 들어 잘못된 `IAM_ROLE` 또는 Amazon S3 데이터 소스로 인해 COPY JOB이 시작될 때 런타임 오류가 발생합니다.

클러스터가 일시 중지된 경우 COPY JOBS는 실행되지 않습니다.

로드된 COPY 명령 파일을 쿼리하고 오류를 로드하려면 [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md), [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md), [STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md) 섹션을 참조하세요. 자세한 내용은 [데이터가 올바로 로드되었는지 확인](verifying-that-data-loaded-correctly.md) 섹션을 참조하세요.

COPY JOBS는 읽기 전용 모드에서 작동하므로 제로 ETL 데이터베이스에서는 지원되지 않습니다.

## 예제
<a name="r_COPY-JOB-examples"></a>

다음 예에서는 Amazon S3 버킷에서 데이터를 로드하기 위해 COPY 작업을 생성하는 방법을 보여줍니다.

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' 
JOB CREATE my_copy_job_name
AUTO ON;
```

# 템플릿으로 복사
<a name="r_COPY-WITH-TEMPLATE"></a>

Redshift 템플릿을 COPY 명령과 함께 사용하여 명령 구문을 단순화하고 데이터 로드 작업 전반에서 일관성을 보장할 수 있습니다. 동일한 형식 지정 파라미터를 반복적으로 지정하는 대신 템플릿에서 한 번 정의하고 COPY 명령에서 템플릿을 참조합니다. 템플릿을 사용하는 경우 COPY 명령은 템플릿의 파라미터를 명령에 직접 지정된 모든 파라미터와 결합합니다. 템플릿과 명령 모두에 동일한 파라미터가 나타나면 명령 파라미터가 우선합니다. 자세한 내용은 [CREATE TEMPLATE](r_CREATE_TEMPLATE.md) 섹션을 참조하세요.

COPY 명령의 템플릿은 다음을 사용하여 생성할 수 있습니다.
+ [데이터 형식 파라미터](copy-parameters-data-format.md)
+ [파일 압축 파라미터](copy-parameters-file-compression.md)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

지원되는 파라미터의 전체 목록은 [COPY](r_COPY.md) 명령을 참조하세요.

## 필수 권한
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

COPY 명령에서 템플릿을 사용하려면 다음이 필요합니다.
+ COPY 명령을 실행하는 데 필요한 모든 권한([필수 권한](r_COPY.md#r_COPY-permissions) 참조)
+ 다음 템플릿 권한 중 하나입니다.
  + 수퍼유저 권한
  + 템플릿에 대한 USAGE 권한 및 템플릿이 포함된 스키마에 대한 USAGE 권한

## 구문
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## 파라미터
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
(선택 사항) 템플릿이 있는 데이터베이스의 이름입니다. 지정하지 않으면 현재 데이터베이스가 사용됩니다.

 *schema\$1name*   
(선택 사항) 템플릿이 있는 스키마의 이름입니다. 지정하지 않으면 현재 검색 경로에서 템플릿이 검색됩니다.

 *template\$1name*   
COPY에서 사용할 템플릿 이름입니다.

## 사용 노트
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ COPY 명령에서 명령별 파라미터(소스, 대상, 권한 부여)를 계속 지정해야 합니다.
+ 템플릿에는 COPY 명령에 대한 매니페스트 파일 사양이 포함될 수 없습니다.

## 예제
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

다음 예제에서는 템플릿을 생성하고 COPY 명령에서 사용하는 방법을 보여 줍니다.

```
CREATE TEMPLATE public.test_template FOR COPY AS
CSV DELIMITER '|' IGNOREHEADER 1 MAXERROR 100;

COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
USING TEMPLATE public.test_template;
```

템플릿과 명령 모두에 파라미터가 있는 경우 명령 파라미터가 우선합니다. 이 예제에서는 `public.test_template` 템플릿에 `DELIMITER '|'` 기호가 포함되어 있지만 COPY 명령이 `DELIMITER ','` 기호를 지정하는 경우 명령의 쉼표 구분 기호(`,`)가 템플릿의 파이프 구분 기호(`|`) 대신 사용됩니다.

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
DELIMITER ','
USING TEMPLATE public.test_template;
```

# COPY 파라미터 참조
<a name="r_COPY-parameters"></a>

COPY에는 다양한 상황에서 사용할 수 있는 많은 파라미터가 있습니다. 그러나 각 상황에서 모든 파라미터가 지원되는 것은 아닙니다. 예를 들어 ORC 또는 PARQUET 파일에서 로드하는 경우 지원되는 파라미터 수가 제한되어 있습니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.

**Topics**
+ [데이터 소스](copy-parameters-data-source.md)
+ [권한 부여 파라미터](copy-parameters-authorization.md)
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md)
+ [파일 압축 파라미터](copy-parameters-file-compression.md)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)
+ [알파벳 순서의 파라미터 목록](r_COPY-alphabetical-parm-list.md)

# 데이터 소스
<a name="copy-parameters-data-source"></a>

클러스터가 Amazon S3 버킷과 Amazon EMR 클러스터 또는 SSH 연결을 사용하여 액세스할 수 있는 원격 호스트에 위치한 텍스트 파일에서 데이터를 로드할 수 있습니다. 또한 DynamoDB 테이블에서도 데이터를 직접 로드할 수 있습니다.

어떤 원본이든지 상관없이 단일 입력 행의 최대 크기는 4MB입니다.

테이블에서 Amazon S3의 파일로 데이터를 내보내려면 [UNLOAD](r_UNLOAD.md) 명령을 사용합니다.

**Topics**
+ [Amazon S3에서 COPY](copy-parameters-data-source-s3.md)
+ [Amazon EMR에서 COPY](copy-parameters-data-source-emr.md)
+ [원격 호스트(SSH)에서 COPY 지원](copy-parameters-data-source-ssh.md)
+ [Amazon DynamoDB에서 COPY](copy-parameters-data-source-dynamodb.md)

# Amazon S3에서 COPY
<a name="copy-parameters-data-source-s3"></a>

1개 이상의 S3 버킷에 위치한 파일에서 데이터를 로드하려면 FROM 절을 사용하여 COPY가 Amazon S3의 파일을 찾는 방법을 지정합니다. 데이터 파일의 객체 경로를 FROM 절의 일부로 제공하거나 Amazon S3 객체 경로 목록이 포함된 매니페스트 파일의 위치를 제공할 수 있습니다. Amazon S3에서 COPY는 HTTPS 연결을 사용합니다. S3 IP 범위가 허용 목록에 추가되었는지 확인합니다. 필요한 S3 IP 범위에 대한 자세한 내용은 [네트워크 격리](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)를 참조하세요.

**중요**  
데이터 파일이 위치한 Amazon S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 [REGION](#copy-region) 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.

**Topics**
+ [구문](#copy-parameters-data-source-s3-syntax)
+ [예제](#copy-parameters-data-source-s3-examples)
+ [선택적 파라미터](#copy-parameters-data-source-s3-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-s3-unsupported-parms)

## 구문
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-s3-examples"></a>

다음은 객체 경로를 사용하여 Amazon S3에서 데이터를 로드하는 예입니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

다음은 매니페스트 파일을 사용하여 Amazon S3에서 데이터를 로드하는 예입니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### 파라미터
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
로드할 데이터 원본입니다. Amazon S3 파일의 인코딩에 대한 자세한 내용은 [데이터 변환 파라미터](copy-parameters-data-conversion.md) 섹션을 참조하세요.

's3://*copy\$1from\$1s3\$1objectpath*'  <a name="copy-s3-objectpath"></a>
데이터가 포함된 Amazon S3 객체의 경로를 지정합니다(예: `'s3://amzn-s3-demo-bucket/custdata.txt'`). *s3://copy\$1from\$1s3\$1objectpath* 파라미터는 단일 파일, 또는 동일한 키 접두사를 갖는 객체 및 폴더 집합을 참조할 수 있습니다. 예를 들어 `custdata.txt`는 `custdata.txt`,`custdata.txt.1`, `custdata.txt.2`, `custdata.txt.bak` 등 다수의 물리적 파일을 참조하는 키 접두사입니다. 키 접두사는 다수의 폴더도 참조할 수 있습니다. 예를 들어 `'s3://amzn-s3-demo-bucket/custfolder'`는 `custfolder`, `custfolder_1`, `custfolder_2` 폴더 등을 참조합니다. 키 접두사가 다수의 폴더를 참조하는 경우 해당 폴더의 모든 파일이 로드됩니다. 키 접두사가 폴더는 물론 파일과도 일치하는 경우(예: `custfolder.log`) COPY가 파일도 로드하려고 합니다. 이처럼 키 접두사로 인해 COPY 명령이 불필요한 파일까지 로드하려고 할 때는 매니페스트 파일을 사용하세요. 자세한 내용은 다음 자료를 참조하세요.[copy_from_s3_manifest_file](#copy-manifest-file)  
데이터 파일이 위치한 S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 [REGION](#copy-region) 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.
자세한 내용은 [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md) 섹션을 참조하세요.

's3://*copy\$1from\$1s3\$1manifest\$1file*'  <a name="copy-manifest-file"></a>
로드할 데이터 파일을 나열하는 매니페스트 파일에 Amazon S3 객체 키를 지정합니다. *'s3://*copy\$1from\$1s3\$1manifest\$1file'** 인수는 단일 파일을 명시적으로 참조해야 합니다(예: `'s3://amzn-s3-demo-bucket/manifest.txt'`). 키 접두사를 참조할 수는 없습니다.  
매니페스트란 Amazon S3에서 로드할 개별 파일의 URL을 JSON 형식으로 나열한 텍스트 파일을 말합니다. URL에는 파일의 버킷 이름과 전체 객체 경로가 포함됩니다. 매니페스트에서 지정되는 파일이 서로 다른 버킷에 있을 수 있지만 모든 버킷은 Amazon Redshift 클러스터와 동일한 AWS 리전에 속해야 합니다. 파일이 두 번 나열되면 마찬가지로 두 번 로드됩니다. 다음은 3개의 파일을 로드하는 매니페스트의 JSON 형식을 나타낸 예입니다.  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1","mandatory":false}
  ]
}
```
큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다. 매니페스트의 각 항목은 옵션으로 `mandatory` 플래그를 추가할 수 있습니다. `mandatory`가 `true`로 설정된 경우 해당 항목에서 파일을 찾지 못하면 COPY 명령이 종료되고, 그렇지 않으면 COPY 명령이 계속 됩니다. `mandatory`의 기본값은 `false`입니다.  
ORC 또는 Parquet 형식의 데이터 파일에서 불러올 경우 다음 예에 나와 있는 것처럼 `meta` 필드가 필요합니다.  

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```
매니페스트 파일에서도 ENCRYPTED, GZIP, LZOP, BZIP2 또는 ZSTD 옵션이 지정되지만 암호화하거나 압축해서는 안 됩니다. 지정된 매니페스트 파일을 찾지 못하거나, 혹은 매니페스트 파일의 형식이 잘못되면 COPY 명령이 오류를 반환합니다.  
매니페스트 파일을 사용할 때는 COPY 명령에서 MANIFEST 파라미터를 지정해야 합니다. MANIFEST 파라미터를 지정하지 않으면 COPY가 FROM에서 지정한 파일이 데이터 파일인 것으로 간주합니다.  
자세한 내용은 [Amazon S3에서 데이터 로드](t_Loading-data-from-S3.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

MANIFEST  <a name="copy-manifest"></a>
Amazon S3에서 로드할 데이터 파일을 식별할 때 매니페스트를 사용하도록 지정합니다. MANIFEST 파라미터를 사용하는 경우에는 COPY 명령이 *'s3://copy\$1from\$1s3\$1manifest\$1file'*에서 참조하는 매니페스트 파일에 나열된 파일에서 데이터를 로드합니다. 매니페스트 파일을 찾지 못하거나, 혹은 잘못된 형식일 때는 COPY가 중단됩니다. 자세한 내용은 [매니페스트를 사용하여 데이터 파일 지정](loading-data-files-using-manifest.md) 섹션을 참조하세요.

Encrypted  <a name="copy-encrypted"></a>
고객 관리형 키를 사용하는 클라이언트 측 암호화로 Amazon S3의 입력 파일을 암호화하도록 지정하는 절입니다. 자세한 내용은 [Amazon S3에서 암호화된 데이터 파일 로드](c_loading-encrypted-files.md) 섹션을 참조하세요. 입력 파일이 Amazon S3 서버 측 암호화(SSE-KMS 또는 SSE-S3)로 암호화되어 있는 경우에는 ENCRYPTED를 지정하지 마세요. COPY가 자동으로 서버 측 암호화 파일을 읽습니다.  
ENCRYPTED 파라미터를 지정하는 경우에는 [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) 파라미터도 지정하거나, 혹은 **master\$1symmetric\$1key** 값을 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 문자열에 추가해야 합니다.  
암호화된 파일이 압축 형식일 때는 GZIP, LZOP, BZIP2 또는 ZSTD 파라미터를 추가하세요.  
ENCRYPTED 옵션을 지정하더라도 매니페스트 파일과 JSONPaths 파일을 암호화해서는 안 됩니다.

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
Amazon S3에서 데이터 파일을 암호화할 때 사용되는 루트 대칭 키입니다. MASTER\$1SYMMETRIC\$1KEY를 지정하면 [ENCRYPTED](#copy-encrypted) 파라미터도 지정해야 합니다. MASTER\$1SYMMETRIC\$1KEY를 CREDENTIALS 파라미터와 함께 사용할 수는 없습니다. 자세한 내용은 [Amazon S3에서 암호화된 데이터 파일 로드](c_loading-encrypted-files.md) 섹션을 참조하세요.  
암호화된 파일이 압축 형식일 때는 GZIP, LZOP, BZIP2 또는 ZSTD 파라미터를 추가하세요.

REGION [AS] '*aws-region*'  <a name="copy-region"></a>
원본 데이터가 위치한 AWS 리전을 지정합니다. 데이터가 위치한 AWS 리소스가 Amazon Redshift 클러스터와 동일한 리전에 속하지 않을 때는 Amazon S3 버킷 또는 DynamoDB 테이블에서 COPY를 실행하려면 REGION이 필요합니다.  
*aws\$1region*의 값은 [Amazon Redshift 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) 표에 나와 있는 리전과 일치해야 합니다.  
REGION 파라미터를 지정하면 매니페스트 파일 또는 여러 Amazon S3 버킷을 포함한 모든 리소스가 지정한 리전에 위치해야 합니다.  
리전 간 데이터를 전송하면 데이터가 있는 Amazon S3 버킷 또는 DynamoDB 테이블을 대상으로 추가 요금이 발생합니다. 요금에 대한 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/) 페이지의 **Amazon S3에서 다른 AWS 리전으로 데이터 전송** 및 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing/) 페이지의 **데이터 전송(발신)** 섹션을 참조하세요.
기본적으로 COPY의 경우 데이터가 Amazon Redshift 클러스터와 동일한 리전에 위치한다고 가정합니다.

## 선택적 파라미터
<a name="copy-parameters-data-source-s3-optional-parms"></a>

Amazon S3에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

Amazon S3에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ SSH
+ READRATIO

# Amazon EMR에서 COPY
<a name="copy-parameters-data-source-emr"></a>

COPY 명령을 사용하면 클러스터의 Hadoop 분산 파일 시스템(HDFS)에 고정 폭 파일, 문자로 구분된 파일, CSV 파일, JSON 파일 또는 Avro 파일 형식으로 텍스트 파일을 쓰도록 구성된 Amazon EMR 클러스터에서 병렬로 데이터를 로드할 수 있습니다.

**Topics**
+ [구문](#copy-parameters-data-source-emr-syntax)
+ [예제](#copy-parameters-data-source-emr-example)
+ [파라미터](#copy-parameters-data-source-emr-parameters)
+ [지원되는 파라미터](#copy-parameters-data-source-emr-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-emr-unsupported-parms)

## 구문
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## 예제
<a name="copy-parameters-data-source-emr-example"></a>

다음은 Amazon EMR 클러스터에서 데이터를 로드하는 예입니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## 파라미터
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
로드할 데이터 원본입니다.

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
COPY 명령에서 데이터 파일을 참조하는 Amazon EMR 클러스터 및 HDFS 파일 경로의 고유 식별자입니다. HDFS 데이터 파일 이름에는 와일드카드 문자인 별표(\$1)와 물음표(?)가 포함되어서는 안 됩니다.  
Amazon EMR 클러스터는 COPY 작업이 완료될 때까지 계속 실행되어야 합니다. COPY 작업을 마치기 전에 HDFS 데이터 파일이 하나라도 변경되거나 삭제되면 예상하지 못한 결과가 나오거나 COPY 작업이 중단될 수 있습니다.
와일드카드 문자인 별표(\$1)와 물음표(?)를 *hdfs\$1file\$1path* 인수에 사용하여 다수의 파일을 로드하도록 지정할 수 있습니다. 예를 들어 `'emr://j-SAMPLE2B500FC/myoutput/part*'`는 파일 `part-0000`, `part-0001` 등을 식별합니다. 와일드카드 문자가 없는 파일 경로는 문자열 리터럴로 처리됩니다. 폴더 이름만 지정하면 COPY가 폴더의 모든 파일을 로드하려고 합니다.  
와일드카드 문자를 사용하거나 폴더 이름만 사용하는 경우에는 불필요한 파일이 로드되지 않는지 확인하세요. 예를 들어 일부 프로세스에서는 로그 파일이 출력 폴더로 로드되는 경우도 있습니다.
자세한 내용은 [Amazon EMR에서 데이터 로드](loading-data-from-emr.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

## 지원되는 파라미터
<a name="copy-parameters-data-source-emr-optional-parms"></a>

Amazon EMR에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

Amazon EMR에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ Encrypted
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# 원격 호스트(SSH)에서 COPY 지원
<a name="copy-parameters-data-source-ssh"></a>

COPY 명령을 사용하면 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스나 다른 컴퓨터 같은 하나 이상의 원격 호스트에서 병렬로 파일을 로드할 수 있습니다. COPY는 SSH(Secure Shell)을 사용하여 원격 호스트에 연결하고 원격 호스트에서 명령을 실행해 텍스트 출력을 생성합니다. 원격 호스트는 EC2 Linux 인스턴스이거나 SSH 연결을 허용하도록 구성된 다른 Unix 또는 Linux 컴퓨터일 수 있습니다. Amazon Redshift는 여러 호스트에 연결할 수 있으며 각 호스트에 대해 여러 SSH 연결을 열 수 있습니다. Amazon Redshift는 각 연결을 통해 고유한 명령을 전송하여 호스트의 표준 출력에 대한 텍스트 출력을 생성합니다. 그러면 Amazon Redshift가 텍스트 파일을 읽을 때 텍스트 출력을 읽습니다.

FROM 절은 매니페스트 파일에 Amazon S3 객체 키를 지정할 때 사용합니다. 매니페스트 파일은 COPY가 SSH 연결을 열어 원격 명령을 실행할 때 사용할 정보를 제공합니다.

**Topics**
+ [구문](#copy-parameters-data-source-ssh-syntax)
+ [예제](#copy-parameters-data-source-ssh-examples)
+ [파라미터](#copy-parameters-data-source-ssh-parameters)
+ [선택적 파라미터](#copy-parameters-data-source-ssh-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-ssh-unsupported-parms)

**중요**  
 매니페스트 파일이 위치한 S3 버킷이 클러스터와 동일한 AWS 리전에 속하지 않을 때는 REGION 파라미터를 사용하여 버킷이 위치한 리전을 지정해야 합니다.

## 구문
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-ssh-examples"></a>

다음은 매니페스트 파일을 사용하여 원격 호스트에서 SSH 연결을 통해 데이터를 로드하는 예입니다.

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## 파라미터
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
로드할 데이터 원본입니다.

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
COPY 명령은 SSH를 사용하여 다수의 호스트에 연결할 뿐만 아니라 각 호스트마다 SSH 연결을 생성할 수 있습니다. 이렇게 생성된 각 호스트 연결을 통해 명령을 실행하고, 명령을 통해 출력되는 데이터를 병렬 방식으로 테이블에 로드합니다. *s3://copy\$1from\$1ssh\$1manifest\$1file* 인수는 매니페스트 파일에 Amazon S3 객체 키를 지정합니다. 매니페스트 파일은 COPY가 SSH 연결을 열어 원격 명령을 실행할 때 사용할 정보를 제공합니다.  
*s3://copy\$1from\$1ssh\$1manifest\$1file* 인수는 명시적으로 단일 파일을 참조해야 합니다. 이때 파일은 키 접두사가 될 수 없습니다. 다음은 그 한 예입니다.  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
매니페스트 파일은 Amazon Redshift가 호스트에 연결하는 데 사용하는 JSON 형식의 텍스트 파일입니다. 매니페스트 파일은 SSH 호스트 엔드포인트를 비롯해 호스트에서 데이터를 Amazon Redshift에 반환할 때 실행하는 명령을 지정합니다. 필요한 경우, 호스트 퍼블릭 키, 로그인 사용자 이름 및 각 항목의 필수 플래그를 포함시킬 수 있습니다. 다음은 SSH 연결 2개를 생성하는 매니페스트 파일 예입니다.  

```
{ 
    "entries": [ 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"}, 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"} 
     ] 
}
```
매니페스트 파일에는 SSH 연결마다 `"entries"` 구문이 하나씩 포함됩니다. 단일 호스트에 다중 연결을, 혹은 다수의 호스트에 다중 연결을 생성할 수 있습니다. 표시된 대로 필드 이름과 값 모두에 큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다. 큰따옴표가 필요하지 않은 유일한 값은 `"mandatory"` 필드의 부울 값인 `true` 또는 `false`입니다.  
다음 표에서는 매니페스트 파일의 속성을 설명합니다.    
엔드포인트  <a name="copy-ssh-manifest-endpoint"></a>
호스트의 URL 주소 또는 IP 주소(예: `"ec2-111-222-333.compute-1.amazonaws.com"` 또는 `"198.51.100.0"`).  
명령  <a name="copy-ssh-manifest-command"></a>
호스트에서 gzip, lzop, bzip2 또는 zstd 형식으로 텍스트 출력 또는 이진수 출력을 생성할 때 실행하는 명령입니다. 명령은 사용자 *"host\$1user\$1name"*이 실행 권한을 갖고 있는 어떤 명령도 될 수 있습니다. 명령은 파일 인쇄처럼 간단할 수도 있고 데이터베이스 쿼리나 스크립트 시작이 될 수도 있습니다. 출력(텍스트 파일, gzip 이진 파일, lzop 이진 파일 또는 bzip2 이진 파일)은 Amazon Redshift COPY 명령이 수집할 수 있는 형식이어야 합니다. 자세한 내용은 [입력 데이터 준비](t_preparing-input-data.md) 섹션을 참조하세요.  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(옵션) 호스트의 퍼블릭 키입니다. 퍼블릭 키를 입력하면 Amazon Redshift가 호스트를 식별하는 데 이 키를 사용합니다. 퍼블릭 키를 입력하지 않으면 Amazon Redshift가 호스트를 식별하지 않습니다. 예를 들어 원격 호스트의 퍼블릭 키가 `ssh-rsa AbcCbaxxx…Example root@amazon.com`인 경우에는 publickey 필드에 `"AbcCbaxxx…Example"` 텍스트를 입력하세요.  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(옵션) 연결 시도가 실패할 경우 COPY 명령의 중단 여부를 나타내는 절입니다. 기본값은 `false`입니다. Amazon Redshift가 하나 이상 연결에 성공하지 못하면 COPY 명령이 중단됩니다.  
사용자 이름  <a name="copy-ssh-manifest-username"></a>
(옵션) 호스트 시스템에 로그온하고 원격 명령을 실행하기 위해 사용할 사용자 이름입니다. 사용자 로그인 이름은 권한이 부여된 호스트 키 파일에 Amazon Redshift 클러스터의 퍼블릭 키를 추가할 때 사용한 로그인 이름과 동일해야 합니다. 기본 위치는 `redshift`입니다.
매니페스트 파일 생성에 대한 자세한 내용은 [데이터 로드 프로세스](loading-data-from-remote-hosts.md#load-from-host-process) 섹션을 참조하세요.  
원격 호스트에서 COPY를 지원할 때는 COPY 명령에서 SSH 파라미터를 지정해야 합니다. SSH 파라미터를 지정하지 않으면 COPY가 FROM에서 지정한 파일이 데이터 파일인 것으로 간주하여 중단되고 맙니다.  
자동 압축을 사용하는 경우 COPY 명령은 데이터 읽기 작업을 2회 실행합니다. 즉, 원격 명령을 2회 실행합니다. 첫 번째 읽기 작업은 압축 분석을 위한 데이터 샘플을 제공하기 위한 것이며, 두 번째 읽기 작업에서 실제로 데이터를 로드합니다. 원격 명령 2회 실행이 문제를 일으킬 수 있는 경우에는 자동 압축을 비활성화해야 합니다. 자동 압축을 비활성화하려면 COMPUPDATE 파라미터를 OFF로 설정하여 COPY 명령을 실행합니다. 자세한 내용은 [자동 압축을 사용하여 테이블 로드](c_Loading_tables_auto_compress.md) 섹션을 참조하세요.  
SSH에서 COPY를 사용하는 자세한 절차는 [원격 호스트에서 데이터 로드](loading-data-from-remote-hosts.md) 섹션을 참조하세요.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

SSH  <a name="copy-ssh"></a>
원격 호스트에서 데이터를 로드할 때 SSH 프로토콜을 사용하도록 지정하는 절입니다. SSH를 지정하는 경우에는 [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest) 인수를 사용하여 매니페스트 파일도 지정해야 합니다.  
SSH를 사용하여 원격 VPC에서 프라이빗 IP 주소를 사용하는 호스트에서 복사하는 경우 VPC는 향상된 VPC 라우팅을 사용하도록 설정해야 합니다. Enhanced VPC Routing에 대한 자세한 내용은 [Amazon Redshift Enhanced VPC Routing](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html) 섹션을 참조하세요.

## 선택적 파라미터
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

SSH 연결을 통해 COPY를 사용할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ [데이터 형식 파라미터](copy-parameters-data-format.md#copy-data-format-parameters)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

SSH에서 COPY를 사용할 때는 다음 파라미터를 사용할 수 없습니다.
+ Encrypted
+ MANIFEST
+ READRATIO

# Amazon DynamoDB에서 COPY
<a name="copy-parameters-data-source-dynamodb"></a>

기존 DynamoDB 테이블에서 데이터를 로드할 때는 FROM 절을 사용하여 DynamoDB 테이블 이름을 지정합니다.

**Topics**
+ [구문](#copy-parameters-data-source-dynamodb-syntax)
+ [예제](#copy-parameters-data-source-dynamodb-examples)
+ [선택적 파라미터](#copy-parameters-data-source-dynamodb-optional-parms)
+ [지원되지 않는 파라미터](#copy-parameters-data-source-dynamodb-unsupported-parms)

**중요**  
DynamoDB 테이블이 Amazon Redshift 클러스터와 동일한 리전에 속하지 않는 경우에는 REGION 파라미터를 사용하여 데이터가 위치한 리전을 지정해야 합니다.

## 구문
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## 예제
<a name="copy-parameters-data-source-dynamodb-examples"></a>

다음은 DynamoDB 테이블에서 데이터를 로드하는 예입니다.

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### 파라미터
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
로드할 데이터 원본입니다.

'dynamodb://*table-name*'  <a name="copy-dynamodb"></a>
데이터가 들어 있는 DynamoDB 테이블의 이름입니다(예: `'dynamodb://ProductCatalog'`). DynamoDB 속성과 Amazon Redshift 열의 매핑 방식에 대한 자세한 내용은 [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md) 섹션을 참조하세요.  
DynamoDB 테이블 이름은 AWS 계정에서 고유하여 AWS 액세스 자격 증명으로 식별됩니다.

*권한 부여*  
COPY 명령을 실행하려면 Amazon S3, Amazon EMR, DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 권한은 클러스터에 연결되는 AWS Identity and Access Management(IAM) 역할을 참조하거나(역할 기반 액세스 제어) 사용자의 액세스 자격 증명을 입력하면(키 기반 액세스 제어) 부여할 수 있습니다. 보안과 유연성을 높이려면 IAM 역할 기반 액세스 제어를 권장합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

READRATIO [AS] *ratio*  <a name="copy-readratio"></a>
DynamoDB 테이블에서 데이터 로드에 사용할 프로비저닝 처리량의 비율입니다. READRATIO는 DynamoDB에서 COPY에 필요합니다. Amazon S3에서 COPY를 지원할 때는 사용할 수 없습니다. 이 비율은 사용되지 않는 평균 프로비저닝 처리량 미만의 값으로 설정하는 것이 좋습니다. 유효한 값은 1\$1200의 정수입니다.  
READRATIO를 100 이상으로 설정하면 Amazon Redshift가 DynamoDB 테이블의 프로비저닝된 처리량을 완전히 소비하여 COPY 세션 도중 동일한 테이블에 대한 동시 읽기 작업 성능을 심각하게 떨어뜨릴 수 있습니다. 쓰기 트래픽은 영향을 받지 않습니다. 100보다 높은 값일 때는 Amazon Redshift가 테이블의 프로비저닝 처리량을 충족하지 못하는 드문 경우의 문제를 해결할 수 있습니다. DynamoDB에서 Amazon Redshift로 데이터를 지속적으로 로드하는 경우에는 DynamoDB 테이블을 시계열로 구성하여 COPY 작업에서 실시간 트래픽을 분리하는 것이 좋습니다.

## 선택적 파라미터
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

Amazon DynamoDB에서 COPY를 지원할 때는 다음 파라미터를 옵션으로 지정할 수 있습니다.
+ [열 매핑 옵션](copy-parameters-column-mapping.md)
+ 지원되는 데이터 변환 파라미터는 다음과 같습니다.
  + [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
  + [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
  + [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
  + [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
  + [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
  + [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
  + [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
  + [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 
+ [데이터 로드 작업](copy-parameters-data-load.md)

## 지원되지 않는 파라미터
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

DynamoDB에서 COPY를 지원할 때는 다음 파라미터를 사용할 수 없습니다.
+ 모든 데이터 형식 파라미터
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ Encrypted

# 권한 부여 파라미터
<a name="copy-parameters-authorization"></a>

COPY 명령을 실행하려면 Amazon S3, Amazon EMR, Amazon DynamoDB, Amazon EC2의 데이터를 포함해 다른 AWS 리소스의 데이터에도 액세스할 수 있도록 권한 부여가 필요합니다. 클러스터에 연결되어 있는 [AWS Identity and Access Management(IAM) 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)을 참조하여 이러한 권한을 부여할 수 있습니다(*역할 기반 액세스 제어*). Amazon S3에서 로드 데이터를 암호화할 수 있습니다.

아래 주제에서는 더욱 자세한 내용과 함께 인증 옵션의 예를 살펴보겠습니다.
+ [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [키 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

COPY 명령에서는 다음 중 한 가지를 사용하여 권한을 부여합니다.
+ [IAM\$1ROLE 파라미터 사용](#copy-iam-role) 파라미터
+ [ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](#copy-access-key-id) 파라미터
+ [CREDENTIALS 파라미터 사용](#copy-credentials) 절

## IAM\$1ROLE 파라미터 사용
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

기본 키워드를 사용하여 COPY 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.

클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. IAM\$1ROLE을 지정하면 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN 또는 CREDENTIALS는 사용할 수 없습니다.

다음은 IAM\$1ROLE 파라미터에 대한 구문을 나타낸 것입니다.

```
IAM_ROLE { default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' }
```

자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

## ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

이 권한 부여 방법은 권장되지 않습니다.

**참고**  
일반 텍스트로 입력되는 액세스 자격 증명보다는 IAM\$1ROLE 파라미터를 지정하는 역할 기반 인증의 사용을 강력하게 권장합니다. 자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

### SESSION\$1TOKEN
<a name="copy-token"></a>

임시 액세스 자격 증명으로 사용되는 세션 토큰입니다. SESSION\$1TOKEN을 지정할 때도 ACCESS\$1KEY\$1ID와 SECRET\$1ACCESS\$1KEY를 사용하여 임시 액세스 키 자격 증명을 입력해야 합니다. SESSION\$1TOKEN을 지정하면 IAM\$1ROLE 또는 CREDENTIALS는 사용할 수 없습니다. 자세한 내용은 IAM 사용 설명서에서 [임시 보안 자격 증명](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) 섹션을 참조하세요.

**참고**  
임시 보안 자격 증명을 생성하는 것보다는 역할 기반 인증의 사용을 강력하게 권장합니다. IAM 역할을 사용하여 권한을 부여하면 Amazon Redshift가 각 세션마다 임시 사용자 자격 증명을 자동으로 생성합니다. 자세한 내용은 [역할 기반 액세스 제어](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 섹션을 참조하세요.

다음은 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터를 사용한 SESSION\$1TOKEN 파라미터의 구문 예입니다.

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

SESSION\$1TOKEN을 지정하면 CREDENTIALS 또는 IAM\$1ROLE은 사용할 수 없습니다.

## CREDENTIALS 파라미터 사용
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

클러스터가 데이터 파일 또는 매니페스트 파일이 위치한 다른 AWS 리소스에 액세스할 때 사용할 방법을 나타내는 절입니다. CREDENTIALS 파라미터는 IAM\$1ROLE 또는 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY와 함께 사용할 수 없습니다.

다음은 CREDENTIALS 파라미터에 대한 구문을 보여줍니다.

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**참고**  
유연성을 높이려면 CREDENTIALS 파라미터 대신 [IAM\$1ROLE](#copy-iam-role-iam) 파라미터를 사용하는 것이 좋습니다.

옵션으로 [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 파라미터를 사용하는 경우에는 *credentials-args* 문자열 역시 암호화 키의 역할을 합니다.

*credentials-args* 문자열은 대소문자를 구분하며 공백이 포함되어서는 안됩니다.

키워드 WITH와 AS는 옵션이며 무시해도 좋습니다.

[role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) 또는 [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase)를 지정할 수 있습니다. 어떤 액세스 제어를 지정하든 간에 IAM 역할 또는 사용자는 지정한 AWS 리소스에 액세스할 수 있는 권한이 필요합니다. 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

**참고**  
AWS 자격 증명을 안전하게 지키고 민감한 데이터를 보호하려면 역할 기반 액세스 제어의 사용을 강력하게 권장합니다.

역할 기반 액세스 제어를 지정하려면 *credentials-args* 문자열을 다음과 같은 형식으로 입력합니다.

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

임시 토큰 자격 증명을 사용하려면 임시 액세스 키 ID와 임시 보안 액세스 키, 그리고 임시 토큰을 입력해야 합니다. *credentials-args* 문자열의 형식은 다음과 같습니다.

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

임시 자격 증명과 함께 역할 기반 액세스 제어를 사용하는 COPY 명령은 다음 샘플 문과 유사합니다.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key-id>;token=<temporary-token>'
```

 자세한 내용은 [임시 보안 자격 증명](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) 섹션을 참조하세요.

[ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 파라미터를 사용하는 경우 *credentials-args* 문자열의 형식은 다음과 같습니다. 여기에서 *<root-key>*는 파일을 암호화할 때 사용한 루트 키의 값입니다.

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

암호화 키와 함께 역할 기반 액세스 제어를 사용하는 COPY 명령은 다음 샘플 문과 유사합니다.

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS 
'aws_iam_role=arn:aws:iam::<account-id>:role/<role-name>;master_symmetric_key=<root-key>'
```

# 열 매핑 옵션
<a name="copy-parameters-column-mapping"></a>

기본적으로 COPY 명령은 데이터 파일의 필드 순서와 동일하게 값을 대상 테이블의 열에 삽입합니다. 기본 열 순서가 유효하지 않은 경우에는 열 목록을 지정하거나 JSONPath 표현식을 사용하여 원본 데이터 필드를 대상 열로 매핑할 수 있습니다.
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## 열 목록
<a name="copy-column-list"></a>

열 이름이 쉼표로 구분된 목록을 지정하여 원본 데이터 필드를 특정 대상 열로 로드할 수 있습니다. COPY 문에서는 열의 순서가 정해져 있지 않지만 Amazon S3 버킷과 같은 플랫 파일에서 로드할 때는 원본 데이터의 순서와 일치해야 합니다.

Amazon DynamoDB 테이블에서 로드할 때는 순서가 중요하지 않습니다. COPY 명령은 DynamoDB 테이블에서 가져오는 항목의 속성 이름을 Amazon Redshift 테이블의 열 이름과 일치시킵니다. 자세한 내용은 [Amazon DynamoDB 테이블에서 데이터 로드](t_Loading-data-from-dynamodb.md) 섹션을 참조하세요.

 열 목록의 형식은 다음과 같습니다.

```
COPY tablename (column1 [,column2, ...]) 
```

대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다.

대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다.

NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.

[IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) 열이 열 목록에 포함되어 있으면 [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 역시 지정해야 합니다. 반대로 IDENTITY 열이 없으면 EXPLICIT\$1IDS를 지정할 수 없습니다. 열 목록을 지정하지 않으면 COPY 명령이 마치 열 목록이 순서에 따라 완전하게 지정되어 있는 것처럼, 그리고 EXPLICIT\$1IDS도 지정하지 않은 것처럼 IDENTITY 열을 생략하여 실행됩니다.

열이 GENERATED BY DEFAULT AS IDENTITY로 정의된 경우 복사할 수 있습니다. 값이 새로 생성되거나 입력한 값으로 업데이트됩니다. EXPLICIT\$1IDS 옵션은 필요하지 않습니다. COPY는 자격 증명 하이 워터마크를 업데이트하지 않습니다. 자세한 내용은 [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause) 섹션을 참조하세요.

## JSONPaths 파일
<a name="copy-column-mapping-jsonpaths"></a>

데이터 파일에서 데이터를 JSON 또는 Avro 형식으로 로드할 때는 COPY 명령이 JSON 또는 Avro 원본 데이터의 데이터 요소를 대상 테이블 열에 자동으로 매핑합니다. 이는 Avro 스키마의 필드 이름을 대상 테이블 또는 열 목록의 열 이름과 일치시키는 방식으로 수행됩니다.

경우에 따라 열 이름과 필드 이름이 일치하지 않거나 데이터 계층의 더 깊은 수준에 매핑해야 합니다. 이러한 경우 JSONPaths 파일을 사용하여 JSON 또는 Avro 데이터 요소를 열에 명시적으로 매핑할 수 있습니다.

자세한 내용은 [JSONPaths 파일](copy-parameters-data-format.md#copy-json-jsonpaths) 섹션을 참조하세요.

# 데이터 형식 파라미터
<a name="copy-parameters-data-format"></a>

COPY 명령에서는 기본적으로 원본 데이터가 문자로 구분된 UTF-8 텍스트 형식입니다. 기본 구분자는 파이프 문자(\$1)입니다. 원본 데이터가 다른 형식인 경우에는 다른 파라미터를 사용하여 데이터 형식을 지정합니다: 
+ [FORMAT](#copy-format)
+ [CSV](#copy-csv)
+ [DELIMITER](#copy-delimiter) 
+ [FIXEDWIDTH](#copy-fixedwidth) 
+ [SHAPEFILE](#copy-shapefile) 
+ [AVRO](#copy-avro) 
+ [JSON format for COPY](#copy-json) 
+ [PARQUET](#copy-parquet) 
+ [ORC](#copy-orc) 

COPY는 표준 데이터 형식 외에도 Amazon S3에서 COPY를 실행할 때 다음과 같은 열 기반 데이터 형식을 지원합니다.
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

열 기반 형식에서의 COPY는 지원되지만 특정 제한이 따릅니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.<a name="copy-data-format-parameters"></a>데이터 형식 파라미터

FORMAT [AS]  <a name="copy-format"></a>
(선택 사항) 데이터 형식 키워드를 식별합니다. FORMAT 인수는 다음과 같습니다.

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
입력 데이터에서 CSV 형식을 사용할 수 있습니다. 구분자와 줄 바꿈 문자, 그리고 캐리지 리턴을 자동으로 이스케이프하려면 QUOTE 파라미터에서 지정한 문자로 묶습니다. 기본 인용 부호는 큰따옴표(")입니다. 필드 안에서 인용 부호를 사용할 때는 추가 인용 부호로 이스케이프 처리해야 합니다. 예를 들어 인용 부호로 큰따옴표를 사용한다고 가정할 때 문자열 `A "quoted" word`는 입력 파일에 문자열 `"A ""quoted"" word"`로 삽입해야 합니다. CSV 파라미터를 사용할 때는 기본 구분자가 쉼표(,)입니다. DELIMITER 파라미터를 사용하여 다른 구분자를 지정할 수도 있습니다.  
필드가 인용 부호로 묶이면 구분자와 인용 부호 사이의 공백은 무시됩니다. 구분자가 탭과 같은 공백 문자라면 구분자를 공백으로 처리하지 않습니다.  
CSV는 FIXEDWIDTH, REMOVEQUOTES 또는 ESCAPE와 함께 사용할 수 없습니다.    
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
선택 사항입니다. CSV 파라미터 사용 시 인용 부호로 사용할 문자를 지정합니다. 기본 문자는 큰 따옴표(")입니다. QUOTE 파라미터를 사용하여 큰따옴표 이외의 다른 인용 부호를 정의하는 경우 필드 내에서 큰따옴표를 이스케이프 처리할 필요는 없습니다. QUOTE 파라미터는 CSV 파라미터하고만 사용할 수 있습니다. AS 키워드는 옵션입니다.

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
파이프 문자(`|`), 쉼표(`,`), 탭(`\t`) 또는 `|~|` 기호 등의 여러 문자와 같이 입력 파일의 필드를 구분하는 데 사용되는 문자를 지정합니다. 인쇄할 수 없는 문자가 지원됩니다. 문자를 UTF-8 코드 단위로 8진수로 표시할 수도 있습니다. 8진수로는 '\$1ddd' 형식을 사용하는데, 여기서 'd'는 8진수(0\$17)를 나타냅니다. 기본 구분자는 CSV 파라미터를 사용하지 않는 한 파이프 문자(`|`)입니다. CSV 파라미터를 사용할 경우에는 쉼표(`,`)가 기본 구분자입니다. AS 키워드는 옵션입니다. DELIMITER는 FIXEDWIDTH와 함께 사용할 수 없습니다.

FIXEDWIDTH '*fixedwidth\$1spec*'  <a name="copy-fixedwidth"></a>
각 열이 구분자로 구분되지 않고, 폭의 길이가 고정되어 있는 파일에서 데이터를 로드합니다. *fixedwidth\$1spec*은 열의 레이블과 폭을 사용자 지정하는 문자열입니다. 열 레이블은 사용자 선택에 따라 문자열 또는 정수가 될 수 있습니다. 열 레이블은 열 이름과 관계가 없습니다. 레이블/폭 페어의 순서는 테이블 열의 순서와 정확히 일치해야 합니다. FIXEDWIDTH는 CSV 또는 DELIMITER와 함께 사용할 수 없습니다. Amazon Redshift에서는 CHAR 및 VARCHAR 열의 길이가 바이트로 표현됩니다. 따라서 로드할 파일을 준비할 때는 지정하는 열의 폭이 멀티바이트 문자의 이진 길이를 수용할 정도로 충분한지 확인해야 합니다. 자세한 내용은 [문자 형식](r_Character_types.md) 섹션을 참조하세요.  
*fixedwidth\$1spec*의 형식은 다음과 같습니다.  

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolerance'*] ]  <a name="copy-shapefile"></a>
입력 데이터에서 SHAPEFILE 형식을 사용할 수 있습니다. 기본적으로 shapefile의 첫 번째 열은 `GEOMETRY` 또는 `IDENTITY` 열입니다. 모든 후속 열은 shapefile에 지정된 순서를 따릅니다.  
FIXEDWIDTH, REMOVEQUOTES 또는 ESCAPE와 함께 SHAPEFILE을 사용할 수 없습니다.  
`COPY FROM SHAPEFILE`과 함께 `GEOGRAPHY` 객체를 사용하려면 먼저 `GEOMETRY` 열로 수집한 다음 객체를 `GEOGRAPHY` 객체로 캐스팅합니다.    
SIMPLIFY [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(옵션) Ramer-Douglas-Peucker 알고리즘과 주어진 허용치를 사용하여 수집 프로세스 동안 모든 지오메트리를 단순화합니다.  
SIMPLIFY AUTO [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(옵션) 최대 지오메트리 크기보다 큰 지오메트리만 단순화합니다. 이 단순화는 Ramer-Douglas-Peucker 알고리즘과 자동으로 계산된 허용치(지정된 허용치를 초과하지 않는 경우)를 사용합니다. 이 알고리즘은 지정된 허용치 내에서 객체를 저장할 크기를 계산합니다. *허용치* 값은 옵션입니다.
shapefile 로드의 예는 [Amazon Redshift에 shapefile 로드](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile) 섹션을 참조하세요.

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
원본 데이터를 Avro 형식으로 지정합니다.  
Avro 형식은 다음과 같은 서비스 및 프로토콜을 통해 COPY에 지원됩니다.  
+ Amazon S3 
+ Amazon EMR 
+ 원격 호스트(SSH) 
Avro는 DynamoDB에서 COPY에 대해 지원되지 않습니다.  
Avro는 데이터 직렬화 프로토콜입니다. Avro 원본 파일에는 데이터 구조를 정의하는 스키마가 저장되어 있습니다. Avro 스키마 형식은 `record`가 되어야 합니다. COPY에서는 기본 비압축 코덱과 `deflate` 및 `snappy` 압축 코덱을 사용하여 생성된 Avro 파일이 허용됩니다. Avro에 대한 자세한 내용은 [Apache Avro](https://avro.apache.org/)에서 확인할 수 있습니다.  
*avro\$1option*의 유효 값은 다음과 같습니다.  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
기본값은 `'auto'`입니다.  
COPY는 Avro 원본 데이터의 데이터 요소를 대상 테이블의 열에 자동으로 매핑합니다. 이는 Avro 스키마의 필드 이름을 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다. 일치는 `'auto'`의 경우 대/소문자를 구분하고 `'auto ignorecase'`의 경우 대/소문자를 구분하지 않습니다.  
Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto'` 옵션을 사용할 때는 일치하는 필드 이름 역시 소문자가 되어야 합니다. 필드 이름이 모두 소문자가 아닌 경우 `'auto ignorecase'` 옵션을 사용할 수 있습니다. 기본 `'auto'` 인수를 사용하면 COPY는 구조에서 첫 번째 수준의 필드 또는 *외부 필드*만 인식합니다.  
열 이름을 Avro 필드 이름에 명시적으로 매핑하려면 [JSONPaths 파일](#copy-json-jsonpaths)를 사용합니다.  
기본적으로 COPY는 대상 테이블의 모든 열을 Avro 필드 이름과 일치시키려고 합니다. 열의 하위 집합까지 로드하려면 옵션으로 열 목록을 지정할 수도 있습니다. 대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다. 대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다. 열 목록에 임의의 열이 포함되어 있다고 할 때 COPY가 Avro 데이터에서 일치하는 필드를 찾지 못할 경우에는 COPY가 해당 열에 NULL을 로드하려고 합니다.  
NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.  
<a name="copy-avro-schema"></a>**Avro 스키마**  
Avro 원본 데이터 파일에는 데이터 구조를 정의하는 스키마가 저장되어 있습니다. COPY는 Avro 원본 데이터 파일에 저장된 스키마를 읽어서 데이터 요소를 대상 테이블 열에 매핑합니다. 다음은 Avro 스키마의 예입니다.  

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
Avro 스키마는 JSON 형식으로 정의됩니다. 최상위 JSON 객체에는 이름, 즉 *키*가 포함된 이름-값 페어 3개인 `"name"`, `"type"` 및 `"fields"`가 있습니다.  
`"fields"` 키는 데이터 구조에서 각 필드의 이름과 데이터 형식을 정의하는 객체 배열과 쌍을 이룹니다. 기본적으로 COPY는 필드 이름을 열 이름과 자동으로 일치시킵니다. 열 이름은 항상 소문자이므로 `‘auto ignorecase’` 옵션을 지정하지 않는 한 일치하는 필드 이름도 소문자여야 합니다. 열 이름과 일치하지 않는 필드 이름은 모두 무시됩니다. 순서는 중요하지 않습니다. 위의 예에서는 COPY가 열 이름 `id`, `guid`, `name` 및 `address`에 매핑하고 있습니다.  
기본값인 `'auto'` 인수를 사용하면 COPY가 첫 번째 레벨의 객체만 열과 일치시킵니다. 스키마에서 더욱 깊숙한 레벨까지 매핑하려면, 혹은 필드 이름과 열 이름이 일치하지 않는 경우에는 JSONPaths 파일을 사용하여 매핑을 정의할 수 있습니다. 자세한 내용은 [JSONPaths 파일](#copy-json-jsonpaths) 섹션을 참조하세요.  
키와 연결된 값이 바이트, 배열, 레코드, 맵 또는 링크 같이 복잡한 Avro 데이터 형식인 경우에는 COPY가 이 값을 문자열로 로드합니다. 여기서 문자열은 데이터의 JSON 표현입니다. 열거형(enum)인 Avro 데이터 형식은 COPY에서 문자열로 로드되며, 이때 열거되는 내용은 형식 이름입니다. 문제 해결 예는 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md)을(를) 참조하세요.  
스키마와 파일 메타데이터가 저장되는 Avro 파일 헤더의 최대 크기는 1MB입니다.    
단일 Avro 데이터 블록의 최대 크기는 4MB입니다. 이는 최대 행 크기와는 완전히 다릅니다. 단일 Avro 데이터 블록의 최대 크기를 초과하면 이에 따른 행 크기가 최댓값인 4MB보다 작더라도 COPY 명령이 중단됩니다.  
Amazon Redshift가 행 크기를 계산할 때는 내부적으로 파이프 문자(\$1)를 두 번 계산합니다. 따라서 입력 데이터에 파이프 문자가 다수 포함되어 있으면 데이터 블록이 4MB 미만이더라도 행 크기가 4MB를 초과할 수도 있습니다.

JSON [AS] '*json\$1option*'  <a name="copy-json"></a>
원본 데이터가 JSON 형식입니다.  
JSON 형식은 다음과 같은 서비스 및 프로토콜을 통해 COPY에 지원됩니다.  
+ Amazon S3
+ Amazon EMR에서 COPY
+ SSH 연결을 통한 COPY
JSON은 DynamoDB를 통한 COPY에서는 지원되지 않습니다.  
*json\$1option*의 유효 값은 다음과 같습니다.  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
기본값은 `'auto'`입니다. Amazon Redshift는 JSON 문서를 로드하는 동안 JSON 구조의 속성을 여러 열로 나누지 않습니다.  
기본적으로 COPY는 대상 테이블의 모든 열을 JSON 필드 이름 키와 일치시키려고 합니다. 열의 하위 집합까지 로드하려면 옵션으로 열 목록을 지정할 수도 있습니다. JSON 필드 이름 키가 모두 소문자가 아닌 경우에도 `'auto ignorecase'` 옵션이나 [JSONPaths 파일](#copy-json-jsonpaths)를 사용하여 열 이름을 명시적으로 JSON 필드 이름 키로 매핑할 수 있습니다.  
대상 테이블의 열이 열 목록에서 빠져있으면 COPY가 대상 열의 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 표현식을 로드합니다. 대상 열에 기본값이 없으면 COPY가 NULL을 로드하려고 합니다. 열 목록에 임의의 열이 포함되어 있다고 할 때 COPY가 JSON 데이터에서 일치하는 필드를 찾지 못할 경우에는 COPY가 해당 열에 NULL을 로드하려고 합니다.  
NOT NULL로 정의된 열에 COPY가 NULL을 할당하려고 하면 COPY 명령이 실패합니다.  
COPY는 JSON 원본 데이터의 데이터 요소를 대상 테이블의 열에 매핑합니다. 이는 원본 이름-값 페어의 *객체 키* 또는 이름을 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다.  
각 *json\$1option* 값에 대한 다음 세부 정보를 참조하세요.    
'auto'  <a name="copy-json-auto"></a>
이 옵션을 사용하면 일치에서 대/소문자를 구분합니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto'` 옵션을 사용할 때는 일치하는 JSON 필드 이름 역시 소문자가 되어야 합니다.  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
이 옵션을 사용하면 일치에서 대/소문자를 구분하지 않습니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 `'auto ignorecase'` 옵션을 사용할 때는 해당 JSON 필드 이름은 소문자, 대문자 또는 대소문자 혼합일 수 있습니다.  
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
이 옵션을 사용하면 COPY가 여기서 지정하는 JSONPaths 파일을 사용하여 JSON 원본 데이터의 데이터 요소를 대상 테이블의 열에 매핑합니다. *`s3://jsonpaths_file`* 인수는 단일 파일을 명시적으로 참조하는 Amazon S3 객체 키여야 합니다. 예를 들면 `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'입니다. 인수는 키 접두사가 될 수 없습니다. JSONPaths 파일 사용에 대한 자세한 내용은 [JSONPaths 파일](#copy-json-jsonpaths) 섹션을 참조하세요.  
경우에 따라 `jsonpaths_file`로 지정된 파일은 데이터 파일에 대해 `copy_from_s3_objectpath`로 지정된 경로와 동일한 접두사를 갖습니다. 그러면 COPY는 JSONPaths 파일을 데이터 파일로 읽고 오류를 반환합니다. 예를 들어 데이터 파일이 객체 경로 `s3://amzn-s3-demo-bucket/my_data.json`을 사용하고 JSONPaths 파일이 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`라고 가정합니다. 이 경우 COPY는 `my_data.jsonpaths`를 데이터 파일로 로드하려고 합니다.  
'noshred'  <a name="copy-json-noshred"></a>
이 옵션을 사용하면 Amazon Redshift가 JSON 문서를 로드하는 동안 JSON 구조의 속성을 여러 열로 나누지 않습니다.

## JSON 데이터 파일
<a name="copy-json-data-file"></a>

JSON 데이터 파일에는 객체 또는 배열 집합이 저장됩니다. COPY는 저장되어 있는 JSON 객체 또는 배열을 각각 대상 테이블의 행 하나로 로드합니다. 행으로 로드되는 객체 또는 배열은 각각 독립된 루트 레벨 구조이어야 합니다. 즉 다른 JSON 구조의 멤버가 되어서는 안됩니다.

JSON *객체*는 중괄호(\$1 \$1)로 시작해서 끝나며 이름-값 페어 집합이 순서에 상관없이 포함되어 있습니다. 쌍을 이루는 이름과 값은 각각 콜론으로 구분되며, 페어는 서로 쉼표로 구분됩니다. 기본적으로 이름-값 페어에서 *객체 키* 또는 이름은 테이블의 해당 열 이름과 일치해야 합니다. Amazon Redshift 테이블의 열 이름은 항상 소문자이기 때문에 일치하는 JSON 필드 이름 키 역시 소문자가 되어야 합니다. 열 이름과 JSON 키가 일치하지 않을 때는 [JSONPaths 파일](#copy-json-jsonpaths)을 사용하여 명시적으로 열을 키로 매핑하세요.

JSON 객체의 순서는 중요하지 않습니다. 열 이름과 일치하지 않는 이름은 모두 무시됩니다. 다음은 간단한 JSON 객체의 구조를 나타낸 예입니다.

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

JSON *배열*은 대괄호([ ])로 시작해서 끝나며 쉼표로 구분된 값 집합이 순서에 따라 포함되어 있습니다. 데이터 파일이 배열을 사용하는 경우에는 JSONPaths 파일을 지정하여 값과 열을 일치시켜야 합니다. 다음은 간단한 JSON 배열의 구조를 나타낸 예입니다.

```
["value1", value2]
```

JSON은 올바른 형식을 따라야 합니다. 예를 들어 객체나 배열은 공백을 제외하고 쉼표나 기타 다른 문자로 구분할 수 없습니다. 문자열은 큰따옴표로 묶어야 합니다. 인용 부호는 기울어진 인용 부호나 "스마트" 인용 부호가 아닌 단순 인용 부호(0x22)가 되어야 합니다.

중괄호 또는 대괄호를 포함하여 단일 JSON 객체 및 배열의 최대 크기는 4MB입니다. 이는 최대 행 크기와는 완전히 다릅니다. 단일 JSON 객체 또는 배열의 최대 크기를 초과하면 이에 따른 행 크기가 최댓값인 4MB보다 작더라도 COPY 명령이 중단됩니다.

Amazon Redshift가 행 크기를 계산할 때는 내부적으로 파이프 문자(\$1)를 두 번 계산합니다. 따라서 입력 데이터에 파이프 문자가 다수 포함되어 있으면 객체 크기가 4MB 미만이더라도 행 크기가 4MB를 초과할 수도 있습니다.

COPY는 줄 바꿈 문자로 `\n`을, 그리고 탭 문자로 `\t`를 로드합니다. 백슬래시를 로드하려면 백슬래시(`\\`)로 이스케이프하세요.

COPY는 지정한 JSON 원본에서 올바른 형식의 유효 JSON 객체 또는 배열을 검색합니다. COPY가 사용 가능한 JSON 구조를 찾기 전에 또는 유효한 JSON 객체 또는 배열 사이에서 공백이 아닌 문자를 발견하면 COPY는 각 인스턴스에 대해 오류를 반환합니다. 이러한 오류는 MAXERROR 오류로 가산되며, 오류 수가 MAXERROR와 같거나 이를 초과하면 COPY는 중단됩니다.

Amazon Redshift는 STL\$1LOAD\$1ERRORS 시스템 테이블의 행에 오류를 일일이 기록합니다. LINE\$1NUMBER 열에는 오류를 일으킨 JSON 객체의 마지막 라인이 기록됩니다.

IGNOREHEADER를 지정하면 COPY가 지정한 만큼 JSON 데이터의 라인 수를 무시합니다. JSON 데이터의 줄 바꿈 문자도 항상 IGNOREHEADER 계산에 포함됩니다.

COPY는 기본적으로 빈 문자열을 빈 필드의 형태로 로드합니다. 이때 EMPTYASNULL을 지정하면 COPY가 CHAR 및 VARCHAR 필드의 빈 문자열을 NULL로 로드합니다. INT 같이 다른 데이터 형식의 빈 문자열은 항상 NULL로 로드됩니다.

다음 옵션은 JSON에서 지원되지 않습니다.
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요. JSON 데이터 구조에 대한 자세한 내용은 [www.json.org](https://www.json.org/)에서 확인할 수 있습니다.

## JSONPaths 파일
<a name="copy-json-jsonpaths"></a>

JSON 형식 또는 Avro 원본 데이터에서 로드하는 경우에는 기본적으로 COPY가 원본 데이터의 첫 번째 수준 데이터 요소를 대상 테이블의 열에 매핑합니다. 이는 이름-값 페어의 각 이름 또는 객체 키를 대상 테이블의 열 이름과 일치시키는 방식으로 수행됩니다.

열 이름과 객체 키가 일치하지 않는 경우, 혹은 데이터 계층에서 더욱 깊숙한 레벨까지 매핑하려면 JSONPaths 파일을 사용하여 JSON 또는 Avro 데이터 요소를 명시적으로 열까지 매핑할 수 있습니다. JSONPaths 파일은 대상 테이블 또는 열 목록의 열 순서를 일치시켜 JSON 데이터 요소를 열로 매핑합니다.

JSONPaths 파일에는 배열이 아닌 단일 JSON 객체만 저장되어야 합니다. JSON 객체는 이름-값 페어입니다. 이름-값 페어에서 이름에 해당하는 *객체 키*는 `"jsonpaths"`가 되어야 합니다. 이름-값 페어에서 *값*은 *JSONPath 표현식*의 배열입니다. JSONPath 표현식은 각각 JSON 데이터 계층 또는 Avro 스키마의 단일 요소를 참조합니다. 이는 XPath 표현식이 XML 문서의 요소를 참조하는 방식과 비슷합니다. 자세한 내용은 [JSONPath 표현식](#copy-json-jsonpath-expressions) 섹션을 참조하세요.

JSONPaths 파일을 사용하려면 COPY 명령에 JSON 또는 AVRO 키워드를 추가합니다. 다음 형식을 사용하여 JSONPaths 파일의 S3 버킷 이름과 객체 경로를 지정합니다.

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

`s3://jsonpaths_file` 값은 `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`와 같은 단일 파일을 명시적으로 참조하는 Amazon S3 객체 키여야 합니다. 키 접두사일 수 없습니다.

경우에 따라 경우에 따라 Amazon S3에서 로드하는 경우 `jsonpaths_file`로 지정된 파일은 데이터 파일에 대해 `copy_from_s3_objectpath`로 지정된 경로와 동일한 접두사를 갖습니다. 그러면 COPY는 JSONPaths 파일을 데이터 파일로 읽고 오류를 반환합니다. 예를 들어 데이터 파일이 객체 경로 `s3://amzn-s3-demo-bucket/my_data.json`을 사용하고 JSONPaths 파일이 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`라고 가정합니다. 이 경우 COPY는 `my_data.jsonpaths`를 데이터 파일로 로드하려고 합니다.

 키 이름이 `"jsonpaths"`가 아닌 다른 문자열이라면 COPY 명령이 오류를 반환하지는 않습니다. 하지만 *jsonpaths\$1file*을 무시하고 `'auto'` 인수를 사용합니다.

다음 중 한 가지라도 발생하면 COPY 명령이 중단됩니다.
+ JSON 형식이 잘못된 경우
+ JSON 객체가 2개 이상인 경우
+ 공백을 제외한 문자가 객체 외부에 존재하는 경우
+ 배열 요소가 빈 문자열이거나, 혹은 문자열이 아닌 경우

JSONPaths 파일에는 MAXERROR가 적용되지 않습니다.

[ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 옵션을 지정하더라도 JSONPaths 파일을 암호화해서는 안 됩니다.

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

## JSONPath 표현식
<a name="copy-json-jsonpath-expressions"></a>

JSONPaths 파일은 JSONPath 표현식을 사용하여 데이터 필드를 대상 열로 매핑합니다. 각 JSONPath 표현식은 Amazon Redshift 대상 테이블의 열 하나에 해당합니다. JSONPath 배열 요소의 순서는 대상 테이블의 열 순서와, 혹은 열 목록을 사용하는 경우 열 목록의 열 순서와 일치해야 합니다.

표시된 대로 필드 이름과 값 모두에 큰따옴표가 필요하며, 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다.

JSONPath 표현식에서 참조하는 객체 요소가 JSON 데이터에서 발견되지 않으면 COPY가 NULL 값을 로드하려고 합니다. 참조 객체의 형식이 잘못되면 COPY가 로드 오류를 반환합니다.

JSONPath 표현식에서 참조하는 배열 요소가 JSON 또는 Avro 데이터에서 발견되지 않으면 COPY가 다음 오류와 함께 중단됩니다. `Invalid JSONPath format: Not an array or index out of range.` 이때 원본 데이터에 존재하지 않는 배열 요소는 JSONPaths에서 모두 제거한 후 원본 데이터의 배열이 올바른 형식인지 확인하세요.  

JSONPath 표현식은 대괄호 또는 점 표기법을 사용할 수 있지만 표기법을 혼용할 수는 없습니다. 다음은 대괄호 표기법을 사용한 JSONPath 표현식 예입니다.

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

다음은 점 표기법을 사용한 JSONPath 표현식 예입니다.

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

Amazon Redshift COPY 구문 컨텍스트에서 JSONPath 표현식은 JSON 또는 Avro 계층적 데이터 구조의 단일 이름 요소에 대한 명시적 경로를 지정해야 합니다. Amazon Redshift는 모호한 경로 또는 여러 이름 요소로 해석될 수 있는 와일드카드 문자 또는 필터 표현식과 같은 JSONPath 요소를 지원하지 않습니다.

자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

## Avro 데이터의 JSONPaths 사용
<a name="using-jsonpath-with-avro"></a>

다음은 다중 레벨의 Avro 스키마를 나타낸 예입니다.

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "isActive", "type": "boolean"},
        {"name": "age", "type": "int"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"},
        {"name": "latitude", "type": "double"},
        {"name": "longitude", "type": "double"},
        {
            "name": "tags",
            "type": {
                        "type" : "array",
                        "name" : "inner_tags",
                        "items" : "string"
                    }
        },
        {
            "name": "friends",
            "type": {
                        "type" : "array",
                        "name" : "inner_friends",
                        "items" : {
                                    "name" : "friends_record",
                                    "type" : "record",
                                    "fields" : [
                                                 {"name" : "id", "type" : "int"},
                                                 {"name" : "name", "type" : "string"}
                                               ]
                                  }
                    }
        },
        {"name": "randomArrayItem", "type": "string"}
    ]
}
```

다음은 AvroPath 표현식을 사용하여 위의 스키마를 참조하는 JSONPaths 파일의 예입니다.

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

위의 JSONPaths 예에는 다음과 같은 요소가 포함되어 있습니다.

jsonpaths  
AvroPath 표현식이 포함된 JSON 객체의 이름입니다.

[ … ]  
경로 요소가 포함된 JSON 배열을 묶는 대괄호입니다.

\$1  
Avro 스키마에서 `"fields"` 배열에 해당하는 루트 요소를 참조하는 달러 기호입니다.

"\$1.id",  
AvroPath 표현식의 대상입니다. 위 예에서 대상은 `"fields"` 배열에서 이름으로 `"id"`가 포함된 요소입니다. 표현식은 쉼표로 구분됩니다.

"\$1.friends[0].id"  
대괄호는 배열 인덱스를 나타냅니다. JSONPath 표현식은 0부터 시작되는 인덱싱을 사용하기 때문에 이 표현식에서는 `"friends"` 배열에서 이름으로 `"id"`가 포함된 첫 번째 요소를 참조합니다.

Avro 스키마 구문에서는 *안쪽 필드*를 사용하여 레코드 및 배열 데이터 형식의 구조를 정의해야 합니다. AvroPath 표현식에서는 안쪽 필드가 무시됩니다. 예를 들어 `"friends"` 필드는 `"inner_friends"`라는 이름의 배열을 정의하고, 이 배열은 `"friends_record"`라는 이름의 레코드를 정의합니다. `"id"` 필드를 참조하는 AvroPath 표현식은 추가되는 필드를 무시하고 대상 필드를 직접 참조할 수 있습니다. 다음은 `"friends"` 배열에 속한 두 필드를 참조하는 AvroPath 표현식입니다.

```
"$.friends[0].id"
"$.friends[0].name"
```

## 열 기반 데이터 형식 파라미터
<a name="copy-parameters-columnar-data"></a>

COPY는 표준 데이터 형식 외에도 Amazon S3에서 COPY를 실행할 때 다음과 같은 열 기반 데이터 형식을 지원합니다. 열 기반 형식에 대한 COPY는 지원되지만 특정 제한이 따릅니다. 자세한 내용은 [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md) 섹션을 참조하세요.

ORC  <a name="copy-orc"></a>
ORC(Optimized Row Columnar) 파일 형식을 사용하는 파일에서 데이터를 불러옵니다.

PARQUET  <a name="copy-parquet"></a>
Parquet 파일 형식을 사용하는 파일에서 데이터를 불러옵니다.

# 파일 압축 파라미터
<a name="copy-parameters-file-compression"></a>

다음 파라미터를 지정하여 압축된 데이터 파일로부터 로드할 수 있습니다.파일 압축 파라미터

bzip2   <a name="copy-bzip2"></a>
입력 파일이 bzip2 압축 형식(.bz2 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.

GZIP   <a name="copy-gzip"></a>
입력 파일이 gzip 압축 형식(.gz 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.

LZOP   <a name="copy-lzop"></a>
입력 파일이 lzop 압축 형식(.lzo 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.  
COPY는 lzop *--filter* 옵션을 사용한 압축 파일을 지원하지 않습니다.

ZSTD   <a name="copy-zstd"></a>
입력 파일이 Zstandard 압축 형식(.zst 파일)을 따르도록 지정하는 값입니다. COPY 작업은 데이터를 로드할 때 각 압축 파일을 읽고 데이터 압축을 풉니다.  
ZSTD는 Amazon S3에서 COPY에서만 지원됩니다.

# 데이터 변환 파라미터
<a name="copy-parameters-data-conversion"></a>

COPY 명령은 테이블에 데이터를 로드할 때 원본 데이터의 문자열을 묵시적으로 대상 열의 데이터 형식으로 변환합니다. 기본 동작과 다른 변환을 지정해야 하거나, 혹은 기본 변환이 오류를 일으킬 때는 다음 파라미터를 지정하여 데이터 변환을 관리할 수 있습니다. 이러한 파라미터 구문에 대한 자세한 내용은 [COPY 구문](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax)을 참조하세요.
+ [ACCEPTANYDATE](#copy-acceptanydate) 
+ [ACCEPTINVCHARS](#copy-acceptinvchars) 
+ [BLANKSASNULL](#copy-blanksasnull) 
+ [DATEFORMAT](#copy-dateformat) 
+ [EMPTYASNULL](#copy-emptyasnull) 
+ [ENCODING](#copy-encoding) 
+ [ESCAPE](#copy-escape) 
+ [EXPLICIT_IDS](#copy-explicit-ids) 
+ [FILLRECORD](#copy-fillrecord) 
+ [IGNOREBLANKLINES](#copy-ignoreblanklines) 
+ [IGNOREHEADER](#copy-ignoreheader) 
+ [NULL AS](#copy-null-as) 
+ [REMOVEQUOTES](#copy-removequotes) 
+ [ROUNDEC](#copy-roundec) 
+ [TIMEFORMAT](#copy-timeformat) 
+ [TRIMBLANKS](#copy-trimblanks) 
+ [TRUNCATECOLUMNS](#copy-truncatecolumns) <a name="copy-data-conversion-parameters"></a>데이터 변환 파라미터

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
`00/00/00 00:00:00` 같이 잘못된 형식을 포함하여 모든 데이터 형식을 오류 없이 로드할 수 있도록 허용합니다. 이 파라미터는 TIMESTAMP 및 DATE 열에만 적용됩니다. ACCEPTANYDATE는 항상 DATEFORMAT 파라미터와 함께 사용합니다. 데이터의 날짜 형식이 DATEFORMAT 명세와 일치하지 않는 경우에는 Amazon Redshift가 NULL 값을 해당 필드에 삽입합니다.

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
데이터에 잘못된 UTF-8 문자가 포함되어 있어도 VARCHAR 열에 데이터를 로드할 수 있습니다. ACCEPTINVCHARS를 지정하면 COPY가 잘못된 UTF-8 문자를 각각 *replacement\$1char*에서 지정하는 문자로 구성된, 동일한 길이의 문자열로 변경합니다. 예를 들어 변경 문자가 '`^`'라면 잘못된 3바이트 문자는 '`^^^`'로 변경됩니다.  
 변경 문자는 NULL을 제외한 모든 ASCII 문자가 될 수 있습니다. 기본 문자는 물음표(?)입니다. 잘못된 UTF-8 문자에 대한 자세한 내용은 [멀티바이트 문자 로드 오류](multi-byte-character-load-errors.md) 섹션을 참조하세요.  
COPY는 잘못된 UTF-8 문자가 포함된 행의 수를 반환한 후 해당하는 행마다 [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) 시스템 테이블에 항목을 추가합니다. 이때 각 노드 조각에서 항목이 추가되는 행의 최대 수는 100개입니다. 이후 추가되는 잘못된 UTF-8 문자 역시 변경되지만 이러한 문자의 변경 이벤트는 기록되지 않습니다.  
ACCEPTINVCHARS를 지정하지 않으면 COPY가 잘못된 UTF-8 문자를 발견할 때마다 오류를 반환합니다.  
ACCEPTINVCHARS는 VARCHAR 열에서만 유효합니다.

BLANKSASNULL   <a name="copy-blanksasnull"></a>
공백 문자로만 구성된 빈 필드를 NULL로 로드합니다. 이 옵션은 CHAR 및 VARCHAR 열에만 적용됩니다. INT 같이 다른 데이터 형식의 빈 필드는 항상 NULL로 로드됩니다. 예를 들어 공백 문자 3개가 다른 문자 없이 연이어 포함된 문자열은 NULL로 로드됩니다. 이 옵션을 사용하지 않으면 기본 동작으로 공백 문자를 있는 그대로 로드합니다.

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
인수를 지정하지 않을 경우 기본값은 `'YYYY-MM-DD'`입니다. 예를 들어 이를 대신할 수 있는 유효 형식은 `'MM-DD-YYYY'`입니다.  
COPY 명령이 날짜 또는 시간 값의 형식을 인식하지 못하거나, 혹은 날짜 또는 시간 값이 다른 형식인 경우에는 DATEFORMAT 또는 TIMEFORMAT 파라미터에 `'auto'` 인수를 사용하세요. `'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. `'auto'`' 키워드는 대/소문자를 구분합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.  
날짜 형식에 시간 정보(시, 분, 초)가 포함될 수는 있지만 이 정보는 무시됩니다. AS 키워드는 옵션입니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션을 참조하세요.

EMPTYASNULL   <a name="copy-emptyasnull"></a>
Amazon Redshift가 비어있는 CHAR 및 VARCHAR 필드를 NULL로 로드하도록 지정합니다. INT 같이 다른 데이터 형식의 빈 필드는 항상 NULL로 로드됩니다. 빈 필드는 2개의 구분자가 사이에 아무런 문자도 없이 연이어 데이터에 포함되어 있을 때 발생합니다. EMPTYASNULL과 NULL AS '' (empty string)는 동작이 동일합니다.

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
로드 데이터의 인코딩 유형을 지정합니다. COPY 명령은 로딩 도중 데이터를 지정된 인코딩에서 UTF-8로 변환합니다.  
*file\$1encoding*의 유효 값은 다음과 같습니다.  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
기본값은 `UTF8`입니다.  
원본 파일 이름은 UTF-8 인코딩을 사용해야 합니다.  
다음 파일은 로드 데이터로 다른 인코딩이 지정되어 있더라도 UTF-8 인코딩을 사용해야 합니다.  
+ 매니페스트 파일
+ JSONPaths 파일
다음 파라미터와 함께 입력되는 인수 문자열은 UTF-8을 사용해야 합니다.  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
고정 폭 데이터 파일은 UTF-8 인코딩을 사용해야 합니다. 필드 폭은 바이트 수가 아니라 문자 수를 기준으로 하기 때문입니다.  
로드 데이터는 모두 지정된 인코딩을 사용해야 합니다. COPY가 다른 인코딩을 만나면 파일을 건너뛰고 오류를 반환합니다.  
`UTF16`을 지정한 경우에는 데이터에 바이트 순서 표식(BOM)이 있어야 합니다. UTF-16 데이터가 리틀 엔디안(LE)인지, 빅 엔디안(BE)인지 알고 있다면 BOM 유무에 상관없이 `UTF16LE` 또는 `UTF16BE`를 사용할 수 있습니다.  
ISO-8859-1 인코딩을 사용하려면 `ISO88591`을 지정합니다. 자세한 내용은 **Wikipedia의 [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)을 참조하세요.

ESCAPE   <a name="copy-escape"></a>
이 파라미터를 지정하면 입력 데이터의 백슬래시 문자(`\`)가 이스케이프 문자로 처리됩니다. 그러면 백슬래시 문자 바로 뒤에 있는 문자가 일반적으로 특정 용도로 사용되는 문자라고 해도 현재 열 값의 일부로 테이블에 로드됩니다. 예를 들어 이 파라미터를 사용하여 구분자 문자, 인용 부호, 줄 바꿈 문자 또는 이스케이프 문자 자체를 이스케이프 처리할 수 있습니다. 단, 이러한 문자가 모두 열 값에서 유효해야 합니다.  
ESCAPE 파라미터를 REMOVEQUOTES 파라미터와 함께 지정하면 그 외에 삭제될 수도 있는 인용 부호(`'` 또는 `"`)를 이스케이프 처리하여 유지할 수 있습니다. 기본 NULL 문자열인 `\N`은 있는 그대로 유효하지만 입력 데이터에서는 `\\N`로 이스케이프 처리할 수도 있습니다. NULL AS 파라미터를 사용해 대체 NULL 문자열을 지정하지만 않는다면 `\N`과 `\\N`은 동일한 결과를 산출합니다.  
제어 문자 `0x00`(NUL)은 이스케이프 처리할 수 없기 때문에 입력 데이터에서 삭제하거나, 혹은 변환해야 합니다. 이 문자는 레코드 끝(EOR) 마커로 처리되어 나머지 레코드는 모두 잘립니다.
FIXEDWIDTH 로드 시 ESCAPE 파라미터를 사용할 수 없으며, 이스케이프 문자 자체를 지정하는 것도 안 됩니다. 이스케이프 문자는 항상 백슬래시 문자입니다. 또한 입력 데이터에는 적절한 자리에 이스케이프 문자가 포함되어야 합니다.  
여기 몇 가지 입력 데이터를 비롯해 ESCAPE 파라미터를 지정했을 때 로드되는 데이터의 예가 있습니다. 행 4의 결과는 REMOVEQUOTES 파라미터 역시 지정된다는 것을 가정합니다. 입력 데이터는 다음과 같이 파이프로 구분된 필드 2개로 구성됩니다.  

```
1|The quick brown fox\[newline]
jumped over the lazy dog.
2| A\\B\\C
3| A \| B \| C
4| 'A Midsummer Night\'s Dream'
```
열 2로 로드되는 데이터는 다음과 같습니다.  

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
로드 시 입력 데이터에 대한 이스케이프 문자의 적용 여부는 사용자에게 책임이 있습니다. 이러한 요건의 한 가지 예외라면 이전에 ESCAPE 파라미터를 사용해 언로드되었던 데이터를 다시 로드할 때입니다. 이때는 데이터에 이미 필요한 이스케이프 문자가 포함되어 있기 때문입니다.
ESCAPE 파라미터는 8진수, 16진수, Unicode 또는 기타 이스케이프 시퀀스 표기법을 해석하지 않습니다. 예를 들어 원본 데이터에 8진수 라인 피드 값(`\012`)이 포함되어 있을 때 ESCAPE 파라미터를 사용해 이 데이터를 로드하려고 하면 Amazon Redshift가 값 `012`를 테이블로 로드하는 동시에 이 값을 이스케이프 처리되는 라인 피드로 해석하지 않습니다.  
Microsoft Windows 플랫폼에서 작성된 데이터의 줄 바꿈 문자를 이스케이프 처리하려면 캐리지 리턴용 하나와 라인 피드용 하나, 총 2개의 이스케이프 문자를 사용해야 할 수도 있습니다. 그 밖에 파일을 로드하기 전에 dos2unix 유틸리티 등을 사용해 캐리지 리턴을 삭제하는 방법도 있습니다.

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
원본 데이터 파일에서 명시적인 값을 사용해 자동 생성된 값을 재정의하려면 IDENTITY 열이 포함된 테이블에서 EXPLICIT\$1IDS를 사용하세요. 명령에 열 목록을 추가하는 경우에는 해당 목록에 이 파라미터를 사용할 IDENTITY 열도 포함되어야 합니다. EXPLICIT\$1IDS 값의 데이터 형식은 CREATE TABLE 정의에서 지정한 IDENTITY 형식과 일치해야 합니다.  
EXPLICIT\$1IDS 옵션을 사용하여 테이블에 대해 COPY 명령을 실행할 때, Amazon Redshift는 테이블에서 IDENTITY 열의 고유성을 확인하지 않습니다.  
열이 GENERATED BY DEFAULT AS IDENTITY로 정의된 경우 복사할 수 있습니다. 값이 새로 생성되거나 입력한 값으로 업데이트됩니다. EXPLICIT\$1IDS 옵션은 필요하지 않습니다. COPY는 자격 증명 하이 워터마크를 업데이트하지 않습니다.  
 EXPLICIT\$1ID를 사용하는 COPY 명령의 예는 [IDENTITY 열의 명시적인 값을 사용한 VENUE 로드](r_COPY_command_examples.md#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)을 참조하세요.

FILLRECORD   <a name="copy-fillrecord"></a>
서로 인접한 열들이 일부 레코드 끝에서 누락되었을 때도 데이터 파일의 로드를 허용합니다. 누락된 열은 NULL로 로드됩니다. 텍스트 및 CSV 형식의 경우 누락된 열이 VARCHAR 열이면 NULL 대신 길이가 0인 문자열이 로드됩니다. 텍스트 및 CSV에서 VARCHAR 열로 NULL을 로드하려면 EMPTYASNULL 키워드를 지정합니다. NULL 치환은 열 정의가 NULL을 허용할 때만 유효합니다.  
예를 들어 테이블 정의에 NULL을 허용하는 CHAR 열이 4개 포함되어 있고, 레코드에 포함된 값이 `apple, orange, banana, mango`라고 가정한다면 COPY 명령은 `apple, orange` 값만 포함된 레코드를 로드하여 채울 수 있습니다. 이때 누락된 CHAR 값은 NULL 값으로 로드됩니다.

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
데이터 파일에서 라인 피드만 포함된 빈 라인을 무시하고 로드하지 않습니다.

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
지정하는 *number\$1rows*를 파일 헤더로 처리하고 로드하지 않습니다. IGNOREHEADER는 병렬 로드에서 모든 파일의 헤더를 건너뛸 때 사용됩니다.

NULL AS '*null\$1string*'  <a name="copy-null-as"></a>
*null\$1string*과 일치하는 필드를 NULL로 로드합니다. 여기에서 *null\$1string*은 어떤 문자열이든 가능합니다. 데이터에 NUL(UTF-8 0000) 또는 이진 0(0x000)으로도 불리는 null 종결자가 포함되어 있으면 COPY는 이를 다른 문자로 취급합니다. 예를 들어 '1' \$1\$1 NUL \$1\$1 '2'를 포함하는 레코드는 길이가 3바이트인 문자열로 복사됩니다. 필드에 NUL만 포함된 경우 NULL AS로 `'\0'` 또는 `'\000'`을 지정(예: `NULL AS '\0'` 또는 `NULL AS '\000'`)하여 null 종결자를 NULL로 바꿀 수 있습니다. 필드에 NUL로 끝나는 문자열이 있을 때 NULL AS를 지정하면 끝에서 NUL과 함께 문자열이 삽입됩니다. *null\$1string* 값에 '\$1n'(줄 바꿈)을 사용하지 않습니다. Amazon Redshift는 줄 구분 기호로 사용하기 위해 '\$1n'을 예약합니다. 기본 *null\$1string*은 `'\N`'입니다.  
NULL을 NOT NULL로 정의된 열에 로드하려고 하면 COPY 명령이 실패합니다.

REMOVEQUOTES   <a name="copy-removequotes"></a>
입력 데이터의 문자열에서 묶고 있는 인용 부호를 제거합니다. 인용 부호 안의 문자는 구분자를 포함하여 모두 유지됩니다. 문자열에 선행하는 작은 또는 큰 따옴표만 있고 후행하는 인용 부호가 없는 경우에는 COPY 명령이 해당 행을 로드하지 못하고 오류를 반환합니다. 다음 표는 인용 부호로 묶인 문자열과 이 옵션으로 로드되는 값의 몇 가지 예를 보여줍니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
입력 값의 소수점 자릿수가 열 값의 소수점 자릿수보다 큰 경우 숫자 값을 반올림합니다. 기본적으로 COPY는 열 값의 소수점 자릿수에 맞출 필요가 있을 때 값을 자릅니다. 예를 들어 `20.259` 값을 DECIMAL(8,2) 열에 로드한다고 가정할 때 기본적으로 COPY가 이 값을 `20.25`로 자릅니다. 하지만 ROUNDEC를 지정하면 COPY가 값을 `20.26`으로 반올림합니다. INSERT 명령은 열 값의 소수점 자릿수와 일치시켜야 할 때마다 항상 값을 반올림합니다. 따라서 ROUNDEC 파라미터가 지정된 COPY 명령은 INSERT 명령과 똑같이 동작합니다.

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
시간 형식을 지정합니다. TIMEFORMAT을 지정하지 않았을 때 기본 형식은 TIMESTAMP 열의 경우 `YYYY-MM-DD HH:MI:SS`이고, 그리고 TIMESTAMPTZ 열의 경우 `YYYY-MM-DD HH:MI:SSOF`입니다. 여기에서 `OF`는 협정 세계시(UTC)의 오프셋을 말합니다. *timeformat\$1string*에는 시간대 지정자를 추가할 수 없습니다. 기본 형식과 다른 형식의 TIMESTAMPTZ 데이터를 로드하려면 'auto'를 지정해야 합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요. *timeformat\$1string*에 대한 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션을 참조하세요.  
`'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. COPY 명령이 날짜 또는 시간 값의 형식을 인식하지 못하거나, 혹은 날짜 및 시간 값이 서로 다른 형식인 경우에는 DATEFORMAT 또는 TIMEFORMAT 파라미터에 `'auto'` 인수를 사용하세요. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.  
원본 데이터가 epoch 시간, 즉 1970년 1월 1일 00:00:00 UTC 이후의 시간(초 또는 밀리초)으로 표현되는 경우에는 `'epochsecs'` 또는 `'epochmillisecs'`를 지정합니다.  
`'auto'`, `'epochsecs'` 및 `'epochmillisecs'` 키워드는 대/소문자를 구분합니다.  
AS 키워드는 옵션입니다.

TRIMBLANKS   <a name="copy-trimblanks"></a>
VARCHAR 문자열에서 후행 공백 문자를 제거합니다. 이 파라미터는 VARCHAR 데이터 형식의 열에만 적용됩니다.

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
열의 데이터를 열 명세에 따라 적합한 수의 문자로 자릅니다. VARCHAR 또는 CHAR 데이터 형식의 열에만 적용되며, 행의 크기는 4MB 이하입니다.

# 데이터 로드 작업
<a name="copy-parameters-data-load"></a>

문제 해결을 위해, 혹은 로드 시간을 줄일 목적으로 다음 파라미터를 지정하여 로드 작업의 기본 동작을 관리합니다.
+ [COMPROWS](#copy-comprows) 
+ [COMPUPDATE](#copy-compupdate) 
+ [IGNOREALLERRORS](#copy-ignoreallerrors) 
+ [MAXERROR](#copy-maxerror) 
+ [NOLOAD](#copy-noload) 
+ [STATUPDATE](#copy-statupdate) <a name="copy-data-load-parameters"></a>파라미터

COMPROWS *numrows*   <a name="copy-comprows"></a>
압축 분석 시 샘플 크기로 사용할 행의 수를 지정합니다. 분석은 각 데이터 조각의 행에서 실행됩니다. 예를 들어 `COMPROWS 1000000`(1,000,000)을 지정했을 때 시스템에 총 4개의 조각이 있는 경우에는 조각당 250,000개까지만 행을 읽고 분석합니다.  
COMPROWS가 지정되지 않은 경우 샘플 크기는 기본적으로 조각당 100,000개입니다. 기본값인 조각당 100,000개의 행보다 낮은 COMPROWS 값은 자동으로 기본값으로 업그레이드됩니다. 하지만 로드되는 데이터의 크기가 유의적인 샘플을 산출할 정도로 충분하지 않은 경우에는 자동 압축이 일어나지 않습니다.  
COMPROWS 숫자가 입력 파일의 행 개수보다 큰 값이면 COPY 명령이 가능한 모든 행에 대한 압축 분석을 계속 진행하고 실행합니다. 이 인수의 허용 범위는 1000과 2147483647(2,147,483,647) 사이의 수입니다.

COMPUPDATE [ PRESET \$1 \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-compupdate"></a>
COPY 실행 시 압축 인코딩의 자동 적용 여부를 제어합니다.  
COMPUPDATE가 PRESET인 경우 열에 이미 RAW 이외의 다른 인코딩이 있어도 대상 테이블이 비어 있으면 COPY 명령이 각 열에 대한 압축 인코딩을 선택합니다. 현재 지정된 열 인코딩을 바꿀 수 있습니다. 각 열에 대한 인코딩은 열 데이터 형식을 기준으로 합니다. 데이터가 샘플링되지 않습니다. Amazon Redshift가 다음과 같이 압축 인코딩을 자동으로 할당합니다.  
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL 또는 DOUBLE PRECISION 데이터 형식으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR 또는 VARCHAR로 정의된 열에는 LZO 압축이 할당됩니다.
COMPUPDATE가 생략된 경우 COPY 명령은 대상 테이블이 비어 있고 임의의 열에 대한 인코딩(RAW 이외)을 지정하지 않은 경우에만 각 열에 대한 압축 인코딩을 선택합니다. 각 열에 대한 인코딩은 Amazon Redshift에 의해 결정됩니다. 데이터가 샘플링되지 않습니다.  
COMPUPDATE가 ON(또는 TRUE)이거나 옵션 없이 COMPUPDATE가 지정된 경우 테이블 열에 이미 RAW 외에 다른 인코딩이 있어도 테이블이 비어 있으면 COPY 명령이 자동 압축을 적용합니다. 현재 지정된 열 인코딩을 바꿀 수 있습니다. 각 열에 대한 인코딩은 샘플 데이터 분석을 기반으로 합니다. 자세한 내용은 [자동 압축을 사용하여 테이블 로드](c_Loading_tables_auto_compress.md) 섹션을 참조하세요.  
COMPUPDATE가 OFF(또는 FALSE)일 때는 자동 압축이 비활성화됩니다. 열 인코딩은 변경되지 않습니다.  
압축을 분석하는 시스템 테이블에 대한 자세한 내용은 [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md) 섹션을 참조하세요.

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
이 옵션을 지정하여 로드 작업 중에 발생하는 모든 오류를 무시할 수 있습니다.  
MAXERROR 옵션을 지정하면 IGNOREALLERRORS 옵션을 지정할 수 없습니다. ORC 및 Parquet를 포함한 열 형식에 대해서는 IGNOREALLERRORS 옵션을 지정할 수 없습니다.

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
데이터 로드 시 *error\$1count*를 오류 수 이상으로 반환하면 로드가 중단됩니다. 반환되는 오류 수가 더 적을 때는 로드를 계속하면서 INFO 메시지를 반환하여 로드할 수 없는 행의 수를 알려줍니다. 이 파라미터는 형식 오류 또는 기타 데이터 불일치로 인해 일부 행을 테이블에 로드하지 못할 때 중단 없이 로드를 계속할 수 있도록 지정합니다.  
첫 번째 오류 발생 시 바로 로드를 중단하려면 이 값을 `0` 또는 `1`로 설정하세요. AS 키워드는 옵션입니다. MAXERROR 기본 값은 `0`이며 최대 `100000`까지 설정할 수 있습니다.  
 Amazon Redshift의 병렬 특성 때문에 실제로 보고되는 오류 수는 지정한 MAXERROR 값보다 클 수 있습니다. Amazon Redshift 클러스터 노드에서 MAXERROR 값이 초과된 것을 감지하면 각 노드가 발생하는 모든 오류를 보고합니다.

NOLOAD   <a name="copy-noload"></a>
실제로 데이터를 로드하지 않고 데이터 파일의 유효성을 검사합니다. NOLOAD 파라미터를 사용하면 실제로 데이터를 로드하기 전에 데이터 파일의 로드에 따른 잠재적 오류 여부를 확인할 수 있습니다. COPY를 NOLOAD 파라미터와 함께 실행하면 파일의 구문만 분석하기 때문에 데이터 로드보다 속도가 훨씬 빠릅니다.

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
COPY 명령을 성공적으로 마치면 옵티마이저 통계를 자동 계산하여 업데이트합니다. 기본적으로 처음부터 빈 테이블이라면 STATUPDATE 파라미터를 사용하지 않아도 통계가 자동 업데이트됩니다.  
데이터를 비어있지 않은 테이블로 수집하면서 테이블 크기의 변동이 심할 때마다 [ANALYZE](r_ANALYZE.md) 명령을 실행하거나, 혹은 STATUPDATE ON 인수를 사용하여 통계를 업데이트하는 것이 좋습니다.  
STATUPDATE ON(또는 TRUE)일 때는 테이블이 처음부터 비어있는지 상관없이 통계가 자동 업데이트됩니다. STATUPDATE를 사용할 경우 현재 사용자가 테이블 소유자이거나 수퍼유저이어야 합니다. 하지만 STATUPDATE를 지정하지 않는 경우에는 사용자에게 INSERT 권한만 있으면 됩니다.  
STATUPDATE OFF(또는 FALSE)일 때는 통계가 업데이트되지 않습니다.  
자세한 내용은 [테이블 분석](t_Analyzing_tables.md) 섹션을 참조하세요.

# 알파벳 순서의 파라미터 목록
<a name="r_COPY-alphabetical-parm-list"></a>

다음은 COPY 명령 파라미터 각각에 대한 설명 링크가 알파벳 순으로 정렬되어 있는 목록입니다.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id-access)
+ [AVRO](copy-parameters-data-format.md#copy-avro)
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull)
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows)
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate)
+ [CREDENTIALS](copy-parameters-authorization.md#copy-credentials-cred)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter)
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull)
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding)
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape)
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth)
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
+ [GZIP](copy-parameters-file-compression.md#copy-gzip)
+ [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role-iam)
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors)
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines)
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader)
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json)
+ [LZOP](copy-parameters-file-compression.md#copy-lzop)
+ [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
+ [MASTER_SYMMETRIC_KEY](copy-parameters-data-source-s3.md#copy-master-symmetric-key)
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror)
+ [NOLOAD](copy-parameters-data-load.md#copy-noload)
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as)
+ [READRATIO](copy-parameters-data-source-dynamodb.md#copy-readratio)
+ [REGION](copy-parameters-data-source-s3.md#copy-region)
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes)
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)
+ [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token)
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile)
+ [SSH](copy-parameters-data-source-ssh.md#copy-ssh)
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate)
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat)
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks)
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns)
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd)

# 사용 노트
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [다른 AWS 리소스에 대한 액세스 권한](copy-usage_notes-access-permissions.md)
+ [Amazon S3 액세스 포인트 별칭과 함께 COPY 사용](copy-usage_notes-s3-access-point-alias.md)
+ [Amazon S3에서 멀티바이트 데이터 로드](copy-usage_notes-multi-byte.md)
+ [GEOMETRY 또는 GEOGRAPHY 데이터 유형의 열 로드](copy-usage_notes-spatial-data.md)
+ [HLLSKETCH 데이터 형식 로드](copy-usage_notes-hll.md)
+ [VARBYTE 데이터 유형의 열 로드](copy-usage-varbyte.md)
+ [다수의 파일을 읽어올 때 발생하는 오류](copy-usage_notes-multiple-files.md)
+ [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md)
+ [열 기반 데이터 형식에서 COPY 명령](copy-usage_notes-copy-from-columnar.md)
+ [DATEFORMAT 및 TIMEFORMAT 문자열](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md)

# 다른 AWS 리소스에 대한 액세스 권한
<a name="copy-usage_notes-access-permissions"></a>

 Amazon S3, Amazon DynamoDB, Amazon EMR, Amazon EC2 등의 다른 AWS 리소스와 클러스터 사이에 데이터를 이동시키려면 클러스터에 리소스에 대한 액세스 권한을 비롯해 필요한 작업 권한이 있어야 합니다. 예를 들어 Amazon S3에서 데이터를 로드하려면 COPY에 버킷에 대한 LIST 액세스 권한과 버킷 객체에 대한 GET 액세스 권한이 있어야 합니다. 최소 권한에 대한 자세한 내용은 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions) 섹션을 참조하세요.

리소스에 대한 액세스 권한을 얻기 위해서는 먼저 클러스터의 인증이 필요합니다. 인증 방법은 다음 중 한 가지를 선택할 수 있습니다.
+ [역할 기반 액세스 제어](#copy-usage_notes-access-role-based) – 역할 기반 액세스 제어에서는 사용자가 클러스터가 인증 및 권한 부여에 사용할 AWS Identity and Access Management(IAM) 역할을 지정합니다. AWS 자격 증명과 민감한 데이터를 보호하려면 역할 기반 인증의 사용을 강력하게 권장합니다.
+ [키 기반 액세스 제어](#copy-usage_notes-access-key-based) – 키 기반 액세스 제어에서는 사용자의 AWS 액세스 자격 증명(액세스 키 ID와 비밀 액세스 키)을 일반 텍스트로 입력합니다.

## 역할 기반 액세스 제어
<a name="copy-usage_notes-access-role-based"></a>

<a name="copy-usage_notes-access-role-based.phrase"></a>역할 기반 액세스 제어를 통해 클러스터는 IAM 역할을 임시로 맡습니다. 그런 다음 역할에 부여되는 권한에 따라 클러스터가 필요한 AWS 리소스에 액세스할 수 있습니다.

AWS에서 자격 증명이 할 수 있는 것과 없는 것을 결정하는 권한 정책을 갖춘 AWS 자격 증명이라는 점에서 IAM *역할* 생성은 사용자에게 권한을 제공하는 것과 유사합니다. 하지만 역할은 사용자 한 명과 독자적으로 연결되는 것이 아니기 때문에 필요한 모든 객체에게 전달할 수 있습니다. 또한 역할과 연결되는 자격 증명(암호 또는 액세스 키)도 전혀 없습니다. 다만 역할이 클러스터와 연결되면 액세스 키가 동적으로 생성되어 클러스터에게 제공됩니다.

역할 기반 액세스 제어는 AWS 자격 증명을 보호하는 것은 물론이고 AWS 리소스와 민감한 사용자 데이터에 대한 액세스를 더욱 안전하게, 그리고 세분화하여 제어할 수 있다는 점에서 더욱 바람직합니다.

역할 기반 인증의 이점은 다음과 같습니다.
+ AWS 표준 IAM 도구를 사용하여 IAM 역할을 정의한 후 다수의 클러스터와 연결할 수 있습니다. 역할 액세스 정책을 수정할 경우에는 변경 사항이 역할을 사용하는 모든 클러스터에 자동 적용됩니다.
+ 특정 클러스터 및 데이터베이스 사용자에게 원하는 AWS 리소스와 작업에 대한 액세스 권한을 부여하는 IAM 정책을 세분화하여 정의할 수 있습니다.
+ 클러스터가 실행 시간에 임시 세션 자격 증명을 가져온 후 작업이 끝날 때까지 필요에 따라 자격 증명을 새롭게 변경합니다. 키 기반 임시 자격 증명을 사용하는 경우에는 작업을 마치기 전에 임시 자격 증명이 만료되면 작업이 중단됩니다.
+ 액세스 키 ID와 보안 액세스 키 ID는 저장되지도 않고 SQL 코드로 전송되지도 않습니다.

역할 기반 액세스 제어를 사용하려면 먼저 Amazon Redshift 서비스 역할 유형을 사용하여 IAM 역할을 생성한 후 클러스터에 연결해야 합니다. 이 역할에는 최소한 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions)에 나열된 권한이 있어야 합니다. IAM 역할을 생성하여 클러스터에 연결하는 단계는 *Amazon Redshift 관리 가이드*의 [사용자를 대신하여 기타 AWS 서비스에 액세스하도록 Amazon Redshift에 권한 부여](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) 섹션을 참조하세요.

Amazon Redshift 관리 콘솔, CLI 또는 API를 사용하여 역할을 클러스터에 추가하거나, 클러스터와 연결된 역할을 확인할 수 있습니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [클러스터와 IAM 역할 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) 섹션을 참조하세요.

IAM 역할을 생성하면 IAM이 생성된 역할의 Amazon 리소스 이름(ARN)을 반환합니다. IAM 역할을 지정하려면 [IAM\$1ROLE 파라미터 사용](copy-parameters-authorization.md#copy-iam-role) 파라미터 또는 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터에 이 역할 ARN을 입력해야 합니다.

예를 들어 클러스터에 다음과 같은 역할이 연결되어 있다고 가정하겠습니다.

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

다음은 위의 예에서 Amazon S3에 대한 인증 및 액세스를 위해 IAM\$1ROLE 파라미터에 ARN을 사용하는 COPY 명령 예입니다.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

다음은 CREDENTIALS 파라미터를 사용하여 IAM 역할을 지정하는 COPY 명령 예입니다.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

또한 슈퍼 사용자는 데이터베이스 사용자 및 그룹에 ASSUMEROLE 권한을 부여하여 COPY 작업을 위한 역할에 대한 액세스 권한을 제공할 수 있습니다. 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 키 기반 액세스 제어
<a name="copy-usage_notes-access-key-based"></a>

<a name="copy-usage_notes-access-key-based.phrase"></a>키 기반 액세스 제어의 경우 데이터가 포함된 AWS 리소스에 액세스할 권한이 부여된 IAM 사용자에게 액세스 키 ID와 비밀 액세스 키를 제공합니다. [ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](copy-parameters-authorization.md#copy-access-key-id) 파라미터를 함께 사용하거나 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터를 사용할 수 있습니다.

**참고**  
액세스 키 ID와 비밀 액세스 키를 일반 텍스트 형태로 입력하기보다는 IAM 역할을 인증에 사용하는 것을 강력 권장합니다. 키 기반 액세스 제어를 선택하는 경우에는 절대 AWS 계정(루트) 자격 증명을 사용하지 마세요. 항상 IAM 사용자를 먼저 생성한 후 해당 사용자의 액세스 키 ID와 비밀 액세스 키를 입력합니다. IAM 사용자를 생성하는 단계는 [AWS 계정의 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)을 참조하세요.

ACCESS\$1KEY\$1ID와 SECRET\$1ACCESS\$1KEY를 사용하여 인증하려면 다음 예와 같이 *<access-key-id>* 및 *<secret-access-key>*에 권한이 부여된 사용자의 액세스 키 ID와 전체 보안 액세스 키를 입력합니다.

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

CREDENTIALS 파라미터를 사용하여 인증하려면 다음 예와 같이 *<access-key-id>* 및 *<secret-access-key>*에 권한이 부여된 사용자의 액세스 키 ID와 전체 보안 액세스 키를 입력합니다.

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

IAM 사용자는 최소한 [COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한](#copy-usage_notes-iam-permissions)에 나열된 권한이 있어야 합니다.

### 임시 보안 자격 증명
<a name="r_copy-temporary-security-credentials"></a>

 키 기반 액세스 제어를 사용하는 경우에는 임시 보안 자격 증명을 통해 데이터에 대한 사용자 액세스를 추가로 제한할 수 있습니다. 역할 기반 인증은 임시 자격 증명을 자동으로 사용합니다.

**참고**  
임시 자격 증명을 생성하여 액세스 키 ID와 보안 액세스 키를 일반 텍스트 형태로 입력하기보다는 [role-based access control](#copy-usage_notes-access-role-based.phrase)를 사용하는 것이 더욱 바람직합니다. 역할 기반 액세스 제어는 자동으로 임시 자격 증명을 사용합니다.

임시 보안 자격 증명은 유효 기간이 짧고 만료 후 재사용이 불가능하기 때문에 보안을 강화하는 효과가 있습니다. 토큰으로 생성된 액세스 키 ID와 비밀 액세스 키는 토큰 없이 사용할 수 없으며, 이러한 임시 보안 자격 증명이 발급된 사용자는 자격 증명이 만료될 때까지만 리소스에 액세스할 수 있습니다.

사용자에게 리소스에 대한 임시 액세스 권한을 부여할 때는 AWS Security Token Service(AWS STS) API 작업을 호출합니다. AWS STS API 작업은 보안 토큰, 액세스 키 ID 및 보안 액세스 키로 구성된 임시 보안 자격 증명을 반환합니다. 임시 보안 자격 증명은 리소스에 대한 일시적으로 액세스가 필요한 사용자에게 발급합니다. 이러한 사용자들은 기존 IAM 사용자일 수도 있고, 혹은 AWS를 사용하지 않는 사용자일 수도 있습니다. 임시 보안 자격 증명 생성에 대한 자세한 내용은 IAM User Guide의 [Using Temporary Security Credentials](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) 섹션을 참조하세요.

[ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](copy-parameters-authorization.md#copy-access-key-id) 파라미터를 [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) 파라미터 또는 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터와 함께 사용할 수 있습니다. 또한 토큰과 함께 제공되는 액세스 키 ID와 보안 액세스 키를 입력해야 합니다.

ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY 및 SESSION\$1TOKEN을 사용하여 인증하려면 다음 예와 같이 *<temporary-access-key-id>*, *<temporary-secret-access-key>*, *<temporary-token>*에 해당하는 자격 증명을 입력합니다.

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

CREDENTIALS를 사용하여 인증하려면 다음 예와 같이 자격 증명 문자열에 `session_token=<temporary-token>`을 입력합니다.

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

다음은 임시 보안 자격 증명을 사용하는 COPY 명령 예입니다.

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

다음은 임시 자격 증명과 파일 암호화를 사용해 LISTING 테이블에 로드하는 예입니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>'
master_symmetric_key '<root-key>'
encrypted;
```

다음은 CREDENTIALS 파라미터에서 임시 자격 증명과 파일 암호화를 사용해 LISTING 테이블에 로드하는 예입니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
credentials 
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>;master_symmetric_key=<root-key>'
encrypted;
```

**중요**  
임시 보안 자격 증명은 COPY 또는 UNLOAD 작업이 완전히 끝날 때까지 유효해야 합니다. 작업 도중 임시 보안 자격 증명이 만료되면 명령 중단과 함께 트랜잭션이 롤백됩니다. 예를 들어 임시 보안 자격 증명이 15분 후 만료되는데 필요한 COPY 작업 시간이 1시간이라면 COPY 작업이 완료 이전에 중단됩니다. 하지만 역할 기반 액세스를 사용하는 경우에는 작업을 마치기 전에 임시 보안 자격 증명이 새롭게 자동 업데이트됩니다.

## COPY, UNLOAD 및 CREATE LIBRARY 작업을 위한 IAM 권한
<a name="copy-usage_notes-iam-permissions"></a>

CREDENTIALS 파라미터에서 참조하는 IAM 역할 또는 사용자는 최소한 다음 권한을 가지고 있어야 합니다.
+ Amazon S3에서 COPY의 경우 Amazon S3 버킷에 대한 LIST 및 로드 중인 Amazon S3 객체와 매니페스트 파일(사용 중인 경우)에 대한 GET 권한.
+ JSON 형식 데이터가 있는 Amazon S3, Amazon EMR 및 원격 호스트(SSH)에서 COPY를 지원하는 경우 Amazon S3의 JSONPaths 파일(사용하는 경우)에 대한 LIST 및 GET 권한.
+ DynamoDB에서 COPY의 경우 로드 중인 DynamoDB 테이블에 대한 SCAN 및 DESCRIBE 권한.
+ Amazon EMR 클러스터에서 COPY의 경우 Amazon EMR 클러스터에 대한 `ListInstances` 작업 권한.
+ Amazon S3로 UNLOAD의 경우 데이터 파일을 언로드 중인 Amazon S3 버킷에 대한 GET, LIST 및 PUT 권한.
+ Amazon S3에서 CREATE LIBRARY의 경우 Amazon S3 버킷에 대한 LIST 및 가져오고 있는 Amazon S3 객체에 대한 GET 권한.

**참고**  
COPY, UNLOAD 또는 CREATE LIBRARY 명령 실행 시 오류 메시지로 `S3ServiceException: Access Denied`가 수신되면 클러스터에 Amazon S3에 대한 액세스 권한이 없는 것입니다.

IAM 권한은 클러스터, 사용자 또는 사용자가 속한 그룹에 연결되어 있는 IAM 역할에 IAM 정책을 연결하여 관리할 수 있습니다. 예를 들어 `AmazonS3ReadOnlyAccess` 관리형 정책은 Amazon S3 리소스에 LIST 및 GET 권한을 부여합니다. IAM 정책에 대한 자세한 내용은 *IAM User Guide*의 [Managing IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) 섹션을 참조하세요.

# Amazon S3 액세스 포인트 별칭과 함께 COPY 사용
<a name="copy-usage_notes-s3-access-point-alias"></a>

COPY는 Amazon S3 액세스 포인트 별칭을 지원합니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [액세스 포인트에 버킷 스타일 별칭 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)을 참조하세요.

# Amazon S3에서 멀티바이트 데이터 로드
<a name="copy-usage_notes-multi-byte"></a>

데이터에 중국어나 키릴 문자 같이 ASCII가 아닌 멀티바이트 문자가 포함되어 있는 경우에는 VARCHAR 열에 데이터를 로드해야 합니다. VARCHAR 데이터 형식은 4바이트 UTF-8 문자를 지원하지만 CHAR 데이터 형식에서는 1바이트 ASCII 문자만 허용되기 때문입니다. Amazon Redshift 테이블에 5바이트 이상의 문자는 로드할 수 없습니다. 자세한 내용은 [멀티바이트 문자](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters) 섹션을 참조하세요.

# GEOMETRY 또는 GEOGRAPHY 데이터 유형의 열 로드
<a name="copy-usage_notes-spatial-data"></a>

CSV 파일과 같이 문자로 구분된 텍스트 파일의 데이터에서 `GEOMETRY` 또는 `GEOGRAPHY` 열로 COPY가 가능합니다. 데이터는 잘 알려진 이진 형식(WKB 또는 EWKB) 또는 잘 알려진 텍스트 형식(WKT 또는 EWKT)의 16진수 형식이어야 하며 COPY 명령에 대한 단일 입력 행의 최대 크기에 맞아야 합니다. 자세한 내용은 [COPY](r_COPY.md) 섹션을 참조하세요.

shapefile에서 로드하는 방법에 대한 자세한 내용은 [Amazon Redshift에 shapefile 로드](spatial-copy-shapefile.md) 섹션을 참조하세요.

`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형에 대한 자세한 내용은 [Amazon Redshift에서 공간 데이터 쿼리](geospatial-overview.md)섹션을 참조하세요.

# HLLSKETCH 데이터 형식 로드
<a name="copy-usage_notes-hll"></a>

HLL 스케치는 Amazon Redshift에서 지원하는 희소 또는 밀집 형식으로만 복사할 수 있습니다. HyperLogLog 스케치에서 COPY 명령을 사용하려면 밀접 HyperLogLog 스케치에 Base64 형식을 사용하고 희소 HyperLogLog 스케치에 JSON 형식을 사용합니다. 자세한 내용은 [HyperLogLog 함수](hyperloglog-functions.md) 섹션을 참조하세요.

다음 예에서는 CREATE TABLE 및 COPY를 사용하여 CSV 파일의 데이터를 테이블로 가져옵니다. 먼저 이 예에서는 CREATE TABLE을 사용하여 테이블 `t1`을 생성합니다.

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

그런 다음 COPY를 사용하여 CSV 파일의 데이터를 테이블 `t1`로 가져옵니다.

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# VARBYTE 데이터 유형의 열 로드
<a name="copy-usage-varbyte"></a>

CSV, Parquet, ORC 형식의 파일에서 데이터를 로드할 수 있습니다. CSV의 경우 데이터는 파일에서 VARBYTE 데이터의 16진수 표현으로 로드됩니다. `FIXEDWIDTH` 옵션을 사용하여 VARBYTE 데이터를 로드할 수 없습니다. COPY의 `ADDQUOTES` 또는 `REMOVEQUOTES` 옵션은 지원되지 않습니다. VARBYTE 열은 파티션 열로 사용할 수 없습니다.

# 다수의 파일을 읽어올 때 발생하는 오류
<a name="copy-usage_notes-multiple-files"></a>

COPY 명령은 원자성을 띤 트랜잭션으로 처리됩니다. 다시 말해서 COPY 명령이 다수의 파일에서 데이터를 읽어올 때도 전체 프로세스가 하나의 트랜잭션으로 처리됩니다. COPY가 파일을 읽어오다 오류가 발생하면 프로세스 시간 제한에 이를 때까지([statement\$1timeout](r_statement_timeout.md) 참조) 자동으로 재시도합니다. 또는 Amazon S3에서 장시간(15\$130분) 데이터를 다운로드할 수 없는 경우에도 마찬가지입니다. 따라서 각 파일마다 반드시 단 한 번 로드됩니다. COPY 명령이 실패하면 전체 트랜잭션이 취소되고 모든 변경 사항이 롤백됩니다. 로드 오류 처리에 대한 자세한 내용은 [데이터 로드 문제 해결](t_Troubleshooting_load_errors.md) 섹션을 참조하세요.

COPY 명령이 성공적으로 시작되면 클라이언트가 분리되는 등 세션이 종료되더라도 중단되지 않습니다. 하지만 COPY 명령이 세션 종료로 인해 아직 완료되지 않은 BEGIN … END 트랜잭션 블록 내에서 정체되면 COPY를 포함해 전체 트랜잭션이 롤백됩니다. 버전 관리에 대한 자세한 내용은 [BEGIN](r_BEGIN.md) 섹션을 참조하세요.

# JSON 형식의 COPY 지원
<a name="copy-usage_notes-copy-from-json"></a>

JSON 데이터 구조는 객체 또는 배열 집합으로 구성됩니다. JSON *객체*는 중괄호로 시작해서 끝나며 이름-값 페어 집합이 순서에 상관없이 포함되어 있습니다. 각 이름과 값은 각각 콜론으로 구분되며, 페어는 서로 쉼표로 구분됩니다. 이름은 큰 따옴표로 묶이는 문자열입니다. 인용 부호는 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다.

JSON *배열*은 대괄호로 시작해서 끝나며 쉼표로 구분된 값 집합이 순서에 따라 포함되어 있습니다. 값은 큰 따옴표로 묶이는 문자열, 숫자, 부울(true 또는 false), NULL, JSON 객체 또는 배열이 될 수 있습니다.

JSON 객체와 배열은 중첩이 가능하여 계층적인 데이터 구조를 이룹니다. 다음은 유효한 객체 2개가 포함된 JSON 데이터 구조의 예입니다.

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

다음은 두 개의 JSON 배열과 동일한 데이터를 보여 줍니다.

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## JSON에 대한 COPY 옵션
<a name="copy-usage-json-options"></a>

JSON 형식 데이터와 함께 COPY를 사용할 경우 다음 옵션을 지정할 수 있습니다.
+ `'auto' ` - COPY가 JSON 파일에서 필드를 자동으로 로드합니다.
+ `'auto ignorecase'` - COPY가 필드 이름의 대/소문자를 무시하면서 JSON 파일에서 필드를 자동으로 로드합니다.
+ `s3://jsonpaths_file` - COPY가 JSONPaths 파일을 사용하여 JSON 원본 데이터를 구문 분석합니다. *JSONPaths 파일*은 이름 `"jsonpaths"`가 JSONPath 표현식 배열과 쌍을 이루는 단일 JSON 객체가 포함된 텍스트 파일입니다. 이때 이름이 `"jsonpaths"`가 아닌 다른 문자열이면 COPY는 JSONPaths 파일 대신 `'auto'` 인수를 사용합니다.

`'auto'`, `'auto ignorecase'` 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방식과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 나타낸 예는 [JSON에서 복사 예제](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 섹션을 참조하세요.

## JSONPath 옵션
<a name="copy-usage-json-options"></a>

Amazon Redshift COPY 구문에서 JSONPath 표현식은 대괄호 또는 점 표기법을 사용하여 JSON 계층적 데이터 구조의 단일 이름 요소에 대한 명시적 경로를 지정합니다. Amazon Redshift는 모호한 경로 또는 여러 이름 요소로 해석될 수 있는 와일드카드 문자 또는 필터 표현식과 같은 JSONPath 요소를 지원하지 않습니다. 결과적으로 Amazon Redshift는 복잡한 다단 데이터 구조의 구문을 분석할 수 없습니다.

다음은 대괄호 표기법을 사용하여 JSONPath 표현식을 작성한 JSONPaths 파일의 예입니다. 달러 기호(\$1)는 루트 레벨 구조를 나타냅니다.

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 위 예에서 `$['location'][0]`은 배열에서 첫 번째 요소를 참조합니다. JSON은 0부터 시작되는 배열 인덱싱을 사용합니다. 배열 인덱스는 0보다 크거나 같은 양의 정수가 되어야 합니다.

다음은 위의 JSONPaths 파일에 점 표기법을 사용한 예입니다.

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

`jsonpaths` 배열에서 대괄호 표기법과 점 표기법을 혼용할 수는 없습니다. 다만 배열 요소를 참조할 때는 대괄호 표기법과 점 표기법 모두에서 대괄호를 사용할 수 있습니다.

점 표기법을 사용할 경우에는 JSONPath 표현식에 다음 문자가 포함되어서는 안 됩니다.
+ 작은 직선형 따옴표(') 
+ 마침표 또는 점(.) 
+ 배열 요소를 참조하기 위한 경우를 제외한 대괄호([ ]) 

JSONPath 표현식이 참조하는 이름-값 페어의 값이 객체 또는 배열이면 중괄호나 대괄호를 포함하여 전체 객체 또는 배열이 문자열로 로드됩니다. 예를 들어 JSON 데이터에 다음과 같은 객체가 포함되어 있다고 가정하겠습니다.

```
{
    "id": 0,
    "guid": "84512477-fa49-456b-b407-581d0d851c3c",
    "isActive": true,
    "tags": [
        "nisi",
        "culpa",
        "ad",
        "amet",
        "voluptate",
        "reprehenderit",
        "veniam"
    ],
    "friends": [
        {
            "id": 0,
            "name": "Martha Rivera"
        },
        {
            "id": 1,
            "name": "Renaldo"
        }
    ]
}
```

그러면 JSONPath 표현식 `$['tags']`가 다음 값을 반환합니다.

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

그러면 JSONPath 표현식 `$['friends'][1]`가 다음 값을 반환합니다.

```
"{"id": 1,"name": "Renaldo"}" 
```

`jsonpaths` 배열의 JSONPath 표현식은 각각 Amazon Redshift 대상 테이블의 열 1개에 해당합니다. 따라서 `jsonpaths` 배열 요소의 순서는 대상 테이블의 열 순서와, 혹은 열 목록을 사용하는 경우 열 목록의 열 순서와 일치해야 합니다.

`'auto'` 인수 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방법과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 보여주는 예는 [JSON에서 복사 예제](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 섹션을 참조하세요.

여러 JSON 파일을 복사하는 방법에 대한 자세한 내용은 [매니페스트를 사용하여 데이터 파일 지정](loading-data-files-using-manifest.md) 섹션을 참조하세요.

## JSON의 이스케이프 문자
<a name="copy-usage-json-escape-characters"></a>

COPY는 줄 바꿈 문자로 `\n`을, 그리고 탭 문자로 `\t`를 로드합니다. 백슬래시를 로드하려면 백슬래시(`\\`)로 이스케이프하세요.

예를 들어 `escape.json` 버킷에 저장된 `s3://amzn-s3-demo-bucket/json/`이라는 이름의 파일에 다음과 같은 JSON이 있다고 가정하겠습니다.

```
{
  "backslash": "This is a backslash: \\",
  "newline": "This sentence\n is on two lines.",
  "tab": "This sentence \t contains a tab."
}
```

다음 명령을 실행하여 ESCAPES 테이블을 생성하고 JSON을 로드합니다.

```
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35));

copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as json 'auto';
```

ESCAPES 테이블에 대한 쿼리를 실행하여 결과를 확인합니다.

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## 숫자 정밀도 상실
<a name="copy-usage-json-rounding"></a>

JSON 형식의 데이터 파일에서 숫자 데이터 형식으로 정의된 열로 숫자를 로드할 경우 정밀도가 상실될 수 있습니다. 일부 부동 소수점 값이 컴퓨터 시스템에 정확하게 표시되지 않습니다. 따라서 JSON 파일에서 복사하는 데이터가 예상한 대로 반올림되지 않을 수 있습니다. 정밀도 상실을 방지하려면 다음 대안 중 하나를 사용하는 것이 좋습니다.
+ 값을 큰 따옴표로 묶어서 숫자를 문자열로 표시합니다.
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)를 사용하여 숫자를 자르지 않고 반올림합니다.
+ JSON 또는 Avro 파일 대신 CSV, 문자로 구분된 형식 또는 고정 너비 텍스트 파일을 사용합니다.

# 열 기반 데이터 형식에서 COPY 명령
<a name="copy-usage_notes-copy-from-columnar"></a>

COPY는 Amazon S3에서 다음과 같은 열 기반 형식의 데이터를 불러올 수 있습니다.
+ ORC
+ Parquet

열 데이터 형식에서 COPY를 사용하는 예는 [COPY 예](r_COPY_command_examples.md) 섹션을 참조하세요.

COPY는 열 기반 형식 데이터를 지원하지만 다음과 같은 고려 사항이 있습니다.
+ Amazon S3 버킷이 Amazon Redshift 데이터베이스와 동일한 AWS 리전에 있어야 합니다.
+ VPC 엔드포인트를 통해 Amazon S3 데이터에 액세스하려면 *Amazon Redshift 관리 가이드*의 [Enhanced VPC Routing과 함께 Amazon Redshift Spectrum 사용](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html)에 설명된 대로 IAM 정책과 IAM 역할을 사용하여 액세스를 설정합니다.
+ COPY는 압축 인코딩을 자동으로 적용하지 않습니다.
+ 다음과 같은 COPY 파라미터만 지원됩니다.
  + ORC 또는 Parquet 파일에서 복사하는 경우 [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
  + [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
  + [FROM](copy-parameters-data-source-s3.md#copy-parameters-from) ...
  + [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role)
  + [CREDENTIALS](copy-parameters-authorization.md#copy-credentials)
  + [STATUPDATE ](copy-parameters-data-load.md#copy-statupdate)
  + [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
  + [EXPLICIT\$1IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ COPY 명령을 실행하여 불러오는 중 오류가 발생하면 명령이 실패합니다. 열 기반 데이터 유형의 경우 ACCEPTANYDATE 및 MAXERROR가 지원되지 않습니다.
+ 오류 메시지는 SQL 클라이언트로 전송됩니다. 일부 오류는 STL\$1LOAD\$1ERRORS 및 STL\$1ERROR에 기록됩니다.
+ COPY 명령은 열 기반 데이터 파일의 열 순서와 동일하게 대상 테이블의 열에 값을 삽입합니다. 대상 테이블의 열 수와 데이터 파일의 열 수는 일치해야 합니다.
+ COPY 작업에 대해 지정한 파일에 다음 확장자 중 하나가 포함되어 있는 경우 파라미터를 추가하지 않고 데이터의 압축을 해제할 수 있습니다.
  + `.gz`
  + `.snappy`
  + `.bz2`
+ Parquet 및 ORC 파일 형식에서 COPY는 Redshift Spectrum과 버킷 액세스를 사용합니다. 이러한 형식에 COPY를 사용하려면 Amazon S3의 미리 서명된 URL 사용을 차단하는 IAM 정책이 없어야 합니다. Amazon Redshift에서 생성한 미리 서명된 URL은 1시간 동안 유효하므로 Amazon Redshift가 충분한 시간을 갖고 Amazon S3 버킷에서 모든 파일을 로드할 수 있습니다. 열 기반 데이터 형식에서 COPY로 스캔한 각 파일에 대해 미리 서명된 고유한 URL이 생성됩니다. `s3:signatureAge` 작업이 포함된 버킷 정책의 경우 값을 최소 3,600,000밀리초로 설정해야 합니다. 자세한 내용은 [Enhanced VPC Routing과 함께 Amazon Redshift Spectrum 사용](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html) 섹션을 참조하세요.
+ REGION 파라미터는 열 데이터 형식의 COPY에서는 지원되지 않습니다. Amazon S3 버킷과 데이터베이스가 동일한 AWS 리전에 있더라도 PARQUET 기반 COPY에는 REGION 인수가 지원되지 않음 등의 오류가 발생할 수 있습니다.
+ 열 형식의 COPY는 이제 동시성 규모 조정을 지원합니다. 동시성 규모 조정을 활성화하려면 [동시성 규모 조정 대기열 구성](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues)을 참조하세요.

# DATEFORMAT 및 TIMEFORMAT 문자열
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

COPY 명령은 DATEFORMAT 및 TIMEFORMAT 옵션을 사용하여 소스 데이터의 날짜 및 시간 값을 구문 분석합니다. DATEFORMAT 및 TIMEFORMAT은 소스 데이터의 날짜 및 시간 값 형식과 일치해야 하는 형식이 지정된 문자열입니다. 예를 들어 날짜 값이 `Jan-01-1999`인 소스 데이터를 로드하는 COPY 명령에는 다음 DATEFORMAT 문자열이 포함되어야 합니다.

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

COPY 데이터 변환 관리에 대한 자세한 내용은 [데이터 변환 파라미터](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html)를 참조하세요.

DATEFORMAT 및 TIMEFORMAT 문자열은 날짜/시간 구분 기호(예: '`-`', '`/`' 또는 '`:`')와 다음 테이블의 날짜 부분 및 시간 부분 형식을 포함할 수 있습니다.

**참고**  
날짜 또는 시간 값의 형식을 다음 날짜 부분 및 시간 부분과 일치시킬 수 없거나 서로 다른 형식을 사용하는 날짜 및 시간 값이 있는 경우 DATEFORMAT 또는 TIMEFORMAT 파라미터와 함께 `'auto'` 인수를 사용하세요. `'auto'` 인수는 DATEFORMAT 또는 TIMEFORMAT 문자열 사용 시 지원되지 않는 몇 가지 형식을 인식합니다. 자세한 내용은 [DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용](automatic-recognition.md) 섹션을 참조하세요.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

기본 날짜 형식은 YYYY-MM-DD입니다. 시간대(TIMESTAMP)를 제외한 기본 타임스탬프 형식은 YYYY-MM-DD HH:MI:SS입니다. 시간대가 포함된 기본 타임스탬프(TIMESTAMPTZ) 형식은 YYYY-MM-DD HH:MI:SSOF입니다. 여기서 OF는 UTC의 오프셋입니다(예: -8:00). timeformat\$1string에 시간대 지정자(TZ, tz 또는 OF)를 포함할 수 없습니다. 초(SS) 필드는 마이크로초 수준의 세부 정보까지 소수 초를 지원합니다. 기본 형식과 다른 형식으로 TIMESTAMPTZ 데이터를 로드하려면 'auto'를 지정합니다.

다음은 소스 데이터에서 볼 수 있는 몇 가지 샘플 날짜 또는 시간과 그에 해당하는 DATEFORMAT 또는 TIMEFORMAT 문자열입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

## 예제
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings-examples"></a>

TIMEFORMAT 사용 예는 [타임스탬프 또는 데이트스탬프 로드](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp)을 참조하세요.

# DATEFORMAT 및 TIMEFORMAT 옵션의 자동 인식 사용
<a name="automatic-recognition"></a>

DATEFORMAT 또는 TIMEFORMAT 파라미터의 인수로 `'auto'`를 지정하면 Amazon Redshift가 원본 데이터의 날짜 형식 또는 시간 형식을 자동으로 인식하여 변환합니다. 다음은 그 한 예입니다.

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

DATEFORMAT 및 TIMEFORMAT 파라미터에서 `'auto'` 인수를 사용하면 COPY가 [DATEFORMAT 및 TIMEFORMAT 문자열예제](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 섹션의 표에 나열된 날짜 및 시간 형식을 인식하여 변환합니다. 또한 `'auto'` 인수는 DATEFORMAT 및 TIMEFORMAT 문자열 사용 시 아래와 같이 지원되지 않는 몇 가지 형식을 인식합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/automatic-recognition.html)

자동 인식은 epochsec 및 epochmillisec을 지원하지 않습니다.

날짜 또는 타임스탬프 값의 자동 변환 여부를 테스트하려면 CAST 함수를 사용하여 문자열을 날짜 또는 타임스탬프 값으로 변환해볼 수 있습니다. 예를 들어 다음은 타임스탬프 값 `'J2345678 04:05:06.789'`를 테스트하는 명령입니다.

```
create table formattest (test char(21));
insert into formattest values('J2345678 04:05:06.789');
select test, cast(test as timestamp) as timestamp, cast(test as date) as date from formattest;

        test          |      timestamp      |	date
----------------------+---------------------+------------
J2345678 04:05:06.789   1710-02-23 04:05:06	1710-02-23
```

DATE 열의 원본 데이터에 시간 정보가 포함되면 시간 구성요소는 잘립니다. TIMESTAMP 열의 원본 데이터에서 시간 정보가 빠지면 시간 구성요소로 00:00:00이 사용됩니다.

# COPY 예
<a name="r_COPY_command_examples"></a>

**참고**  
여기에서 설명하는 예는 가독성을 위해 줄 바꿈이 포함되었습니다. 실제 *credentials-args* 문자열에서는 줄 바꿈이나 공백을 입력하지 마세요.

**Topics**
+ [DynamoDB 테이블에서 FAVORITEMOVIES 로드](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [Amazon S3 버킷에서 LISTING 로드](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [Amazon EMR 클러스터에서 LISTING 로드](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [파이프로 구분된 파일(기본 구분자)에서 LISTING 로드](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [Parquet 형식의 열 기반 데이터를 사용한 LISTING 로드](#r_COPY_command_examples-load-listing-from-parquet)
+ [ORC 형식의 열 기반 데이터를 사용한 LISTING 로드](#r_COPY_command_examples-load-listing-from-orc)
+ [옵션을 사용한 EVENT 로드](#r_COPY_command_examples-load-event-with-options)
+ [고정 폭 데이터 파일에서 VENUE 로드](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [CSV 파일에서 CATEGORY 로드](#load-from-csv)
+ [IDENTITY 열의 명시적인 값을 사용한 VENUE 로드](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [파이프로 구분된 GZIP파일에서 TIME 로드](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [타임스탬프 또는 데이트스탬프 로드](#r_COPY_command_examples-load-a-time-datestamp)
+ [파일에서 기본값을 사용한 데이터 로드](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [ESCAPE 옵션을 사용한 데이터 COPY 작업](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [JSON에서 복사 예제](#r_COPY_command_examples-copy-from-json)
+ [Avro에서 복사 예제](#r_COPY_command_examples-copy-from-avro)
+ [ESCAPE 옵션과 함께 COPY에 사용할 파일 준비](#r_COPY_preparing_data)
+ [Amazon Redshift에 shapefile 로드](#copy-example-spatial-copy-shapefile)
+ [NOLOAD 옵션을 사용한 CPPY 명령](#r_COPY_command_examples-load-noload-option)
+ [멀티바이트 구분 기호와 ENCODING 옵션을 포함한 COPY 명령](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## DynamoDB 테이블에서 FAVORITEMOVIES 로드
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

AWS SDK에는 *Movies*라는 DynamoDB 테이블을 생성하는 간단한 예가 포함되어 있습니다. 이러한 예제는 [DynamoDB 시작하기](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html)를 참조하세요. 다음은 DynamoDB 테이블의 데이터를 Amazon Redshift MOVIES 테이블에 로드하는 예입니다. Amazon Redshift 테이블은 사전에 데이터베이스에 존재해야 하며,

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## Amazon S3 버킷에서 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

다음 예는 Amazon S3 버킷에서 LISTING을 로드합니다. COPY 명령은 `/data/listing/` 폴더에 위치한 모든 파일을 로드합니다.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Amazon EMR 클러스터에서 LISTING 로드
<a name="copy-command-examples-emr"></a>

다음은 Amazon EMR 클러스터의 lzop 압축 파일에서 탭으로 구분된 데이터를 SALES 테이블과 함께 로드하는 예입니다. COPY는 `myoutput/` 폴더에서 `part-`로 시작하는 모든 파일을 로드합니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

다음은 Amazon EMR 클러스터에서 JSON 형식 데이터를 SALES 테이블과 함께 로드하는 예입니다. COPY는 `myoutput/json/` 폴더에서 모든 파일을 로드합니다.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/json/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON 's3://amzn-s3-demo-bucket/jsonpaths.txt';
```

## 매니페스트를 사용하여 데이터 파일 지정
<a name="copy-command-examples-manifest"></a>

매니페스트를 사용하여 COPY 명령이 Amazon S3에서 필요한 파일을 모두, 즉 필요한 파일만 로드할 수 있습니다. 그 밖에 동일한 접두사를 공유하지 않는 다른 버킷이나 파일에서 다수의 파일을 로드해야 할 때도 매니페스트를 사용할 수 있습니다.

예를 들어 `custdata1.txt`, `custdata2.txt`, `custdata3.txt` 등 파일 3개를 로드해야 하는 경우 다음 명령을 사용하여 접두사를 지정함으로써 `amzn-s3-demo-bucket`에서 `custdata`로 시작하는 파일을 모두 로드할 수 있습니다.

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

실수로 파일이 2개만 존재하는 경우에는 COPY가 해당 파일 2개만 로드하고 명령을 성공적으로 마치지만 결과적으로는 불완전 데이터 로드가 됩니다. 불필요하지만 동일한 접두사를 사용하는 파일(예: `custdata.backup` 파일)이 버킷에 있다면 COPY가 해당 파일까지 로드하므로 결국 원하지 않는 데이터가 로드됩니다.

필요한 파일은 모두 로드하고 원하지 않는 파일은 로드되지 않도록 하려면 매니페스트 파일을 사용합니다. 매니페스트란 COPY 명령에서 처리할 파일이 나열된 JSON 형식의 파일을 말합니다. 예를 들어 다음 매니페스트는 위의 예에서 파일 3개를 로드합니다.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.1",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.2",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.3",
         "mandatory":true
      }
   ]
}
```

옵션인 `mandatory` 플래그는 파일이 없을 때 COPY의 종료 여부를 나타냅니다. 기본값은 `false`입니다. 필수 설정에 상관없이 파일이 검색되지 않으면 COPY가 종료됩니다. 이 예에서 파일 중 하나라도 검색되지 않으면 COPY가 오류를 반환합니다. 키 접두사만 지정하여 선택될 수도 있는 불필요한 파일(`custdata.backup` 등)은 매니페스트에 없기 때문에 무시됩니다.

ORC 또는 Parquet 형식의 데이터 파일에서 불러올 경우 다음 예에 나와 있는 것처럼 `meta` 필드가 필요합니다.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```

다음 예는 `cust.manifest`라는 매니페스트를 사용합니다.

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

매니페스트를 이용하면 다른 버킷, 다른 리전이나 접두사가 다른 파일에서 파일을 불러올 수 있습니다. 다음은 이름이 데이트스탬프로 시작하는 파일의 데이터를 로드하는 JSON 예입니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/2013-10-04-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-05-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-06-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-07-custdata.txt","mandatory":true}
  ]
}
```

매니페스트는 버킷이 클러스터와 동일한 AWS 리전에 속하는 한 다른 버킷에 있는 파일을 나열할 수 있습니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false}
  ]
}
```

## 파이프로 구분된 파일(기본 구분자)에서 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

다음은 별도의 옵션 지정 없이 입력 파일에 기본 구분자인 파이프 문자('\$1')가 포함된, 매우 단순한 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parquet 형식의 열 기반 데이터를 사용한 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

다음은 Amazon S3에서 parquet이라는 데이터를 로드하는 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## ORC 형식의 열 기반 데이터를 사용한 LISTING 로드
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

다음은 Amazon S3에서 `orc`라는 데이터를 로드하는 예입니다.

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## 옵션을 사용한 EVENT 로드
<a name="r_COPY_command_examples-load-event-with-options"></a>

다음은 파이프로 구분된 데이터를 EVENT 테이블에 로드하면서 아래 규칙을 적용하는 예입니다.
+ 인용 부호 쌍을 사용하여 문자열을 묶는 경우 인용 부호가 삭제됩니다.
+ 빈 문자열과 공백이 포함된 문자열 모두 NULL 값으로 로드됩니다.
+ 오류가 6회 이상 반환되면 로드가 실패합니다.
+ 타임스탬프 값은 지정된 형식을 따라야 합니다. 예를 들어 유효한 타임스탬프는 `2008-09-26 05:43:12`입니다.

```
copy event
from 's3://amzn-s3-demo-bucket/data/allevents_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
removequotes
emptyasnull
blanksasnull
maxerror 5
delimiter '|'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

## 고정 폭 데이터 파일에서 VENUE 로드
<a name="r_COPY_command_examples-load-venue-from-a-fixed-width-data-file"></a>

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

위의 예는 데이터 파일이 샘플 데이터와 동일한 형식이라는 가정을 전제로 합니다. 아래 샘플에서는 모든 열이 명세에서 기록한 것과 동일한 폭을 갖도록 공백이 자리 표시자의 역할을 합니다.

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
```

## CSV 파일에서 CATEGORY 로드
<a name="load-from-csv"></a>

다음과 같이 표에 기재된 값을 CATEGORY에 로드한다고 가정하겠습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

다음 예에서는 필드 값을 쉼표로 구분하여 텍스트 파일의 내용을 보여 줍니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre  
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts
```

쉼표로 구분된 입력을 지정하는 DELIMITER 파라미터를 사용하여 파일을 로드하면 일부 입력 필드에 쉼표가 포함되어 있기 때문에 COPY 명령이 실패합니다. 이러한 문제는 CSV 파라미터를 사용하고 쉼표가 포함된 필드를 인용 부호로 묶으면 피할 수 있습니다. 인용 부호가 다른 인용 부호로 묶인 문자열 내에 들어가는 경우에는 인용 부호를 이중으로 사용하여 이스케이프 처리해야 합니다. 기본 인용 부호가 큰따옴표이므로 큰따옴표를 추가하여 큰따옴표를 각각 이스케이프 처리해야 합니다. 새 입력 파일의 모양은 다음과 같습니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"
```

파일 이름이 `category_csv.txt`인 경우 다음 COPY 명령을 사용하여 파일을 로드할 수 있습니다.

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

그 밖에 입력 파일에서 큰따옴표의 이스케이프 처리를 피하려면 QUOTE AS 파라미터를 사용해 다른 인용 부호를 지정하는 방법도 있습니다. 예를 들어 다음 버전의 `category_csv.txt`는 '`%`'를 인용 부호로 사용합니다.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,%All "non-musical" theatre%
14,Shows,Opera,%All opera, light, and "rock" opera%
15,Concerts,Classical,%All symphony, concerto, and choir concerts%
```

다음은 QUOTE AS를 사용하여 `category_csv.txt`를 로드하는 COPY 명령입니다.

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv quote as '%';
```

## IDENTITY 열의 명시적인 값을 사용한 VENUE 로드
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

다음 예는 VENUE 테이블을 생성하면서 1개 이상의 열(`venueid` 열 등)을 IDENTITY 열로 지정했다는 가정을 전제로 합니다. 이 명령은 IDENTITY 열의 자동 생성 값에 대한 기본적인 IDENTITY 동작을 재정의하고 venue.txt 파일에서 명시적인 값을 로드합니다. Amazon Redshift는 EXLICIT\$1IDS 옵션을 사용할 때 테이블에 중복된 IDENTITY 값이 로드되었는지 확인하지 않습니다.

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## 파이프로 구분된 GZIP파일에서 TIME 로드
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

다음은 파이프로 구분된 GZIP 파일에서 TIME 테이블을 로드하는 예입니다.

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## 타임스탬프 또는 데이트스탬프 로드
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

다음은 형식이 지정된 타임스탬프로 데이터를 로드하는 예입니다.

**참고**  
`HH:MI:SS` 형식의 TIMEFORMAT 역시 `SS`를 넘어 마이크로초의 정밀도까지 소수 초를 지원합니다. 이번 예에서 사용하는 `time.txt` 파일에는 `2009-01-12 14:15:57.119568` 행 하나가 포함되어 있습니다.

```
copy timestamp1 
from 's3://amzn-s3-demo-bucket/data/time.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

이 파일의 구조는 다음과 같습니다.

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## 파일에서 기본값을 사용한 데이터 로드
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

다음은 TICKIT 데이터베이스에서 변형된 VENUE 테이블을 사용하는 예입니다. 이때 VENUE\$1NEW 테이블을 아래와 같은 문으로 정의한다고 가정합니다.

```
create table venue_new(
venueid smallint not null,
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

아래 예와 같이 venue\$1noseats.txt 데이터 파일에 VENUESEATS 열의 값이 포함되어 있지 않다고 가정합니다.

```
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
```

다음은 데이터 파일에서 테이블을 성공적으로 로드한 후 누락된 열에 DEFAULT 값('1000')을 적용하는 COPY 문입니다.

```
copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_noseats.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

그 결과 로드되는 테이블은 다음과 같습니다.

```
select * from venue_new order by venueid;
venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |       1000
2 | Columbus Crew Stadium      | Columbus        | OH         |       1000
3 | RFK Stadium                | Washington      | DC         |       1000
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |       1000
5 | Gillette Stadium           | Foxborough      | MA         |       1000
6 | New York Giants Stadium    | East Rutherford | NJ         |       1000
7 | BMO Field                  | Toronto         | ON         |       1000
8 | The Home Depot Center      | Carson          | CA         |       1000
9 | Dick's Sporting Goods Park | Commerce City   | CO         |       1000
10 | Pizza Hut Park             | Frisco          | TX         |       1000
(10 rows)
```

다음 예에서는 파일에 VENUESEATS 데이터가 포함되지 않았을 뿐만 아니라 VENUENAME 데이터도 포함되지 않았다고 가정합니다.

```
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
```

 동일한 테이블 정의를 사용하는 경우 VENUENAME에 대한 DEFAULT 값이 지정되지 않았고 VENUENAME이 NOT NULL 열이므로 다음 COPY 문이 실패합니다.

```
copy venue(venueid, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

이제 IDENTITY 열을 사용하는 다른 형태의 VENUE 테이블이 있다고 가정합니다.

```
create table venue_identity(
venueid int identity(1,1),
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

앞의 예와 마찬가지로 원본 파일에 VENUESEATS 열에 해당하는 값이 없다고 가정하면 다음 COPY 문에서 사전 정의한 IDENTITY 데이터 값을 자동 생성하지 않고 포함하는 테이블을 성공적으로 로드합니다.

```
copy venue(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

다음 문은 IDENTITY 열 없이(VENUEID가 열 목록에서 누락됨) EXPLICIT\$1IDS 파라미터를 추가했기 때문에 중단됩니다.

```
copy venue(venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

다음 문은 EXPLICIT\$1IDS 파라미터를 추가하지 않았기 때문에 중단됩니다.

```
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

## ESCAPE 옵션을 사용한 데이터 COPY 작업
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

다음은 구분자 문자(여기에서는 파이프 문자)와 일치하는 문자의 로드 방법을 나타낸 예입니다. 먼저 입력 파일에서 로드할 파이프 문자(\$1)가 모두 백슬래시 문자(\$1)를 사용해 이스케이프 처리되어 있는지 확인합니다. 그런 다음 ESCAPE 파라미터를 사용해 파일을 로드합니다.

```
$ more redshiftinfo.txt
1|public\|event\|dwuser
2|public\|sales\|dwuser

create table redshiftinfo(infoid int,tableinfo varchar(50));

copy redshiftinfo from 's3://amzn-s3-demo-bucket/data/redshiftinfo.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
delimiter '|' escape;

select * from redshiftinfo order by 1;
infoid |       tableinfo
-------+--------------------
1      | public|event|dwuser
2      | public|sales|dwuser
(2 rows)
```

ESCAPE 파라미터를 사용하지 않으면 이 COPY 문은 `Extra column(s) found` 오류와 함께 중단됩니다.

**중요**  
COPY를 ESCAPE 파라미터와 함께 사용하여 데이터를 로드하는 경우 역수 출력 파일을 생성하도록 UNLOAD 명령과 함께 ESCAPE 파라미터도 지정해야 합니다. 마찬가지로 ESCAPE 파라미터를 사용하여 UNLOAD하는 경우 동일한 데이터를 COPY할 때 ESCAPE를 사용해야 합니다.

## JSON에서 복사 예제
<a name="r_COPY_command_examples-copy-from-json"></a>

다음 예에서는 다음 데이터와 함께 CATEGORY 테이블을 로드합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ ['auto' 옵션을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-auto)
+ ['auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-auto-ignorecase)
+ [JSONPaths 파일을 사용하여 JSON 데이터에서 로드](#copy-from-json-examples-using-jsonpaths)
+ [JSONPaths 파일을 사용하여 JSON 배열에서 로드](#copy-from-json-examples-using-jsonpaths-arrays)

### 'auto' 옵션을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-auto"></a>

JSON 데이터에서 `'auto'` 옵션을 사용해 로드하려면 JSON 데이터가 객체 집합으로 구성되어야 합니다. 키 이름이 열 이름과 일치해야 하지만 순서는 중요하지 않습니다. 다음은 `category_object_auto.json`이라는 이름의 파일 내용을 나타낸 것입니다.

```
{
    "catdesc": "Major League Baseball",
    "catid": 1,
    "catgroup": "Sports",
    "catname": "MLB"
}
{
    "catgroup": "Sports",
    "catid": 2,
    "catname": "NHL",
    "catdesc": "National Hockey League"
}
{
    "catid": 3,
    "catname": "NFL",
    "catgroup": "Sports",
    "catdesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "catid": 4,
    "catgroup": "Sports",
    "catname": "NBA",
    "catdesc": "National Basketball Association"
}
{
    "catid": 5,
    "catgroup": "Shows",
    "catname": "Musicals",
    "catdesc": "All symphony, concerto, and choir concerts"
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### 'auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

JSON 데이터에서 `'auto ignorecase'` 옵션을 사용해 로드하려면 JSON 데이터가 객체 집합으로 구성되어야 합니다. 키 이름의 대/소문자는 열 이름과 일치하지 않아도 되며 순서는 중요하지 않습니다. 다음은 `category_object_auto-ignorecase.json`이라는 이름의 파일 내용을 나타낸 것입니다.

```
{
    "CatDesc": "Major League Baseball",
    "CatID": 1,
    "CatGroup": "Sports",
    "CatName": "MLB"
}
{
    "CatGroup": "Sports",
    "CatID": 2,
    "CatName": "NHL",
    "CatDesc": "National Hockey League"
}
{
    "CatID": 3,
    "CatName": "NFL",
    "CatGroup": "Sports",
    "CatDesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "CatID": 4,
    "CatGroup": "Sports",
    "CatName": "NBA",
    "CatDesc": "National Basketball Association"
}
{
    "CatID": 5,
    "CatGroup": "Shows",
    "CatName": "Musicals",
    "CatDesc": "All symphony, concerto, and choir concerts"
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### JSONPaths 파일을 사용하여 JSON 데이터에서 로드
<a name="copy-from-json-examples-using-jsonpaths"></a>

JSON 데이터 객체가 열 이름과 정확히 일치하지 않으면 JSONPaths 파일을 사용하여 JSON 요소를 열로 매핑할 수 있습니다. JSON 원본 데이터에서 순서는 중요하지 않습니다. 단, JSONPaths 파일 표현식의 순서는 열 순서와 일치해야 합니다. 다음과 같이 `category_object_paths.json`이라는 이름의 데이터 파일이 있는 경우

```
{
    "one": 1,
    "two": "Sports",
    "three": "MLB",
    "four": "Major League Baseball"
}
{
    "three": "NHL",
    "four": "National Hockey League",
    "one": 2,
    "two": "Sports"
}
{
    "two": "Sports",
    "three": "NFL",
    "one": 3,
    "four": "National Football League"
}
{
    "one": 4,
    "two": "Sports",
    "three": "NBA",
    "four": "National Basketball Association"
}
{
    "one": 6,
    "two": "Shows",
    "three": "Musicals",
    "four": "All symphony, concerto, and choir concerts"
}
```

이름이 `category_jsonpath.json`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_jsonpath.json';
```

### JSONPaths 파일을 사용하여 JSON 배열에서 로드
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

배열 집합으로 구성된 JSON 데이터에서 로드하려면 JSONPaths 파일을 사용하여 배열 요소를 열로 매핑해야 합니다. 다음과 같이 `category_array_data.json`이라는 이름의 데이터 파일이 있는 경우

```
[1,"Sports","MLB","Major League Baseball"]
[2,"Sports","NHL","National Hockey League"]
[3,"Sports","NFL","National Football League"]
[4,"Sports","NBA","National Basketball Association"]
[5,"Concerts","Classical","All symphony, concerto, and choir concerts"]
```

이름이 `category_array_jsonpath.json`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

위의 예에 있는 JSON 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_array_data.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';
```

## Avro에서 복사 예제
<a name="r_COPY_command_examples-copy-from-avro"></a>

다음 예에서는 다음 데이터와 함께 CATEGORY 테이블을 로드합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ ['auto' 옵션을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-auto)
+ ['auto ignorecase' 옵션을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-auto-ignorecase)
+ [JSONPaths 파일을 사용하여 Avro 데이터에서 로드](#copy-from-avro-examples-using-avropaths)

### 'auto' 옵션을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-auto"></a>

Avro 데이터에서 `'auto'` 인수를 사용하여 로드하려면 Avro 스키마의 필드 이름이 열 이름과 일치해야 합니다. `'auto'` 인수를 사용할 때 순서는 중요하지 않습니다. 다음은 이름이 `category_auto.avro`인 파일의 스키마를 나타낸 것입니다.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

Avro 파일의 데이터는 이진 형식이기 때문에 사람이 읽을 수 없습니다. 다음은 `category_auto.avro` 파일의 데이터를 JSON으로 표현한 것입니다.

```
{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### 'auto ignorecase' 옵션을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

Avro 데이터에서 `'auto ignorecase'` 인수를 사용하여 로드하려는 경우 Avro 스키마에서 필드 이름의 대/소문자는 열 이름의 대/소문자와 일치하지 않아도 됩니다. `'auto ignorecase'` 인수를 사용할 때 순서는 중요하지 않습니다. 다음은 이름이 `category_auto-ignorecase.avro`인 파일의 스키마를 나타낸 것입니다.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}
```

Avro 파일의 데이터는 이진 형식이기 때문에 사람이 읽을 수 없습니다. 다음은 `category_auto-ignorecase.avro` 파일의 데이터를 JSON으로 표현한 것입니다.

```
{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto ignorecase';
```

### JSONPaths 파일을 사용하여 Avro 데이터에서 로드
<a name="copy-from-avro-examples-using-avropaths"></a>

Avro 스키마의 필드 이름이 열 이름과 정확히 일치하지 않으면 JSONPaths 파일을 사용하여 스키마 요소를 열로 매핑할 수 있습니다. JSONPaths 파일 표현식의 순서는 열 순서와 일치해야 합니다.

앞의 예와 동일한 데이터를 포함하지만 스키마는 다음과 같은 이름이 `category_paths.avro`인 데이터 파일이 있는 경우

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}
```

이름이 `category_path.avropath`인 다음 JSONPaths 파일이 원본 데이터를 테이블 열로 매핑합니다.

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

위의 예에 있는 Avro 데이터 파일에서 로드하려면 다음 COPY 명령을 실행합니다.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';
```

## ESCAPE 옵션과 함께 COPY에 사용할 파일 준비
<a name="r_COPY_preparing_data"></a>

다음 예에서는 ESCAPE 파라미터와 함께 COPY 명령을 사용하여 데이터를 Amazon Redshift 테이블에 가져오기 전에 줄 바꿈 문자를 "이스케이프" 처리하도록 데이터를 준비하는 방법을 설명합니다. 줄 바꿈 문자를 구분할 데이터를 준비하지 않으면 줄 바꿈 문자가 대개 레코드 구분자로 사용되므로 COPY 명령을 실행할 때 Amazon Redshift에서 오류를 로드합니다.

예를 들어 외부 테이블에 Amazon Redshift 테이블로 복사할 파일 또는 열이 있는 경우 파일 또는 열에 XML 형식의 내용이나 이와 비슷한 데이터가 포함되어 있으면 내용의 일부인 줄 바꿈 문자(\$1n)가 모두 백슬래시 문자(\$1)로 이스케이프 처리되어 있는지 확인해야 합니다.

줄 바꿈 문자가 포함된 파일 또는 테이블은 비교적 식별하기 용이한 패턴을 제공합니다. 줄 바꿈 문자가 항상 `>` 문자 뒤에 나오고, 그 사이에 잠재적으로 공백(`' '` 또는 탭)이 포함될 가능성이 매우 높기 때문입니다. 다음과 같이 `nlTest1.txt`라는 이름의 텍스트 파일 예를 참조하세요.

```
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
```

다음 예에서는 텍스트 처리 유틸리티를 실행하여 원본 파일을 전처리한 후 필요한 자리에 이스케이프 문자를 삽입할 수 있습니다. (`|` 문자는 원래 Amazon Redshift 테이블에 복사할 때 열 데이터의 구분자로 사용하기 위한 것입니다.) 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

마찬가지로 Perl을 사용하여 비슷한 작업을 실행할 수 있습니다.

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

먼저 `nlTest2.txt` 파일의 데이터를 Amazon Redshift로 로드할 수 있도록에서 2열 테이블을 생성했습니다. 첫 번째 열인 c1은 `nlTest2.txt` 파일에서 XML 형식의 내용을 저장할 문자 열입니다. 두 번째 열인 c2에는 동일한 파일에서 로드되는 정수 값이 저장됩니다.

`sed` 명령을 실행한 후에는 ESCAPE 파라미터를 사용하여 `nlTest2.txt` 파일의 데이터를 Amazon Redshift 테이블로 정확하게 로드할 수 있습니다.

**참고**  
COPY 명령에 ESCAPE 파라미터를 추가하면 백슬래시 문자(줄 바꿈 문자 포함)를 포함하여 다수의 특수 문자가 이스케이프 처리됩니다.

```
copy t2 from 's3://amzn-s3-demo-bucket/data/nlTest2.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'  
escape
delimiter as '|';

select * from t2 order by 2;

c1           |  c2
-------------+------
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>
| 1000
<xml>
</xml>       | 2000
(2 rows)
```

유사한 방법으로 외부 데이터베이스에서 내보내는 데이터 파일도 준비할 수 있습니다. Oracle 데이터베이스를 예로 들면, 테이블에서 Amazon Redshift로 복사할 열마다 REPLACE 함수를 사용하면 됩니다.

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

그 밖에 일반적으로 대용량 데이터를 처리하는 데이터베이스 내보내기 및 ETL(Extract, Transform, Load) 도구들도 대부분 이스케이프 및 구분자 문자를 지정하는 옵션이 있습니다.

## Amazon Redshift에 shapefile 로드
<a name="copy-example-spatial-copy-shapefile"></a>

다음 예에서는 COPY를 사용하여 Esri shapefile을 로드하는 방법을 보여줍니다. shapefile 로드에 대한 자세한 내용은 [Amazon Redshift에 shapefile 로드](spatial-copy-shapefile.md) 섹션을 참조하세요.

### shapefile 로드
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

다음 단계에서는 COPY 명령을 사용하여 Amazon S3에서 OpenStreetMap 데이터를 수집하는 방법을 보여줍니다. 이 예에서는 [Geofabrik 다운로드 사이트](https://download.geofabrik.de/europe.html)의 Norway shapefile 아카이브가 해당 AWS 리전의 프라이빗 Amazon S3 버킷에 업로드되었다고 가정합니다. `.shp`, `.shx` 및 `.dbf` 파일은 동일한 Amazon S3 접두사와 파일 이름을 공유해야 합니다.

#### 단순화 없이 데이터 수집
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

다음 명령은 단순화 없이 최대 지오메트리 크기에 맞는 테이블을 생성하고 데이터를 수집합니다. 선호하는 GIS 소프트웨어에서 `gis_osm_natural_free_1.shp`를 열고 이 계층의 열을 검사합니다. 기본적으로 IDENTITY 또는 GEOMETRY 열이 첫 번째 열입니다. GEOMETRY 열이 첫 번째 열이면 다음과 같이 테이블을 생성할 수 있습니다.

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

또는 IDENTITY 열이 첫 번째 열이면 다음과 같이 테이블을 생성할 수 있습니다.

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

이제 COPY를 사용하여 데이터를 수집할 수 있습니다.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully
```

또는 다음과 같이 데이터를 수집할 수 있습니다.

```
COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.
```

#### 단순화와 함께 데이터 수집
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

다음 명령은 단순화 없이 최대 지오메트리 크기에 맞지 않는 테이블을 생성하고 데이터 수집을 시도합니다. `gis_osm_water_a_free_1.shp` shapefile을 검사하고 다음과 같이 적절한 테이블을 생성합니다.

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

COPY 명령이 실행되면 오류가 발생합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
ERROR:  Load into table 'norway_water' failed.  Check 'stl_load_errors' system table for details.
```

`STL_LOAD_ERRORS` 쿼리 결과 지오메트리가 너무 큽니다.

```
SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id();
 line_number |    btrim     |                                 btrim
-------------+--------------+-----------------------------------------------------------------------
     1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447
```

이를 극복하기 위해`SIMPLIFY AUTO` 파라미터가 COPY 명령에 추가되어 지오메트리를 단순화합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.
```

단순화된 행과 지오메트리를 보려면 `SVL_SPATIAL_SIMPLIFY`를 쿼리합니다.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size |   final_tolerance
-------+-------------+-------------------+--------------+------------+------------+----------------------
    20 |     1184704 |                -1 |      1513736 | t          |    1008808 |   1.276386653895e-05
    20 |     1664115 |                -1 |      1233456 | t          |    1023584 | 6.11707814796635e-06
```

자동 계산된 것보다 낮은 허용치로 SIMPLIFY AUTO *max\$1tolerance*를 사용하면 수집 오류가 발생할 수 있습니다. 이 경우 MAXERROR를 사용하여 오류를 무시합니다.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO 1.1E-05
MAXERROR 2
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989195 record(s) loaded successfully.
INFO:  Load into table 'norway_water' completed, 1 record(s) could not be loaded.  Check 'stl_load_errors' system table for details.
```

`SVL_SPATIAL_SIMPLIFY`를 다시 쿼리하여 COPY가 로드하지 않은 레코드를 식별합니다.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance
-------+-------------+-------------------+--------------+------------+------------+-----------------
    29 |     1184704 |           1.1e-05 |      1513736 | f          |          0 |               0
    29 |     1664115 |           1.1e-05 |      1233456 | t          |     794432 |         1.1e-05
```

이 예에서는 첫 번째 레코드가 맞지 않아 `simplified` 열이 false로 표시됩니다. 두 번째 레코드가 지정된 허용치 내에서 로드되었습니다. 그러나 최종 크기는 최대 허용치를 지정하지 않고 자동 계산된 허용치를 사용하는 것보다 큽니다.

### 압축된 shapefile에서 로드
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

Amazon Redshift COPY는 압축된 shapefile에서 데이터 수집을 지원합니다. 모든 shapefile 구성 요소에는 동일한 Amazon S3 접두사와 동일한 압축 접미사가 있어야 합니다. 예를 들어 이전 예의 데이터를 로드하려고 한다고 가정합니다. 이 경우 파일 `gis_osm_water_a_free_1.shp.gz`, `gis_osm_water_a_free_1.dbf.gz`, 및 `gis_osm_water_a_free_1.shx.gz`는 동일한 Amazon S3 디렉터리를 공유해야 합니다. COPY 명령에는 GZIP 옵션이 필요하고 FROM 절은 다음과 같이 올바른 압축 파일을 지정해야 합니다.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz'
FORMAT SHAPEFILE
GZIP
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.
```

### 다른 열 순서로 테이블에 데이터 로드
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

첫 번째 열이 `GEOMETRY`가 아닌 테이블이 있는 경우 열 매핑을 사용하여 열을 대상 테이블에 매핑할 수 있습니다. 예를 들어 `osm_id`가 첫 번째 열로 지정된 테이블을 생성합니다.

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

그런 다음 열 매핑을 사용하여 shapefile을 수집합니다.

```
COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) 
FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.
```

### 지오그래피 열이 있는 테이블에 데이터 로드
<a name="copy-example-spatial-copy-shapefile-geography"></a>

`GEOGRAPHY` 열이 있는 테이블이 있는 경우 먼저 열`GEOMETRY` 로 수집한 다음 객체를 `GEOGRAPHY` 객체로 캐스팅합니다. 예를 들어, shapefile을 `GEOMETRY` 열에 복사한 후 테이블을 변경하여 `GEOGRAPHY` 데이터 유형의 열을 추가합니다.

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

그런 다음 지오메트리를 지오그래피로 변환합니다.

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

선택적으로 `GEOMETRY` 열을 삭제할 수 있습니다.

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## NOLOAD 옵션을 사용한 CPPY 명령
<a name="r_COPY_command_examples-load-noload-option"></a>

실제로 데이터를 로드하기 전에 데이터 파일을 확인하려면 COPY 명령과 함께 NOLOAD 옵션을 사용합니다. Amazon Redshift Redshift는 입력 파일을 구문 분석하여 발생한 오류를 표시합니다. 다음 예제에서는 NOLOAD 옵션을 사용하며 실제로 테이블에 행이 로드되지 않습니다.

```
COPY public.zipcode1
FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' 
DELIMITER ';' 
IGNOREHEADER 1 REGION 'us-east-1'
NOLOAD
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole';

Warnings:
Load into table 'zipcode1' completed, 0 record(s) loaded successfully.
```

## 멀티바이트 구분 기호와 ENCODING 옵션을 포함한 COPY 명령
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

다음 예제는 멀티바이트 데이터가 포함된 Amazon S3 파일에서 LATIN1을 로드합니다. COPY 명령은 구분 기호를 8진수 형식(`\302\246\303\254`)으로 지정하여 ISO-8859-1로 인코딩된 입력 파일의 필드를 구분합니다. UTF-8에서 동일한 구분 기호를 지정하려면 `DELIMITER '¦ì'`를 지정합니다.

```
COPY latin1
FROM 's3://amzn-s3-demo-bucket/multibyte/myfile' 
IAM_ROLE 'arn:aws:iam::123456789012:role/myRedshiftRole'
DELIMITER '\302\246\303\254'
ENCODING ISO88591
```

# 데이터베이스 생성
<a name="r_CREATE_DATABASE"></a>

새 레벨을 생성합니다.

데이터베이스를 생성하려면 슈퍼 사용자이거나 CREATEDB 권한이 있어야 합니다. 제로 ETL 통합과 연결된 데이터베이스를 생성하려면 수퍼유저이거나 CREATEDB 권한과 CREATEDB 권한이 모두 있어야 합니다.

트랜잭션 블록(BEGIN ... END) 내에서는 CREATE DATABASE를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

## 구문
<a name="r_CREATE_DATABASE-synopsis"></a>

```
CREATE DATABASE database_name 
[ { [ 
      FROM INTEGRATION '<integration_id>'[ DATABASE '<source_database>' ]
      [ SET ]
      [ ACCEPTINVCHARS [=] { TRUE | FALSE }]
      [ QUERY_ALL_STATES [=] { TRUE | FALSE }] 
      [ REFRESH_INTERVAL <interval> ] 
      [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ]
      [ HISTORY_MODE [=] {TRUE | FALSE} ]
    ]
    [ WITH ]
    [ OWNER [=] db_owner ]
    [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]
    [ ISOLATION LEVEL { SNAPSHOT | SERIALIZABLE } ]
  }
  | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } } }
  | { IAM_ROLE  {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } }
  | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid }
]
```

## 파라미터
<a name="r_CREATE_DATABASE-parameters"></a>

 *database\$1name*   
새 데이터베이스의 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

FROM INTEGRATION '<integration\$1id>' [ DATABASE '<source\$1database>' ]   
제로 ETL 통합 식별자를 사용하여 데이터베이스를 생성할지 여부를 지정합니다. SVV\$1INTEGRATION 시스템 뷰에서 `integration_id`를 검색할 수 있습니다. Aurora PostgreSQL 제로 ETL 통합의 경우 SVV\$1INTEGRATION에서 검색할 수도 있는 `source_database` 이름을 지정해야 합니다.  
문제 해결 예는 [제로 ETL 통합 결과를 받을 데이터베이스 생성](#r_CREATE_DATABASE-integration)을(를) 참조하세요. 제로 ETL 통합을 사용하여 데이터베이스를 생성하는 방법에 대한 자세한 내용은 **Amazon Redshift 관리 가이드의 [Amazon Redshift에서 대상 데이터베이스 생성](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)을 참조하세요.

SET  
선택적 키워드입니다.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
ACCEPTINVCHARS 절은 VARCHAR 데이터 유형에 대해 유효하지 않은 문자가 감지될 때 제로 ETL 통합 테이블이 수집을 계속할지 여부를 설정합니다. 유효하지 않은 문자가 발견되면 유효하지 않은 문자가 기본 `?` 문자로 교체됩니다.

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
QUERY\$1ALL\$1STATES 절은 모든 상태(`Synced`, `Failed`, `ResyncRequired`, `ResyncInitiated`)에서 제로 ETL 통합 테이블을 쿼리할 수 있는지 여부를 설정합니다. 기본적으로 제로 ETL 통합 테이블은 `Synced` 상태에서만 쿼리할 수 있습니다.

REFRESH\$1INTERVAL <interval>  
REFRESH\$1INTERVAL 절은 제로 ETL 소스에서 대상 데이터베이스로 데이터를 새로고침하기 위해 대략적인 시간 간격을 초 단위로 설정합니다. 소스 유형이 Aurora MySQL, Aurora PostgreSQL 또는 RDS for MySQL인 제로 ETL 통합의 경우 값을 0\$1432,000초(5일)로 설정할 수 있습니다. Amazon DynamoDB 제로 ETL 통합의 경우 값을 900\$1432,000초(15분\$15일)로 설정할 수 있습니다. 소스 유형이 Aurora MySQL, Aurora PostgreSQL 또는 RDS for MySQL인 제로 ETL 통합의 경우 기본 `interval`은 0초입니다. Amazon DynamoDB 제로 ETL 통합의 경우 기본 `interval`은 900초(15분)입니다.

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
TRUNCATECOLUMNS 절은 VARCHAR 열 또는 SUPER 열 속성의 값이 제한을 초과할 때 제로 ETL 통합 테이블이 수집을 계속할지 여부를 설정합니다. `TRUE`인 경우 값이 열에 맞게 잘리고 오버플로되는 JSON 속성의 값이 SUPER 열에 맞게 잘립니다.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1  
Amazon Redshift가 지정된 데이터베이스의 모든 새 테이블에 대해 기록 모드를 설정할지 여부를 지정하는 절입니다. 이 옵션은 제로 ETL 통합을 위해 생성된 데이터베이스에만 적용됩니다.  
HISTORY\$1MODE 절은 `TRUE` 또는 `FALSE`로 설정할 수 있습니다. 기본값은 `FALSE`입니다. HISTORY\$1MODE에 대한 자세한 내용은 *Amazon Redshift 관리 안내서*의 [기록 모드](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html)를 참조하세요.

WITH  
선택적 키워드입니다.

OWNER [=] db\$1owner  
데이터베이스 소유자의 사용자 이름을 지정합니다.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
사용자가 동시에 열어놓을 수 있는 데이터베이스 연결의 최대 개수입니다. 슈퍼 사용자에 대해서는 이 제한이 적용되지 않습니다. 최대 동시 연결 수를 허용하려면 UNLIMITED 키워드를 사용하세요. 각 사용자에 대한 연결 개수 제한이 적용될 수도 있습니다. 자세한 내용은 [CREATE USER](r_CREATE_USER.md) 섹션을 참조하세요. 기본값은 UNLIMITED입니다. 현재 연결을 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리하세요.  
사용자 및 데이터베이스 연결 제한이 모두 적용되는 경우 사용되지 않는 연결 슬롯은 사용자가 연결 시도 시 양쪽 제한 범위 내에서 모두 사용 가능해야 합니다.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
문자열 검색 또는 비교가 대소문자를 구분하는지, 구분하지 않는지를 지정하는 절입니다. 기본값은 대소문자를 구분합니다.  
데이터 공유에서 데이터베이스를 생성할 때는 COLLATE가 지원되지 않습니다.  
CASE\$1SENSITIVE와 CS는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다. 마찬가지로 CASE\$1INSENSITIVE와 CI는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
데이터베이스에 대해 쿼리가 실행될 때 사용되는 격리 수준을 지정하는 절입니다. 격리 수준에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.  
+ SNAPSHOT 격리 - 업데이트 및 삭제 충돌로부터 보호하는 격리 수준을 제공합니다. 프로비저닝된 클러스터 또는 서버리스 네임스페이스에서 생성된 데이터베이스의 기본값입니다.
+ SERIALIZABLE 격리 - 동시 트랜잭션에 대한 완전한 직렬화 기능을 제공합니다.

FROM ARN '<ARN>'  
데이터베이스를 생성하는 데 사용할 AWS Glue 데이터베이스 ARN입니다.

\$1 WITH DATA CATALOG SCHEMA '<schema>' \$1 WITH NO DATA CATALOG SCHEMA \$1  
이 파라미터는 CREATE DATABASE 명령에 FROM ARN 파라미터도 사용하는 경우에만 적용할 수 있습니다.
AWS Glue Data Catalog의 객체에 액세스하는 데 도움이 되는 스키마를 사용하여 데이터베이스를 생성할지 여부를 지정합니다.

IAM\$1ROLE \$1 default \$1 'SESSION' \$1 'arn:aws:iam::*<AWS 계정-id>*:role/*<role-name>*' \$1  
이 파라미터는 CREATE DATABASE 명령에 FROM ARN 파라미터도 사용하는 경우에만 적용할 수 있습니다.
CREATE DATABASE 명령을 실행할 때 클러스터와 연결된 IAM 역할을 지정하면 데이터베이스에서 쿼리를 실행할 때 Amazon Redshift가 해당 역할의 보안 인증을 사용합니다.  
`default` 키워드를 지정한다는 것은 기본값으로 설정되어 클러스터와 연결된 IAM 역할을 사용한다는 의미입니다.  
페더레이션형 ID를 사용하여 Amazon Redshift 클러스터에 연결하고 이 명령을 사용하여 생성된 외부 스키마에서 테이블에 액세스하는 경우에 `'SESSION'`을 사용합니다. 페더레이션 ID 사용의 예를 보려면 페더레이션형 ID 구성 방법이 설명된 [페더레이션형 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html) 섹션을 참조하세요.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. 최소 IAM 역할은 액세스되는 Amazon S3 버킷에서 LIST 작업을 수행하고 버킷에 포함된 Amazon S3 객체에 대한 GET 작업을 수행할 수 있는 권한이 있어야 합니다. 데이터 공유를 위해 AWS Glue Data Catalog를 사용하여 데이터베이스를 생성할 때 IAM\$1ROLE을 사용하는 방법에 대해 자세히 알아보려면 [소비자로서 레이크 포메이션 관리형 데이터 공유로 작업](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html)을 참조하세요.  
다음은 단일 ARN에 대한 IAM\$1ROLE 파라미터의 구문을 보여줍니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
역할을 함께 묶어 클러스터가 다른 계정에 속한 다른 IAM 역할을 수임하도록 할 수 있습니다. 최대 10개의 역할을 함께 묶을 수 있습니다. 자세한 내용은 [Amazon Redshift Spectrum에서 IAM 역할 연결](c-spectrum-iam-policies.md#c-spectrum-chaining-roles) 섹션을 참조하세요.  
 이 IAM 역할에 다음과 유사한 IAM 권한 정책을 연결합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
연합 쿼리에 사용할 IAM 역할을 생성하는 단계는 [연합 쿼리 사용을 위해 비밀 및 IAM 역할 생성](federated-create-secret-iam-role.md) 섹션을 참조하세요.  
연결된 역할 목록에 공백을 포함하지 마세요.
다음은 세 역할을 함께 묶기 위한 구문을 나타낸 것입니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

## datashare와 함께 CREATE DATABASE를 사용하기 위한 구문
<a name="r_CREATE_DATABASE-datashare-synopsis"></a>

다음 구문에서는 동일한 AWS 계정 내에서 데이터를 공유하기 위해 datashare에서 데이터베이스를 생성하는 데 사용되는 CREATE DATABASE 명령을 설명합니다.

```
CREATE DATABASE database_name
[ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid
```

다음 구문에서는 AWS 계정 간에 데이터를 공유하기 위해 datashare에서 데이터베이스를 생성하는 데 사용되는 CREATE DATABASE 명령을 설명합니다.

```
CREATE DATABASE database_name
[ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF ACCOUNT account_id NAMESPACE namespace_guid
```

### datashare와 함께 CREATE DATABASE를 사용하기 위한 파라미터
<a name="r_CREATE_DATABASE-parameters-datashare"></a>

FROM DATASHARE   
datashare가 있는 위치를 나타내는 키워드입니다.

 *datashare\$1name*   
소비자 데이터베이스가 생성되는 datashare의 이름입니다.

WITH PERMISSIONS  
개별 데이터베이스 객체에 액세스하려면 데이터 공유에서 만든 데이터베이스에 객체 수준 권한이 필요하다는 것을 지정합니다. 이 절을 사용하지 않으면 데이터베이스에 대한 USAGE 권한이 부여된 사용자 또는 역할은 데이터베이스의 모든 데이터베이스 객체에 대한 액세스 권한을 자동으로 갖게 됩니다.

 NAMESPACE *namespace\$1guid*   
datashare가 속한 생산자 네임스페이스를 지정하는 값입니다.

ACCOUNT *account\$1id*  
datashare가 속한 생산자 계정을 지정하는 값입니다.

## datashare를 위한 CREATE DATABASE 사용 노트
<a name="r_CREATE_DATABASE-usage"></a>

데이터베이스 수퍼유저는 CREATE DATABASE를 사용하여 AWS 계정 내의 datashare에서 데이터베이스를 생성할 때 NAMESPACE 옵션을 지정합니다. ACCOUNT 옵션은 선택 사항입니다. CREATE DATABASE를 사용하여 AWS 여러 계정의 데이터 공유에서 데이터베이스를 생성하는 경우 프로듀서의 ACCOUNT 및 NAMESPACE 옵션을 모두 지정합니다.

소비자 클러스터에서 하나의 datashare에 대해 하나의 소비자 데이터베이스만 생성할 수 있습니다. 동일한 datashare를 참조하는 여러 소비자 데이터베이스를 만들 수 없습니다.

## AWS Glue Data Catalog의 CREATE DATABASE
<a name="r_CREATE_DATABASE_data-catalog"></a>

AWS Glue 데이터베이스 ARN을 사용하여 데이터베이스를 생성하려면 CREATE DATABASE 명령에 ARN을 지정합니다.

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA;
```

선택적으로 IAM\$1ROLE 파라미터에 값을 제공할 수도 있습니다. 파라미터 및 허용되는 값에 대한 자세한 내용은 [파라미터](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html#r_CREATE_DATABASE-parameters)를 참조하세요.

다음은 IAM 역할을 사용하여 ARN에서 데이터베이스를 만드는 방법을 보여주는 예제입니다.

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE <iam-role-arn>
```

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE default;
```

DATA CATALOG SCHEMA를 사용하여 데이터베이스를 생성할 수도 있습니다.

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH DATA CATALOG SCHEMA <sample_schema> IAM_ROLE default;
```

## 제로 ETL 통합 결과를 받을 데이터베이스 생성
<a name="r_CREATE_DATABASE-integration"></a>

제로 ETL 통합 ID를 사용하여 데이터베이스를 생성하려면 CREATE DATABASE 명령에 `integration_id`를 지정합니다.

```
CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';
```

예를 들어, 먼저 SVV\$1INTEGRATION에서 통합 ID를 검색합니다.

```
SELECT integration_id FROM SVV_INTEGRATION;
```

그런 다음 검색된 통합 ID 중 하나를 사용하여 제로 ETL 통합을 받는 데이터베이스를 생성합니다.

```
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111';
```

제로 ETL 통합 소스 데이터베이스가 필요한 경우 예를 들어 지정합니다.

```
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' DATABASE sourcedb;
```

데이터베이스의 새로고침 간격을 설정할 수도 있습니다. 예를 들어 제로 ETL 통합 소스의 데이터에 대해 새로고침 간격을 7,200초로 설정하려면 다음과 같이 합니다.

```
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
```

SVV\$1INTEGRATION 카탈로그 뷰에서 integration\$1id, target\$1database, source, refresh\$1interval 등의 제로 ETL 통합에 관한 정보를 쿼리합니다.

```
SELECT * FROM svv_integration;
```

다음 예제에서는 기록 모드가 켜진 상태로 통합에서 데이터베이스를 생성합니다.

```
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
```

## CREATE DATABASE의 제한 사항
<a name="r_CREATE_DATABASE-create-database-limits"></a>

Amazon Redshift는 데이터베이스에 대해 다음과 같은 제한 사항을 적용합니다.
+ 클러스터당 사용자 정의 데이터베이스 최대 개수는 60개입니다.
+ 데이터베이스 이름은 최대 127바이트입니다.
+ 데이터베이스 이름은 예약어가 될 수 없습니다.

## 데이터베이스 데이터 정렬
<a name="r_CREATE_DATABASE-collation"></a>

데이터 정렬은 데이터베이스 엔진이 SQL의 문자 형식 데이터를 비교하고 정렬하는 방법을 정의하는 일련의 규칙입니다. 대/소문자를 구분하지 않는 데이터 정렬은 가장 일반적으로 사용되는 데이터 정렬입니다. Amazon Redshift는 대/소문자를 구분하지 않는 데이터 정렬을 사용하여 다른 데이터 웨어하우스 시스템에서 쉽게 마이그레이션할 수 있습니다. 대/소문자를 구분하지 않는 데이터 정렬을 기본적으로 지원하는 Amazon Redshift는 배포 키, 정렬 키 또는 범위 제한 스캔과 같은 중요한 조정 또는 최적화 방법을 계속 사용합니다.

COLLATE 절은 데이터베이스의 모든 CHAR 및 VARCHAR 열에 대한 기본 데이터 정렬을 지정합니다. CASE\$1INSENSITIVE가 지정되면 모든 CHAR 또는 VARCHAR 열은 대/소문자를 구분하지 않는 데이터 정렬을 사용합니다. 데이터 정렬에 대한 자세한 내용은 [콜레이션 시퀀스](c_collation_sequences.md) 섹션을 참조하세요.

대/소문자를 구분하지 않는 열에 삽입되거나 수집된 데이터는 원래 대/소문자를 유지합니다. 그러나 정렬 및 그룹화를 포함한 모든 비교 기반 문자열 연산은 대/소문자를 구분하지 않습니다. LIKE 조건자, 유사 및 정규식 함수와 같은 패턴 일치 연산도 대/소문자를 구분하지 않습니다.

다음 SQL 연산은 적용 가능한 데이터 정렬 의미 체계를 지원합니다.
+ 비교 연산자: =, <>, <, <=, >, >=.
+ LIKE 연산자
+ ORDER BY 절
+ GROUP BY 절
+ MIN 및 MAX 및 LISTAGG와 같은 문자열 비교를 사용하는 집계 함수
+ PARTITION BY 절 및 ORDER BY 절과 같은 윈도 함수
+ 스칼라 함수 greatest() and least(), STRPOS(), REGEXP\$1COUNT(), REGEXP\$1REPLACE(), REGEXP\$1INSTR(), REGEXP\$1SUBSTR()
+ Distinct 절
+ UNION, INTERSECT 및 EXCEPT
+ IN LIST

Amazon Redshift Spectrum 및 Aurora PostgreSQL 연합 쿼리를 포함한 외부 쿼리의 경우 VARCHAR 또는 CHAR 열의 데이터 정렬은 현재 데이터베이스 수준 데이터 정렬과 동일합니다.

다음 예에서는 Amazon Redshift Spectrum 테이블을 쿼리합니다.

```
SELECT ci_varchar FROM spectrum.test_collation
WHERE ci_varchar = 'AMAZON';

ci_varchar
----------
amazon
Amazon
AMAZON
AmaZon
(4 rows)
```

데이터베이스 데이터 정렬을 사용하여 테이블을 생성하는 방법에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

COLLATE 함수에 대한 자세한 내용은 [COLLATE 함수](r_COLLATE.md) 섹션을 참조하세요.

### 데이터베이스 데이터 정렬 제한 사항
<a name="r_CREATE_DATABASE-collation-limitations"></a>

다음은 Amazon Redshift에서 데이터베이스 데이터 정렬 작업 시 제한 사항입니다.
+ PG 카탈로그 테이블과 Amazon Redshift 시스템 테이블을 포함한 모든 시스템 테이블 또는 뷰는 대/소문자를 구분합니다.
+ 소비자 데이터베이스와 생산자 데이터베이스의 데이터베이스 수준 데이터 정렬이 다른 경우 Amazon Redshift는 데이터베이스 간 쿼리와 클러스터 간 쿼리를 지원하지 않습니다.
+ Amazon Redshift는 리더 노드 전용 쿼리에서 대/소문자를 구분하지 않는 데이터 정렬을 지원하지 않습니다.

  다음 예에서는 지원되지 않는 대/소문자를 구분하지 않는 쿼리와 Amazon Redshift에서 전송하는 오류를 보여줍니다.

  ```
  SELECT collate(usename, 'case_insensitive') FROM pg_user;
  ERROR:  Case insensitive collation is not supported in leader node only query.
  ```
+ Amazon Redshift는 비교, 함수, 조인 또는 설정 연산과 같이 대/소문자를 구분하는 열과 대/소문자를 구분하지 않는 열 간의 상호 작용을 지원하지 않습니다.

  다음 예에서는 대/소문자를 구분하는 열과 대/소문자를 구분하지 않는 열이 상호 작용할 때의 오류를 보여줍니다.

  ```
  CREATE TABLE test
    (ci_col varchar(10) COLLATE case_insensitive,
     cs_col varchar(10) COLLATE case_sensitive,
     cint int,
     cbigint bigint);
  ```

  ```
  SELECT ci_col = cs_col FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT concat(ci_col, cs_col) FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT ci_col FROM test UNION SELECT cs_col FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT * FROM test a, test b WHERE a.ci_col = b.cs_col;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  Select Coalesce(ci_col, cs_col) from test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  Select case when cint > 0 then ci_col else cs_col end from test;
  ERROR:  Query with different collations is not supported yet.
  ```

이러한 쿼리가 작동하도록 하려면 COLLATE 함수를 사용하여 한 열의 데이터 정렬을 다른 열과 일치하도록 변환합니다. 자세한 내용은 [COLLATE 함수](r_COLLATE.md) 섹션을 참조하세요.

## 예제
<a name="r_CREATE_DATABASE-examples"></a>

**데이터베이스 생성**  
다음 예에서는 TICKIT로 명명된 데이터베이스를 생성하고 사용자 DWUSER에게 소유권을 부여합니다.

```
create database tickit
with owner dwuser;
```

데이터베이스에 대한 세부 정보를 보려면 PG\$1DATABASE\$1INFO 카탈로그 테이블을 쿼리합니다.

```
select datname, datdba, datconnlimit
from pg_database_info
where datdba > 1;

 datname     | datdba | datconnlimit
-------------+--------+-------------
 admin       |    100 | UNLIMITED
 reports     |    100 | 100
 tickit      |    100 | 100
```

다음 예에서는 SNAPSHOT 격리 수준의 **sampledb** 데이터베이스를 생성합니다.

```
CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

다음 예에서는 datashare salesshare에서 데이터베이스 sales\$1db를 생성합니다.

```
CREATE DATABASE sales_db FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

### 데이터베이스 데이터 정렬 예
<a name="r_CREATE_DATABASE-collation-examples"></a>

**대/소문자를 구분하지 않는 데이터베이스 생성**  
다음 예에서는 `sampledb` 데이터베이스를 생성하고, `T1` 테이블을 생성하고, 데이터를 `T1` 테이블에 삽입합니다.

```
create database sampledb collate case_insensitive;
```

SQL 클라이언트를 사용하여 방금 만든 새 데이터베이스에 연결합니다. Amazon Redshift 쿼리 에디터 v2를 사용하려면 **에디터**에서 `sampledb`를 선택합니다. RSQL을 사용하려면 다음과 같은 명령을 사용합니다.

```
\connect sampledb;
```

```
CREATE TABLE T1 (
  col1 Varchar(20) distkey sortkey
);
```

```
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');
```

그런 다음 쿼리에서 `John`을 포함하는 결과를 찾습니다.

```
SELECT * FROM T1 WHERE col1 = 'John';

 col1
 ------
 john
 JOHN
(2 row)
```

**대/소문자를 구분하지 않는 순서**  
다음 예에서는 테이블 T1을 사용하여 대/소문자를 구분하지 않는 순서를 보여줍니다. *Bob*과 *bob* 또는 *John*과 *john*의 순서는 대/소문자를 구분하지 않는 열에서 동일하기 때문에 비결정적입니다.

```
SELECT * FROM T1 ORDER BY 1;

 col1
 ------
 bob
 Bob
 JOHN
 john
 Mary
(5 rows)
```

마찬가지로 다음 예에서는 GROUP BY 절을 사용하여 대/소문자를 구분하지 않는 순서를 보여줍니다. *Bob*과 *bob*은 동일하며 같은 그룹에 속합니다. 어느 것이 결과에 나타나는지는 비결정적입니다.

```
SELECT col1, count(*) FROM T1 GROUP BY 1;

 col1 | count
 -----+------
 Mary |  1
 bob  |  2
 JOHN |  2
(3 rows)
```

**대/소문자를 구분하지 않는 열에서 윈도 함수로 쿼리**  
다음 예에서는 대/소문자를 구분하지 않는 열에서 윈도 함수를 쿼리합니다.

```
SELECT col1, rank() over (ORDER BY col1) FROM T1;

 col1 | rank
 -----+------
 bob  |   1
 Bob  |   1
 john |   3
 JOHN |   3
 Mary |   5
(5 rows)
```

**DISTINCT 키워드로 쿼리**  
다음 예에서는 DISTINCT 키워드로 `T1` 테이블을 쿼리합니다.

```
SELECT DISTINCT col1 FROM T1;

 col1
 ------
 bob
 Mary
 john
(3 rows)
```

**UNION 절로 쿼리**  
다음 예에서는 테이블 `T1` 및 `T2`의 UNION 결과를 보여줍니다.

```
CREATE TABLE T2 AS SELECT * FROM T1;
```

```
SELECT col1 FROM T1 UNION SELECT col1 FROM T2;

 col1
 ------
 john
 bob
 Mary
(3 rows)
```

# CREATE DATASHARE
<a name="r_CREATE_DATASHARE"></a>

현재 데이터베이스에서 새 datashare를 생성합니다. 이 datashare의 소유자는 CREATE DATASHARE 명령의 발급자입니다.

Amazon Redshift는 각 datashare를 단일 Amazon Redshift 데이터베이스와 연결합니다. 연결된 데이터베이스의 객체만 datashare에 추가할 수 있습니다. 동일한 Amazon Redshift 데이터베이스에 여러 datashare를 생성할 수 있습니다.

datashare에 대한 자세한 내용은 [Amazon Redshift에서 데이터 공유](datashare-overview.md) 섹션을 참조하세요.

datashare에 대한 정보를 보려면 [SHOW DATASHARES](r_SHOW_DATASHARES.md)를 사용합니다.

## 필수 권한
<a name="r_CREATE_DATASHARE-privileges"></a>

CREATE DATASHARE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE DATASHARE 권한이 있는 사용자
+ 데이터베이스 소유자

## 구문
<a name="r_CREATE_DATASHARE-synopsis"></a>

```
CREATE DATASHARE datashare_name
[[SET] PUBLICACCESSIBLE [=] TRUE | FALSE ];
```

## 파라미터
<a name="r_CREATE_DATASHARE-parameters"></a>

*datashare\$1name*  
datashare의 이름입니다. datashare 이름은 클러스터 네임스페이스에서 고유해야 합니다.

[[SET] PUBLICACCESSIBLE]  
공개적으로 액세스할 수 있는 클러스터와 datashare를 공유할 수 있는지 여부를 지정하는 절입니다.  
`SET PUBLICACCESSIBLE`의 기본값은 `FALSE`입니다.

## 사용 노트
<a name="r_CREATE_DATASHARE_usage"></a>

기본적으로 datashare의 소유자는 공유만 소유하고 공유 내의 객체는 소유하지 않습니다.

슈퍼 사용자와 데이터베이스 소유자만 CREATE DATASHARE를 사용하고 ALTER 권한을 다른 사용자 또는 그룹에 위임할 수 있습니다.

## 예제
<a name="r_CREATE_DATASHARE_examples"></a>

다음 예에서는 datashare `salesshare`를 생성합니다.

```
CREATE DATASHARE salesshare;
```

다음 예에서는 AWS Data Exchange에서 관리하는 datashare `demoshare`를 생성합니다.

```
CREATE DATASHARE demoshare SET PUBLICACCESSIBLE TRUE, MANAGEDBY ADX;
```

# CREATE EXTERNAL FUNCTION
<a name="r_CREATE_EXTERNAL_FUNCTION"></a>

Amazon Redshift에 대해 AWS Lambda를 기반으로 스칼라 사용자 정의 함수(UDF)를 생성합니다. Lambda 사용자 정의 함수에 대한 자세한 내용은 [Scalar Lambda UDF](udf-creating-a-lambda-sql-udf.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_EXTERNAL_FUNCTION-privileges"></a>

CREATE EXTERNAL FUNCTION에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE [ OR REPLACE ] EXTERNAL FUNCTION 권한이 있는 사용자

## 구문
<a name="r_CREATE_EXTERNAL_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] EXTERNAL FUNCTION external_fn_name ( [data_type] [, ...] )
RETURNS data_type
{ VOLATILE | STABLE }
LAMBDA 'lambda_fn_name'
IAM_ROLE { default | ‘arn:aws:iam::<AWS 계정-id>:role/<role-name>’
RETRY_TIMEOUT milliseconds
MAX_BATCH_ROWS count
MAX_BATCH_SIZE size [ KB | MB ];
```

## 파라미터
<a name="r_CREATE_EXTERNAL_FUNCTION-parameters"></a>

OR REPLACE  
이름 및 입력 인수 데이터 형식이 같은 함수 또는 *서명*이 같은 함수인 경우 이런 함수가 이미 하나 존재하므로 기존 함수를 대체하도록 지정하는 절입니다. 함수는 똑같은 데이터 형식 집합을 정의하는 새 함수로만 바꿀 수 있습니다. 수퍼유저만이 함수를 바꿀 수 있습니다.  
기존 함수와 이름은 같지만 서명이 다른 함수를 정의하면 새 함수가 생성됩니다. 즉, 함수 이름이 오버로드됩니다. 자세한 내용은 [함수 이름 오버로드](udf-naming-udfs.md#udf-naming-overloading-function-names) 섹션을 참조하세요.

*external\$1fn\$1name*  
외부 함수의 이름입니다. 스키마 이름을 지정하는 경우(예: myschema.myfunction) 함수는 지정된 스키마를 사용하여 생성됩니다. 그렇지 않으면, 함수가 현재 스키마로 생성됩니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
모든 UDF 이름에 `f_`를 접두사로 사용하는 것이 좋습니다. Amazon Redshift는 UDF 이름용으로 `f_` 접두사를 예약합니다. `f_` 접두사를 사용하면 UDF 이름이 현재 또는 미래에 Amazon Redshift의 기본 제공 SQL 함수 이름과 충돌하지 않도록 할 수 있습니다. 자세한 내용은 [UDF 이름 충돌 방지](udf-naming-udfs.md) 섹션을 참조하세요.

*data\$1type*  
입력 인수의 데이터 형식입니다. 자세한 내용은 [Scalar Python UDF](udf-creating-a-scalar-udf.md) 및 [Scalar Lambda UDF](udf-creating-a-lambda-sql-udf.md)(을)를 참조하세요.

RETURNS *data\$1type*  
함수에 의해 반환되는 값의 데이터 형식입니다. RETURNS 데이터 형식은 임의의 표준 Amazon Redshift 데이터 형식일 수 있습니다. 자세한 내용은 [Scalar Python UDF](udf-creating-a-scalar-udf.md) 및 [Scalar Lambda UDF](udf-creating-a-lambda-sql-udf.md)(을)를 참조하세요.

VOLATILE \$1 STABLE  
쿼리 최적화 프로그램에 함수의 휘발성에 대해 알립니다.  
최상으로 최적화하기 위해 함수에 대해 유효한 가장 엄격한 휘발성 범주로 함수에 레이블을 지정합니다. 가장 덜 엄격한 범주부터 시작해서 엄격성의 순으로 휘발성 범주를 나열하면 다음과 같습니다.  
+ VOLATILE
+ STABLE
VOLATILE  
인수가 같을 경우, 함수는 단일 명령문의 행에 대해서도 연속적인 호출에 대해 상이한 결과를 반환할 수 있습니다. 쿼리 옵티마이저는 휘발성 함수의 동작에 대해 가정을 할 수 없습니다. 휘발성 함수를 사용하는 쿼리는 모든 입력에 대해 함수를 재평가해야 합니다.  
STABLE  
인수가 동일하면 함수는 단일 문 내에서 처리되는 연속적인 호출에서 동일한 결과를 반환하도록 보장됩니다. 이 함수는 서로 다른 명령문에서 호출될 경우 서로 다른 결과를 반환할 수 있습니다. 이 범주를 사용하면 옵티마이저가 단일 문 내에서 함수가 호출되는 횟수를 줄일 수 있습니다.  
선택한 엄격도가 함수에 유효하지 않은 경우 옵티마이저가 이 엄격도에 따라 일부 호출을 건너뛸 수 있다는 점에 유의하세요. 이로 인해 잘못된 결과 집합이 생성될 수 있습니다.  
IMMUTABLE 절은 현재 Lambda UDF에서 지원되지 않습니다.

LAMBDA *'lambda\$1fn\$1name'*  
 Amazon Redshift에서 호출하는 함수의 이름입니다.  
AWS Lambda 함수를 생성하는 단계는 *AWS Lambda 개발자 안내서*의 [콘솔로 Lambda 함수 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) 섹션을 참조하세요.  
Lambda 함수에 필요한 권한에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda 권한](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) 섹션을 참조하세요.

IAM\$1ROLE \$1 default \$1 ‘arn:aws:iam::*<AWS 계정-id>*:role/*<role-name>*’   
기본 키워드를 사용하여 CREATE EXTERNAL FUNCTION 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. CREATE EXTERNAL FUNCTION 명령은 이 IAM 역할을 통해 Lambda 함수를 호출할 권한이 있습니다. 클러스터에 연결된 Lambda 함수를 호출할 수 있는 권한이 있는 기존 IAM 역할이 있는 경우 역할의 ARN을 대체할 수 있습니다. 자세한 내용은 [Lambda UDF에 대한 권한 부여 파라미터 구성](udf-creating-a-lambda-sql-udf.md#udf-lambda-authorization) 섹션을 참조하세요.  
다음은 IAM\$1ROLE 파라미터에 대한 구문을 나타낸 것입니다.  

```
IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'
```

RETRY\$1TIMEOUT *milliseconds*   
Amazon Redshift가 재시도 백오프 지연에 사용하는 총 시간(밀리초)입니다.  
실패한 쿼리에 대해 즉시 재시도하는 대신 Amazon Redshift는 백오프를 수행하고 재시도 사이에 일정 시간 동안 기다립니다. 그런 다음 Amazon Redshift는 모든 지연의 합계가 지정한 RETRY\$1TIMEOUT 값과 같거나 초과할 때까지 실패한 쿼리를 다시 실행하도록 요청을 재시도합니다. 기본값은 20,000밀리초입니다.  
Lambda 함수가 호출되면 Amazon Redshift는 `TooManyRequestsException`, `EC2ThrottledException`, `ServiceException` 등의 오류를 수신하는 쿼리에 대해 재시도합니다.  
RETRY\$1TIMEOUT 파라미터를 0밀리초로 설정하여 Lambda UDF에 대한 재시도를 방지할 수 있습니다.

MAX\$1BATCH\$1ROWS count**  
 Amazon Redshift가 단일 람다 호출에 대한 단일 배치 요청으로 보내는 최대 행 수입니다.  
 이 파라미터의 최소값은 1입니다. 최대값은 INT\$1MAX 또는 2,147,483,647입니다.  
 이 파라미터는 선택 사항입니다. 기본값은 INT\$1MAX 또는 2,147,483,647입니다.

MAX\$1BATCH\$1SIZE size**[KB\$1MB]   
 Amazon Redshift가 단일 람다 호출에 대한 단일 배치 요청으로 보내는 데이터 페이로드의 최대 크기입니다.  
 이 파라미터의 최소값은 1KB입니다. 최대값은 5MB입니다.  
 이 파라미터의 기본값은 5MB입니다.  
 KB 및 MB는 선택 사항입니다. 측정 단위를 설정하지 않으면 Amazon Redshift는 기본적으로 KB를 사용합니다.

## 사용 노트
<a name="r_CREATE_FUNCTION-usage-notes"></a>

Lambda UDF를 생성할 때 다음 사항을 고려하세요.
+ 입력 인수에 대한 Lambda 함수 호출 순서는 고정되거나 보장되지 않습니다. 클러스터 구성에 따라 쿼리를 실행하는 인스턴스마다 다를 수 있습니다.
+ 함수는 각 입력 인수에 한 번만 적용된다는 보장이 없습니다. Amazon Redshift와 AWS Lambda 간의 상호 작용으로 인해 동일한 입력으로 반복적인 호출이 발생할 수 있습니다.

## 예제
<a name="r_CREATE_FUNCTION-examples"></a>

다음은 스칼라 Lambda 사용자 정의 함수(UDF)를 사용하는 예입니다.

### Node.js Lambda 함수를 사용하는 스칼라 Lambda UDF 예
<a name="r_CREATE_FUNCTION-lambda-example-node"></a>

다음 예에서는 2개의 정수를 입력 인수로 사용하는 `exfunc_sum`이라는 외부 함수를 생성합니다. 이 함수는 정수 출력으로 합계를 반환합니다. 호출할 Lambda 함수의 이름은 `lambda_sum`입니다. 이 Lambda 함수에 사용되는 언어는 Node.js 12.x입니다. IAM 역할을 지정해야 합니다. 이 예에서는 `'arn:aws:iam::123456789012:user/johndoe'`를 IAM 역할로 사용합니다.

```
CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT)
RETURNS INT
VOLATILE
LAMBDA 'lambda_sum'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

Lambda 함수는 요청 페이로드를 받아 각 행을 반복합니다. 단일 행의 모든 값은 응답 배열에 저장되는 해당 행의 합계를 계산하기 위해 추가됩니다. 결과 배열의 행 수는 요청 페이로드에서 수신된 행 수와 유사합니다.

JSON 응답 페이로드는 'results' 필드에 결과 데이터가 있어야 외부 기능에서 인식됩니다. Lambda 함수로 전송된 요청의 arguments 필드에는 데이터 페이로드가 포함되어 있습니다. 배치 요청의 경우 데이터 페이로드에 여러 행이 있을 수 있습니다. 다음 Lambda 함수는 요청 데이터 페이로드의 모든 행을 반복합니다. 또한 단일 행 내의 모든 값을 개별적으로 반복합니다.

```
exports.handler = async (event) => {
    // The 'arguments' field in the request sent to the Lambda function contains the data payload.
    var t1 = event['arguments'];

    // 'len(t1)' represents the number of rows in the request payload.
    // The number of results in the response payload should be the same as the number of rows received.
    const resp = new Array(t1.length);

    // Iterating over all the rows in the request payload.
    for (const [i, x] of t1.entries())
    {
        var sum = 0;
        // Iterating over all the values in a single row.
        for (const y of x) {
            sum = sum + y;
        }
        resp[i] = sum;
    }
    // The 'results' field should contain the results of the lambda call.
    const response = {
        results: resp
    };
    return JSON.stringify(response);
};
```

다음 예에서는 리터럴 값을 사용하여 외부 함수를 호출합니다.

```
select exfunc_sum(1,2);
exfunc_sum
------------
 3
(1 row)
```

다음 예에서는 정수 데이터 형식의 두 열 c1 및 c2가 있는 t\$1sum이라는 테이블을 생성하고 두 행의 데이터를 삽입합니다. 그런 다음 이 테이블의 열 이름을 전달하여 외부 함수를 호출합니다. 두 테이블 행은 단일 Lambda 호출로 요청 페이로드의 배치 요청으로 전송됩니다.

```
CREATE TABLE t_sum(c1 int, c2 int);
INSERT INTO t_sum VALUES (4,5), (6,7);
SELECT exfunc_sum(c1,c2) FROM t_sum;
 exfunc_sum
---------------
 9
 13
(2 rows)
```

### RETRY\$1TIMEOUT 속성을 사용하는 Scalar Lambda UDF 예
<a name="r_CREATE_FUNCTION-lambda-example-retry"></a>

다음 섹션에서 Lambda UDF에서 RETRY\$1TIMEOUT 속성을 사용하는 방법의 예를 찾아볼 수 있습니다.

AWS Lambda 함수에는 각 함수에 대해 설정할 수 있는 동시성 제한이 있습니다. 동시성 한도에 대한 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 함수에 대한 동시성 관리](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) 및 AWS 컴퓨팅 블로그의 게시물 [AWS Lambda 함수 동시성 관리](https://aws.amazon.com/blogs/compute/managing-aws-lambda-function-concurrency)를 참조하세요.

Lambda UDF에서 제공하는 요청 수가 동시성 제한을 초과하면 새 요청에서 `TooManyRequestsException` 오류를 수신합니다. ambda UDF는 Lambda 함수로 전송된 요청 간의 모든 지연 합계가 설정한 RETRY\$1TIMEOUT 값과 같거나 초과할 때까지 이 오류에 대해 재시도합니다. 기본 RETRY\$1TIMEOUT 값은 20,000밀리초입니다.

다음 예시에서는 `exfunc_sleep_3`이라는 Lambda 함수를 생성합니다. 이 함수는 요청 페이로드를 받아 각 행을 반복하고 입력을 대문자로 변환합니다. 그런 다음 3초 동안 휴면하고 결과를 반환합니다. 이 Lambda 함수에 사용되는 언어는 Python 3.8입니다.

결과 배열의 행 수는 요청 페이로드에서 수신된 행 수와 유사합니다. JSON 응답 페이로드는 `results` 필드에 결과 데이터가 있어야 외부 기능에서 인식됩니다. Lambda 함수로 전송된 요청의 `arguments` 필드에는 데이터 페이로드가 포함되어 있습니다. 배치 요청의 경우 데이터 페이로드에 여러 행이 나타날 수 있습니다.

이 함수의 동시성 제한은 RETRY\$1TIMEOUT 속성의 사용을 보여주기 위해 예약된 동시성에서 특별히 1로 설정됩니다. 속성이 1로 설정되면 Lambda 함수는 한 번에 하나의 요청만 처리할 수 있습니다.

```
import json
import time
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            resp[i] = y.upper()

    time.sleep(3)
    ret = dict()
    ret['results'] = resp
    ret_json = json.dumps(ret)
    return ret_json
```

다음 두 가지 추가 예에서는 RETRY\$1TIMEOUT 속성을 보여줍니다. 각 예에서 단일 Lambda UDF를 호출합니다. Lambda UDF를 호출하는 동안 각 예에서는 동일한 SQL 쿼리를 실행하여 동시에 2개의 동시 데이터베이스 세션에서 Lambda UDF를 호출합니다. Lambda UDF를 호출하는 첫 번째 쿼리가 UDF에 의해 제공되는 경우 두 번째 쿼리는 `TooManyRequestsException` 오류를 수신합니다. 이 결과는 UDF에서 예약된 동시성을 1로 특별히 설정했기 때문에 발생합니다. Lambda 함수에 대해 예약된 동시성을 설정하는 방법에 대한 자세한 내용은 [예약된 동시성 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-reservedconfiguration-concurrency-reserved) 섹션을 참조하세요.

다음 첫 번째 예에서는 Lambda UDF의 RETRY\$1TIMEOUT 속성을 0밀리초로 설정합니다. Lambda 요청이 Lambda 함수에서 예외를 수신하면 Amazon Redshift는 재시도하지 않습니다. RETRY\$1TIMEOUT 특성이 0으로 설정되어 있기 때문에 이러한 결과가 발생합니다.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 0;
```

RETRY\$1TIMEOUT을 0으로 설정하면 별도의 데이터베이스 세션에서 다음 두 쿼리를 실행하여 다른 결과를 볼 수 있습니다.

Lambda UDF를 사용하는 첫 번째 SQL 쿼리가 성공적으로 실행됩니다.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

별도의 데이터베이스 세션에서 동시에 실행되는 두 번째 쿼리는 `TooManyRequestsException` 오류를 수신합니다.

```
select exfunc_upper('Varchar');
ERROR:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
DETAIL:
-----------------------------------------------
error:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
code:      32103
context:query:     0
location:  exfunc_client.cpp:102
process:   padbmaster [pid=26384]
-----------------------------------------------
```

다음 두 번째 예에서는 Lambda UDF의 RETRY\$1TIMEOUT 속성을 3,000밀리초로 설정합니다. 두 번째 쿼리가 동시에 실행되더라도 총 지연 시간이 3,000밀리초가 될 때까지 Lambda UDF가 재시도합니다. 따라서 두 쿼리가 모두 성공적으로 실행됩니다.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 3000;
```

RETRY\$1TIMEOUT을 3,000밀리초로 설정하면 별도의 데이터베이스 세션에서 다음 두 쿼리를 실행하여 같은 결과를 볼 수 있습니다.

Lambda UDF를 실행하는 첫 번째 SQL 쿼리가 성공적으로 실행됩니다.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

두 번째 쿼리가 동시에 실행되고 총 지연 시간이 3,000밀리초가 될 때까지 Lambda UDF가 재시도합니다.

```
select exfunc_upper('Varchar');
 exfunc_upper
--------------
 VARCHAR
(1 row)
```

### Python Lambda 함수를 사용하는 스칼라 Lambda UDF 예
<a name="r_CREATE_FUNCTION-lambda-example-python"></a>

다음 예에서는 `exfunc_multiplication`이라는 외부 함수를 생성하고 숫자를 곱하고 정수를 반환합니다. 이 예에서는 Lambda 응답에 성공 및 `error_msg` 필드를 통합합니다. 곱셈 결과에 정수 오버플로가 있는 경우 성공 필드가 false로 설정되고 `error_msg` 메시지가 `Integer multiplication overflow`로 설정됩니다. `exfunc_multiplication` 함수는 3개의 정수를 입력 인수로 사용하고 합계를 정수 출력으로 반환합니다.

호출되는 Lambda 함수의 이름은 `lambda_multiplication`입니다. 이 Lambda 함수에 사용되는 언어는 Python 3.8입니다. IAM 역할을 지정해야 합니다.

```
CREATE EXTERNAL FUNCTION exfunc_multiplication(int, int, int)
RETURNS INT
VOLATILE
LAMBDA 'lambda_multiplication'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

Lambda 함수는 요청 페이로드를 받아 각 행을 반복합니다. 단일 행의 모든 값을 곱하여 응답 목록에 저장되는 해당 행의 결과를 계산합니다. 이 예에서는 기본적으로 true로 설정된 부울 성공 값을 사용합니다. 행의 곱셈 결과에 정수 오버플로가 있으면 성공 값은 false로 설정됩니다. 그런 다음 반복 루프가 중단됩니다.

응답 페이로드를 생성하는 동안 성공 값이 false인 경우 다음 Lambda 함수는 페이로드에 `error_msg` 필드를 추가합니다. 또한 오류 메시지를 `Integer multiplication overflow`로 설정합니다. 성공 값이 true이면 결과 필드에 결과 데이터가 추가됩니다. 결과 배열(있는 경우)의 행 수는 요청 페이로드에서 수신된 행 수와 유사합니다.

Lambda 함수로 전송된 요청의 arguments 필드에는 데이터 페이로드가 포함되어 있습니다. 배치 요청의 경우 데이터 페이로드에 여러 행이 있을 수 있습니다. 다음 Lambda 함수는 요청 데이터 페이로드의 모든 행을 반복하고 단일 행 내의 모든 값을 개별적으로 반복합니다.

```
import json
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # By default success is set to 'True'.
    success = True
    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        mul = 1
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            mul = mul*y

        # Check integer overflow.
        if (mul >= 9223372036854775807 or mul <= -9223372036854775808):
            success = False
            break
        else:
            resp[i] = mul
    ret = dict()
    ret['success'] = success
    if not success:
        ret['error_msg'] = "Integer multiplication overflow"
    else:
        ret['results'] = resp
    ret_json = json.dumps(ret)

    return ret_json
```

다음 예에서는 리터럴 값을 사용하여 외부 함수를 호출합니다.

```
SELECT exfunc_multiplication(8, 9, 2);
  exfunc_multiplication
---------------------------
          144
(1 row)
```

다음 예에서는 3개(c1, c2, c3)의 정수 데이터 형식 열이 있는 t\$1multi라는 테이블을 생성합니다. 이 테이블의 열 이름을 전달하여 외부 함수를 호출합니다. 정수 오버플로가 오류 전파 방식을 표시하는 방식으로 데이터가 삽입됩니다.

```
CREATE TABLE t_multi (c1 int, c2 int, c3 int);
INSERT INTO t_multi VALUES (2147483647, 2147483647, 4);
SELECT exfunc_multiplication(c1, c2, c3) FROM t_multi;
DETAIL:
  -----------------------------------------------
  error:  Integer multiplication overflow
  code:      32004context:
  context:
  query:     38
  location:  exfunc_data.cpp:276
  process:   query2_16_38 [pid=30494]
  -----------------------------------------------
```

# CREATE EXTERNAL MODEL
<a name="r_create_external_model"></a>

**Topics**
+ [CREATE EXTERNAL MODEL의 사전 조건](#r_create_external_model_prereqs)
+ [필수 권한](#r_simple_create_model-privileges)
+ [비용 관리](#r_create_model_cost)
+ [CREATE EXTERNAL MODEL 구문](#r_create_external_model_syntax)
+ [CREATE EXTERNAL MODEL 파라미터 및 설정](#r_create_external_model_parameters_settings)
+ [CREATE EXTERNAL MODEL 추론 함수 파라미터](#r_create_external_model_if_parameters)

## CREATE EXTERNAL MODEL의 사전 조건
<a name="r_create_external_model_prereqs"></a>

CREATE EXTERNAL MODEL 스테이트먼트를 사용하기 전에 먼저 [Amazon Redshift 기계 학습 사용을 위한 클러스터 설정](getting-started-machine-learning.md#cluster-setup)의 사전 조건을 충족해야 합니다. 다음은 사전 조건을 개괄적으로 요약한 것입니다.
+ AWS 관리 콘솔 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 Amazon Redshift 클러스터를 생성합니다.
+ 클러스터를 생성하는 동안 AWS Identity and Access Management(IAM) 정책을 연결합니다.
+ Amazon Redshift와 Amazon Bedrock이 다른 서비스와 상호 작용하는 역할을 맡도록 허용하려면 IAM 역할에 적절한 신뢰 정책을 추가합니다.
+ Amazon Bedrock 콘솔에서 사용하려는 특정 LLM에 대한 액세스를 활성화합니다.
+ (선택 사항) 소량의 데이터라도 `Too many requests, please wait before trying again`과 같이 Amazon Bedrock에서 발생하는 스로틀링 예외가 있는 경우 Amazon Bedrock 계정의 **Service Quotas**에서 할당량을 확인합니다. 적용된 계정 수준 할당량이 사용 중인 모델의 **InvokeModel** 요청에 대한 AWS 기본 할당량 값과 적어도 동일한지 확인합니다.

IAM 역할, 신뢰 정책 및 기타 사전 조건에 대한 자세한 내용은 [Amazon Redshift 기계 학습 사용을 위한 클러스터 설정](getting-started-machine-learning.md#cluster-setup) 섹션을 참조하세요.

## 필수 권한
<a name="r_simple_create_model-privileges"></a>

CREATE EXTERNAL MODEL에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE MODEL 권한이 있는 사용자
+ GRANT CREATE MODEL 권한이 있는 역할

## 비용 관리
<a name="r_create_model_cost"></a>

 Amazon Redshift ML은 기존 클러스터 리소스를 사용하여 예측 모델을 생성하므로 추가 비용을 지불하지 않아도 됩니다. 그러나 선택한 모델에 따라 Amazon Bedrock 사용에 대해 AWS 요금이 부과됩니다. 자세한 내용은 [Amazon Redshift 기계 학습 사용 비용](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)을 참조하세요.

## CREATE EXTERNAL MODEL 구문
<a name="r_create_external_model_syntax"></a>

다음은 CREATE EXTERNAL MODEL 스테이트먼트의 전체 구문입니다.

```
CREATE EXTERNAL MODEL model_name 
FUNCTION function_name
IAM_ROLE {default/'arn:aws:iam::<account-id>:role/<role-name>'}
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID model_id
   [, PROMPT 'prompt prefix']
   [, SUFFIX 'prompt suffix']
   [, REQUEST_TYPE {RAW|UNIFIED}]
   [, RESPONSE_TYPE {VARCHAR|SUPER}]
);
```

`CREATE EXTERNAL MODEL` 명령은 콘텐츠를 만드는 데 사용하는 추론 함수를 생성합니다.

다음은 `RAW`의 `REQUEST_TYPE`을 사용하여 `CREATE EXTERNAL MODEL`을 생성하는 추론 함수의 구문입니다.

```
SELECT inference_function_name(request_super) 
[FROM table];
```

다음은 `UNIFIED`의 `REQUEST_TYPE`을 사용하여 `CREATE EXTERNAL MODEL`을 생성하는 추론 함수의 구문입니다.

```
SELECT inference_function_name(input_text, [, inference_config [, additional_model_request_fields]])
[FROM table];
```

추론 함수 사용 방법에 관한 내용은 [Amazon Redshift ML과 Amazon Bedrock의 통합용 외부 모델 사용](machine-learning-br.md#machine-learning-br-use) 섹션을 참조하시기 바랍니다.

## CREATE EXTERNAL MODEL 파라미터 및 설정
<a name="r_create_external_model_parameters_settings"></a>

이 섹션에서는 `CREATE EXTERNAL MODEL` 명령의 파라미터와 설정에 대해 설명합니다.

**Topics**
+ [CREATE EXTERNAL MODEL 파라미터](#r_create_external_model_parameters)
+ [CREATE EXTERNAL MODEL 설정](#r_create_external_model_settings)

### CREATE EXTERNAL MODEL 파라미터
<a name="r_create_external_model_parameters"></a>

model\$1name  
외부 모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

FUNCTION **function\$1name (data\$1type [,...] )  
`CREATE EXTERNAL MODEL`에서 생성되는 추론 함수의 이름입니다. 추론 함수를 사용하여 Amazon Bedrock에 요청을 보내고 ML에서 생성된 텍스트를 검색합니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1**  
Amazon Redshift가 Amazon Bedrock에 액세스하는 데 사용하는 IAM 역할입니다. IAM 역할에 대한 상세 정보는 [Amazon Redshift ML과 Amazon Bedrock의 통합을 위한 IAM 역할 생성 또는 업데이트](machine-learning-br.md#machine-learning-br-iam) 섹션을 참조하세요.

MODEL\$1TYPE BEDROCK  
모델 유형을 지정합니다. 유일한 유효 값은 `BEDROCK`입니다.

SETTINGS ( MODEL\$1ID model\$1id [,...] )  
외부 모델 설정을 지정합니다. 자세한 내용은 다음 섹션을 참조하시기 바랍니다.

### CREATE EXTERNAL MODEL 설정
<a name="r_create_external_model_settings"></a>

MODEL\$1ID model\$1id  
외부 모델의 식별자입니다(예: `anthropic.claude-v2`). Amazon Bedrock 모델 ID에 관한 자세한 내용은 [Amazon Bedrock 모델 ID](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html)를 참조하시기 바랍니다.

PROMPT '프롬프트 접두사'  
Amazon Redshift가 모든 추론 요청의 시작 부분에 추가하는 정적 프롬프트를 지정합니다. `UNIFIED`의 `REQUEST_TYPE`에서만 지원됩니다.

SUFFIX '프롬프트 접미사'  
Amazon Redshift가 모든 추론 요청의 끝에 추가하는 정적 프롬프트를 지정합니다. `UNIFIED`의 `REQUEST_TYPE`에서만 지원됩니다.

REQUEST\$1TYPE \$1 RAW \$1 UNIFIED \$1  
Amazon Bedrock으로 전송된 요청의 형식을 지정합니다. 유효한 값은 다음과 같습니다.  
+ **RAW**: 추론 함수는 입력을 단일 슈퍼 값으로 간주하고 항상 슈퍼 값을 반환합니다. 슈퍼 값의 형식은 선택한 Amazon Bedrock 모델에 따라 다릅니다. 슈퍼는 여러 알고리즘을 결합하여 향상된 단일 예측을 생성하는 예측 모델입니다.
+ **UNIFIED**: 추론 함수는 통합 API를 사용합니다. 모든 모델은 Amazon Bedrock과 통합되고 일관된 인터페이스를 갖추고 있습니다. 이는 메시지를 지원하는 모든 모델에 적용됩니다. 이 값이 기본값입니다.

  자세한 내용은 Amazon Bedrock API 설명서**에 나와 있는 [Converse API 설명서](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)를 참조하시기 바랍니다.

RESPONSE\$1TYPE \$1 VARCHAR \$1 SUPER \$1  
응답의 형식을 지정합니다. `REQUEST_TYPE`이 `RAW`인 경우 `RESPONSE_TYPE`이 필요하며 유일한 유효한 값은 `SUPER`입니다. 다른 모든 `REQUEST TYPE` 값의 경우 기본값은 `VARCHAR`이며 `RESPONSE_TYPE`은 선택 사항입니다. 유효한 값은 다음과 같습니다.  
+ **VARCHAR**: Amazon Redshift는 모델에서 생성된 텍스트 응답만 반환합니다.
+ **SUPER**: Amazon Redshift는 모델에서 생성된 전체 응답 JSON을 슈퍼로 반환합니다. 여기에는 텍스트 응답과 함께 중단 이유, 모델 입력 및 출력 토큰 사용과 같은 정보가 포함됩니다. 슈퍼는 여러 알고리즘을 결합하여 향상된 단일 예측을 생성하는 예측 모델입니다.

## CREATE EXTERNAL MODEL 추론 함수 파라미터
<a name="r_create_external_model_if_parameters"></a>

이 섹션에서는 `CREATE EXTERNAL MODEL` 명령으로 생성되는 추론 함수의 유효한 파라미터를 설명합니다.

### `RAW`의 `REQUEST_TYPE`에 대한 CREATE EXTERNAL MODEL 추론 함수 파라미터
<a name="r_create_external_model_if_parameters_raw"></a>

`RAW`의 `REQUEST_TYPE`로 생성된 추론 함수에는 슈퍼 입력 인수가 하나 있으며 항상 슈퍼 데이터 유형을 반환합니다. 입력 슈퍼의 구문은 Amazon Bedrock에서 선택한 특정 모델의 요청 구문을 따릅니다.

### `UNIFIED`의 `REQUEST_TYPE`에 대한 CREATE EXTERNAL MODEL 추론 함수 파라미터
<a name="r_create_external_model_if_parameters_unified"></a>

input\$1text  
Amazon Redshift가 Amazon Bedrock에 보내는 텍스트입니다.

inference\$1config  
Amazon Redshift가 Amazon Bedrock에 보내는 선택 사항 파라미터가 포함된 슈퍼 값입니다. 여기에는 다음이 포함될 수 있습니다.  
+ maxTokens
+ stopSequences
+ temperature
+ topP
이러한 파라미터는 모두 선택 사항이며 대/소문자를 구분합니다. 이러한 파라미터에 관한 자세한 내용은 Amazon Bedrock API 참조**의 [InferenceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html)을 참조하시기 바랍니다.

# CREATE EXTERNAL SCHEMA
<a name="r_CREATE_EXTERNAL_SCHEMA"></a>

현재 데이터베이스에서 새 외부 스키마를 생성합니다. 이 외부 스키마를 사용하여 Amazon RDS for PostgreSQL 또는 Amazon Aurora PostgreSQL 호환 버전 데이터베이스에 연결할 수 있습니다. 또한 AWS Glue, Athena와 같은 외부 데이터 카탈로그의 데이터베이스 또는 Amazon EMR과 같은 Apache Hive 메타스토어의 데이터베이스를 참조하는 외부 스키마를 생성할 수 있습니다.

이 스키마의 소유자는 CREATE EXTERNAL SCHEMA 명령의 발행자입니다. 외부 스키마의 소유권을 이전하려면 [ALTER SCHEMA](r_ALTER_SCHEMA.md)를 사용해 소유자를 변경합니다. 다른 사용자 또는 사용자 그룹에 스키마에 대한 액세스를 허용하려면 [GRANT](r_GRANT.md) 명령을 사용합니다.

외부 테이블에서 권한에 대한 GRANT 또는 REVOKE 명령을 사용할 수 없습니다. 대신에, 외부 스키마에 대한 권한을 허용하거나 취소합니다.

**참고**  
현재 Amazon Athena 데이터 카탈로그에 Redshift Spectrum 외부 테이블이 있다면 Athena 데이터 카탈로그를 AWS Glue Data Catalog로 마이그레이션할 수 있습니다. AWS Glue Data Catalog를 Redshift Spectrum과 함께 사용하려면 AWS Identity and Access Management(IAM) 정책을 변경해야 할 수 있습니다. 자세한 내용은 *Athena User Guide*의 [Upgrading to the AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade) 섹션을 참조하세요.

외부 스키마에 대한 세부 정보를 보려면 [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 시스템 뷰를 쿼리하세요.

## 구문
<a name="r_CREATE_EXTERNAL_SCHEMA-synopsis"></a>

다음 구문은 외부 데이터 카탈로그를 사용하여 데이터를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령에 대해 설명합니다. 자세한 내용은 [Amazon Redshift Spectrum](c-using-spectrum.md) 섹션을 참조하세요.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM [ [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT | KAFKA ]
[ DATABASE 'database_name' ]
[ SCHEMA 'schema_name' ]
[ REGION 'aws-region' ]
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ]
[ URI ['hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'Kafka bootstrap URL'] ] 
[ CLUSTER_ARN 'arn:aws:kafka:<region>:<AWS 계정-id>:cluster/msk/<cluster uuid>' ]
[ CATALOG_ROLE [ 'SESSION' | 'catalog-role-arn-string' ] ]
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]
[ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]
```

다음 구문은 RDS POSTGRES 또는 Aurora PostgreSQL에 대한 연합 쿼리로 데이터를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령을 설명합니다. Kinesis Data Streams와 같은 스트리밍 소스를 참조하는 외부 스키마를 생성할 수도 있습니다. 자세한 내용은 [Amazon Redshift에서 연합 쿼리를 사용하여 데이터 쿼리](federated-overview.md) 섹션을 참조하세요.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM POSTGRES
DATABASE 'federated_database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

다음 구문은 RDS MySQL 또는 Aurora MySQL에 대한 연합 쿼리로 데이터를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령을 설명합니다. 자세한 내용은 [Amazon Redshift에서 연합 쿼리를 사용하여 데이터 쿼리](federated-overview.md) 섹션을 참조하세요.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM MYSQL
DATABASE 'federated_database_name'
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

다음 구문은 Kinesis 스트림 데이터를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령에 대해 설명합니다. 자세한 내용은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md) 섹션을 참조하세요.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE [ default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' ]
```

다음 구문은 Amazon Managed Streaming for Apache Kafka 또는 Confluent Cloud 클러스터와 해당 수집 대상 주제를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령을 설명합니다. 연결하려면 브로커 URI을 제공하면 됩니다. 자세한 내용은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md) 섹션을 참조하세요.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KAFKA
[ IAM_ROLE [ default | 'arn:aws:iam::<AWS 계정-id>:role/<role-name>' ] ]
URI 'Kafka bootstrap URI'
AUTHENTICATION [ none | iam | mtls ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
```

다음 구문은 데이터베이스 간 쿼리로 데이터를 참조하는 데 사용되는 CREATE EXTERNAL SCHEMA 명령을 설명합니다.

```
CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
```

## 파라미터
<a name="r_CREATE_EXTERNAL_SCHEMA-parameters"></a>

IF NOT EXISTS  
지정된 스키마가 이미 존재하는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 스키마가 존재한다는 메시지를 반환함을 나타내는 절입니다. 이 절은 스크립트 작성 시 유용하므로, CREATE EXTERNAL SCHEMA가 이미 존재하는 스키마의 생성을 시도하는 경우에는 스크립트가 실패하지 않습니다.

local\$1schema\$1name  
새 외부 스키마의 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

FROM [ DATA CATALOG ] \$1 HIVE METASTORE \$1 POSTGRES \$1 MYSQL \$1 KINESIS \$1 MSK \$1 REDSHIFT   
외부 데이터베이스가 있는 위치를 나타내는 키워드입니다.  
DATA CATALOG는 외부 데이터베이스가 Athena 데이터 카탈로그 또는 AWS Glue Data Catalog에 정의되어 있음을 나타냅니다.  
외부 데이터베이스가 다양한 AWS 리전에서 외부 Data Catalog에 정의되어 있는 경우 REGION 파라미터가 필요합니다. DATA CATALOG는 기본값입니다.  
HIVE METASTORE는 외부 데이터베이스가 Apache Hive 메타스토어에 정의되어 있음을 나타냅니다. HIVE METASTORE가 지정되는 경우 URI가 필요합니다.  
POSTGRES는 외부 데이터베이스가 RDS PostgreSQL 또는 Aurora PostgreSQL에 정의되어 있음을 나타냅니다.  
MYSQL은 외부 데이터베이스가 RDS MySQL 또는 Aurora MySQL에 정의되어 있음을 나타냅니다.  
KINESIS는 데이터 원본이 Kinesis Data Streams의 스트림임을 나타냅니다.  
MSK는 데이터 소스가 Amazon MSK 프로비저닝 또는 서버리스 클러스터임을 나타냅니다.  
KAFKA는 데이터 소스가 Kafka 클러스터임을 나타냅니다. Amazon MSK와 Confluent Cloud 모두에 이 키워드를 사용할 수 있습니다.

FROM REDSHIFT  
데이터베이스가 Amazon Redshift에 있음을 나타내는 키워드입니다.

DATABASE '*redshift\$1database\$1name*' SCHEMA '*redshift\$1schema\$1name*'  
Amazon Redshift 데이터베이스의 이름입니다.  
*redshift\$1schema\$1name*은 Amazon Redshift의 스키마를 나타냅니다. 기본 *redshift\$1schema\$1name*은 `public`입니다.

DATABASE '*federated\$1database\$1name*'  
키워드는 지원되는 PostgreSQL 또는 MySQL 데이터베이스 엔진에서 외부 데이터베이스의 이름을 나타냅니다.

[SCHEMA '*schema\$1name*']  
*schema\$1name*은 지원되는 PostgreSQL 데이터베이스 엔진의 스키마를 나타냅니다. 기본 *schema\$1name*은 `public`입니다.  
지원되는 MySQL 데이터베이스 엔진에 대한 연합 쿼리를 설정할 때 SCHEMA를 지정할 수 없습니다.

REGION '*aws-region*'  
외부 데이터베이스가 Athena 데이터 카탈로그 또는 AWS Glue Data Catalog에 정의되어 있는 경우 데이터베이스가 있는 AWS 리전입니다. 이 파라미터는 데이터베이스가 외부 Data Catalog에 정의되어 있는 경우에 필요합니다.

URI [ 'hive\$1metastore\$1uri' [ PORT port\$1number ] \$1 'hostname' [ PORT port\$1number ] \$1 'Kafka bootstrap URI' ]  
지원되는 PostgreSQL 또는 MySQL 데이터베이스 엔진의 호스트 이름 URI와 port\$1number입니다. *hostname*은 복제본 세트의 헤드 노드입니다. 엔드포인트는 Amazon Redshift 클러스터에서 연결(라우팅)할 수 있어야 합니다. 기본 PostgreSQL 포트 번호는 5432입니다. 기본 MySQL 포트 번호는 3306입니다.  
지원되는 PostgreSQL 또는 MySQL 데이터베이스 엔진은 Amazon Redshift 및 RDS url-rsPostgreSQL 또는 Aurora PostgreSQL을 연결하는 보안 그룹을 포함하는 Amazon Redshift 클러스터와 동일한 VPC에 있어야 합니다. 또한, Enhanced VPC Routing을 사용하여 VPC 간 사용 사례를 구성할 수 있습니다. 자세한 내용은 [Redshift 관리형 VPC 엔드포인트](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html)를 참조하세요.
**메타스토어 URI 지정**  
데이터베이스가 Hive 메타스토어에 있는 경우 메타스토어의 URI를 지정하고 선택적으로 포트 번호를 지정합니다. 기본 포트 번호는 9083입니다.  
URI에는 프로토콜 사양("http://")이 포함되어 있지 않습니다. 유효한 URI의 예: `uri '172.10.10.10'`.  
**스트리밍 수집용 브로커 URI 지정**  
부트스트랩 브로커 URI를 포함하면 Amazon MSK 또는 Confluent Cloud 클러스터에 연결하고 스트리밍 데이터를 수신할 수 있습니다. 자세한 내용과 예시를 확인하려면 [Amazon Managed Streaming for Apache Kafka에서 스트리밍 수집 시작](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)을 참조하세요.

IAM\$1ROLE [ default \$1 'SESSION' \$1 'arn:aws:iam::*<AWS 계정-id>*:role/*<role-name>*' ]  
기본 키워드를 사용하여 CREATE EXTERNAL SCHEMA 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.  
페더레이션형 ID를 사용하여 Amazon Redshift 클러스터에 연결하고 이 명령을 사용하여 생성된 외부 스키마에서 테이블에 액세스하는 경우에 `'SESSION'`을 사용합니다. 자세한 내용은 페더레이션형 ID 구성 방법이 설명된 [페더레이션형 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html) 섹션을 참조하세요. ARN 대신 `'SESSION'`을 사용하는 이 구성은 `DATA CATALOG`를 사용하여 스키마를 생성한 경우에만 사용할 수 있다는 점에 유의하세요.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. 최소 IAM 역할은 액세스되는 Amazon S3 버킷에서 LIST 작업을 수행하고 버킷에 포함된 Amazon S3 객체에 대한 GET 작업을 수행할 수 있는 권한이 있어야 합니다.  
다음은 단일 ARN에 대한 IAM\$1ROLE 파라미터의 구문을 보여줍니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
역할을 함께 묶어 클러스터가 다른 계정에 속한 다른 IAM 역할을 수임하도록 할 수 있습니다. 최대 10개의 역할을 함께 묶을 수 있습니다. 역할 연쇄의 예는 [Amazon Redshift Spectrum에서 IAM 역할 연결](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)를 참조하세요.  
 이 IAM 역할에 다음과 유사한 IAM 권한 정책을 연결합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
연합 쿼리에 사용할 IAM 역할을 생성하는 단계는 [연합 쿼리 사용을 위해 비밀 및 IAM 역할 생성](federated-create-secret-iam-role.md) 섹션을 참조하세요.  
연결된 역할 목록에 공백을 포함하지 마세요.
다음은 세 역할을 함께 묶기 위한 구문을 나타낸 것입니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

SECRET\$1ARN '*ssm-secret-arn*'  
AWS Secrets Manager를 사용하여 생성한 지원되는 PostgreSQL 또는 MySQL 데이터베이스 엔진 암호의 Amazon 리소스 이름(ARN)입니다. 시크릿의 ARN을 생성하고 검색하는 방법에 대한 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager를 사용하여 시크릿 관리](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) 및 [Amazon Redshift에서 시크릿의 Amazon 리소스 이름(ARN) 검색](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html)을 참조하세요.

CATALOG\$1ROLE [ 'SESSION' \$1 *catalog-role-arn-string*]  
`'SESSION'`은 데이터 카탈로그에 대한 인증 및 권한 부여를 위해 페더레이션형 ID를 사용하여 Amazon Redshift 클러스터에 연결하는 데 사용합니다. 페더레이션형 ID 단계를 완료하는 방법에 대한 자세한 내용은 [페더레이션형 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)를 참조하세요. `'SESSION'` 역할은 스키마가 DATA CATALOG에서 생성된 경우에만 사용할 수 있다는 점에 유의하세요.  
클러스터가 데이터 카탈로그에 대한 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다.  
CATALOG\$1ROLE을 지정하지 않으면 Amazon Redshift는 지정된 IAM\$1ROLE을 사용합니다. 카탈로그 역할은 AWS Glue 또는 Athena에 있는 Data Catalog에 액세스할 수 있는 권한이 있어야 합니다. 자세한 내용은 [Amazon Redshift Spectrum에 대한 IAM 정책](c-spectrum-iam-policies.md) 섹션을 참조하세요.  
다음은 단일 ARN에 대한 CATALOG\$1ROLE 파라미터의 구문을 보여줍니다.  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'
```
역할을 함께 묶어 클러스터가 다른 계정에 속한 다른 IAM 역할을 수임하도록 할 수 있습니다. 최대 10개의 역할을 함께 묶을 수 있습니다. 자세한 내용은 [Amazon Redshift Spectrum에서 IAM 역할 연결](c-spectrum-iam-policies.md#c-spectrum-chaining-roles) 섹션을 참조하세요.  
함께 묶은 역할 목록에 공백을 포함하면 안 됩니다.
다음은 세 역할을 함께 묶기 위한 구문을 나타낸 것입니다.  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role-1-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-2-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-3-name>'
```


CREATE EXTERNAL DATABASE IF NOT EXISTS  
지정된 외부 데이터베이스가 존재하지 않는 경우 DATABASE 인수로 지정된 이름을 가진 외부 데이터베이스를 생성하는 절입니다. 지정된 외부 데이터베이스가 존재하는 경우 이 명령을 실행해도 아무런 변화가 없습니다. 이 경우에는 명령 실행 시 오류 메시지와 함께 종료되지 않고 외부 데이터베이스가 존재한다는 메시지가 반환됩니다.  
CREATE EXTERNAL DATABASE IF NOT EXISTS를 HIVE METASTORE와 함께 사용할 수 없습니다.  
Data Catalog가 AWS Lake Formation에 사용되는 상태에서 CREATE EXTERNAL DATABASE IF NOT EXISTS를 사용하려면 Data Catalog에 대한 `CREATE_DATABASE` 권한이 필요합니다.

CATALOG\$1ID *'Glue 또는 Lake Formation 데이터베이스가 포함된 Amazon Web Services 계정 ID'*  
데이터 카탈로그 데이터베이스가 저장되는 계정 ID입니다.  
`CATALOG_ID`는 다음 중 하나를 설정하여 데이터 카탈로그에 대한 인증 및 권한 부여를 위해 페더레이션형 ID를 사용하여 Amazon Redshift 클러스터 또는 Amazon Redshift Serverless에 연결하려는 경우에만 지정할 수 있습니다.  
+ `CATALOG_ROLE`\$1`'SESSION'`
+ `IAM_ROLE`을 `'SESSION'`으로, `'CATALOG_ROLE'`을 기본값으로 설정 
페더레이션형 ID 단계를 완료하는 방법에 대한 자세한 내용은 [페더레이션형 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)를 참조하세요.

인증  
스트리밍 수집에 대해 정의된 인증 유형입니다. 인증 유형이 있는 스트리밍 수집은 Amazon Managed Streaming for Apache Kafka와 함께 작동합니다. `AUTHENTICATION` 유형은 다음과 같습니다.  
+ **none** - 필요한 인증이 없다고 지정합니다. 이는 Apache Kafka에서 TLS를 사용하는 MSK 또는 일반 텍스트에 대한 인증되지 않은 액세스에 해당합니다.
+ **iam** - IAM 인증을 지정합니다. 이 항목을 선택할 때는 IAM 역할에 IAM 인증 권한이 있는지 확인해야 합니다. 외부 스키마 정의에 대한 자세한 내용은 [Apache Kafka 소스에서 스트리밍 수집 시작하기](materialized-view-streaming-ingestion-getting-started-MSK.md)을 참조하세요.
+ **mtls** - 클라이언트와 서버 간의 인증을 용이하게 하여 상호 전송 계층 보안을 통해 안전한 통신을 제공하도록 지정합니다. 이 경우 클라이언트는 Redshift이고 서버는 Amazon MSK입니다. mTLS를 사용하여 스트리밍 수집 구성에 관한 자세한 내용은 [Apache Kafka 소스에서 Redshift 스트리밍 수집을 위한 mTLS 인증](materialized-view-streaming-ingestion-mtls.md) 섹션을 참조하시기 바랍니다.


AUTHENTICATION\$1ARN  
Amazon Redshift가 Amazon MSK에서 mtls 인증 시 사용하는 AWS Certificate Manager 인증서의 ARN입니다. ARN은 발급된 인증서를 선택하면 ACM 콘솔에서 사용할 수 있습니다.

CLUSTER\$1ARN  
스트리밍 수집의 경우, CLUSTER\$1ARN은 스트리밍 출처인 Amazon Managed Streaming for Apache Kafka 클러스터의 클러스터 식별자입니다. CLUSTER\$1ARN을 사용할 때는 `kafka:GetBootstrapBrokers` 권한이 포함된 IAM 역할 정책이 필요합니다. 이 옵션은 이전 버전과의 호환성을 위해 제공됩니다. 현재 부트스트랩 브로커 URI 옵션을 사용하여 Amazon Managed Streaming for Apache Kafka 클러스터에 연결하는 것이 좋습니다. 자세한 내용은 [스트리밍 수집](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html)을 참조하세요.

## 사용 노트
<a name="r_CREATE_EXTERNAL_SCHEMA_usage"></a>

Athena Data Catalog 사용 시 제한 사항은 AWS 일반 참조의 [Athena 제한 사항](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#amazon-athena-limits)을 참조하세요.

AWS Glue Data Catalog 사용 시 제한 사항은 AWS 일반 참조의 [AWS Glue 제한 사항](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_glue)을 참조하세요.

Hive 메타스토어에는 이러한 제한이 적용되지 않습니다.

데이터베이스당 스키마 수는 최대 9,900개입니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [할당량 및 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.

스키마의 등록을 취소하려면 [DROP SCHEMA](r_DROP_SCHEMA.md) 명령을 사용합니다.

외부 스키마에 대한 세부 정보를 보려면 다음 시스템 보기를 쿼리합니다.
+ [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 
+ [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 
+ [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 

## 예제
<a name="r_CREATE_EXTERNAL_SCHEMA_examples"></a>

다음 예에서는 미국 서부(오레곤)에서 `sampledb`로 명명된 데이터 카탈로그에 있는 데이터베이스를 사용하여 외부 스키마를 생성합니다. 이 예시를 Athena 또는 AWS Glue 데이터 카탈로그와 함께 사용하세요.

```
create external schema spectrum_schema
from data catalog
database 'sampledb'
region 'us-west-2'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

다음 예에서는 외부 스키마를 생성하고 `spectrum_db`로 명명된 새로운 외부 데이터베이스를 생성합니다.

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'
create external database if not exists;
```

다음 예에서는 `hive_db`로 명명된 Hive 메타스토어 데이터베이스를 사용하여 외부 스키마를 생성합니다.

```
create external schema hive_schema
from hive metastore
database 'hive_db'
uri '172.10.10.10' port 99
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

다음 예에서는 Amazon S3 액세스에 `myS3Role` 역할을 사용하고 데이터 카탈로그 액세스에 `myAthenaRole`을 사용하기 위해 역할을 함께 묶습니다. 자세한 내용은 [Amazon Redshift Spectrum에서 IAM 역할 연결](c-spectrum-iam-policies.md#c-spectrum-chaining-roles) 섹션을 참조하세요.

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myRedshiftRole,arn:aws:iam::123456789012:role/myS3Role'
catalog_role 'arn:aws:iam::123456789012:role/myAthenaRole'
create external database if not exists;
```

다음 예에서는 외부 Aurora PostgreSQL 데이터베이스를 참조하는 외부 스키마를 생성합니다.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM POSTGRES
DATABASE 'my_aurora_db' SCHEMA 'my_aurora_schema'
URI 'endpoint to aurora hostname' PORT 5432  
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

다음 예에서는 소비자 클러스터에서 가져온 sales\$1db를 참조하는 외부 스키마를 생성합니다.

```
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
```

다음 예에서는 외부 Aurora MySQL 데이터베이스를 참조하는 외부 스키마를 생성합니다.

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM MYSQL
DATABASE 'my_aurora_db'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

# CREATE EXTERNAL TABLE
<a name="r_CREATE_EXTERNAL_TABLE"></a>

지정된 스키마에서 새 외부 테이블을 생성합니다. 모든 외부 테이블은 외부 스키마에 생성해야 합니다. 외부 스키마와 외부 테이블에 대해서는 검색 경로가 지원되지 않습니다. 자세한 내용은 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 섹션을 참조하세요.

CREATE EXTERNAL TABLE 명령을 사용하여 생성되는 외부 테이블 외에도 Amazon Redshift는 AWS Glue 또는 AWS Lake Formation 카탈로그나 Apache Hive 메타스토어에 정의된 외부 테이블을 참조할 수 있습니다. [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 명령을 사용하면 외부 카탈로그에 정의된 외부 데이터베이스를 등록하고 Amazon Redshift에서 외부 테이블을 사용하도록 할 수 있습니다. AWS Glue 또는 AWS Lake Formation 카탈로그 또는 Hive 메타스토어에 외부 테이블이 존재하는 경우 CREATE EXTERNAL TABLE을 사용하여 테이블을 생성하지 않아도 됩니다. 외부 테이블을 보려면 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 시스템 뷰를 쿼리하세요.

CREATE EXTERNAL TABLE AS 명령을 실행하여 쿼리의 열 정의를 기반으로 외부 테이블을 생성하고 해당 쿼리의 결과를 Amazon S3에 작성할 수 있습니다. 결과는 Apache Parquet 또는 구분된 텍스트 형식입니다. 외부 테이블에 파티션 키가 있는 경우 Amazon Redshift는 해당 파티션 키에 따라 새 파일을 분할하고 새 파티션을 외부 카탈로그에 자동으로 등록합니다. CREATE EXTERNAL TABLE AS에 대한 자세한 내용은 [사용 노트](r_CREATE_EXTERNAL_TABLE_usage.md) 섹션을 참조하세요.

다른 Amazon Redshift 테이블에 사용하는 것과 같은 SELECT 구문을 사용하여 외부 테이블을 쿼리할 수 있습니다. INSERT 구문을 사용하여 Amazon S3의 외부 테이블 위치에 새 파일을 작성할 수도 있습니다. 자세한 내용은 [INSERT(외부 테이블)](r_INSERT_external_table.md) 섹션을 참조하세요.

외부 테이블로 보기를 새로 만들려면 [CREATE VIEW](r_CREATE_VIEW.md) 문에 WITH NO SCHEMA BINDING 절을 포함시키세요.

트랜잭션(BEGIN … END) 내에서 CREATE EXTERNAL TABLE을 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_EXTERNAL_TABLE-privileges"></a>

외부 테이블을 생성하려면 외부 스키마의 소유자이거나 수퍼유저여야 합니다. 외부 스키마의 소유권을 이전하려면 ALTER SCHEMA를 사용해 소유자를 변경합니다. 외부 테이블에 대한 액세스는 외부 스키마에 대한 액세스에 의해 제어됩니다. 외부 테이블에 대한 권한을 [GRANT](r_GRANT.md) 또는 [REVOKE](r_REVOKE.md)할 수 없습니다. 대신에, 외부 스키마에 대한 USAGE를 허용하거나 취소합니다.

[사용 노트](r_CREATE_EXTERNAL_TABLE_usage.md)에는 외부 테이블의 특정 권한에 대한 추가 정보가 있습니다.

## 구문
<a name="r_CREATE_EXTERNAL_TABLE-synopsis"></a>

```
CREATE EXTERNAL TABLE
external_schema.table_name
(column_name data_type [, …] )
[ PARTITIONED BY (col_name data_type [, … ] )]
[ { ROW FORMAT DELIMITED row_format |
  ROW FORMAT SERDE 'serde_name'
  [ WITH SERDEPROPERTIES ( 'property_name' = 'property_value' [, ...] ) ] } ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
```

다음은 CREATE EXTERNAL TABLE AS의 구문입니다.

```
CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [, … ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
```

## 파라미터
<a name="r_CREATE_EXTERNAL_TABLE-parameters"></a>

 *external\$1schema.table\$1name*   
생성한 후 외부 스키마 이름으로 정규화할 테이블의 이름입니다. 외부 테이블은 외부 스키마에 생성해야 합니다. 자세한 내용은 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 섹션을 참조하세요.  
테이블 이름의 최대 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 최대 4바이트까지 UTF-8 멀티바이트 문자를 사용할 수 있습니다. Amazon Redshift는 사용자 정의 임시 테이블과 쿼리 처리 또는 시스템 유지 관리 중에 Amazon Redshift에서 생성한 임시 테이블을 포함하여 클러스터당 테이블을 9,900개로 제한합니다. 선택적으로, 데이터베이스 이름으로 테이블 이름을 정규화할 수 있습니다. 다음 예에서는 데이터베이스 이름이 `spectrum_db`이고, 외부 스키마 이름은 `spectrum_schema`이며, 테이블 이름은 `test`입니다.  

```
create external table spectrum_db.spectrum_schema.test (c1 int)
stored as parquet
location 's3://amzn-s3-demo-bucket/myfolder/';
```
지정된 데이터베이스 또는 스키마가 존재하지 않는 경우 테이블이 생성되지 않으며, 이 명령문은 오류를 반환합니다. 시스템 데이터베이스 `template0`, `template1`, `padb_harvest` 또는 `sys:internal`에서 테이블 또는 뷰를 생성할 수 없습니다.  
테이블 이름은 지정된 스키마에 대한 고유한 이름이어야 합니다.  
유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

( *column\$1name* *data\$1type* )  
생성되는 각 열의 이름과 데이터 형식입니다.  
열 이름의 최대 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 최대 4바이트까지 UTF-8 멀티바이트 문자를 사용할 수 있습니다. 열 이름 `"$path"` 또는 `"$size"`는 지정할 수 없습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
기본적으로 Amazon Redshift에서는 가상 열 `$path` 및 `$size`가 있는 외부 테이블을 생성합니다. `spectrum_enable_pseudo_columns` 구성 파라미터를 `false`로 설정하여 세션에 대해 가상 열 생성을 비활성화할 수 있습니다. 자세한 내용은 [가상 열](r_CREATE_EXTERNAL_TABLE_usage.md#r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns) 섹션을 참조하세요.  
가상 열이 활성화되어 있으면 단일 테이블에서 정의할 수 있는 최대 열 개수는 1,598개입니다. 가상 열이 활성화되어 있지 않으면 테이블 하나에서 정의할 수 있는 최대 열 개수는 1,600개입니다.  
"넓은 테이블"을 생성할 경우에는 로드 및 쿼리 처리 중에 열의 목록이 중간 결과에 대한 행 너비 경계를 초과하지 않도록 주의하세요. 자세한 내용은 [사용 노트](r_CREATE_TABLE_NEW.md#r_CREATE_TABLE_usage) 섹션을 참조하세요.  
CREATE EXTERNAL TABLE AS 명령의 경우 열이 쿼리에서 파생되기 때문에 열 목록이 필요하지 않습니다.

 *data\$1type*   
다음 모듈을 지원합니다.[데이터 타입](c_Supported_data_types.md)  
+ SMALLINT (INT2)
+ INTEGER (INT, INT4)
+ BIGINT (INT8)
+ DECIMAL (NUMERIC)
+ REAL (FLOAT4)
+ DOUBLE PRECISION (FLOAT8)
+ BOOLEAN (BOOL)
+ CHAR (CHARACTER)
+ VARCHAR (CHARACTER VARYING)
+ VARBYTE(문자 가변) - Parquet 및 ORC 데이터 파일과 함께 사용할 수 있으며 비분할 테이블에만 사용할 수 있습니다.
+ DATE - 텍스트, Parquet 또는 ORC 데이터 파일과 함께 또는 파티션 열로만 사용할 수 있습니다.
+ TIMESTAMP
  
DATE의 경우 다음과 같은 형식을 사용할 수 있습니다. 숫자를 사용하여 표시되는 월 값의 경우 다음 형식이 지원됩니다.  
+ `mm-dd-yyyy` 예: `05-01-2017`. 이 값이 기본값입니다.
+ `yyyy-mm-dd` - 여기서 연도는 2자리 이상의 숫자로 표시됩니다. 예를 들어 `2017-05-01`입니다.
세 글자 약어를 사용하여 표시되는 월 값의 경우 다음 형식이 지원됩니다.  
+ `mmm-dd-yyyy` 예: `may-01-2017`. 이 값이 기본값입니다.
+ `dd-mmm-yyyy` - 여기서 연도는 2자리 이상의 숫자로 표시됩니다. 예를 들어 `01-may-2017`입니다.
+ `yyyy-mmm-dd` - 여기서 연도는 2자리 이상의 숫자로 표시됩니다. 예를 들어 `2017-may-01`입니다.
지속적으로 100보다 작은 연도 값의 경우 연도는 다음 방식으로 계산됩니다.  
+ 연도가 70보다 작은 경우 연도는 연도에 2000을 더한 값으로 계산됩니다. 예를 들어 `mm-dd-yyyy` 형식의 날짜 05-01-17은 `05-01-2017`로 변환됩니다.
+ 연도가 100보다 작고 69보다 큰 경우 연도는 연도에 1900을 더한 값으로 계산됩니다. 예를 들어 `mm-dd-yyyy` 형식의 날짜 05-01-89는 `05-01-1989`로 변환됩니다.
+ 2자리로 표시되는 연도 값의 경우 앞에 0을 추가하여 연도를 4자리로 표시합니다.
타임스탬프 값 `yyyy-mm-dd HH:mm:ss.SSSSSS`에서 볼 수 있듯이, 텍스트 파일의 타임스탬프 값은 `2017-05-01 11:30:59.000000` 형식이어야 합니다.  
VARCHAR 열의 길이 단위는 문자 수가 아니라 바이트로 정의됩니다. 예를 들어 VARCHAR(12) 열에는 단일 바이트 문자 12개, 2바이트 문자 6개가 포함될 수 있습니다. 외부 테이블을 쿼리하는 경우 오류를 반환하지 않고 정의된 열 크기에 맞춰 결과가 잘립니다. 자세한 내용은 [스토리지 및 범위](r_Character_types.md#r_Character_types-storage-and-ranges) 섹션을 참조하세요.  
최상의 성능을 위해 데이터에 맞춰 가장 작은 열 크기를 지정하는 것이 좋습니다. 열의 값에 대한 최대 크기(바이트)를 찾으려면 [OCTET\$1LENGTH](r_OCTET_LENGTH.md) 함수를 사용하세요. 다음 예에서는 이메일 열 값의 최대 크기를 반환합니다.  

```
select max(octet_length(email)) from users;

max
---
 62
```

PARTITIONED BY (*col\$1name* *data\$1type* [, … ] )  
하나 이상의 파티션 열로 분할된 테이블을 정의하는 절입니다. 지정된 각각의 조합에 별개의 데이터 디렉터리가 사용되어 상황에 따라 쿼리 성능을 개선할 수 있습니다. 분할된 열은 테이블 데이터 자체 내에는 존재하지 않습니다. 테이블 열과 동일한 *col\$1name*에 대한 값을 사용하는 경우 오류가 발생합니다.  
분할된 테이블을 생성한 후 [ALTER TABLE](r_ALTER_TABLE.md) ... ADD PARTITION 문을 사용하여 테이블을 변경하여 새 파티션을 외부 카탈로그에 등록합니다. 파티션을 추가할 때 Amazon S3에서 파티션 데이터가 들어 있는 하위 폴더의 위치를 정의합니다.  
예를 들어, 테이블 `spectrum.lineitem_part`가 `PARTITIONED BY (l_shipdate date)`로 정의되어 있는 경우 다음 ALTER TABLE 명령을 실행하여 파티션을 추가합니다.  

```
ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29')
LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';
```
CREATE EXTERNAL TABLE AS를 사용하는 경우 ALTER TABLE...ADD PARTITION을 실행할 필요가 없습니다. Amazon Redshift는 외부 카탈로그에 새 파티션을 자동으로 등록합니다. 또한 Amazon Redshift는 테이블에 정의된 파티션 키를 기반으로 Amazon S3의 파티션에 해당 데이터를 자동으로 씁니다.  
파티션을 보려면 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 시스템 뷰를 쿼리하세요.  
CREATE EXTERNAL TABLE AS 명령의 경우 이 열은 쿼리에서 파생되므로 파티션 열의 데이터 형식을 지정할 필요가 없습니다.

ROW FORMAT DELIMITED *rowformat*  
기본 데이터의 형식을 지정하는 절입니다. *rowformat*에 가능한 값은 다음과 같습니다.  
+ LINES TERMINATED BY '*delimiter*'
+ FIELDS TERMINATED BY '*delimiter*'
'*delimiter*'에 단일 ASCII 문자를 지정합니다. 8진수 문자를 사용해 인쇄되지 않는 ASCII 문자를 `'\`*`ddd`*`'` 형식으로 지정할 수 있습니다. 여기서 *`d`*는 최대 ‘\$1177’까지의 8진수(0\$17)입니다. 다음은 8진수 문자를 사용하여 BEL(bell) 문자를 지정하는 예입니다.  

```
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
```
ROW FORMAT이 생략된 경우 기본 형식은 '\$1A(제목 시작)'로 종료되는 구분된 필드와 '\$1n(줄 바꿈)'으로 종료되는 행입니다.

ROW FORMAT SERDE '*serde\$1name*'[WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
기본 데이터의 SERDE 형식을 지정하는 절입니다.    
'*serde\$1name*'  
SerDe의 이름입니다. 다음 형식을 지정할 수 있습니다.  
+ org.apache.hadoop.hive.serde2.RegexSerDe 
+ com.amazonaws.glue.serde.GrokSerDe 
+ org.apache.hadoop.hive.serde2.OpenCSVSerde 

  이 파라미터는 OpenCSVSerde에 대해 다음 SerDe 속성을 지원합니다.

  ```
  'wholeFile' = 'true' 
  ```

  `wholeFile` 속성을 `true`로 설정하여 OpenCSV 요청에 대해 따옴표로 묶인 문자열 내의 줄 바꿈 문자(\$1in)를 적절하게 구문 분석합니다.
+ org.openx.data.jsonserde.JsonSerDe
  + JSON SERDE는 또한 Ion 파일을 지원합니다.
  + JSON은 올바른 형식을 따라야 합니다.
  + Ion 및 JSON 타임스탬프에서는 ISO8601 형식을 사용해야 합니다.
  + 이 파라미터는 JsonSerDe에 대해 다음 SerDe 속성을 지원합니다.

    ```
    'strip.outer.array'='true' 
    ```

    마치 배열 내에 여러 JSON 레코드가 포함되어 있는 것처럼 대괄호( [ … ] )로 둘러싸인 매우 큰 배열 하나가 포함된 Ion/JSON 파일을 처리합니다.
+ com.amazon.ionhiveserde.IonHiveSerDe

  Amazon ION 형식은 데이터 유형 외에도 텍스트 및 이진 형식을 제공합니다. ION 형식의 데이터를 참조하는 외부 테이블의 경우 외부 테이블의 각 열을 ION 형식 데이터의 해당 요소에 매핑합니다. 자세한 내용은 [Amazon Ion](https://amzn.github.io/ion-docs/)을 참조하세요. 또한 입력 및 출력 형식을 지정해야 합니다.  
WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
경우에 따라 쉼표로 구분된 속성 값 및 이름을 지정합니다.
ROW FORMAT이 생략된 경우 기본 형식은 '\$1A(제목 시작)'로 종료되는 구분된 필드와 '\$1n(줄 바꿈)'으로 종료되는 행입니다.

STORED AS *file\$1format*  
데이터 파일의 파일 형식입니다.  
유효한 형식은 다음과 같습니다.  
+ PARQUET
+ RCFILE(LazyBinaryColumnarSerDe가 아니라 ColumnarSerDe만 사용하는 데이터의 경우)
+ SEQUENCEFILE
+ TEXTFILE(JSON 파일을 포함한 텍스트 파일의 경우)
+ ORC 
+ AVRO 
+ INPUTFORMAT '*input\$1format\$1classname*' OUTPUTFORMAT '*output\$1format\$1classname*'
CREATE EXTERNAL TABLE AS 명령은 두 가지 파일 형식, 즉 TEXTFILE 및 PARQUET를 지원합니다.  
INPUTFORMAT과 OUTPUTFORMAT에 대해 다음 예에 나온 것처럼 클래스 이름을 지정합니다.  

```
'org.apache.hadoop.mapred.TextInputFormat'
```

LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*'\$1  <a name="create-external-table-location"></a>
데이터 파일이 포함된 Amazon S3 버킷 또는 폴더, 혹은 Amazon S3 객체 경로 목록이 포함된 매니페스트 파일까지의 경로. 버킷은 Amazon Redshift 클러스터와 동일한 AWS 리전에 있어야 합니다. 지원되는 AWS 리전 목록은 [Amazon Redshift Spectrum 제한 사항](c-spectrum-considerations.md) 섹션을 참조하세요.  
경로가 버킷 또는 폴더를 지정하는 경우(예: `'s3://amzn-s3-demo-bucket/custdata/'`) Redshift Spectrum은 지정된 버킷 또는 폴더와 모든 하위 폴더에서 파일을 스캔합니다. Redshift Spectrum은 마침표나 밑줄로 시작되는 숨겨진 파일과 파일을 무시합니다.  
경로가 매니페스트 파일을 지정하는 경우 `'s3://bucket/manifest_file'` 인수는 단일 파일을 명시적으로 참조해야 합니다(예: `'s3://amzn-s3-demo-bucket/manifest.txt'`). 키 접두사를 참조할 수는 없습니다.  
매니페스트란 Amazon S3에서 로드할 개별 파일의 URL과 파일 크기(단위: 바이트)를 JSON 형식으로 나열한 텍스트 파일을 말합니다. URL에는 파일의 버킷 이름과 전체 객체 경로가 포함됩니다. 매니페스트에서 지정되는 파일이 서로 다른 버킷에 있을 수 있지만 모든 버킷은 Amazon Redshift 클러스터와 동일한 AWS 리전에 속해야 합니다. 파일이 두 번 나열되면 마찬가지로 두 번 로드됩니다. 다음은 3개의 파일을 로드하는 매니페스트의 JSON 형식을 나타낸 예입니다.  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
특정 파일의 포함을 필수로 설정할 수 있습니다. 이렇게 하려면 매니페스트의 파일 수준에서 `mandatory` 옵션을 포함시킵니다. 누락된 필수 파일이 있는 외부 테이블을 쿼리하면 SELECT 문이 실패합니다. 외부 테이블 정의에 포함된 모든 파일이 있는지 확인합니다. 모든 파일이 없으면 찾을 수 없는 첫 번째 필수 파일을 표시하는 오류가 나타납니다. 다음은 `mandatory` 옵션이 `true`로 설정된 매니페스트의 JSON 형식을 나타낸 예입니다.  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "mandatory":true, "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "mandatory":false, "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
UNLOAD를 사용하여 만든 파일을 참조하기 위해 MANIFEST 파라미터와 함께 [UNLOAD](r_UNLOAD.md)를 사용하여 만든 매니페스트를 사용할 수 있습니다. 이 매니페스트 파일은 [Amazon S3에서 COPY](copy-parameters-data-source-s3.md)의 매니페스트 파일과 호환되지만 사용하는 키는 다릅니다. 사용되지 않는 키는 무시됩니다.

TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*' [, ...] )   
테이블 속성의 테이블 정의를 설정하는 절입니다.  
테이블 속성은 대/소문자를 구분합니다.  
 'compression\$1type'='*value*'  
 파일 이름에 확장자가 포함되지 않은 경우에 사용할 압축 유형을 설정하는 속성입니다. 이 속성을 설정하고 파일 확장자가 존재하는 경우 확장자를 무시하고 속성이 설정한 값을 사용합니다. 압축 유형에 유효한 값은 다음과 같습니다.  
+ bzip2
+ gzip
+ 없음
+ gzip  
'data\$1cleansing\$1enabled'='true / false’  
이 속성은 테이블에 대해 데이터 처리가 켜져 있는지 여부를 설정합니다. 'data\$1cleansing\$1enabled'가 true로 설정되어 있으면 테이블에 대한 데이터 처리가 켜져 있는 것입니다. 'data\$1cleansing\$1enabled'가 false로 설정되어 있으면 테이블에 대한 데이터 처리가 꺼져 있는 것입니다. 이 속성으로 제어되는 테이블 수준 데이터 처리 속성 목록은 다음과 같습니다.  
+ column\$1count\$1mismatch\$1handling
+ invalid\$1char\$1handling
+ numeric\$1overflow\$1handling
+ replacement\$1char
+ surplus\$1char\$1handling
예시는 [데이터 처리 예](r_CREATE_EXTERNAL_TABLE_examples.md#r_CREATE_EXTERNAL_TABLE_examples-data-handling) 섹션을 참조하세요.  
'invalid\$1char\$1handling'='*value*'  
쿼리 결과에 잘못된 UTF-8 문자 값이 포함된 경우 수행할 작업을 지정합니다. 다음 작업을 지정할 수 있습니다.    
DISABLED  
잘못된 문자 처리를 수행하지 않습니다.  
FAIL  
잘못된 UTF-8 값이 포함된 데이터를 반환하는 쿼리를 취소합니다.  
SET\$1TO\$1NULL   
잘못된 UTF-8 값을 null로 바꿉니다.  
DROP\$1ROW  
행의 각 값을 null로 바꿉니다.  
REPLACE  
잘못된 문자를 `replacement_char`을 사용하여 지정한 대체 문자열로 바꿉니다.  
'replacement\$1char'='*character*’  
`invalid_char_handling`을 `REPLACE`로 설정할 경우 사용할 대체 문자를 지정합니다.  
'numeric\$1overflow\$1handling'='value’  
ORC 데이터에 열 정의(예: SMALLINT 또는 int16)보다 큰 정수(예: BIGINT 또는 int64)가 포함된 경우 수행할 작업을 지정합니다. 다음 작업을 지정할 수 있습니다.    
DISABLED  
잘못된 문자 처리가 꺼져 있습니다.  
FAIL  
데이터에 잘못된 문자가 포함된 경우 쿼리를 취소합니다.  
SET\$1TO\$1NULL  
잘못된 문자를 null로 설정합니다.  
DROP\$1ROW  
행의 각 값을 null로 설정합니다.  
'surplus\$1bytes\$1handling'='value'**  
VARBYTE 데이터를 포함하는 열에 대해 정의된 데이터 형식의 길이를 초과하는 데이터 로드를 처리하는 방법을 지정합니다. 기본적으로 Redshift Spectrum에서는 열의 너비를 초과하는 데이터에 대해 값을 null로 설정합니다.  
쿼리가 데이터 형식의 길이를 초과하는 데이터를 반환하는 경우 수행할 다음 작업을 지정할 수 있습니다.    
SET\$1TO\$1NULL  
열 너비를 초과하는 데이터를 null로 바꿉니다.  
DISABLED  
잉여 바이트 처리를 수행하지 않습니다.  
FAIL  
열 너비를 초과하는 데이터를 반환하는 쿼리를 취소합니다.  
DROP\$1ROW  
열 너비를 초과하는 데이터가 포함된 모든 행을 삭제합니다.  
TRUNCATE  
열에 정의된 최대 문자 수를 초과하는 문자를 제거합니다.  
'surplus\$1char\$1handling'='*value*'  
VARCHAR, CHAR 또는 문자열 데이터를 포함하는 열에 대해 정의된 데이터 형식의 길이를 초과하는 데이터 로드를 처리하는 방법을 지정합니다. 기본적으로 Redshift Spectrum에서는 열의 너비를 초과하는 데이터에 대해 값을 null로 설정합니다.  
쿼리가 열 너비를 초과하는 데이터를 반환하는 경우 수행할 다음 작업을 지정할 수 있습니다.    
SET\$1TO\$1NULL  
열 너비를 초과하는 데이터를 null로 바꿉니다.  
DISABLED  
잉여 문자 처리를 수행하지 않습니다.  
FAIL  
열 너비를 초과하는 데이터를 반환하는 쿼리를 취소합니다.  
DROP\$1ROW  
행의 각 값을 null로 바꿉니다.  
TRUNCATE  
열에 정의된 최대 문자 수를 초과하는 문자를 제거합니다.  
'column\$1count\$1mismatch\$1handling'='value’  
파일에 포함된 행 값이 외부 테이블 정의에 지정된 열 수보다 적거나 많은지 식별합니다. 이 속성은 압축되지 않은 텍스트 파일 형식에만 사용할 수 있습니다. 다음 작업을 지정할 수 있습니다.    
DISABLED  
열 개수 불일치 처리가 꺼져 있습니다.  
FAIL  
열 개수 불일치가 감지되면 쿼리에 실패합니다.  
SET\$1TO\$1NULL  
누락된 값을 NULL로 채우고 각 행의 추가 값을 무시합니다.  
DROP\$1ROW  
열 수 불일치 오류가 포함된 모든 행을 스캔에서 삭제합니다.  
'numRows'='*row\$1count*'  
테이블 정의를 위해 numRows 값을 설정하는 속성입니다. 외부 테이블의 통계를 명시적으로 업데이트하려면 테이블의 크기를 나타내도록 numRows 속성을 설정합니다. Amazon Redshift는 쿼리 옵티마이저가 쿼리 계획을 생성하는 데 사용하는 테이블 통계를 생성하기 위해 외부 테이블을 분석하지 않습니다. 따라서 외부 테이블에 대한 테이블 통계가 준비되어 있지 않으면 Amazon Redshift가 외부 테이블이 더 큰 테이블이고 로컬 테이블이 더 작은 테이블이라는 가정에 기초하여 쿼리 실행 계획을 생성합니다.  
'skip.header.line.count'='*line\$1count*'  
각 원본 파일의 시작 부분에서 건너 뛸 행 개수를 설정하는 속성입니다.  
'serialization.null.format'=' '  
필드에 제공된 텍스트와 정확히 일치하는 항목이 있는 경우 Spectrum을 지정하는 속성은 `NULL` 값을 반환해야 합니다.  
'orc.schema.resolution'='mapping\$1type'  
ORC 데이터 형식을 사용하는 테이블의 열 매핑 유형을 설정하는 속성입니다. 모든 데이터 형식의 경우 이 속성은 무시됩니다.  
열 매핑 유형에 유효한 값은 다음과 같습니다.  
+ 이름 
+ position 
*orc.schema.resolution* 속성을 생략하면 열이 기본적으로 이름별로 매핑됩니다. *orc.schema.resolution*을 *'name'* 또는 *'position'* 이외 값으로 설정하면 열은 위치별로 매핑됩니다. 열 매핑에 대한 자세한 내용은 [외부 테이블 열을 ORC 열에 매핑](c-spectrum-external-tables.md#c-spectrum-column-mapping-orc) 섹션을 참조하세요.  
COPY 명령은 반드시 위치를 기준으로 ORC 데이터 파일에 매핑됩니다. *orc.schema.resolution* 테이블 속성은 COPY 명령 동작에 영향을 주지 않습니다.  
'write.parallel'='on / off’  
CREATE EXTERNAL TABLE AS가 병렬 방식으로 데이터를 작성해야 하는지 여부를 설정하는 속성입니다. 기본적으로 CREATE EXTERNAL TABLE AS는 클러스터의 조각 수에 따라 다수의 파일에 병렬 방식으로 데이터를 작성합니다. 기본 옵션은 on입니다. 'write.parallel'이 꺼짐으로 설정되면 CREATE EXTERNAL TABLE AS는 Amazon S3의 하나 이상의 데이터 파일에 순차적으로 작성합니다. 이 테이블 속성은 동일한 외부 테이블의 모든 후속 INSERT 문에도 적용됩니다.  
‘write.maxfilesize.mb’=‘size’  
CREATE EXTERNAL TABLE AS에 의해 Amazon S3에 작성된 각 파일의 최대 크기(MB)를 설정하는 속성입니다. 크기는 5에서 6200 사이의 유효한 정수여야 합니다. 기본 최대 파일 크기는 6,200MB입니다. 이 테이블 속성은 동일한 외부 테이블의 모든 후속 INSERT 문에도 적용됩니다.  
‘write.kms.key.id’=‘*value*’  
AWS Key Management Service 키를 지정하여 Amazon S3 객체에 대해 서버 측 암호화(SSE)를 사용할 수 있습니다. 여기서 *값*은 다음 중 하나입니다.  
+ `auto` - Amazon S3 버킷에 저장된 기본 AWS KMS 키를 사용합니다.
+ 데이터를 암호화하기 위해 지정하는 *kms-key*입니다.  
*select\$1statement*  
쿼리를 정의하여 외부 테이블에 하나 이상의 행을 삽입하는 문입니다. 쿼리가 생성하는 모든 행은 테이블 정의에 따라 텍스트 또는 Parquet 형식으로 Amazon S3에 작성됩니다.

## 예제
<a name="r_CREATE_EXTERNAL_TABLE_examples_link"></a>

예제 모음은 [예제](r_CREATE_EXTERNAL_TABLE_examples.md)에서 확인할 수 있습니다.

# 사용 노트
<a name="r_CREATE_EXTERNAL_TABLE_usage"></a>

이 주제에는 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)에 대한 사용 참고 사항이 포함되어 있습니다. [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md), [STV\$1TBL\$1PERM](r_STV_TBL_PERM.md), PG\$1CLASS 또는 information\$1schema와 같은 표준 Amazon Redshift 테이블에 사용하는 것과 동일한 리소스를 사용하여 Amazon Redshift Spectrum 테이블에 대한 세부 정보를 볼 수 없습니다. 비즈니스 인텔리전스 또는 분석 도구가 Redshift Spectrum 외부 테이블을 인식하지 못하는 경우 애플리케이션이 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 및 [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md)를 쿼리하도록 구성합니다.

## CREATE EXTERNAL TABLE AS
<a name="r_CETAS"></a>

경우에 따라 AWS Glue Data Catalog, AWS Lake Formation 외부 카탈로그 또는 Apache Hive 메타스토어에 대해 CREATE EXTERNAL TABLE AS 명령을 실행할 수 있습니다. 이러한 경우 AWS Identity and Access Management(IAM) 역할을 사용하여 외부 스키마를 생성합니다. 이 IAM 역할에는 Amazon S3에 대한 읽기 및 쓰기 권한이 모두 있어야 합니다.

Lake Formation 카탈로그를 사용하는 경우 IAM 역할에 카탈로그에서 테이블을 생성할 수 있는 권한이 있어야 합니다. 이 경우 대상 Amazon S3 경로에 대한 데이터 레이크 위치 권한도 있어야 합니다. 이 IAM 역할은 새 AWS Lake Formation 테이블의 소유자가 됩니다.

파일 이름이 고유한지 확인하기 위해 Amazon Redshift에서는 기본적으로 Amazon S3에 업로드된 각 파일의 이름에 다음 형식을 사용합니다.

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

 예를 들면, `20200303_004509_810669_1007_0001_part_00.parquet`입니다.

CREATE EXTERNAL TABLE AS 명령을 실행할 때 다음 사항을 고려하세요.
+ Amazon S3 위치는 비어 있어야 합니다.
+ Amazon Redshift는 STORED AS 절을 사용할 때만 PARQUET 및 TEXTFILE 형식을 지원합니다.
+ 열 정의 목록을 정의할 필요가 없습니다. 새 외부 테이블의 열 이름과 열 데이터 형식은 SELECT 쿼리에서 직접 파생됩니다.
+ PARTITIONED BY 절에서 파티션 열의 데이터 형식을 정의할 필요가 없습니다. 파티션 키를 지정하는 경우 SELECT 쿼리 결과에 이 열의 이름이 있어야 합니다. 여러 파티션 열이 있는 경우 SELECT 쿼리의 순서는 중요하지 않습니다. Amazon Redshift는 PARTITIONED BY 절에 정의된 순서를 사용하여 외부 테이블을 생성합니다.
+ Amazon Redshift는 파티션 키 값에 따라 출력 파일을 파티션 폴더로 자동으로 분할합니다. 기본적으로 Amazon Redshift는 출력 파일에서 파티션 열을 제거합니다.
+ LINES TERMINATED BY 'delimiter' 절은 지원되지 않습니다.
+ ROW FORMAT SERDE 'serde\$1name' 절은 지원되지 않습니다.
+ 매니페스트 파일의 사용은 지원되지 않습니다. 따라서 Amazon S3에서 매니페스트 파일에 LOCATION 절을 정의할 수 없습니다.
+ Amazon Redshift는 명령 끝에서 'numRows' 테이블 속성을 자동으로 업데이트합니다.
+ 'compression\$1type' 테이블 속성은 PARQUET 파일 형식에 대해 'none' 또는 'snappy'만 사용할 수 있습니다.
+ Amazon Redshift는 외부 SELECT 쿼리에서 LIMIT 절을 허용하지 않습니다. 대신 중첩된 LIMIT 절을 사용할 수 있습니다.
+ STL\$1UNLOAD\$1LOG를 사용하여 각 CREATE EXTERNAL TABLE AS 작업에 의해 Amazon S3에 작성된 파일을 추적할 수 있습니다.

## 외부 테이블 생성 및 쿼리 권한
<a name="r_CREATE_EXTERNAL_TABLE_usage-permissions"></a>

외부 테이블을 생성하려면 외부 스키마의 소유자 또는 수퍼유저인지 확인하세요. 외부 스키마의 소유권을 이전하려면 [ALTER SCHEMA](r_ALTER_SCHEMA.md)를 사용합니다. 다음 예에서는`spectrum_schema` 스키마의 소유자를 `newowner`로 바꿉니다.

```
alter schema spectrum_schema owner to newowner;
```

Redshift Spectrum 쿼리를 실행하는 데 필요한 권한은 다음과 같습니다.
+ 스키마에 대한 사용 권한 
+ 현재 데이터베이스에서 임시 테이블을 생성할 수 있는 권한 

다음 예에서는 `spectrum_schema` 스키마에 대한 사용 권한을 `spectrumusers` 사용자 그룹에 부여합니다.

```
grant usage on schema spectrum_schema to group spectrumusers;
```

다음 예에서는 `spectrumdb` 데이터베이스에 대한 임시 권한을 `spectrumusers` 사용자 그룹에 부여합니다.

```
grant temp on database spectrumdb to group spectrumusers;
```

## 가상 열
<a name="r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns"></a>

기본적으로 Amazon Redshift에서는 가상 열 *\$1path* 및 *\$1size*가 있는 외부 테이블을 생성합니다. 이러한 열을 선택하면 Amazon S3에 있는 데이터 파일의 경로와 쿼리에서 반환한 각 열에 대한 데이터 파일의 크기를 확인할 수 있습니다. *\$1path* 및 *\$1size* 열 이름은 큰 따옴표로 구분해야 합니다. *SELECT \$1* 절은 가상 열을 반환하지 않습니다. 다음 예에서처럼 쿼리에 *\$1path* 및 *\$1size* 열을 명시적으로 포함해야 합니다.

```
select "$path", "$size"
from spectrum.sales_part
where saledate = '2008-12-01';
```

*spectrum\$1enable\$1pseudo\$1columns* 구성 파라미터를 *false*로 설정하여 세션에 대해 가상 열 생성을 비활성화할 수 있습니다.

**중요**  
*\$1size* 또는 *\$1path*를 선택하면 Redshift Spectrum이 Amazon S3의 데이터 파일을 스캔해 결과 집합의 크기를 결정하기 때문에 요금이 발생합니다. 자세한 내용은 [Amazon Redshift Pricing](https://aws.amazon.com/redshift/pricing/)(Amazon Redshift 요금) 섹션을 참조하세요.

## 데이터 처리 옵션 설정
<a name="r_CREATE_EXTERNAL_TABLE_usage-data-handling"></a>

테이블 파라미터를 설정하여 외부 테이블에서 쿼리되는 다음을 비롯한 데이터의 입력 처리를 지정할 수 있습니다.
+ VARCHAR, CHAR 및 문자열 데이터를 포함하는 열의 잉여 문자. 자세한 내용은 외부 테이블 속성 `surplus_char_handling` 섹션을 참조하세요.
+ VARCHAR, CHAR 및 문자열 데이터를 포함하는 열의 잘못된 문자. 자세한 내용은 외부 테이블 속성 `invalid_char_handling` 섹션을 참조하세요.
+ 외부 테이블 속성 `invalid_char_handling`에 REPLACE를 지정하는 경우 사용할 대체 문자.
+ 정수 및 십진수 데이터가 포함된 열에서 캐스트 오버플로우 처리 자세한 내용은 외부 테이블 속성 `numeric_overflow_handling` 섹션을 참조하세요.
+ Surplus\$1bytes\$1handling은 varbyte 데이터를 포함하는 열의 잉여 바이트에 대한 입력 처리를 지정합니다. 자세한 내용은 외부 테이블 속성 `surplus_bytes_handling` 섹션을 참조하세요.

# 예제
<a name="r_CREATE_EXTERNAL_TABLE_examples"></a>

다음 예에서는 `spectrum`이라는 Amazon Redshift 외부 스키마에서 SALES로 명명된 테이블을 생성합니다. 데이터는 탭으로 구분된 텍스트 파일입니다. TABLE PROPERTIES 절은 numRows 속성을 170,000개 행으로 설정합니다.

CREATE EXTERNAL TABLE을 실행할 때 사용하는 자격 증명에 따라 구성해야 하는 IAM 권한이 있을 수 있습니다. 가장 좋은 방법은 권한 정책을 IAM 역할에 연결한 다음 필요에 따라 사용자 및 그룹에 할당하는 것입니다. 자세한 내용은 [Amazon Redshift의 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)를 참조하세요.

```
create external table spectrum.sales(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
saledate date,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
row format delimited
fields terminated by '\t'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales/'
table properties ('numRows'='170000');
```

다음 예에서는 JsonSerDe를 사용하여 JSON 형식의 데이터를 참조하는 테이블을 생성합니다.

```
create external table spectrum.cloudtrail_json (
event_version int,
event_id bigint,
event_time timestamp,
event_type varchar(10),
awsregion varchar(20),
event_name varchar(max),
event_source varchar(max),
requesttime timestamp,
useragent varchar(max),
recipientaccountid bigint)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties (
'dots.in.keys' = 'true',
'mapping.requesttime' = 'requesttimestamp'
) location 's3://amzn-s3-demo-bucket/json/cloudtrail';
```

다음 CREATE EXTERNAL TABLE AS 예는 분할되지 않은 외부 테이블을 생성합니다. 그런 다음 대상 Amazon S3 위치에 Apache Parquet로 SELECT 쿼리의 결과를 작성합니다.

```
CREATE EXTERNAL TABLE spectrum.lineitem
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/lineitem/'
AS SELECT * FROM local_lineitem;
```

다음 예에서는 분할된 외부 테이블을 생성하고 SELECT 쿼리에 파티션 열을 포함합니다.

```
CREATE EXTERNAL TABLE spectrum.partitioned_lineitem
PARTITIONED BY (l_shipdate, l_shipmode)
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/partitioned_lineitem/'
AS SELECT l_orderkey, l_shipmode, l_shipdate, l_partkey FROM local_table;
```

외부 데이터 카탈로그에 있는 기존 데이터베이스의 목록을 보려면 [SVV\$1EXTERNAL\$1DATABASES](r_SVV_EXTERNAL_DATABASES.md) 시스템 뷰를 쿼리하세요.

```
select eskind,databasename,esoptions from svv_external_databases order by databasename;
```

```
eskind | databasename | esoptions
-------+--------------+----------------------------------------------------------------------------------
     1 | default      | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | sampledb     | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | spectrumdb   | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
```

외부 테이블의 세부 정보를 보려면 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 및 [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 시스템 뷰를 쿼리하세요.

다음 예에서는 SVV\$1EXTERNAL\$1TABLES 뷰를 쿼리합니다.

```
select schemaname, tablename, location from svv_external_tables;
```

```
schemaname | tablename            | location
-----------+----------------------+--------------------------------------------------------
spectrum   | sales                | s3://redshift-downloads/tickit/spectrum/sales
spectrum   | sales_part           | s3://redshift-downloads/tickit/spectrum/sales_partition
```

다음 예에서는 SVV\$1EXTERNAL\$1COLUMNS 뷰를 쿼리합니다.

```
select * from svv_external_columns where schemaname like 'spectrum%' and tablename ='sales';
```

```
schemaname | tablename | columnname | external_type | columnnum | part_key
-----------+-----------+------------+---------------+-----------+---------
spectrum   | sales     | salesid    | int           |         1 |        0
spectrum   | sales     | listid     | int           |         2 |        0
spectrum   | sales     | sellerid   | int           |         3 |        0
spectrum   | sales     | buyerid    | int           |         4 |        0
spectrum   | sales     | eventid    | int           |         5 |        0
spectrum   | sales     | saledate   | date          |         6 |        0
spectrum   | sales     | qtysold    | smallint      |         7 |        0
spectrum   | sales     | pricepaid  | decimal(8,2)  |         8 |        0
spectrum   | sales     | commission | decimal(8,2)  |         9 |        0
spectrum   | sales     | saletime   | timestamp     |        10 |        0
```

테이블 파티션을 보려면 다음 쿼리를 사용하세요.

```
select schemaname, tablename, values, location
from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

다음은 외부 테이블의 관련 데이터 파일의 총 크기를 반환하는 예입니다.

```
select distinct "$path", "$size"
   from spectrum.sales_part;

 $path                                                                    | $size
--------------------------------------------------------------------------+-------
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ |  1616
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
```

## 파티셔닝 예
<a name="r_CREATE_EXTERNAL_TABLE_examples-partitioning"></a>

날짜 기준으로 파티셔닝된 외부 테이블을 만들려면 다음 명령을 실행합니다.

```
create external table spectrum.sales_part(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
partitioned by (saledate date)
row format delimited
fields terminated by '|'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales_partition/'
table properties ('numRows'='170000');
```

파티션을 추가하려면 다음 ALTER TABLE 명령을 실행합니다.

```
alter table spectrum.sales_part
add if not exists partition (saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-04-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-05-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-06-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-07-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-08-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-09-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-10-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-11-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-12-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12/';
```

파티셔닝된 테이블에서 데이터를 선택하려면 다음 쿼리를 실행합니다.

```
select top 10 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid)
from spectrum.sales_part, event
where spectrum.sales_part.eventid = event.eventid
  and spectrum.sales_part.pricepaid > 30
  and saledate = '2008-12-01'
group by spectrum.sales_part.eventid
order by 2 desc;
```

```
eventid | sum
--------+---------
    914 | 36173.00
   5478 | 27303.00
   5061 | 26383.00
   4406 | 26252.00
   5324 | 24015.00
   1829 | 23911.00
   3601 | 23616.00
   3665 | 23214.00
   6069 | 22869.00
   5638 | 22551.00
```

외부 테이블 파티션을 보려면 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 시스템 뷰를 쿼리하세요.

```
select schemaname, tablename, values, location from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+--------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

## 행 형식 예
<a name="r_CREATE_EXTERNAL_TABLE_examples-row-format"></a>

다음은 AVRO 형식으로 저장된 데이터 파일에 대해 ROW FORMAT SERDE 파라미터를 지정하는 예입니다.

```
create external table spectrum.sales(salesid int, listid int, sellerid int, buyerid int, eventid int, dateid int, qtysold int, pricepaid decimal(8,2), comment VARCHAR(255))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='{\"namespace\": \"dory.sample\",\"name\": \"dory_avro\",\"type\": \"record\", \"fields\": [{\"name\":\"salesid\", \"type\":\"int\"},
{\"name\":\"listid\", \"type\":\"int\"},
{\"name\":\"sellerid\", \"type\":\"int\"},
{\"name\":\"buyerid\", \"type\":\"int\"},
{\"name\":\"eventid\",\"type\":\"int\"},
{\"name\":\"dateid\",\"type\":\"int\"},
{\"name\":\"qtysold\",\"type\":\"int\"},
{\"name\":\"pricepaid\", \"type\": {\"type\": \"bytes\", \"logicalType\": \"decimal\", \"precision\": 8, \"scale\": 2}}, {\"name\":\"comment\",\"type\":\"string\"}]}')
STORED AS AVRO
location 's3://amzn-s3-demo-bucket/avro/sales' ;
```

다음은 RegEx를 사용하여 ROW FORMAT SERDE 파라미터를 지정하는 예입니다.

```
create external table spectrum.types(
cbigint bigint,
cbigint_null bigint,
cint int,
cint_null int)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ('input.regex'='([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)')
stored as textfile
location 's3://amzn-s3-demo-bucket/regex/types';
```

다음은 Grok를 사용하여 ROW FORMAT SERDE 파라미터를 지정하는 예입니다.

```
create external table spectrum.grok_log(
timestamp varchar(255),
pid varchar(255),
loglevel varchar(255),
progname varchar(255),
message varchar(255))
row format serde 'com.amazonaws.glue.serde.GrokSerDe'
with serdeproperties ('input.format'='[DFEWI], \\[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid:int}\\] *(?<loglevel>:DEBUG|FATAL|ERROR|WARN|INFO) -- +%{DATA:progname}: %{GREEDYDATA:message}')
stored as textfile
location 's3://DOC-EXAMPLE-BUCKET/grok/logs';
```

다음은 S3 버킷에서 Amazon S3 서버 액세스 로그를 정의하는 예입니다. Redshift Spectrum을 사용하여 Amazon S3 액세스 로그를 쿼리할 수 있습니다.

```
CREATE EXTERNAL TABLE spectrum.mybucket_s3_logs(
bucketowner varchar(255),
bucket varchar(255),
requestdatetime varchar(2000),
remoteip varchar(255),
requester varchar(255),
requested varchar(255),
operation varchar(255),
key varchar(255),
requesturi_operation varchar(255),
requesturi_key varchar(255),
requesturi_httpprotoversion varchar(255),
httpstatus varchar(255),
errorcode varchar(255),
bytessent bigint,
objectsize bigint,
totaltime varchar(255),
turnaroundtime varchar(255),
referrer varchar(255),
useragent varchar(255),
versionid varchar(255)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\\s*([^ ]*)\\s*([^ ]*)\" (- |[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*).*$')
LOCATION 's3://amzn-s3-demo-bucket/s3logs’;
```

다음은 ION 형식 데이터에 대해 ROW FORMAT SERDE 파라미터를 지정하는 예입니다.

```
CREATE EXTERNAL TABLE tbl_name (columns)
ROW FORMAT SERDE 'com.amazon.ionhiveserde.IonHiveSerDe'
STORED AS
INPUTFORMAT 'com.amazon.ionhiveserde.formats.IonInputFormat'
OUTPUTFORMAT 'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/prefix'
```

## 데이터 처리 예
<a name="r_CREATE_EXTERNAL_TABLE_examples-data-handling"></a>

다음 예제에서는 [spi\$1global\$1rankings.csv](https://s3.amazonaws.com/redshift-downloads/docs-downloads/spi_global_rankings.csv) 파일에 액세스합니다. 이 예에서 보여주는 것처럼 `spi_global_rankings.csv` 파일을 Amazon S3 버킷에 업로드할 수 있습니다.

다음 예에서는 외부 스키마 `schema_spectrum_uddh` 및 `spectrum_db_uddh` 데이터베이스를 생성합니다. `aws-account-id`에 AWS 계정 ID, `role-name`에 Redshift Spectrum 역할 이름을 입력합니다.

```
create external schema schema_spectrum_uddh
from data catalog
database 'spectrum_db_uddh'
iam_role 'arn:aws:iam::aws-account-id:role/role-name'
create external database if not exists;
```

다음 예에서는 외부 스키마 `schema_spectrum_uddh`에서 외부 테이블 `soccer_league`를 생성합니다.

```
CREATE EXTERNAL TABLE schema_spectrum_uddh.soccer_league
(
  league_rank smallint,
  prev_rank   smallint,
  club_name   varchar(15),
  league_name varchar(20),
  league_off  decimal(6,2),
  league_def  decimal(6,2),
  league_spi  decimal(6,2),
  league_nspi integer
)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n\l'
stored as textfile
LOCATION 's3://spectrum-uddh/league/'
table properties ('skip.header.line.count'='1');
```

`soccer_league` 테이블에 포함된 행의 수를 확인합니다.

```
select count(*) from schema_spectrum_uddh.soccer_league;
```

행 수가 표시됩니다.

```
count
645
```

다음 쿼리는 상위 10개 클럽을 표시합니다. 클럽 `Barcelona`의 문자열에 잘못된 문자가 있으므로 이름에 NULL이 표시됩니다.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

```
league_rank	club_name	league_name			league_nspi
1		Manchester City	Barclays Premier Lea		34595
2		Bayern Munich	German Bundesliga		34151
3		Liverpool	Barclays Premier Lea		33223
4		Chelsea		Barclays Premier Lea		32808
5		Ajax		Dutch Eredivisie		32790
6		Atletico 	Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi		31469
8		NULL	        Spanish Primera Divi            31321
9		RB Leipzig	German Bundesliga		31014
10		Paris Saint-Ger	French Ligue 1			30929
```

다음 예제에서는 `invalid_char_handling`, `replacement_char`, `data_cleansing_enabled` 외부 테이블 속성을 지정하여 예기치 않은 문자의 대체 문자로 물음표(?)를 삽입하도록 `soccer_league` 테이블을 변경합니다.

```
alter  table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='REPLACE','replacement_char'='?','data_cleansing_enabled'='true');
```

다음 예제에서는 `soccer_league` 테이블에서 순위가 1\$110위인 팀을 쿼리합니다.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

테이블 속성이 변경되어 결과에 상위 10개 클럽과 `Barcelona` 클럽의 8번째 행을 대체하는 물음표(?) 문자가 표시됩니다.

```
league_rank	club_name	league_name		league_nspi
1		Manchester City	Barclays Premier Lea	34595
2		Bayern Munich	German Bundesliga	34151
3		Liverpool	Barclays Premier Lea	33223
4		Chelsea		Barclays Premier Lea	32808
5		Ajax		Dutch Eredivisie	32790
6		Atletico Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi	31469
8		Barcel?na	Spanish Primera Divi	31321
9		RB Leipzig	German Bundesliga	31014
10		Paris Saint-Ger	French Ligue 1		30929
```

다음 예제에서는 `invalid_char_handling` 외부 테이블 속성을 지정하여 예기치 않은 문자가 있는 행을 삭제하도록 `soccer_league` 테이블을 변경합니다.

```
alter table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='DROP_ROW','data_cleansing_enabled'='true');
```

다음 예제에서는 `soccer_league` 테이블에서 순위가 1\$110위인 팀을 쿼리합니다.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

결과에는 상위 클럽이 `Barcelona` 클럽의 8번째 행은 포함하지 않고 표시됩니다.

```
league_rank   club_name         league_name            league_nspi
1             Manchester City   Barclays Premier Lea   34595
2             Bayern Munich     German Bundesliga      34151
3             Liverpool         Barclays Premier Lea   33223
4             Chelsea           Barclays Premier Lea   32808
5             Ajax              Dutch Eredivisie       32790
6             Atletico Madrid   Spanish Primera Divi   31517
7             Real Madrid       Spanish Primera Divi   31469
9             RB Leipzig        German Bundesliga      31014
10            Paris Saint-Ger   French Ligue 1         30929
```

# CREATE EXTERNAL VIEW
<a name="r_CREATE_EXTERNAL_VIEW"></a>

데이터 카탈로그 미리 보기 기능은 다음 리전에서만 사용 가능합니다.
+ 미국 동부(오하이오)(us-east-2)
+ 미국 동부(버지니아 북부)(us-east-1)
+ 미국 서부(캘리포니아 북부)(us-west-1)
+ 아시아 태평양(도쿄)(ap-northeast-1)
+ 유럽(아일랜드)(eu-west-1)
+ 유럽(스톡홀름)(eu-north-1)

데이터 카탈로그에서 뷰를 생성합니다. 데이터 카탈로그 뷰는 Amazon Athena와 Amazon EMR 등의 다른 SQL 엔진에서 작동하는 단일 뷰 스키마입니다. 원하는 엔진에서 뷰를 쿼리할 수 있습니다. 데이터 카탈로그 뷰에 대한 자세한 내용은 [데이터 카탈로그 뷰 생성](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)을 참조하세요.

## 구문
<a name="r_CREATE_EXTERNAL_VIEW-synopsis"></a>

```
CREATE EXTERNAL VIEW schema_name.view_name [ IF NOT EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
AS query_definition;
```

## 파라미터
<a name="r_CREATE_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
AWS Glue 데이터베이스에 연결된 스키마이며, 뷰 이름이 뒤따릅니다.

PROTECTED  
query\$1definition 내의 쿼리를 성공적으로 완료할 수 있는 경우에만 CREATE EXTERNAL VIEW 명령을 완료하도록 지정합니다.

IF NOT EXISTS  
뷰가 아직 존재하지 않는 경우 뷰를 생성합니다.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
뷰를 생성할 때 사용하는 스키마의 표기법입니다. 직접 만든 Glue 데이터베이스인 AWS Glue Data Catalog 또는 직접 만든 외부 스키마를 사용하도록 지정할 수 있습니다. 자세한 내용은 [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 및 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

 *query\$1definition*   
뷰를 변경하기 위해 Amazon Redshift가 실행하는 SQL 쿼리의 정의입니다.

## 예제
<a name="r_CREATE_EXTERNAL_VIEW-examples"></a>

다음 예시에서는 sample\$1schema.glue\$1data\$1catalog\$1view라는 데이터 카탈로그 뷰를 생성합니다.

```
CREATE EXTERNAL PROTECTED VIEW sample_schema.glue_data_catalog_view IF NOT EXISTS
AS SELECT * FROM sample_database.remote_table "remote-table-name";
```

# CREATE FUNCTION
<a name="r_CREATE_FUNCTION"></a>

SQL SELECT 절 또는 Python 프로그램을 이용해 스칼라 사용자 정의 함수(UDF)를 새로 만듭니다.

자세한 내용과 예제는 [Amazon Redshift의 사용자 정의 함수](user-defined-functions.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_FUNCTION-privileges"></a>

CREATE OR REPLACE FUNCTION을 실행하려면 다음 방법 중 하나에 대한 권한이 있어야 합니다.
+ CREATE FUNCTION의 경우
  + 슈퍼 사용자는 신뢰할 수 있는 언어와 신뢰할 수 없는 언어를 사용하여 함수를 만들 수 있습니다.
  + CREATE [ OR REPLACE ] FUNCTION 권한이 있는 사용자는 신뢰할 수 있는 언어로 함수를 만들 수 있습니다.
+ REPLACE FUNCTION의 경우
  + 수퍼유저
  + CREATE [ OR REPLACE ] FUNCTION 권한이 있는 사용자
  + 함수 소유자

## 구문
<a name="r_CREATE_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] FUNCTION f_function_name
( { [py_arg_name  py_arg_data_type |
sql_arg_data_type } [ , ... ] ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
  { python_program | SELECT_clause }
$$ LANGUAGE { plpythonu | sql }
```

## 파라미터
<a name="r_CREATE_FUNCTION-parameters"></a>

OR REPLACE  
이름 및 입력 인수 데이터 형식이 같은 함수 또는 *서명*이 같은 함수인 경우 이런 함수가 이미 하나 존재하므로 기존 함수가 대체됨을 지정합니다. 함수는 똑같은 데이터 형식 집합을 정의하는 새 함수로만 바꿀 수 있습니다. 수퍼유저만이 함수를 바꿀 수 있습니다.  
기존 함수와 이름은 같지만 서명이 다른 함수를 정의하면 새 함수가 생성됩니다. 즉, 함수 이름이 오버로드됩니다. 자세한 내용은 [함수 이름 오버로드](udf-naming-udfs.md#udf-naming-overloading-function-names) 섹션을 참조하세요.

 *f\$1function\$1name*   
함수의 이름입니다. 스키마 이름을 지정하는 경우(예: `myschema.myfunction`), 함수는 지정된 스키마를 사용하여 생성됩니다. 그렇지 않으면, 함수가 현재 스키마로 생성됩니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
모든 UDF 이름에 `f_`를 접두사로 사용하는 것이 좋습니다. Amazon Redshift는 UDF 이름에 대해 `f_` 접두사를 예약하므로, `f_` 접두사를 사용하면 UDF 이름이 기존 또는 향후의 Amazon Redshift 내장 SQL 함수 이름과 충돌하지 않을 것입니다. 자세한 내용은 [UDF 이름 충돌 방지](udf-naming-udfs.md) 섹션을 참조하세요.  
입력 인수에 대한 데이터 형식이 서로 다른 경우 함수 이름이 동일한 함수를 2개 이상 정의할 수 있습니다. 즉, 함수 이름이 오버로드됩니다. 자세한 내용은 [함수 이름 오버로드](udf-naming-udfs.md#udf-naming-overloading-function-names) 섹션을 참조하세요.

 *py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Python UDF에 대해서는 입력 인수 이름과 데이터 형식의 목록입니다. SQL UDF에 대해서는 인수 이름이 없는 데이터 형식의 목록입니다. Python UDF에서는 인수 이름을 이용한 인수를 참조하세요. SQL UDF에서는 인수 목록에서 인수의 순서를 토대로 \$11, \$12, ... 등을 이용한 인수를 참조하세요.  
SQL UDF의 경우, 입력 및 반환 데이터 형식은 모든 표준 Amazon Redshift 데이터 형식일 수 있습니다. Python UDF의 경우, 입력 및 반환 데이터 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE 또는 TIMESTAMP일 수 있습니다. 또한 Python 사용자 정의 함수(UDF)는 ANYELEMENT 데이터 형식을 지원합니다. 이는 런타임에 제공되는 해당 인수의 데이터 형식을 기준으로 표준 데이터 형식으로 자동 변환됩니다. 여러 인수가 ANYELEMENT를 사용하는 경우 이들 인수는 모두 목록에서 첫 번째 ANYELEMENT 인수를 기준으로 런타임에 동일한 데이터 형식으로 확인됩니다. 자세한 내용은 [Python UDF 데이터 형식](udf-data-types.md) 및 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.  
인수를 최대 32개까지 지정할 수 있습니다.

 RETURNS *data\$1type*   
함수에 의해 반환되는 값의 데이터 형식입니다. RETURNS 데이터 형식은 임의의 표준 Amazon Redshift 데이터 형식일 수 있습니다. 뿐만 아니라, Python UDF는 런타임에 제공되는 인수를 기준으로 표준 데이터 형식으로 자동 변환되는 ANYELEMENT의 데이터 형식을 사용할 수 있습니다. 반환 데이터 형식에 대해 ANYELEMENT를 지정하는 경우 하나 이상의 인수가 ANYELEMENT를 사용해야 합니다. 실제 반환 데이터 형식은 함수가 호출될 때 ANYELEMENT 인수에 대해 제공되는 데이터 형식과 일치합니다. 자세한 내용은 [Python UDF 데이터 형식](udf-data-types.md) 섹션을 참조하세요.

 VOLATILE \$1 STABLE \$1 IMMUTABLE   
쿼리 최적화 프로그램에 함수의 휘발성에 대해 알립니다.  
함수에 대해 유효한 가장 엄격한 휘발성 범주로 함수에 레이블을 지정하면 최상으로 최적화할 수 있습니다. 그러나 범주가 너무 엄격하면 최적화 프로그램이 일부 호출을 잘못 건너뛰어 잘못된 결과 집합을 초래할 위험이 있습니다. 가장 덜 엄격한 범주부터 시작해서 엄격성의 순으로 휘발성 범주를 나열하면 다음과 같습니다.  
+ VOLATILE
+ STABLE
+ IMMUTABLE
VOLATILE  
인수가 같을 경우, 함수는 단일 명령문의 행에 대해서도 연속적인 호출에 대해 상이한 결과를 반환할 수 있습니다. 쿼리 최적화 프로그램은 휘발성 함수의 동작에 대해 어떤 가정도 할 수 없으므로, 휘발성 함수를 사용하는 쿼리가 모든 입력 행에 대해 함수를 재평가해야 합니다.  
STABLE  
인수가 같을 경우, 함수는 단일 명령문 내에서 처리되는 모든 행에 대해 동일한 결과를 반환하도록 보장됩니다. 이 함수는 서로 다른 명령문에서 호출될 경우 서로 다른 결과를 반환할 수 있습니다. 최적화 프로그램은 이 범주를 사용하여 단일 명령문 내에서 함수의 여러 호출을 명령문에 대한 단일 호출로 최적화할 수 있습니다.  
IMMUTABLE  
인수가 같을 경우, 함수는 항상 동일한 결과를 계속 반환합니다. 쿼리가 일정한 인수로 `IMMUTABLE` 함수를 호출할 때는 최적화 프로그램이 함수를 미리 평가합니다.

AS \$1\$1 *statement* \$1\$1  
 실행할 문을 둘러싼 구문입니다. 리터럴 키워드 `AS $$` 및 `$$`가 필요합니다.  
Amazon Redshift에서는 \$1 인용이라는 형식을 사용하여 함수의 문을 묶어야 합니다. 묶음 기호 내에 있는 것은 모두 정확히 그대로 전달됩니다. 문자열의 내용은 문자 그대로 작성되므로 특수 문자를 이스케이프할 필요가 없습니다.  
 *\$1 인용* 사용 시, 달러 기호 쌍(\$1\$1)을 사용하면 다음 예에 표시된 것처럼 실행할 문의 시작과 끝을 나타낼 수 있습니다.  

```
$$ my statement $$
```
 각 쌍의 달러 기호들 사이에서 선택적으로 문을 식별하는 데 도움이 되는 문자열을 지정할 수 있습니다. 사용하는 문자열은 묶음 쌍의 시작과 끝에서 모두 동일해야 합니다. 이 문자열은 대/소문자를 구분하고 달러 기호를 포함할 수 없는 경우를 제외하면 따옴표가 없는 식별자와 똑같은 제약 조건을 따릅니다. 다음 예에서는 `test` 문자열을 사용합니다.  

```
$test$ my statement $test$
```
달러 인용에 대한 자세한 내용은 PostgreSQL 설명서의 [ 어휘 구조](https://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html)에서 “달러 기호로 인용된 문자열 상수”를 참조하세요.

*python\$1program*   
값을 반환하는 유효하고 실행 가능한 Python 프로그램입니다. 함수와 함께 전달하는 문은 Python 웹사이트의 [Python 코드 스타일 가이드](https://www.python.org/dev/peps/pep-0008/#indentation)에 지정된 들여쓰기 요구 사항을 준수해야 합니다. 자세한 내용은 [UDF에 대한 Python 언어 지원](udf-python-language-support.md) 섹션을 참조하세요.

*SQL 절*   
SQL SELECT 절.  
SELECT 절은 다음 유형의 절을 포함할 수 없습니다.  
+ FROM
+ INTO
+ WHERE
+ GROUP BY
+ ORDER BY
+ LIMIT

LANGUAGE \$1 plpythonu \$1 sql \$1   
Python에는 `plpythonu`를 지정합니다. SQL에는 `sql`을 지정합니다. SQL 또는 plpythonu에 대한 언어에 사용 권한이 필요합니다. 자세한 내용은 [UDF 보안 및 권한](udf-security-and-privileges.md) 섹션을 참조하세요.

## 사용 노트
<a name="r_CREATE_FUNCTION-usage-notes"></a>

### 중첩 함수
<a name="r_CREATE_FUNCTION-usage-notes-nested-functions"></a>

SQL UDF 안에서 다른 SQL 사용자 정의 함수(UDF)를 호출할 수 있습니다. CREATE FUNCTION 명령을 실행할 때 중첩 함수가 있어야 합니다. Amazon Redshift는 UDF에 대한 종속성을 추적하지 않으므로 중첩 함수를 삭제해도 Amazon Redshift는 오류를 반환하지 않습니다. 그러나 중첩 함수가 존재하지 않으면 UDF가 실패합니다. 예를 들어 다음 함수는 SELECT 절에 `f_sql_greater `함수를 호출합니다.

```
create function f_sql_commission (float, float )
  returns float
stable
as $$
  select f_sql_greater ($1, $2)
$$ language sql;
```

### UDF 보안 및 권한
<a name="r_CREATE_FUNCTION-usage-notes-security-and-privileges"></a>

UDF를 새로 만들려면 SQL 또는 plpythonu(Python)에 대한 언어에 사용 권한이 필요합니다. 기본적으로 USAGE ON LANGUAGE SQL은 PUBLIC에 허용됩니다. 그러나 특정 사용자 또는 그룹에 USAGE ON LANGUAGE PLPYTHONU 권한을 명시적으로 허용해야 합니다.

SQL에 대한 사용을 취소하려면 먼저 PUBLIC에서의 사용을 취소해야 합니다. 그런 다음 SQL UDF 생성이 허용된 사용자 또는 그룹에게만 SQL에 대한 사용 권한을 허용합니다. 다음은 PUBLIC에서의 SQL 사용을 취소한 후 사용자 그룹 `udf_devs`에 사용을 허용하는 예시입니다.

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```

UDF를 실행하려면 각 함수마다 실행 권한이 필요합니다. 기본적으로 새로운 UDF에 대한 실행 권한은 PUBLIC에 허용됩니다. 사용을 제한하려면 함수에 대해 PUBLIC에서 실행 권한을 취소합니다. 그런 다음 개인 혹은 그룹에 권한을 허용합니다.

다음은 PUBLIC에서 `f_py_greater` 함수에 대한 실행 권한을 취소한 다음 사용자 그룹 `udf_devs`에 사용 권한을 부여하는 예입니다.

```
revoke execute on function f_py_greater(a float, b float) from PUBLIC;
grant execute on function f_py_greater(a float, b float) to group udf_devs;
```

기본적으로 수퍼유저는 모든 권한을 갖습니다.

자세한 내용은 [GRANT](r_GRANT.md) 및 [REVOKE](r_REVOKE.md) 섹션을 참조하세요.

## 예제
<a name="r_CREATE_FUNCTION-examples"></a>

### 스칼라 Python UDF 예시
<a name="r_CREATE_FUNCTION-python-example"></a>

다음 예에서는 두 정수를 비교하여 더 큰 값을 반환하는 Python UDF를 생성합니다.

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

다음 예에서는 SALES 테이블을 쿼리하고 COMMISSION 또는 PRICEPAID의 20% 중 큰 값을 반환하는 새 `f_py_greater` 함수를 호출합니다.

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

### 스칼라 SQL UDF 예시
<a name="r_CREATE_FUNCTION-sql-example"></a>

다음은 2개의 수를 비교하여 더 큰 값을 반환하는 함수의 생성 예입니다.

```
create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql;
```

다음은 새로운 `f_sql_greater` 함수를 호출하여 SALES 테이블에 대한 쿼리를 실행한 후 COMMISSION 또는 PRICEPAID의 20% 중에서 더 큰 값을 반환하는 쿼리입니다.

```
select f_sql_greater (commission, pricepaid*0.20) from sales;
```

# create group
<a name="r_CREATE_GROUP"></a>

새로운 사용자 그룹을 정의합니다. 수퍼유저만이 그룹을 생성할 수 있습니다.

## 구문
<a name="r_CREATE_GROUP-synopsis"></a>

```
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
```

## 파라미터
<a name="r_CREATE_GROUP-parameters"></a>

 *group\$1name*   
새로운 사용자 그룹의 이름입니다. 2개의 밑줄로 시작하는 그룹 이름은 Amazon Redshift 내부 용도로 예약되어 있습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

WITH  
CREATE GROUP을 위한 추가 파라미터를 표시하는 선택적 구문입니다.

USER  
한 명 이상의 사용자를 그룹에 추가합니다.

 * 사용자 이름*   
그룹에 추가할 사용자의 이름입니다.

## 예제
<a name="r_CREATE_GROUP-examples"></a>

다음 예에서는 두 사용자 ADMIN1 및 ADMIN2가 있고 ADMIN\$1GROUP으로 명명된 사용자 그룹을 생성합니다.

```
create group admin_group with user admin1, admin2;
```

# CREATE IDENTITY PROVIDER
<a name="r_CREATE_IDENTITY_PROVIDER"></a>

새 자격 증명 공급자를 정의합니다. 슈퍼 사용자만 자격 증명 공급자를 생성할 수 있습니다.

## 구문
<a name="r_CREATE_IDENTITY_PROVIDER-synopsis"></a>

```
CREATE IDENTITY PROVIDER identity_provider_name TYPE type_name
NAMESPACE namespace_name
[PARAMETERS parameter_string]
[APPLICATION_ARN arn]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
  ];
```

## 파라미터
<a name="r_CREATE_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
새 자격 증명 공급자 이름입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

*type\$1name*  
인터페이스할 자격 증명 공급자입니다. Azure와 AWSIDC는 현재 유일하게 지원되는 ID 제공업체입니다.

*namespace\$1name*  
네임스페이스입니다. 자격 증명 공급자 디렉터리에 대한 고유한 약식 식별자입니다.

 *parameter\$1string*   
자격 증명 공급자에 필요한 파라미터와 값이 포함된 올바른 형식의 JSON 객체를 포함하는 문자열입니다.

 *arn*   
IAM Identity Center 관리형 애플리케이션의 Amazon 리소스 이름(ARN)입니다. 이 파라미터는 ID 제공업체 유형이 AWSIDC인 경우에만 적용됩니다.

 *iam\$1role*   
IAM Identity Center에 대한 연결 권한을 제공하는 IAM 역할입니다. 이 파라미터는 ID 제공업체 유형이 AWSIDC인 경우에만 적용됩니다.

 *auto\$1create\$1roles*   
역할 자동 생성 기능을 활성화하거나 비활성화합니다. 값이 TRUE이면 Amazon Redshift가 역할 자동 생성 기능을 활성화합니다. 값이 FALSE이면 Amazon Redshift가 역할 자동 생성 기능을 비활성화합니다. 이 파라미터의 값을 지정하지 않으면 Amazon Redshift가 다음 로직을 사용하여 값을 결정합니다.  
+  `AUTO_CREATE_ROLES`를 제공했지만 값을 지정하지 않은 경우 값이 TRUE로 설정됩니다.
+  `AUTO_CREATE_ROLES`를 제공하지 않고 ID 제공업체가 AWSIDC인 경우 값이 FALSE로 설정됩니다.
+  `AUTO_CREATE_ROLES`를 제공하지 않고 ID 제공업체가 Azure인 경우 값이 TRUE로 설정됩니다.
그룹을 포함하려면 `INCLUDE`를 지정합니다. 기본값은 비어 있습니다. 즉, `AUTO_CREATE_ROLES`가 켜져 있는 경우 모든 그룹이 포함됩니다.  
그룹을 제외하려면 `EXCLUDE`를 지정합니다. 기본값은 비어 있습니다. 즉, `AUTO_CREATE_ROLES`가 켜져 있는 경우 그룹을 제외하지 않습니다.

 *filter\$1pattern*   
그룹 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_CREATE_IDENTITY_PROVIDER.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.  
*filter\$1pattern*은 다음 문자를 지원합니다.  
+  대문자 및 소문자 알파벳 문자(A\$1Z 및 a\$1z) 
+  숫자(0\$19) 
+  다음 특수 문자: 

  ```
  _ % ^ * + ? { } , $
  ```

## 예제
<a name="r_CREATE_IDENTITY_PROVIDER-examples"></a>

다음 예에서는 TYPE *azure*를 통해 *oauth\$1standard*라는 자격 증명 공급자를 생성하여 Microsoft Azure Active Directory(AD)와의 통신을 설정합니다.

```
CREATE IDENTITY PROVIDER oauth_standard TYPE azure
NAMESPACE 'aad'
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

IAM Identity Center의 관리형 애플리케이션을 기존의 프로비저닝된 클러스터 또는 Amazon Redshift Serverless 작업 그룹에 연결할 수 있습니다. 이렇게 하면 IAM Identity Center를 통해 Redshift 데이터베이스에 대한 액세스를 관리할 수 있습니다. 이렇게 하려면 다음 샘플과 같은 SQL 명령을 실행합니다. 데이터베이스 관리자여야 합니다.

```
CREATE IDENTITY PROVIDER "redshift-idc-app" TYPE AWSIDC
NAMESPACE 'awsidc'
APPLICATION_ARN 'arn:aws:sso::123456789012:application/ssoins-12345f67fe123d4/apl-a0b0a12dc123b1a4'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyRedshiftRole';
```

이 경우 연결할 관리형 애플리케이션은 애플리케이션 ARN으로 식별됩니다. `SELECT * FROM SVV_IDENTITY_PROVIDERS;`를 실행하여 이를 찾을 수 있습니다.

추가 예를 포함하여 CREATE IDENTITY PROVIDER 사용에 대한 자세한 내용은 [Amazon Redshift용 기본 ID 제공업체(IdP) 페더레이션](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)을 참조하세요. Redshift에서 IAM Identity Center에 대한 연결을 설정하는 방법에 대한 자세한 내용은 [Redshift를 IAM Identity Center와 연결하여 사용자에게 Single Sign-On 경험을 제공합니다](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)를 참조하세요.

# CREATE LIBRARY
<a name="r_CREATE_LIBRARY"></a>

사용자가 [CREATE FUNCTION](r_CREATE_FUNCTION.md) 명령으로 UDF(사용자 정의 함수)를 만들 때 사용자가 포함할 수 있도록 제공되는 Python 라이브러리를 설치합니다. 사용자가 설치한 라이브러리의 총 크기는 100MB를 초과할 수 없습니다.

CREATE LIBRARY를 트랜잭션 블록(BEGIN … END) 내에서 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

Amazon Redshift는 Python 버전 2.7을 지원합니다. 자세한 내용은 [www.python.org](https://www.python.org/)를 참조하세요.

자세한 내용은 [예제: 사용자 지정 Python 라이브러리 모듈 가져오기](udf-importing-custom-python-library-modules.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_LIBRARY-privileges"></a>

CREATE LIBRARY에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE LIBRARY 권한이 있거나 지정된 언어의 권한이 있는 사용자

## 구문
<a name="r_CREATE_LIBRARY-synopsis"></a>

```
CREATE [ OR REPLACE ] LIBRARY library_name LANGUAGE plpythonu
FROM
{ 'https://file_url'
| 's3://bucketname/file_name'
authorization
  [ REGION [AS] 'aws_region']
  IAM_ROLE { default | ‘arn:aws:iam::<AWS 계정-id>:role/<role-name>’ }
}
```

## 파라미터
<a name="r_CREATE_LIBRARY-parameters"></a>

OR REPLACE  
이름이 같은 라이브러리인 경우 이런 라이브러리가 이미 하나 존재하므로 기존 라이브러리가 대체됨을 지정합니다. REPLACE는 즉시 커밋합니다. 라이브러리에 종속된 UDF가 동시에 실행 중인 경우 UDF는 트랜잭션 내에서 실행 중이더라도 실패하거나 예기치 않은 결과를 반환할 수 있습니다. 소유자 또는 수퍼유저만이 라이브러리를 바꿀 수 있습니다.

 *library\$1name*   
설치할 라이브러리의 이름입니다. Python Standard Library 모듈 또는 Amazon Redshift에 사전 설치되어 있는 Python 모듈과 동일한 이름의 모듈이 포함되어 있는 라이브러리는 생성할 수 없습니다. 기존의 사용자 설치 라이브러리가 설치할 라이브러리와 같은 Python 패키지를 사용하는 경우 기존 라이브러리를 삭제한 후 새 라이브러리를 설치해야 합니다. 자세한 내용은 [UDF에 대한 Python 언어 지원](udf-python-language-support.md) 섹션을 참조하세요.

LANGUAGE plpythonu  
사용할 언어입니다. Python(plpythonu)이 유일하게 지원되는 언어입니다. Amazon Redshift는 Python 버전 2.7을 지원합니다. 자세한 내용은 [www.python.org](https://www.python.org/)를 참조하세요.

FROM  
라이브러리 파일의 위치. Amazon S3 버킷과 객체 이름을 지정하거나 공용 웹사이트에서 파일을 다운로드하기 위한 URL을 지정할 수 있습니다. 라이브러리는 `.zip` 파일의 형식으로 압축해야 합니다. 자세한 내용은 Python 설명서의 [Building and Installing Python Modules](https://docs.python.org/2/library/distutils.html?highlight=distutils#module-distutils) 섹션을 참조하세요.

 https://*file\$1url*   
공용 웹사이트에서 파일을 다운로드하기 위한 URL입니다. 이 URL은 최대 3개의 리디렉션을 포함할 수 있습니다. 다음은 파일 URL의 예입니다.  

```
'https://www.example.com/pylib.zip'
```

 s3://*버킷 이름/파일 이름*   
라이브러리 파일이 들어 있는 단일 Amazon S3 객체의 경로입니다. 다음은 Amazon S3 객체 경로의 예입니다.  

```
's3://amzn-s3-demo-bucket/my-pylib.zip'
```
Amazon S3 버킷을 지정하는 경우 파일 다운로드 권한을 가진 AWS 사용자를 위한 자격 증명도 제공해야 합니다.  
 Amazon S3 버킷이 Amazon Redshift 클러스터와 동일한 AWS 리전에 없는 경우에는 REGION 옵션을 사용하여 데이터가 위치한 AWS 리전을 지정해야 합니다. *aws\$1region*의 값은 COPY 명령에 대한 [REGION](copy-parameters-data-source-s3.md#copy-region) 파라미터 설명에서 표에 나와 있는 AWS 리전과 일치해야 합니다.

*권한 부여*   
클러스터가 라이브러리 파일이 있는 Amazon S3 버킷에 액세스하기 위한 인증 및 권한 부여에 사용할 방법을 나타내는 절입니다. 클러스터에 LIST 및 GET 작업으로 Amazon S3에 액세스할 권한이 있어야 합니다.  
권한 부여를 위한 구문은 COPY 명령 권한 부여에 대한 것과 동일합니다. 자세한 내용은 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.  

```
IAM_ROLE { default | ‘arn:aws:iam::<AWS 계정-id>:role/<role-name>’
```
 기본 키워드를 사용하여 CREATE LIBRARY 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. IAM\$1ROLE을 지정하면 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN 또는 CREDENTIALS는 사용할 수 없습니다.  
선택적으로, Amazon S3 버킷이 서버 측 암호화를 사용하는 경우 credentials-args 문자열에 암호화 키를 제공합니다. 임시 보안 자격 증명을 사용하는 경우 *credentials-args* 문자열에 임시 토큰을 제공합니다.  
자세한 내용은 [임시 보안 자격 증명](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) 섹션을 참조하세요.

 REGION [AS] *aws\$1region*   
Amazon S3 버킷이 위치한 AWS 리전입니다. Amazon S3 버킷이 Amazon Redshift 클러스터와 같은 AWS 리전에 있지 않을 때는 REGION이 필요합니다. *aws\$1region*의 값은 COPY 명령에 대한 [REGION](copy-parameters-data-source-s3.md#copy-region) 파라미터 설명에서 표에 나와 있는 AWS 리전과 일치해야 합니다.  
기본적으로, CREATE LIBRARY에서는 Amazon S3 버킷이 Amazon Redshift 클러스터와 같은 AWS 리전에 위치한 것으로 가정합니다.

## 예제
<a name="r_CREATE_LIBRARY-examples"></a>

다음 두 예에서는 `urlparse3-1.0.3.zip`이라는 파일에 패키지된[urlparse](https://docs.python.org/2/library/urlparse.html#module-urlparse) Python 모듈을 설치합니다.

다음 명령으로 미국 동부 리전에 위치한 Amazon S3 버킷으로 업로드된 패키지에서 `f_urlparse`로 명명된 UDF 라이브러리를 설치합니다.

```
create library f_urlparse
language plpythonu
from 's3://amzn-s3-demo-bucket/urlparse3-1.0.3.zip'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
region as 'us-east-1';
```

다음 예에서는 라이브러리 파일에서 `f_urlparse`로 명명된 라이브러리를 웹사이트에 설치합니다.



```
create library f_urlparse
language plpythonu
from 'https://example.com/packages/urlparse3-1.0.3.zip';
```

# 마스킹 정책 생성
<a name="r_CREATE_MASKING_POLICY"></a>

지정된 형식의 데이터를 난독화하는 새 동적 데이터 마스킹 정책을 만듭니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md)(동적 데이터 마스킹(미리 보기)을 참조하세요.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 마스킹 정책을 생성할 수 있습니다.

## 구문
<a name="r_CREATE_MASKING_POLICY-synopsis"></a>

```
CREATE MASKING POLICY 
   { policy_name | database_name.policy_name } [IF NOT EXISTS]
   WITH (input_columns)
   USING (masking_expression);
```

## 파라미터
<a name="r_CREATE_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
마스킹 정책의 이름입니다. 마스킹 정책은 데이터베이스에 이미 있는 다른 마스킹 정책과 이름이 같을 수 없습니다.

database\$1name  
정책이 생성되는 데이터베이스의 이름입니다. 정책은 연결된 데이터베이스 또는 Amazon Redshift 페더레이션 권한 카탈로그에서 생성할 수 있습니다.

*input\$1columns*   
형식(col1 형식, col2 형식...)의 열 이름 튜플입니다.  
열 이름은 마스킹 표현식의 입력으로 사용됩니다. 열 이름은 마스킹되는 열의 이름과 일치하지 않아도 되지만 입력 및 출력 데이터 유형은 일치해야 합니다.

*masking\$1expression*  
대상 열을 변환하는 데 사용되는 SQL 표현식입니다. 문자열 조작 함수와 같은 데이터 조작 함수를 사용하거나 SQL, Python 또는 AWS Lambda로 작성된 사용자 정의 함수와 함께 작성할 수 있습니다. 출력이 여러 개인 정책을 마스킹하기 위해 열 표현식의 튜플을 포함할 수 있습니다. 상수를 마스킹 표현식으로 사용하는 경우 입력 유형과 일치하는 유형으로 상수를 명시적으로 변환해야 합니다.  
 마스킹 표현식에서 사용하는 모든 사용자 정의 함수에 대한 USAGE 권한이 있어야 합니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 CREATE MASKING POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

하나 이상의 Amazon Redshift 테이블을 기반으로 구체화된 뷰를 생성합니다. Spectrum 또는 통합 쿼리를 사용하여 생성된 외부 테이블을 기반으로 구체화된 뷰를 만들 수도 있습니다. Spectrum에 대한 자세한 내용은 [Amazon Redshift Spectrum](c-using-spectrum.md) 섹션을 참조하세요. 연합 쿼리에 대한 자세한 내용은 [Amazon Redshift에서 연합 쿼리를 사용하여 데이터 쿼리](federated-overview.md) 섹션을 참조하세요.

## 구문
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

## 파라미터
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

BACKUP  
자동 및 수동 클러스터 스냅샷에 구체화된 뷰를 포함해야 할지 여부를 지정하는 절입니다.  
중요한 데이터를 포함하지 않는 구체화된 뷰의 경우 BACKUP NO를 지정하여 스냅샷을 생성하고 스냅샷으로부터 복원할 때의 처리 시간을 절약하고 Amazon Simple Storage Service의 스토리지 공간을 줄입니다. BACKUP NO 설정은 클러스터 내에 있는 다른 노드로의 데이터 자동 복제에 아무런 영향도 미치지 않으므로, 노드 장애가 발생할 경우 BACKUP NO가 지정된 구체화된 뷰가 복원됩니다. 기본값은 BACKUP YES입니다.

 *table\$1attributes*   
다음을 포함하여 구체화된 보기의 데이터가 분산되는 방식을 지정하는 절입니다.  
+  구체화된 보기의 분산 스타일입니다(`DISTSTYLE { EVEN | ALL | KEY }` 형식). 이 절을 생략한 경우 배포 스타일은 `EVEN`입니다. 자세한 내용은 [분산 스타일](c_choosing_dist_sort.md) 섹션을 참조하세요.
+ 구체화된 보기의 분산 키입니다(`DISTKEY ( distkey_identifier )` 형식). 자세한 내용은 [분산 스타일 지정](t_designating_distribution_styles.md) 섹션을 참조하세요.
+ 구체화된 보기의 정렬 키입니다(`SORTKEY ( column_name [, ...] )` 형식). 자세한 내용은 [정렬 키](t_Sorting_data.md) 섹션을 참조하세요.

AS *query*  
구체화된 뷰와 해당 콘텐츠를 정의하는 유효한 `SELECT` 문입니다. 쿼리의 결과 집합은 구체화된 보기의 열과 행을 정의합니다. 구체화된 뷰 생성 시 제한 사항에 대한 자세한 내용은 [제한 사항](#mv_CREATE_MATERIALIZED_VIEW-limitations) 섹션을 참조하세요.  
또한 쿼리에 사용되는 특정 SQL 언어 구조는 구체화된 보기를 증분 새로 고침으로 할지 아니면 전체 새로 고침으로 할지를 결정합니다. 새로 고침 방법에 대한 자세한 내용은 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md) 섹션을 참조하세요. 증분 새로 고침의 제한 사항에 대한 자세한 내용은 [증분 새로 고침에 대한 제한 사항](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations) 섹션을 참조하세요.  
쿼리에 증분 새로 고침을 지원하지 않는 SQL 명령이 포함된 경우 Amazon Redshift는 구체화된 뷰가 전체 새로 고침 사용을 알리는 메시지를 표시합니다. SQL 클라이언트 애플리케이션에 따라 메시지가 표시될 수도 있고 표시되지 않을 수도 있습니다. 구체화된 보기에서 사용되는 새로 고침 유형을 보려면 `state`의 [STV\$1MV\$1INFO](r_STV_MV_INFO.md) 열을 확인합니다.

AUTO REFRESH  
구체화된 뷰가 기본 테이블의 최신 변경 사항으로 자동으로 새로 고쳐져야 하는지 여부를 정의하는 절입니다. 기본 값은 `NO`입니다. 자세한 내용은 [구체화된 뷰 새로 고침](materialized-view-refresh.md) 섹션을 참조하세요.

## 사용 노트
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

구체화된 보기를 생성하려면 다음 권한이 있어야 합니다.
+ 스키마에 대한 CREATE 권한
+ 구체화된 뷰를 생성하기 위한 기본 테이블에 대한 테이블 수준 또는 열 수준 SELECT 권한입니다. 특정 열에 대한 열 수준 권한이 있는 경우 해당 열에 대해서만 구체화된 뷰를 생성할 수 있습니다.

 `mv_name`에 외부 데이터베이스 이름을 제공하여 원격 데이터 공유 클러스터에서 구체화된 뷰를 생성할 수 있습니다.

## 데이터 공유의 구체화된 뷰에 대한 증분 새로 고침
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 Amazon Redshift는 기본 테이블이 공유될 때 소비자 데이터 공유의 구체화된 뷰에 대한 자동 및 증분 새로 고침을 지원합니다. 증분 새로 고침은 Amazon Redshift가 이전 새로 고침 이후에 발생한 기본 테이블의 변경 사항을 식별하고 구체화된 뷰의 해당 레코드만 업데이트하는 작업입니다. 이는 전체 새로 고침보다 더 빠르게 실행되며 워크로드 성능을 개선합니다. 증분 새로 고침을 활용하기 위해 구체화된 뷰 정의를 변경할 필요는 없습니다.

구체화된 뷰에서 증분 새로 고침을 활용할 때는 다음과 같은 몇 가지 제한 사항이 있습니다.
+ 구체화된 뷰는 로컬 또는 원격 데이터베이스 하나만 참조해야 합니다.
+ 증분 새로 고침은 새 구체화된 뷰에서만 사용할 수 있습니다. 따라서 증분 새로 고침이 발생하려면 기존의 구체화된 뷰를 삭제하고 다시 생성해야 합니다.

데이터 공유에서 구체화된 뷰를 생성하는 방법에 대한 자세한 내용은 여러 쿼리 예제가 [Amazon Redshift 데이터 공유에서 보기 작업](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views)을 참조하세요.

## 구체화된 보기 또는 기본 테이블에 대한 DDL 업데이트
<a name="materialized-view-ddl"></a>

Amazon Redshift에서 구체화된 뷰를 사용하는 경우 구체화된 뷰 또는 기본 테이블에 대한 데이터 정의 언어(DDL) 업데이트와 관련된 다음 사용 노트를 따릅니다.
+ 기본 테이블을 참조하는 구체화된 보기에 영향을 주지 않고 기본 테이블에 열을 추가할 수 있습니다.
+ 일부 작업은 구체화된 보기를 전혀 새로 고칠 수 없는 상태로 둘 수 있습니다. 예를 들어, 열 이름 바꾸기 또는 삭제, 열 유형 변경 및 스키마 이름 변경 등의 작업이 그렇습니다. 이러한 구체화된 보기는 쿼리할 수 있지만 새로 고칠 수는 없습니다. 이 경우 구체화된 보기를 삭제하고 다시 생성해야 합니다.
+ 일반적으로 구체화된 보기의 정의(해당 SQL 문)는 변경할 수 없습니다.
+ 구체화된 보기의 이름을 바꿀 수 없습니다.

## 제한 사항
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

다음 중 하나를 참조 또는 포함하는 구체화된 보기를 정의할 수 없습니다.
+ 표준 뷰 또는 시스템 테이블 및 뷰.
+ 임시 테이블.
+ 사용자 정의 함수.
+ ORDER BY, LIMIT 또는 OFFSET 절
+ 기본 테이블에 대한 지연 바인딩 참조. 다시 말해, 구체화된 보기의 SQL 쿼리 정의에서 참조된 기본 테이블 또는 관련 열이 존재해야 하며 유효해야 합니다.
+ 리더 노드 전용 함수: CURRENT\$1SCHEMA, CURRENT\$1SCHEMAS, HAS\$1DATABASE\$1PRIVILEGE, HAS\$1SCHEMA\$1PRIVILEGE, HAS\$1TABLE\$1PRIVILEGE.
+ 구체화된 뷰 정의에 변경 가능한 함수 또는 외부 스키마가 포함된 경우 AUTO REFRESH YES 옵션을 사용할 수 없습니다. 또한 다른 구체화된 뷰에서 구체화된 뷰를 정의할 때도 사용할 수 없습니다.
+ 구체화된 뷰에서 [ANALYZE](r_ANALYZE.md)를 수동으로 실행할 필요가 없습니다. 이는 현재 AUTO ANALYZE를 통해서만 이루어집니다. 자세한 내용은 [테이블 분석](t_Analyzing_tables.md) 섹션을 참조하세요.
+ RLS 보호 또는 DDM 보호 테이블 
+ 원격 데이터 공유 클러스터에서 구체화된 뷰를 생성하면 다른 구체화된 뷰, Spectrum 테이블, 다른 Redshift 클러스터에 정의된 테이블 및 UDF에 대한 참조가 지원되지 않습니다. 로컬(생산자) 클러스터에서 구체화된 뷰를 생성하는 데 지원됩니다.

## 예제
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

다음 예에서는 조인 및 집계되는 3개의 기본 테이블에서 구체화된 뷰를 생성합니다. 각 행은 판매된 티켓 수가 있는 범주를 나타냅니다. tickets\$1mv 구체화된 보기를 쿼리할 때 tickets\$1mv 구체화된 보기에서 미리 계산된 데이터에 직접 액세스합니다.

```
CREATE MATERIALIZED VIEW tickets_mv AS
    select   catgroup,
    sum(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;
```

다음 예제에서는 이전 예제와 유사한 구체화된 뷰를 생성하고 집계 함수 MAX()를 사용합니다.

```
CREATE MATERIALIZED VIEW tickets_mv_max AS
    select   catgroup,
    max(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;

SELECT name, state FROM STV_MV_INFO;
```

다음 예에서는 UNION ALL 절을 사용하여 Amazon Redshift `public_sales` 테이블과 Redshift Spectrum `spectrum.sales` 테이블을 조인하여 구체화된 뷰 `mv_sales_vw`를 생성합니다. Amazon Redshift Spectrum의 CREATE EXTERNAL TABLE 명령에 대한 자세한 내용은 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 섹션을 참조하세요. Redshift Spectrum 외부 테이블은 Amazon S3의 데이터를 참조합니다.

```
CREATE MATERIALIZED VIEW mv_sales_vw as
select salesid, qtysold, pricepaid, commission, saletime from public.sales
union all
select salesid, qtysold, pricepaid, commission, saletime from spectrum.sales
```

다음 예에서는 연합 쿼리 외부 테이블을 기반으로 구체화된 보기 `mv_fq`를 생성합니다. 연합 쿼리에 대한 자세한 내용은 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 섹션을 참조하세요.

```
CREATE MATERIALIZED VIEW mv_fq as select firstname, lastname from apg.mv_fq_example;

select firstname, lastname from mv_fq;
 firstname | lastname
-----------+----------
 John      | Day
 Jane      | Doe
(2 rows)
```

다음 예에서는 구체화된 보기의 정의를 보여줍니다.

```
SELECT pg_catalog.pg_get_viewdef('mv_sales_vw'::regclass::oid, true);

pg_get_viewdef
---------------------------------------------------
create materialized view mv_sales_vw as select a from t;
```

 다음 샘플은 구체화된 뷰 정의에서 AUTO REFRESH를 설정하는 방법을 보여주고 DISTSTYLE도 지정합니다. 먼저 간단한 기본 테이블을 생성합니다.

```
CREATE TABLE baseball_table (ball int, bat int);
```

그런 다음 구체화된 뷰를 생성합니다.

```
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
```

이제 mv\$1baseball 구체화된 뷰를 쿼리할 수 있습니다. 구체화된 뷰에 대해 AUTO REFRESH가 켜져 있는지 확인하려면 [STV\$1MV\$1INFO](r_STV_MV_INFO.md)을 참조하세요.

다음 샘플은 다른 데이터베이스의 소스 테이블을 참조하는 구체화된 뷰를 생성합니다. 소스 테이블인 database\$1A를 포함하는 데이터베이스가 database\$1B에서 생성한 구체화된 뷰와 동일한 클러스터 또는 작업 그룹에 있다고 가정합니다. (샘플을 자체 데이터베이스로 대체할 수 있습니다.) 먼저 *cities*라는 database\$1A에 *cityname* 열이 있는 테이블을 생성합니다. 열의 데이터 유형을 VARCHAR로 설정합니다. *소스 테이블을 생성한 후 database\$1B에서 다음 명령을 실행하여 소스가 cities* 테이블인 구체화된 뷰를 생성합니다. FROM 절에 소스 테이블의 데이터베이스와 스키마를 지정해야 합니다.

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

생성한 구체화된 뷰를 쿼리합니다. 쿼리는 원본 소스가 database\$1A의 *cities* 테이블인 레코드를 검색합니다.

```
select * from cities_mv;
```

SELECT 명령문을 실행하면 *cities\$1mv*가 레코드를 반환합니다. REFRESH 명령문을 실행할 때만 소스 테이블에서 레코드가 새로 고쳐집니다. 또한 구체화된 뷰에서는 레코드를 직접 업데이트할 수 없습니다. 구체화된 뷰의 데이터 새로 고침에 대한 자세한 내용은 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md) 섹션을 참조하세요.

구체화된 보기 개요와 구체화된 보기를 새로 고치고 삭제하는 데 사용되는 SQL 명령에 대한 자세한 내용은 다음 주제를 참조하세요.
+ [Amazon Redshift의 구체화된 뷰](materialized-view-overview.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)

# CREATE MODEL
<a name="r_CREATE_MODEL"></a>

**Topics**
+ [사전 조건](#r_create_model_prereqs)
+ [필수 권한](#r_simple_create_model-privileges)
+ [비용 관리](#r_create_model_cost)
+ [전체 CREATE MODEL](#r_full_create_model)
+ [파라미터](#r_create_model_parameters)
+ [사용 노트](r_create_model_usage_notes.md)
+ [사용 사례](r_create_model_use_cases.md)

## 사전 조건
<a name="r_create_model_prereqs"></a>

CREATE MODEL 문을 사용하기 전에 [Amazon Redshift 기계 학습 사용을 위한 클러스터 설정](getting-started-machine-learning.md#cluster-setup)의 사전 조건을 충족해야 합니다. 다음은 사전 조건을 개괄적으로 요약한 것입니다.
+ AWS 관리 콘솔 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 Amazon Redshift 클러스터를 생성합니다.
+ 클러스터를 생성하는 동안 AWS Identity and Access Management(IAM) 정책을 연결합니다.
+ Amazon Redshift와 SageMaker AI가 다른 서비스와 상호 작용하는 역할을 맡도록 허용하려면 IAM 역할에 적절한 신뢰 정책을 추가합니다.

IAM 역할, 신뢰 정책 및 기타 사전 조건에 대한 자세한 내용은 [Amazon Redshift 기계 학습 사용을 위한 클러스터 설정](getting-started-machine-learning.md#cluster-setup) 섹션을 참조하세요.

다음으로 CREATE MODEL 문에 대한 여러 사용 사례를 찾아볼 수 있습니다.
+ [단순 CREATE MODEL](r_create_model_use_cases.md#r_simple_create_model)
+ [사용자 안내에 따라 CREATE MODEL](r_create_model_use_cases.md#r_user_guidance_create_model)
+ [AUTO OFF로 CREATE XGBoost 모델](r_create_model_use_cases.md#r_auto_off_create_model)
+ [기존 보유 모델 사용(BYOM) - 로컬 추론](r_create_model_use_cases.md#r_byom_create_model)
+ [기존 보유 모델 사용(BYOM) - 원격 추론](r_create_model_use_cases.md#r_byom_create_model_remote)
+ [K-MEANS를 사용한 CREATE MODEL](r_create_model_use_cases.md#r_k-means_create_model)
+ [전체 CREATE MODEL](#r_full_create_model)

## 필수 권한
<a name="r_simple_create_model-privileges"></a>

CREATE MODEL에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE MODEL 권한이 있는 사용자
+ GRANT CREATE MODEL 권한이 있는 역할

## 비용 관리
<a name="r_create_model_cost"></a>

 Amazon Redshift ML은 기존 클러스터 리소스를 사용하여 예측 모델을 생성하므로 추가 비용을 지불하지 않아도 됩니다. 그러나 클러스터 크기를 조정해야 하거나 모델을 훈련하려는 경우 추가 비용이 발생할 수 있습니다. Amazon Redshift AI 기계 학습은 모델 훈련에 Amazon SageMaker를 사용하며, 이 경우 추가 관련 비용이 발생합니다. 훈련에 소요되는 최대 시간을 제한하거나 모델 훈련에 사용되는 훈련 예제의 수를 제한하는 등 추가 비용을 관리하는 방법이 있습니다. 자세한 내용은 [Amazon Redshift 기계 학습 사용 비용](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)을 참조하세요.

## 전체 CREATE MODEL
<a name="r_full_create_model"></a>

다음은 전체 CREATE MODEL 구문의 기본 옵션을 요약한 것입니다.

### 전체 CREATE MODEL 구문
<a name="r_auto_off-create-model-synposis"></a>

다음은 CREATE MODEL 문의 전체 구문입니다.

**중요**  
CREATE MODEL 문을 사용하여 모델을 생성할 때 다음 구문의 키워드 순서를 따릅니다.

```
CREATE MODEL model_name
FROM { table_name | ( select_statement )  | 'job_name' }
[ TARGET column_name ]
FUNCTION function_name [ ( data_type [, ...] ) ] 
[ RETURNS data_type ] 
  -- supported only for BYOM
[ SAGEMAKER 'endpoint_name'[:'model_name']] 
  -- supported only for BYOM remote inference
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[ AUTO ON / OFF ]
  -- default is AUTO ON
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER | KMEANS | FORECAST } ]
  -- not required for non AUTO OFF case, default is the list of all supported types
  -- required for AUTO OFF
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
  -- not supported when AUTO OFF
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1_Macro' | 'AUC' |
             'reg:squarederror' | 'reg:squaredlogerror'| 'reg:logistic'|
             'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge',
             'multi:softmax' | 'RMSE' | 'WAPE' | 'MAPE' | 'MASE' | 'AverageWeightedQuantileLoss' ) ]
  -- for AUTO ON: first 5 are valid
  -- for AUTO OFF: 6-13 are valid
  -- for FORECAST: 14-18 are valid
[ PREPROCESSORS 'string' ]
  -- required for AUTO OFF, when it has to be 'none'
  -- optional for AUTO ON
[ HYPERPARAMETERS { DEFAULT | DEFAULT EXCEPT ( Key 'value' (,...) ) } ]
  -- support XGBoost hyperparameters, except OBJECTIVE
  -- required and only allowed for AUTO OFF
  -- default NUM_ROUND is 100
  -- NUM_CLASS is required if objective is multi:softmax (only possible for AUTO OFF)
 [ SETTINGS (
   S3_BUCKET 'amzn-s3-demo-bucket',  |
    -- required
  TAGS 'string', |
    -- optional
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional, defualt is on.
  MAX_CELLS integer, |
    -- optional, default is 1,000,000
  MAX_RUNTIME integer (, ...) |
    -- optional, default is 5400 (1.5 hours)
  HORIZON integer, |
    -- required if creating a forecast model
  FREQUENCY integer, |
    -- required if creating a forecast model
  PERCENTILES string, |
    -- optional if creating a forecast model
  MAX_BATCH_ROWS integer -- optional for BYOM remote inference
    ) ]
```

## 파라미터
<a name="r_create_model_parameters"></a>

model\$1name  
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1 *'job\$1name'*\$1  
table\$1name 또는 훈련 데이터를 지정하는 쿼리입니다. 시스템의 기존 테이블이거나 괄호로 묶인 Amazon Redshift 호환 SELECT 쿼리, 즉 ()일 수 있습니다. 쿼리 결과에는 2개 이상의 열이 있어야 합니다.

TARGET *column\$1name*  
예측 대상이 되는 열의 이름입니다. FROM 절에 열이 있어야 합니다.

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
생성할 함수의 이름과 입력 인수의 데이터 형식입니다. 데이터베이스에 있는 스키마의 스키마 이름을 함수 이름 대신 입력할 수 있습니다.

RETURNS *data\$1type*  
모델의 함수에서 반환할 데이터 형식입니다. 반환된 `SUPER` 데이터 형식은 원격 추론이 있는 BYOM에만 적용됩니다.

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]  
Amazon SageMaker AI 엔드포인트의 이름입니다. 엔드포인트 이름이 다중 모델 엔드포인트를 가리키는 경우 사용할 모델의 이름을 추가합니다. 엔드포인트는 Amazon Redshift 클러스터와 동일한 AWS 리전에서 호스팅되어야 합니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 기본 키워드를 사용하여 CREATE MODEL 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다. 또는 IAM 역할의 ARN을 지정하여 해당 역할을 사용할 수도 있습니다.

[ AUTO ON / OFF ]  
 전처리기, 알고리즘 및 하이퍼파라미터 선택의 CREATE MODEL 자동 검색을 켜거나 끕니다. 예측 모델을 생성할 때 on을 지정하면 Amazon Forecast가 데이터 세트의 각 시계열에 최적의 알고리즘 조합을 적용하는 AutoPredictor를 사용한다는 뜻입니다.

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1 KMEANS \$1 FORECAST \$1*   
(옵션) 모델 유형을 지정합니다. XGBoost, 다층 퍼셉트론(MLP), KMEANS 또는 Linear Learner와 같은 특정 모델 유형의 모델을 훈련할지 여부를 지정할 수 있습니다. 이 모델은 모두 Amazon SageMaker AI Autopilot에서 지원하는 알고리즘입니다. 파라미터를 지정하지 않으면 지원되는 모든 모델 유형이 훈련 중 최상의 모델을 찾기 위해 검색됩니다. 또한 Redshift ML에서 예측 모델을 생성하여 정확한 시계열 예측을 생성할 수도 있습니다.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(옵션) 문제 유형을 지정합니다. 문제 유형을 알고 있는 경우 해당 특정 모델 유형의 최상의 모델만 검색하도록 Amazon Redshift를 제한할 수 있습니다. 이 파라미터를 지정하지 않으면 데이터를 기반으로 훈련 중 문제 유형이 검색됩니다.

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC' \$1 'reg:squarederror' \$1 'reg:squaredlogerror' \$1 'reg:logistic' \$1 'reg:pseudohubererror' \$1 'reg:tweedie' \$1 'binary:logistic' \$1 'binary:hinge' \$1 'multi:softmax' \$1 'RMSE' \$1 'WAPE' \$1 'MAPE' \$1 'MASE' \$1 'AverageWeightedQuantileLoss' )  
(옵션) 기계 학습 시스템의 예측 품질을 측정하는 데 사용되는 목표 지표의 이름을 지정합니다. 이 지표는 데이터의 모델 파라미터 값에 대한 최상의 추정치를 제공하기 위해 훈련 중에 최적화됩니다. 지표를 명시적으로 지정하지 않은 경우 기본 동작은 MSE(회귀 분석의 경우), F1(이진 분류의 경우), 정확도(다중 클래스 분류의 경우)를 자동으로 사용하는 것입니다. 목표에 대한 자세한 내용은 *Amazon SageMaker AI API Reference*의 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) 및 XGBOOST 설명서의 [Learning task parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters)를 참조하세요 RMSE, WAPE, MAPE, MASE 및 AverageWeightedQuantileLoss 값은 예측 모델에만 적용할 수 있습니다. 자세한 내용은 [CreateAutoPredictor](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateAutoPredictor.html#forecast-CreateAutoPredictor-request-OptimizationMetric) API 작업을 참조하세요.

 *PREPROCESSORS 'string' *   
(옵션) 특정 열 집합에 대한 전처리기의 특정 조합을 지정합니다. 형식은 columnSet의 목록과 각 열 집합에 적용할 적절한 변환입니다. Amazon Redshift는 특정 변환기 목록의 모든 변환기를 해당 ColumnSet의 모든 열에 적용합니다. 예를 들어 Imputer가 있는 OneHotEncoder를 열 t1 및 t2에 적용하려면 다음 샘플 명령을 사용합니다.  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
  {"ColumnSet": [
      "t1",
      "t2"
    ],
    "Transformers": [
      "OneHotEncoder",
      "Imputer"
    ]
  },
  {"ColumnSet": [
      "t3"
    ],
    "Transformers": [
      "OneHotEncoder"
    ]
  },
  {"ColumnSet": [
      "temp"
    ],
    "Transformers": [
      "Imputer",
      "NumericPassthrough"
    ]
  }
]'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket'
)
```

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
기본 XGBoost 파라미터가 사용되는지 아니면 사용자 지정 값으로 재정의되는지를 지정합니다. 작은따옴표로 값을 묶여야 합니다. 다음은 XGBoost에 대한 파라미터와 해당 기본값의 예입니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_CREATE_MODEL.html)

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 TAGS 'string', \$1 KMS\$1KEY\$1ID *'kms\$1string' *, \$1 S3\$1GARBAGE\$1COLLECT on / off, \$1 MAX\$1CELLS integer , \$1 MAX\$1RUNTIME (,...) , \$1 HORIZON integer, \$1 FREQUENCY forecast\$1frequency, \$1 PERCENTILES array of strings )  
S3\$1BUCKET 절은 중간 결과를 저장하는 데 사용되는 Amazon S3 위치를 지정합니다.  
(선택 사항) TAGS 파라미터는 쉼표로 구분된 키-값 쌍의 목록으로, Amazon SageMaker AI에서 생성한 리소스에 태그를 지정하는 데 사용할 수 있으며 Amazon Forecast에 사용할 수 있습니다. 태그는 리소스를 구성하고 비용을 할당하는 데 도움이 됩니다 쌍의 값은 선택 사항이므로 `key=value` 형식을 사용하거나 키만 생성하여 태그를 만들 수 있습니다. Amazon Redshift의 태그에 대한 자세한 내용은 [태그 개요](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-tagging.html)를 참조하세요.  
(선택 사항) KMS\$1KEY\$1ID는 Amazon Redshift가 AWS KMS 키로 서버 측 암호화를 사용하여 저장 데이터를 보호할지 여부를 지정합니다. 전송 중인 데이터는 보안 소켓 계층(SSL)으로 보호됩니다.  
(선택 사항) S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1는 Amazon Redshift가 모델 훈련에 사용되는 결과 데이터 세트에 대해 가비지 수집을 수행할지 여부를 지정합니다. OFF로 설정하면 모델 훈련에 사용된 결과 데이터 집합과 모델이 Amazon S3에 남아 다른 용도로 사용할 수 있습니다. ON으로 설정하면 훈련이 완료된 후 Amazon Redshift가 Amazon S3에서 아티팩트를 삭제합니다. 기본값은 ON입니다.  
(선택 사항) MAX\$1CELLS는 훈련 데이터의 셀 수를 지정합니다. 이 값은 레코드 수(훈련 쿼리 또는 테이블)에 열 수를 곱한 값입니다. 기본값은 1,000,000입니다.  
(선택 사항) MAX\$1RUNTIME은 훈련할 최대 시간을 지정합니다. 데이터 집합 크기에 따라 훈련 작업이 더 빨리 완료되는 경우가 많습니다. 이는 훈련에 소요되는 최대 시간을 지정합니다. 기본값은 5,400(90분)입니다.  
HORIZON은 예측 모델이 반환할 수 있는 최대 예측 수를 지정합니다. 모델을 학습시킨 후에는 이 정수를 변경할 수 없습니다. 이 파라미터는 예측 모델을 학습하는 경우 필요합니다.  
FREQUENCY는 예측을 얼마나 세분화된 시간 단위로 설정할지를 지정합니다. 사용 가능한 옵션은 `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`입니다. 이 파라미터는 예측 모델을 학습하는 경우 필요합니다.  
(선택 사항) PERCENTILES는 예측기를 훈련하는 데 사용되는 예측 유형을 지정하는 쉼표로 구분된 문자열입니다. 예측 유형은 0.01에서 0.99까지의 사분위수(0.01 이상 증분)일 수 있습니다. 평균을 사용하여 평균 예측을 지정할 수도 있습니다. 최대 5개의 예측 유형을 지정할 수 있습니다.

 MAX\$1BATCH\$1ROWS *정수*   
(선택) Amazon Redshift가 단일 SageMaker AI 간접 호출에 대한 단일 배치 요청으로 보내는 최대 행 수입니다. 원격 추론 기능이 있는 BYOM에만 지원됩니다. 이 파라미터의 최소값은 1입니다. 최대값은 `INT_MAX` 또는 2,147,483,647입니다. 이 파라미터는 입력 및 반환 데이터 형식이 모두 *SUPER*인 경우에만 필요합니다. 기본값은 `INT_MAX` 또는 2,147,483,647입니다.

# 사용 노트
<a name="r_create_model_usage_notes"></a>

CREATE MODEL을 사용할 때는 다음 사항을 고려하세요.
+ CREATE MODEL 문은 비동기 모드에서 작동하며 Amazon S3로 훈련 데이터를 내보낼 때 반환됩니다. Amazon SageMaker AI의 나머지 훈련 단계는 백그라운드에서 진행됩니다. 훈련이 진행되는 동안 해당 추론 함수가 표시되지만 실행할 수는 없습니다. [STV\$1ML\$1MODEL\$1INFO](r_STV_ML_MODEL_INFO.md)를 쿼리하여 훈련 상태를 볼 수 있습니다.
+ 훈련은 기본적으로 자동 모델에서 백그라운드로 최대 90분 동안 실행될 수 있으며 확장될 수 있습니다. 훈련을 취소하려면 [DROP MODEL](r_DROP_MODEL.md) 명령을 실행하기만 하면 됩니다.
+ 모델을 생성하는 데 사용되는 Amazon Redshift 클러스터와 훈련 데이터 및 모델 아티팩트를 준비하는 데 사용되는 Amazon S3 버킷은 동일한 AWS 리전에 있어야 합니다.
+ 모델 훈련 중 Amazon Redshift 및 SageMaker AI는 사용자가 제공하는 Amazon S3 버킷에 중간 아티팩트를 저장합니다. 기본적으로 Amazon Redshift는 CREATE MODEL 작업이 끝날 때 가비지 수집을 수행합니다. Amazon Redshift는 Amazon S3에서 해당 객체를 제거합니다. Amazon S3에 이러한 아티팩트를 유지하려면 S3\$1GARBAGE COLLECT OFF 옵션을 설정합니다.
+ FROM 절에 제공된 훈련 데이터에서 최소 500개의 행을 사용해야 합니다.
+ CREATE MODEL 문을 사용할 때 FROM \$1 table\$1name \$1 ( select\$1query ) \$1 절에 특성(입력) 열을 최대 256개까지만 지정할 수 있습니다.
+ AUTO ON의 경우 훈련 집합으로 사용할 수 있는 열 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE, BOOLEAN, CHAR, VARCHAR, DATE, TIME, TIMETZ, TIMESTAMP 및 TIMESTAMPTZ입니다. AUTO OFF의 경우 훈련 집합으로 사용할 수 있는 열 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE 및 BOOLEAN입니다.
+ DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, GEOMETRY, GEOGRAPHY, HLLSKETCH, SUPER 또는 VARBYTE는 대상 열 형식으로 사용할 수 없습니다.
+ 모델 정확도를 높이려면 다음 중 하나를 수행합니다.
  + FROM 절에 훈련 데이터를 지정할 때 CREATE MODEL 명령에 가능한 한 많은 관련 열을 추가합니다.
  + MAX\$1RUNTIME 및 MAX\$1CELLS에 더 큰 값을 사용합니다. 이 파라미터의 값이 클수록 모델 학습 비용이 증가합니다.
+ 훈련 데이터가 계산되어 Amazon S3 버킷으로 내보내는 즉시 CREATE MODEL 문 실행이 돌아옵니다. 그 이후에는 SHOW MODEL 명령을 사용하여 훈련 상태를 확인할 수 있습니다. 백그라운드에서 훈련 중인 모델이 실패하면 SHOW MODEL을 사용하여 오류를 확인할 수 있습니다. 실패한 모델은 재시도할 수 없습니다. DROP MODEL을 사용하여 실패한 모델을 제거하고 새 모델을 다시 생성합니다. SHOW MODEL에 대한 자세한 내용은 [SHOW MODEL](r_SHOW_MODEL.md) 섹션을 참조하세요.
+ 로컬 BYOM은 Amazon Redshift 기계 학습에서 BYOM이 아닌 경우에 지원하는 것과 동일한 종류의 모델을 지원합니다. Amazon Redshift는 일반 XGBoost(XGBoost 버전 1.0 이상 사용), 프리프로세서가 없는 KMEANS 모델 및 Amazon SageMaker AI Autopilot에서 훈련된 XGBOOST/MLP/Linear Learner 모델을 지원합니다. Amazon SageMaker AI Neo에서도 지원하는 Autopilot이 지정한 전처리기로 후자를 지원합니다.
+ Amazon Redshift 클러스터에서 가상 프라이빗 클라우드(VPC)에 향상된 라우팅을 사용하는 경우 클러스터가 있는 VPC에 대해 Amazon S3 VPC 엔드포인트와 SageMaker AI VPC 엔드포인트를 생성해야 합니다. 이렇게 하면 CREATE MODEL을 수행하는 동안 이러한 서비스 간에 VPC를 통해 트래픽을 실행할 수 있습니다. 자세한 내용은 [SageMaker AI Clarify Job Amazon VPC Subnets and Security Groups](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-vpc.html#clarify-vpc-job)을 참조하세요.

# 사용 사례
<a name="r_create_model_use_cases"></a>

다음 사용 사례는 필요에 맞게 CREATE MODEL을 사용하는 방법을 보여줍니다.

## 단순 CREATE MODEL
<a name="r_simple_create_model"></a>

다음은 CREATE MODEL 구문의 기본 옵션을 요약한 것입니다.

### 단순 CREATE MODEL 구문
<a name="r_simple-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_query ) }
TARGET column_name
FUNCTION prediction_function_name
IAM_ROLE { default }
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  [ MAX_CELLS integer ]
)
```

### 단순 CREATE MODEL 파라미터
<a name="r_simple-create-model-parameters"></a>

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1  
table\$1name 또는 훈련 데이터를 지정하는 쿼리입니다. 시스템의 기존 테이블이거나 괄호로 묶인 Amazon Redshift 호환 SELECT 쿼리, 즉 ()일 수 있습니다. 쿼리 결과에는 2개 이상의 열이 있어야 합니다.

TARGET *column\$1name*  
예측 대상이 되는 열의 이름입니다. FROM 절에 열이 있어야 합니다.

FUNCTION *prediction\$1function\$1name*   
CREATE MODEL에서 생성하고 이 모델을 사용하여 예측하는 데 사용할 Amazon Redshift 기계 학습 함수의 이름을 지정하는 값입니다. 이 함수는 모델 객체와 동일한 스키마에 생성되며 오버로드될 수 있습니다.  
Amazon Redshift 기계 학습은 회귀 및 분류를 위한 XGBoost(Xtreme Gradient Boosted tree) 모델과 같은 모델을 지원합니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
 기본 키워드를 사용하여 CREAT MODEL 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다. 또는 IAM 역할의 ARN을 지정하여 해당 역할을 사용할 수도 있습니다.

 *S3\$1BUCKET *'amzn-s3-demo-bucket'**  
이전에 만든 Amazon S3 버킷의 이름은 Amazon Redshift와 SageMaker AI 간에 훈련 데이터와 아티팩트를 공유하는 데 사용됩니다. Amazon Redshift는 훈련 데이터를 언로드하기 전에 이 버킷에 하위 폴더를 생성합니다. 훈련이 완료되면 Amazon Redshift는 생성된 하위 폴더와 해당 콘텐츠를 삭제합니다.

MAX\$1CELLS 정수   
FROM 절에서 내보낼 최대 셀 수입니다. 기본값은 1,000,000입니다.  
셀 수는 훈련 데이터의 행 수(FROM 절 테이블 또는 쿼리에 의해 생성됨)에 열 수를 곱한 값입니다. 훈련 데이터의 셀 수가 max\$1cells 파라미터에 지정된 것보다 많은 경우 CREATE MODEL은 FROM 절 훈련 데이터를 다운샘플링하여 훈련 집합의 크기를 MAX\$1CELLS 미만으로 줄입니다. 더 큰 훈련 데이터 집합을 허용하면 정확도를 높일 수 있지만 모델을 훈련하는 데 더 많은 시간과 비용이 더 많이 들 수 있습니다.  
Amazon Redshift 사용 비용에 대한 자세한 내용은 [Amazon Redshift 기계 학습 사용 비용](cost.md) 섹션을 참조하세요.  
다양한 셀 번호와 관련된 비용 및 무료 평가판 세부 정보에 대한 자세한 내용은 [Amazon Redshift 요금](https://aws.amazon.com/redshift/pricing) 섹션을 참조하세요.

## 사용자 안내에 따라 CREATE MODEL
<a name="r_user_guidance_create_model"></a>

다음으로 [단순 CREATE MODEL](#r_simple_create_model)에 설명된 옵션 외에 CREATE MODEL에 대한 옵션에 대한 설명을 찾아볼 수 있습니다.

기본적으로 CREATE MODEL은 특정 데이터 집합에 대한 최적의 전처리 및 모델 조합을 검색합니다. 추가 제어를 원하거나 모델에 대한 추가 도메인 지식(예: 문제 유형 또는 목표)을 도입할 수 있습니다. 고객 이탈 시나리오에서 "고객이 활동하고 있지 않음"이라는 결과가 드물다면 F1 목표가 정확도 목표보다 선호되는 경우가 많습니다. 높은 정확도 모델은 항상 "고객이 활동하고 있음"이라고 예측할 수 있기 때문에 정확도는 높지만 비즈니스 가치는 거의 없습니다. F1 목표에 대한 자세한 내용은 *Amazon SageMaker AI API Reference*의 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) 섹션을 참조하세요.

그런 다음 CREATE MODEL은 목표와 같은 지정된 측면에 대한 제안을 따릅니다. 동시에 CREATE MODEL은 최고의 전처리기와 최고의 하이퍼파라미터를 자동으로 검색합니다.

### 사용자 안내 구문으로 CREATE MODEL
<a name="r_user_guidance-create-model-synposis"></a>

CREATE MODEL은 지정할 수 있는 측면과 Amazon Redshift가 자동으로 검색하는 측면에서 더 많은 유연성을 제공합니다.

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER} ]
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1Macro' | 'AUC') ]
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### 사용자 안내 파라미터로 CREATE MODEL
<a name="r_user_guidance-create-model-parameters"></a>

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1*   
(옵션) 모델 유형을 지정합니다. XGBoost, 다층 퍼셉트론(MLP) 또는 Linear Learner와 같은 특정 모델 유형의 모델을 교육할지 여부를 지정할 수 있습니다. 이 모델은 모두 Amazon SageMaker AI Autopilot에서 지원하는 알고리즘입니다. 파라미터를 지정하지 않으면 지원되는 모든 모델 유형이 훈련 중 최상의 모델을 찾기 위해 검색됩니다.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(옵션) 문제 유형을 지정합니다. 문제 유형을 알고 있는 경우 해당 특정 모델 유형의 최상의 모델만 검색하도록 Amazon Redshift를 제한할 수 있습니다. 이 파라미터를 지정하지 않으면 데이터를 기반으로 훈련 중 문제 유형이 검색됩니다.

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC')  
(옵션) 기계 학습 시스템의 예측 품질을 측정하는 데 사용되는 목표 지표의 이름을 지정합니다. 이 지표는 데이터의 모델 파라미터 값에 대한 최상의 추정치를 제공하기 위해 훈련 중에 최적화됩니다. 지표를 명시적으로 지정하지 않은 경우 기본 동작은 MSE(회귀 분석의 경우), F1(이진 분류의 경우), 정확도(다중 클래스 분류의 경우)를 자동으로 사용하는 것입니다. 목표에 대한 자세한 내용은 *Amazon SageMaker AI API Reference*의 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) 섹션을 참조하세요.

MAX\$1CELLS 정수   
(옵션) 훈련 데이터의 셀 수를 지정합니다. 이 값은 레코드 수(훈련 쿼리 또는 테이블)에 열 수를 곱한 값입니다. 기본값은 1,000,000입니다.

MAX\$1RUNTIME 정수   
(옵션) 훈련할 최대 시간을 지정합니다. 데이터 집합 크기에 따라 훈련 작업이 더 빨리 완료되는 경우가 많습니다. 이는 훈련에 소요되는 최대 시간을 지정합니다. 기본값은 5,400(90분)입니다.

S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1  
(옵션) Amazon Redshift가 모델 훈련에 사용되는 결과 데이터 집합에 대해 가비지 수집을 수행할지 여부를 지정합니다. OFF로 설정하면 모델 훈련에 사용된 결과 데이터 집합과 모델이 Amazon S3에 남아 다른 용도로 사용할 수 있습니다. ON으로 설정하면 훈련이 완료된 후 Amazon Redshift가 Amazon S3에서 아티팩트를 삭제합니다. 기본값은 ON입니다.

KMS\$1KEY\$1ID 'kms\$1key\$1id'  
(옵션) Amazon Redshift가 AWS KMS 키로 서버 측 암호화를 사용하여 저장된 데이터를 보호할지 여부를 지정합니다. 전송 중인 데이터는 보안 소켓 계층(SSL)으로 보호됩니다.

 *PREPROCESSORS 'string' *   
(옵션) 특정 열 집합에 대한 전처리기의 특정 조합을 지정합니다. 형식은 columnSet의 목록과 각 열 집합에 적용할 적절한 변환입니다. Amazon Redshift는 특정 변환기 목록의 모든 변환기를 해당 ColumnSet의 모든 열에 적용합니다. 예를 들어 Imputer가 있는 OneHotEncoder를 열 t1 및 t2에 적용하려면 다음 샘플 명령을 사용합니다.  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
{"ColumnSet": [
    "t1",
    "t2"
  ],
  "Transformers": [
    "OneHotEncoder",
    "Imputer"
  ]
},
{"ColumnSet": [
    "t3"
  ],
  "Transformers": [
    "OneHotEncoder"
  ]
},
{"ColumnSet": [
    "temp"
  ],
  "Transformers": [
    "Imputer",
    "NumericPassthrough"
  ]
}
]'
SETTINGS (
S3_BUCKET 'amzn-s3-demo-bucket'
)
```

Amazon Redshift는 다음 변환기를 지원합니다.
+ OneHotEncoder - 일반적으로 이산 값을 하나의 0이 아닌 값이 있는 이진 벡터로 인코딩하는 데 사용됩니다. 이 변환기는 많은 기계 학습 모델에 적합합니다.
+ OrdinalEncoder – 이산 값을 단일 정수로 인코딩합니다. 이 변환기는 MLP 및 Linear Learner와 같은 특정 기계 학습 모델에 적합합니다.
+ NumericPassthrough – 입력을 있는 그대로 모델에 전달합니다.
+ Imputer – 누락된 값과 NaN(Not a Number) 값을 채웁니다.
+ ImputerWithIndicator – 누락된 값과 NaN 값을 채웁니다. 또한 이 변환기는 누락되어 채워진 값이 있는지 여부에 대한 표시기를 생성합니다.
+ Normalizer – 많은 기계 학습 알고리즘의 성능을 향상시킬 수 있는 값을 정규화합니다.
+ DateTimeVectorizer - 기계 학습 모델에서 사용할 수 있는 날짜/시간 데이터 형식의 열을 나타내는 벡터 임베딩을 생성합니다.
+ PCA - 가능한 한 많은 정보를 유지하면서 특성 수를 줄이기 위해 데이터를 저차원 공간에 표시합니다.
+ StandardScaler – 평균을 제거하고 단위 분산에 맞게 조정하여 특성을 표준화합니다.
+ MinMax – 각 특성을 지정된 범위로 확장하여 특성을 변환합니다.

Amazon Redshift 기계 학습은 훈련된 변환기를 저장하고 예측 쿼리의 일부로 자동 적용합니다. 모델에서 예측을 생성할 때는 변환기를 지정할 필요가 없습니다.

## AUTO OFF로 CREATE XGBoost 모델
<a name="r_auto_off_create_model"></a>

AUTO OFF CREATE MODEL은 일반적으로 기본 CREATE MODEL과 다른 목표를 가지고 있습니다.

원하는 모델 유형과 이러한 모델을 훈련할때 사용할 하이퍼파라미터를 이미 알고 있는 고급 사용자는 AUTO OFF와 함께 CREATE MODEL을 사용하여 전처리기 및 하이퍼파라미터의 CREATE MODEL 자동 검색을 해제할 수 있습니다. 이를 위해서는 모델 유형을 명시적으로 지정합니다. XGBoost는 현재 AUTO가 OFF로 설정된 경우 지원되는 유일한 모델 유형입니다. 하이퍼파라미터를 지정할 수 있습니다. Amazon Redshift는 지정한 하이퍼파라미터에 대해 기본값을 사용합니다.

### AUTO OFF 구문이 있는 CREATE XGBoost 모델
<a name="r_auto_off-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | (select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE { 'reg:squarederror' | 'reg:squaredlogerror' | 'reg:logistic' |
            'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge' |
            'multi:softmax' | 'rank:pairwise' | 'rank:ndcg' }
HYPERPARAMETERS DEFAULT EXCEPT (
    NUM_ROUND '10',
    ETA '0.2',
    NUM_CLASS '10',
    (, ...)
)
PREPROCESSORS 'none'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### AUTO OFF 파라미터로 CREATE XGBoost 모델
<a name="r_auto_off-create-model-parameters"></a>

 *AUTO OFF*   
전처리기, 알고리즘 및 하이퍼파라미터 선택의 CREATE MODEL 자동 검색을 해제합니다.

MODEL\$1TYPE XGBOOST  
XGBOOST를 사용하여 모델을 훈련하도록 지정합니다.

OBJECTIVE str  
알고리즘에서 인식하는 목표를 지정합니다. Amazon Redshift는 reg:squarederror, reg:squaredlogerror, reg:logistic, reg:pseudohubererror, reg:tweedie, binary:logistic, binary:hinge, multi:softmax를 지원합니다. 이러한 목표에 대한 자세한 내용은 XGBoost 설명서의 [Learning task parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) 섹션을 참조하세요.

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
기본 XGBoost 파라미터가 사용되는지 아니면 사용자 지정 값으로 재정의되는지를 지정합니다. 작은따옴표로 값을 묶여야 합니다. 다음은 XGBoost에 대한 파라미터와 해당 기본값의 예입니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_create_model_use_cases.html)

다음 예에서는 XGBoost용 데이터를 준비합니다.

```
DROP TABLE IF EXISTS abalone_xgb;

CREATE TABLE abalone_xgb (
length_val float,
diameter float,
height float,
whole_weight float,
shucked_weight float,
viscera_weight float,
shell_weight float,
rings int,
record_number int);

COPY abalone_xgb
FROM 's3://redshift-downloads/redshift-ml/abalone_xg/'
REGION 'us-east-1'
IAM_ROLE default
IGNOREHEADER 1 CSV;
```

다음 예에서는 MODEL\$1TYPE, OBJECTIVE 및 PREPROCESSORS와 같은 고급 옵션이 지정된 XGBoost 모델을 생성합니다.

```
DROP MODEL abalone_xgboost_multi_predict_age;

CREATE MODEL abalone_xgboost_multi_predict_age
FROM ( SELECT length_val,
              diameter,
              height,
              whole_weight,
              shucked_weight,
              viscera_weight,
              shell_weight,
              rings
   FROM abalone_xgb WHERE record_number < 2500 )
TARGET rings FUNCTION ml_fn_abalone_xgboost_multi_predict_age
IAM_ROLE default
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE 'multi:softmax'
PREPROCESSORS 'none'
HYPERPARAMETERS DEFAULT EXCEPT (NUM_ROUND '100', NUM_CLASS '30')
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

다음 예에서는 추론 쿼리를 사용하여 레코드 번호가 2,500보다 큰 물고기의 나이를 예측합니다. 위의 명령에서 생성된 ml\$1fn\$1abalone\$1xgboost\$1multi\$1predict\$1age 함수가 사용됩니다.

```
select ml_fn_abalone_xgboost_multi_predict_age(length_val,
                                                   diameter,
                                                   height,
                                                   whole_weight,
                                                   shucked_weight,
                                                   viscera_weight,
                                                   shell_weight)+1.5 as age
from abalone_xgb where record_number > 2500;
```

## 기존 보유 모델 사용(BYOM) - 로컬 추론
<a name="r_byom_create_model"></a>

Amazon Redshift 기계 학습은 로컬 추론에서 기존 보유 모델 사용(BYOM)을 지원합니다.

다음은 BYOM용 CREATE MODEL 구문에 대한 옵션을 요약한 것입니다. Amazon Redshift에서 로컬로 데이터베이스 내 추론을 위해 Amazon SageMaker AI와 함께 Amazon Redshift 외부에서 훈련된 모델을 사용할 수 있습니다.

### 로컬 추론을 위한 CREATE MODEL 구문
<a name="r_local-create-model"></a>

다음은 로컬 추론을 위한 CREATE MODEL 구문에 대한 설명입니다.

```
CREATE MODEL model_name
FROM ('job_name' | 's3_path' )
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
IAM_ROLE { default }
[ SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', | --required
  KMS_KEY_ID 'kms_string') --optional
];
```

Amazon Redshift는 현재 BYOM용으로 사전 훈련된 XGBoost, MLP 및 Linear Learner 모델만 지원합니다. 이 경로를 사용하여 로컬 추론을 위해 Amazon SageMaker AI에서 직접 훈련된 SageMaker AI Autopilot과 모델을 가져올 수 있습니다.

#### 로컬 추론을 위한 CREATE MODEL 파라미터
<a name="r_local-create-model-parameters"></a>

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

FROM (*'job\$1name'* \$1 *'s3\$1path'* )  
*job\$1name*은 Amazon SageMaker AI 작업 이름을 입력으로 사용합니다. 작업 이름은 Amazon SageMaker AI 훈련 작업 이름 또는 Amazon SageMaker AI Autopilot 작업 이름일 수 있습니다. 작업은 Amazon Redshift 클러스터를 소유한 동일한 AWS 계정에서 생성되어야 합니다. 작업 이름을 찾으려면 Amazon SageMaker AI를 시작합니다. **훈련(Training)** 드롭다운 메뉴에서 **훈련 작업(Training jobs)**을 선택합니다.  
*'s3\$1path'*는 모델을 생성할 때 사용할 .tar.gz 모델 아티팩트 파일의 S3 위치를 지정합니다.

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
생성할 함수의 이름과 입력 인수의 데이터 형식입니다. 스키마 이름을 제공할 수 있습니다.

RETURNS *data\$1type*  
함수에 의해 반환되는 값의 데이터 형식입니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 기본 키워드를 사용하여 CREATE MODEL 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다.

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 KMS\$1KEY\$1ID *'kms\$1string'*)  
S3\$1BUCKET 절은 중간 결과를 저장하는 데 사용되는 Amazon S3 위치를 지정합니다.  
(옵션) KMS\$1KEY\$1ID 절은 Amazon Redshift가 AWS KMS 키로 서버 측 암호화를 사용하여 저장된 데이터를 보호할지 여부를 지정합니다. 전송 중인 데이터는 보안 소켓 계층(SSL)으로 보호됩니다.  
자세한 내용은 [사용자 안내에 따라 CREATE MODEL](#r_user_guidance_create_model) 섹션을 참조하세요.

#### 로컬 추론을 위한 CREATE MODEL 예
<a name="r_local-create-model-example"></a>

다음 예에서는 Amazon Redshift 외부의 Amazon SageMaker AI에서 이전에 훈련된 모델을 생성합니다. 모델 유형은 로컬 추론을 위해 Amazon Redshift 기계 학습에서 지원되므로 다음 CREATE MODEL은 Amazon Redshift에서 로컬로 사용할 수 있는 함수를 생성합니다. SageMaker AI 훈련 작업 이름을 제공할 수 있습니다.

```
CREATE MODEL customer_churn
FROM 'training-job-customer-churn-v4'
FUNCTION customer_churn_predict (varchar, int, float, float)
RETURNS int
IAM_ROLE default
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

모델이 생성된 후 지정된 인수 형식과 함께 *customer\$1churn\$1predict* 함수를 사용하여 예측할 수 있습니다.

## 기존 보유 모델 사용(BYOM) - 원격 추론
<a name="r_byom_create_model_remote"></a>

또한 Amazon Redshift 기계 학습은 원격 추론에서도 기존 보유 모델 사용(BYOM)을 지원합니다.

다음은 BYOM용 CREATE MODEL 구문에 대한 옵션을 요약한 것입니다.

### 원격 추론을 위한 CREATE MODEL 구문
<a name="r_remote-create-model"></a>

다음은 원격 추론을 위한 CREATE MODEL 구문에 대한 설명입니다.

```
CREATE MODEL model_name 
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
SAGEMAKER 'endpoint_name'[:'model_name']
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[SETTINGS (MAX_BATCH_ROWS integer)];
```

#### 원격 추론을 위한 CREATE MODEL 파라미터
<a name="r_remote-create-model-parameters"></a>

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

FUNCTION *fn\$1name* ( [*data\$1type*] [, ...] )  
함수의 이름과 입력 인수의 데이터 형식입니다. 지원되는 모든 데이터 유형을 보려면 [데이터 유형](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)을 참조하세요. `Geography`, `geometry` 및 `hllsketch`는 지원되지 않습니다.  
`myschema.myfunction`과 같이 두 부분으로 구성된 표기법을 사용하여 스키마 내에 함수 이름을 제공할 수도 있습니다.

RETURNS *data\$1type*  
함수에 의해 반환되는 값의 데이터 형식입니다. 지원되는 모든 데이터 유형을 보려면 [데이터 유형](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)을 참조하세요. `Geography`, `geometry` 및 `hllsketch`는 지원되지 않습니다.

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]   
Amazon SageMaker AI 엔드포인트의 이름입니다. 엔드포인트 이름이 다중 모델 엔드포인트를 가리키는 경우 사용할 모델의 이름을 추가합니다. 엔드포인트는 Amazon Redshift 클러스터와 동일한 AWS 리전 및 AWS 계정에서 호스팅되어야 합니다. 엔드포인트를 찾으려면 Amazon SageMaker AI를 시작합니다. **추론(Inference)** 드롭다운 메뉴에서 **엔드포인트(Endpoints)**를 선택합니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 기본 키워드를 사용하여 CREATE MODEL 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다. 또는 IAM 역할의 ARN을 지정하여 해당 역할을 사용할 수도 있습니다.

MAX\$1BATCH\$1ROWS *정수*  
Amazon Redshift가 단일 SageMaker AI 간접 호출에 대한 단일 배치 요청으로 보내는 최대 행 수입니다. 원격 추론 기능이 있는 BYOM에만 지원됩니다. 배치의 실제 행 수는 입력 크기에 따라 다르지만 이 값보다 작거나 같아야 합니다. 이 파라미터의 최소값은 1입니다. 최대값은 `INT_MAX` 또는 2,147,483,647입니다. 이 파라미터는 입력 및 반환 데이터 형식이 모두 `SUPER`인 경우에만 필요합니다. 기본값은 `INT_MAX` 또는 2,147,483,647입니다.

모델이 SageMaker AI 엔드포인트에 배포되면 SageMaker AI는 Amazon Redshift에 모델 정보를 생성합니다. 그런 다음 외부 기능을 통해 추론을 수행합니다. SHOW MODEL 명령을 사용하여 Amazon Redshift 클러스터의 모델 정보를 볼 수 있습니다.

#### 원격 추론을 위한 CREATE MODEL 사용 노트
<a name="r_remote-create-model-usage-notes"></a>

원격 추론을 위해 CREATE MODEL을 사용하기 전에 다음 사항을 고려하세요.
+ 엔드포인트는 Amazon Redshift 클러스터를 소유한 동일한 AWS 계정에서 호스팅되어야 합니다.
+ Amazon SageMaker AI 엔드포인트에 Amazon Redshift의 추론 직접 호출을 수용할 수 있는 충분한 리소스가 있는지 또는 Amazon SageMaker AI 엔드포인트가 자동으로 확장될 수 있는지 확인합니다.
+ `SUPER` 데이터 형식을 입력으로 사용하지 않는 경우 모델은 쉼표로 구분된 값(CSV) 형식의 입력만 허용하며, 이는 SageMaker AI의 `text/CSV` 콘텐츠 유형에 해당합니다.
+ `SUPER` 데이터 형식을 입력으로 사용하지 않는 경우 모델의 출력은 함수를 만들 때 지정한 유형의 단일 값입니다. 출력은 쉼표로 구분된 값(CSV) 형식의 `text/CSV` 콘텐츠 유형을 통해 SageMaker AI에서 이루어집니다. `VARCHAR` 데이터 형식은 따옴표로 묶을 수 없고 새 줄을 포함할 수 없으며 각 출력은 새 줄에 있어야 합니다.
+ 모델은 null을 빈 문자열로 수락합니다.
+ 입력 데이터 형식이 `SUPER`인 경우 하나의 입력 인수만 지원됩니다.
+ 입력 데이터 형식이 `SUPER`인 경우 반환되는 데이터 형식도 `SUPER`여야 합니다.
+ 입력 및 반환된 데이터 형식이 모두 SUPER인 경우 MAX\$1BATCH\$1ROWS가 필요합니다.
+ 입력 데이터 형식이 `SUPER`인 경우 엔드포인트 호출의 콘텐츠 유형은 MAX\$1BATCH\$1ROWS가 `application/json`인 경우 `1`, 그 외의 모든 경우에는 `application/jsonlines`입니다.
+ 반환 데이터 형식이 `SUPER`인 경우 엔드포인트 호출의 수락 유형은 MAX\$1BATCH\$1ROWS가 `application/json`인 경우 `1`, 그 외의 모든 경우에는 `application/jsonlines`입니다.

##### 원격 추론을 위한 CREATE MODEL 예
<a name="r_remote-create-model-example"></a>

다음 예에서는 SageMaker AI 엔드포인트를 사용하여 예측하는 모델을 생성합니다. 예측을 수행하고 CREATE MODEL 명령에서 해당 이름을 지정하기 위해 엔드포인트가 실행 중인지 확인합니다.

```
CREATE MODEL remote_customer_churn
FUNCTION remote_fn_customer_churn_predict (varchar, int, float, float)
RETURNS int
SAGEMAKER 'customer-churn-endpoint'
IAM_ROLE default;
```

 다음 예는 대규모 언어 모델 모델(LLM)을 사용하여 원격 추론으로 BYOM을 생성하는 예제입니다. Amazon SageMaker AI Jumpstart에서 호스팅되는 LLM은 `application/json` 콘텐츠 유형을 수락하고 반환하며 간접 호출당 단일 JSON을 지원합니다. 입력 및 반환 데이터 형식은 `SUPER`여야 하며 MAX\$1BATCH\$1ROWS는 1로 설정해야 합니다.

```
CREATE MODEL sample_super_data_model
FUNCTION sample_super_data_model_predict(super)
RETURNS super
SAGEMAKER 'sample_super_data_model_endpoint'
IAM_ROLE default
SETTINGS (MAX_BATCH_ROWS 1);
```

## K-MEANS를 사용한 CREATE MODEL
<a name="r_k-means_create_model"></a>

Amazon Redshift는 레이블이 지정되지 않은 데이터를 그룹화하는 K-Means 알고리즘을 지원합니다. 이 알고리즘은 데이터에서 그룹을 검색하려는 클러스터링 문제를 해결합니다. 분류되지 않은 데이터는 유사점과 차이점에 따라 그룹화되고 분할됩니다.

### K-MEANS 구문을 사용한 CREATE MODEL
<a name="r_k-means-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
FUNCTION function_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS 'string'
HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional
  MAX_CELLS integer, |
    -- optional
  MAX_RUNTIME integer
    -- optional);
```

### K-MEANS 파라미터를 사용한 CREATE MODEL
<a name="r_k-means-create-model-parameters"></a>

 *AUTO OFF*   
전처리기, 알고리즘 및 하이퍼파라미터 선택의 CREATE MODEL 자동 검색을 해제합니다.

MODEL\$1TYPE KMEANS  
KMEANS를 사용하여 모델을 훈련하도록 지정합니다.

PREPROCESSORS 'string'  
특정 열 집합에 대한 프로프로세서의 특정 조합을 지정합니다. 형식은 columnSet의 목록과 각 열 집합에 적용할 적절한 변환입니다. Amazon Redshift는 3개의 K-Means 프리프로세서, 즉 StandardScaler, MinMax 및 NumericPassthrough를 지원합니다. K-Means에 대한 사전 처리를 적용하지 않으려면 변환기로 명시적으로 NumericPassthrough를 선택합니다. 지원되는 변환기에 대한 자세한 내용은 [사용자 안내 파라미터로 CREATE MODEL](#r_user_guidance-create-model-parameters) 섹션을 참조하세요.  
K-Means 알고리즘은 유클리드 거리를 사용하여 유사성을 계산합니다. 데이터 사전 처리는 모델의 특성이 동일한 규모로 유지되고 신뢰할 수 있는 결과를 생성하도록 보장합니다.

HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )  
K-Means 파라미터의 사용 여부를 지정합니다. K-Means 알고리즘을 사용할 때는 `K` 파라미터를 지정해야 합니다. 자세한 내용은 *Amazon SageMaker AI Developer Guide*의 [K-Means Hyperparameters](https://docs.aws.amazon.com/sagemaker/latest/dg/k-means-api-config.html)를 참조하세요.

다음 예에서는 K-Means용 데이터를 준비합니다.

```
CREATE MODEL customers_clusters
FROM customers
FUNCTION customers_cluster
IAM_ROLE default
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS '[
{
  "ColumnSet": [ "*" ],
  "Transformers": [ "NumericPassthrough" ]
}
]'
HYPERPARAMETERS DEFAULT EXCEPT ( K '5' )
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');

select customer_id, customers_cluster(...) from customers;
customer_id | customers_cluster
--------------------
12345            1
12346            2
12347            4
12348
```

## 예측이 포함된 CREATE MODEL
<a name="r_forecast_model"></a>

Redshift ML의 예측 모델은 Amazon Forecast를 사용하여 정확한 시계열 예측을 생성합니다. 이렇게 하면 일정 기간 동안의 과거 데이터를 사용하여 향후 이벤트를 예측할 수 있습니다. Amazon Forecast의 일반적인 사용 사례에는 소매 제품 데이터를 사용하여 재고 가격 책정 방법을 결정하고, 제조 수량 데이터를 사용하여 주문할 품목의 양을 예측하고, 웹 트래픽 데이터를 사용하여 웹 서버에 수신될 수 있는 트래픽 양을 예측하는 것이 포함됩니다.

 [Amazon Forecast의 할당량 한도](https://docs.aws.amazon.com/forecast/latest/dg/limits.html)는 Amazon Redshift 예측 모델에 적용됩니다. 예를 들어 최대 예측 수는 100개이지만 조정 가능합니다. 예측 모델을 삭제해도 Amazon Forecast의 관련 리소스가 자동으로 삭제되지는 않습니다. Redshift 클러스터를 삭제하면 관련 모델도 모두 삭제됩니다.

Forecast 모델은 현재 다음 리전에서만 사용할 수 있습니다.
+ 미국 동부(오하이오)(us-east-2)
+ 미국 동부(버지니아 북부)(us-east-1)
+ 미국 서부(오레곤)(us-west-2)
+ 아시아 태평양(뭄바이)(ap-south-1)
+ 아시아 태평양(서울)(ap-northeast-2)
+ 아시아 태평양(싱가포르)(ap-southeast-1)
+ 아시아 태평양(시드니)(ap-southeast-2)
+ 아시아 태평양(도쿄)(ap-northeast-1)
+ 유럽(프랑크푸르트)(eu-central-1)
+ 유럽(아일랜드)(eu-west-1)

### 예측 구문이 포함된 CREATE MODEL
<a name="r_forecast_model-synopsis"></a>

```
CREATE [ OR REPLACE ] MODEL forecast_model_name 
FROM { table_name | ( select_query ) } 
TARGET column_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>'} 
AUTO ON
MODEL_TYPE FORECAST
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  HORIZON integer,
  FREQUENCY forecast_frequency
  [PERCENTILES '0.1', '0.5', '0.9']
  )
```

### 예측 파라미터가 포함된 CREATE MODEL
<a name="r_forecast_model-parameters"></a>

 *forecast\$1model\$1name*   
모델의 이름입니다. 모델 이름은 고유해야 합니다.

FROM \$1 table\$1name \$1 ( select\$1query ) \$1  
table\$1name 또는 훈련 데이터를 지정하는 쿼리입니다. 이는 시스템의 기존 테이블이거나 괄호로 묶인 Amazon Redshift 호환 SELECT 쿼리일 수 있습니다. 테이블 또는 쿼리 결과에는 다음과 같이 3개 이상의 열이 있어야 합니다. (1) 시계열 이름을 지정하는 varchar 열. 각 데이터 세트에는 여러 시계열이 있음, (2) 날짜/시간 열, (3) 예측할 대상 열. 이 대상 열은 int 또는 float여야 함. 3개 이상의 열이 있는 데이터 세트를 제공하는 경우 Amazon Redshift는 모든 추가 열이 관련 시계열의 일부라고 가정합니다. 참고로 관련 시계열은 int 또는 float 유형이어야 합니다. 관련 시계열에 대한 자세한 내용은 관련 [시계열 데이터 세트 사용](https://docs.aws.amazon.com/forecast/latest/dg/related-time-series-datasets.html)을 참조하세요.

TARGET column\$1name  
예측 대상이 되는 열의 이름입니다. FROM 절에 열이 있어야 합니다.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
기본 키워드를 사용하여 CREAT MODEL 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다. 또는 IAM 역할의 ARN을 지정하여 해당 역할을 사용할 수도 있습니다.

AUTO ON  
알고리즘 및 하이퍼파라미터 선택의 CREATE MODEL 자동 검색을 켭니다. 예측 모델을 생성할 때 on을 지정하면 Amazon Forecast가 데이터 세트의 각 시계열에 최적의 알고리즘 조합을 적용하는 Forecast AutoPredictor를 사용한다는 뜻입니다.

MODEL\$1TYPE FORECAST  
FORECAST를 사용하여 모델을 훈련하도록 지정합니다.

S3\$1BUCKET 'amzn-s3-demo-bucket'  
이전에 생성한 Amazon Simple Storage Service 버킷의 이름으로, Amazon Redshift와 Amazon Forecast 간에 훈련 데이터와 아티팩트를 공유하는 데 사용됩니다. Amazon Redshift는 훈련 데이터를 언로드하기 전에 이 버킷에 하위 폴더를 생성합니다. 훈련이 완료되면 Amazon Redshift는 생성된 하위 폴더와 해당 콘텐츠를 삭제합니다.

HORIZON 정수  
예측 모델이 반환할 수 있는 최대 예측 수입니다. 모델을 학습시킨 후에는 이 정수를 변경할 수 없습니다.

FREQUENCY forecast\$1frequency  
예측을 얼마나 세분화하여 설정할지를 지정합니다. 사용 가능한 옵션은 `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`입니다. 예측 모델을 학습하는 경우 필요합니다.

PERCENTILES 문자열  
예측기를 훈련하는 데 사용되는 예측 유형을 지정하는 쉼표로 구분된 문자열입니다. 예측 유형은 0.01에서 0.99까지의 사분위수(0.01 이상 증분)일 수 있습니다. 평균을 사용하여 평균 예측을 지정할 수도 있습니다. 최대 5개의 예측 유형을 지정할 수 있습니다.

다음 예는 간단한 예측 모델을 만드는 방법을 보여줍니다.

```
CREATE MODEL forecast_example
FROM forecast_electricity_
TARGET target 
IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name>'
AUTO ON 
MODEL_TYPE FORECAST
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket',
          HORIZON 24,
          FREQUENCY 'H',
          PERCENTILES '0.25,0.50,0.75,mean',
          S3_GARBAGE_COLLECT OFF);
```

예측 모델을 생성한 후 예측 데이터가 포함된 새 테이블을 생성할 수 있습니다.

```
CREATE TABLE forecast_model_results as SELECT Forecast(forecast_example)
```

그런 다음 새 테이블을 쿼리하여 예측을 얻을 수 있습니다.

```
SELECT * FROM forecast_model_results
```

# CREATE PROCEDURE
<a name="r_CREATE_PROCEDURE"></a>

새 저장 프로시저를 생성하거나 현재 데이터베이스의 기존 프로시저를 바꿉니다.

자세한 내용과 예제는 [Amazon Redshift에서 저장 프로시저 생성](stored-procedure-overview.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_PROCEDURE-privileges"></a>

CREATE OR REPLACE PROCEDURE를 실행하려면 다음 방법 중 하나에 대한 권한이 있어야 합니다.
+ CREATE PROCEDURE의 경우
  + 수퍼유저
  + 저장 프로시저가 생성된 스키마에 대한 CREATE 및 USAGE 권한이 있는 사용자
+ REPLACE PROCEDURE의 경우
  + 수퍼유저
  + 프로시저 소유자

## 구문
<a name="r_CREATE_PROCEDURE-synopsis"></a>

```
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name  
  ( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
  procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
```

## 파라미터
<a name="r_CREATE_PROCEDURE-parameters"></a>

 OR REPLACE   
이름 및 입력 인수 데이터 형식이 같은 프로시저 또는 서명이 같은 프로시저인 경우 이런 프로시저가 이미 하나 존재하므로 기존 프로시저가 대체됨을 지정하는 절입니다. 프로시저는 똑같은 데이터 형식 집합을 정의하는 새 프로시저로만 바꿀 수 있습니다.  
기존 프로시저와 이름이 동일하지만 서명이 다른 프로시저를 정의하는 경우, 새 프로시저를 생성합니다. 다시 말해 프로시저 이름이 오버로드됩니다. 자세한 내용은 [프로시저 이름 오버로드](stored-procedure-naming.md#stored-procedure-overloading-name) 섹션을 참조하세요.

 *sp\$1procedure\$1name*   
프로시저의 이름입니다. 스키마 이름을 지정하는 경우(예: **myschema.myprocedure**), 프로시저는 지정된 스키마에서 생성됩니다. 그렇지 않으면, 프로시저가 현재 스키마에서 생성됩니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
모든 저장 프로시저 이름에 `sp_`를 접두사로 사용하는 것이 좋습니다. Amazon Redshift는 저장 프로시저 이름용으로 `sp_` 접두사를 예약합니다. `sp_` 접두사를 사용하여 저장 프로시저 이름이 기존 또는 향수 Amazon Redshift 기본 제공 저장 프로시저 또는 함수 이름과 충돌하지 않도록 할 수 있습니다. 자세한 내용은 [저장 프로시저 명명](stored-procedure-naming.md) 섹션을 참조하세요.  
입력 인수에 대한 데이터 형식 또는 서명이 서로 다른 경우 같은 이름을 가진 프로시저를 2개 이상 정의할 수 있습니다. 다시 말해 이 경우 프로시저 이름이 오버로드됩니다. 자세한 내용은 [프로시저 이름 오버로드](stored-procedure-naming.md#stored-procedure-overloading-name) 섹션을 참조하세요.

*[argname] [ argmode] argtype*   
인수 이름, 인수 모드 및 데이터 형식의 목록입니다. 데이터 형식만 필수입니다. 이름과 모드는 선택 사항이고, 위치를 전환할 수 있습니다.  
인수 모드는 IN, OUT 또는 INOUT일 수 있습니다. 기본값은 IN입니다.  
OUT 및 INOUT 인수를 사용하여 프로시저 호출에서 값을 하나 이상 반환할 수 있습니다. OUT 또는 INOUT 인수가 있는 경우, 프로시저 호출이 *n* 열이 포함된 결과 행 하나를 반환합니다. 여기에서 *n*은 OUT 또는 INOUT 인수의 총 수입니다.  
INOUT 인수는 동시에 입력 및 출력 인수입니다. *입력 인수*에는 IN 인수와 INOUT 인수가 모두 포함되며, *출력 인수*에는 OUT 인수와 INOUT 인수가 모두 포함됩니다.  
OUT 인수는 CALL 문의 일부로 지정되지 않습니다. 저장 프로시저 CALL 문에서 INOUT 인수를 지정합니다. INOUT 인수는 중첩 호출에서 값을 전달 및 반환하고 `refcursor`를 반환할 때 유용할 수 있습니다. `refcursor` 형식에 대한 자세한 내용은 [커서](c_PLpgSQL-statements.md#r_PLpgSQL-cursors) 섹션을 참조하세요.  
인수 데이터 형식은 모든 표준 Amazon Redshift 데이터 형식일 수 있습니다. 또한 인수 데이터 형식은 `refcursor`일 수 있습니다.  
최대 32개의 입력 인수와 32개의 출력 인수를 지정할 수 있습니다.

AS \$1\$1 *procedure\$1body* \$1\$1   
실행할 프로시저를 둘러싼 구문입니다. 리터럴 키워드 AS \$1\$1 및 \$1\$1가 필요합니다.  
Amazon Redshift에서는 \$1 인용이라는 형식을 사용하여 프로시저의 문을 묶어야 합니다. 묶음 기호 내에 있는 것은 모두 정확히 그대로 전달됩니다. 문자열의 내용은 문자 그대로 작성되므로 특수 문자를 이스케이프할 필요가 없습니다.  
*\$1 인용* 사용 시, 달러 기호 쌍(\$1\$1)을 사용하면 다음 예에 표시된 것처럼 실행할 문의 시작과 끝을 나타낼 수 있습니다.  

```
$$ my statement $$
```
각 쌍의 달러 기호들 사이에서 선택적으로 문을 식별하는 데 도움이 되는 문자열을 지정할 수 있습니다. 사용하는 문자열은 묶음 쌍의 시작과 끝에서 모두 동일해야 합니다. 이 문자열은 대/소문자를 구분하고 달러 기호를 포함할 수 없는 경우를 제외하면 따옴표가 없는 식별자와 똑같은 제약 조건을 따릅니다. 다음 예에서는 문자열 테스트를 사용합니다.  

```
$test$ my statement $test$
```
이 구문은 중첩 달러 인용에도 유용합니다. 달러 인용에 대한 자세한 내용은 PostgreSQL 설명서의 [어휘 구조](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html)에서 “달러 기호로 인용된 문자열 상수”를 참조하세요.

 *procedure\$1body*   
유효한 PL/pgSQL 문 세트입니다. PL/pgSQL 문은 루프 및 조건 표현식을 비롯한 프로시저 구문으로 SQL 명령을 보완하여 논리 흐름을 제어합니다. COPY, UNLOAD, INSERT 등의 데이터 수정 언어(DML)와 CREATE TABLE 등의 데이터 정의 언어(DDL)를 포함한 대부분의 SQL 명령을 프로시저 본문에서 사용할 수 있습니다. 자세한 내용은 [PL/pgSQL 언어 참조](c_pl_pgSQL_reference.md) 섹션을 참조하세요.

LANGUAGE *plpgsql*  
언어 값입니다. `plpgsql`를 지정합니다. `plpgsql`을 사용하려면 언어에 대한 사용 권한이 필요합니다. 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

NONATOMIC  
NONATOMIC 트랜잭션 모드에서 저장 프로시저를 생성합니다. NONATOMIC 모드는 프로시저 내에서 문을 자동으로 커밋합니다. 또한 NONATOMIC 프로시저 내에서 오류가 발생하여 예외 블록에서 처리되는 경우 오류가 다시 발생하지 않습니다. 자세한 내용은 [트랜잭션 관리](stored-procedure-transaction-management.md) 및 [RAISE](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors) 섹션을 참조하세요.  
저장 프로시저를 `NONATOMIC`으로 정의할 때 다음 사항을 고려하세요.  
+ 저장 프로시저 호출을 중첩할 때는 모든 프로시저를 동일한 트랜잭션 모드에서 생성해야 합니다.
+ NONATOMIC 모드에서 프로시저를 생성할 때는 `SECURITY DEFINER` 옵션과 `SET configuration_parameter` 옵션이 지원되지 않습니다.
+ 암시적 커밋이 처리되면 (명시적으로 또는 암시적으로) 열린 모든 커서가 자동으로 닫힙니다. 따라서 커서 루프를 시작하기 전에 명시적 트랜잭션을 열어 루프 반복 내의 SQL이 암시적으로 커밋되지 않도록 해야 합니다.

SECURITY INVOKER \$1 SECURITY DEFINER  
`NONATOMIC`이 지정된 경우 `SECURITY DEFINER` 옵션이 지원되지 않습니다.  
프로시저의 보안 모드는 실행 시간에 프로시저의 액세스 권한을 결정합니다. 프로시저는 기본 데이터베이스 객체에 액세스할 권한이 있어야 합니다.  
SECURITY INVOKER 모드에서 프로시저는 프로시저를 호출하는 사용자의 권한을 사용합니다. 사용자는 기본 데이터베이스 객체에 대한 명시적 권한이 있어야 합니다. 기본값은 SECURITY INVOKER입니다.  
SECURITY DEFINER 모드에서, 프로시저는 프로시저 소유자의 권한을 사용합니다. 프로시저 소유자는 런타임에 프로시저를 소유하는 사용자로 정의되며, 프로시저를 처음 정의한 사용자일 필요는 없습니다. 프로시저를 호출하는 사용자는 프로시저에 대한 권한을 실행해야 하지만, 기본 객체에 대한 권한은 필요하지 않습니다.

SET configuration\$1parameter \$1 TO value \$1 = value \$1  
`NONATOMIC`이 지정된 경우 이 옵션이 지원되지 않습니다.  
SET 절은 프로시저가 입력될 때 지정된 `configuration_parameter`가 지정된 값으로 설정되게 합니다. 그런 다음 이 절은 프로시저가 종료되면 `configuration_parameter`를 이전 값으로 복원합니다.

## 사용 노트
<a name="r_CREATE_PROCEDURE-usage"></a>

SECURITY DEFINER 옵션을 사용하여 저장 프로시저를 생성한 경우, 저장 프로시저 내에서 CURRENT\$1USER 함수를 호출하면 Amazon Redshift는 저장 프로시저 소유자의 사용자 이름을 반환합니다.

## 예제
<a name="r_CREATE_PROCEDURE-examples"></a>

**참고**  
이러한 예제를 실행할 때 다음과 비슷한 오류가 발생하는 경우  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
[Amazon Redshift의 저장 프로시저 개요](stored-procedure-create.md)을(를) 참조하세요.

다음 예제에서는 입력 파라미터가 두 개 있는 프로시저를 생성합니다.

```
CREATE OR REPLACE PROCEDURE test_sp1(f1 int, f2 varchar(20))
AS $$
DECLARE
  min_val int;
BEGIN
  DROP TABLE IF EXISTS tmp_tbl;
  CREATE TEMP TABLE tmp_tbl(id int);
  INSERT INTO tmp_tbl values (f1),(10001),(10002);
  SELECT min_val MIN(id) FROM tmp_tbl;
  RAISE INFO 'min_val = %, f2 = %', min_val, f2;
END;
$$ LANGUAGE plpgsql;
```

**참고**  
 저장 프로시저를 작성할 때는 민감한 값을 보호하기 위한 모범 사례를 참조하는 것이 좋습니다.  
 민감한 정보를 저장 프로시저 로직 내에 하드 코딩하지 마세요. 예를 들어, 저장 프로시저 본문의 CREATE USER 문에 사용자 암호를 할당하지 마세요. 하드 코딩된 값이 카탈로그 테이블에 스키마 메타 데이터로 기록될 수 있기 때문에 보안 위험이 따릅니다. 암호와 같은 민감한 값은 파라미터를 사용하여 저장 프로시저에 인수로 전달하세요.  
저장된 프로시저에 대한 자세한 내용은 [프로시저 생성](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html) 및 [Amazon Redshift에서 저장 프로시저 생성](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html)을 참조하세요. 카탈로그 테이블에 대한 자세한 내용은 [시스템 카탈로그 테이블](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html)을 참조하세요.

다음 예제에서는 IN 파라미터 한 개, OUT 파라미터 한 개, INOUT 파라미터 한 개가 있는 프로시저를 생성합니다.

```
CREATE OR REPLACE PROCEDURE test_sp2(f1 IN int, f2 INOUT varchar(256), out_var OUT varchar(256))
AS $$
DECLARE
  loop_var int;
BEGIN
  IF f1 is null OR f2 is null THEN
    RAISE EXCEPTION 'input cannot be null';
  END IF;
  DROP TABLE if exists my_etl;
  CREATE TEMP TABLE my_etl(a int, b varchar);
    FOR loop_var IN 1..f1 LOOP
        insert into my_etl values (loop_var, f2);
        f2 := f2 || '+' || f2;
    END LOOP;
  SELECT INTO out_var count(*) from my_etl;
END;
$$ LANGUAGE plpgsql;
```

다음 예제에서는 `SECURITY DEFINER` 파라미터를 사용하는 프로시저를 생성합니다. 이 프로시저는 프로시저를 소유한 사용자의 권한을 사용하여 실행됩니다.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_definer()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
```

다음 예제에서는 `SECURITY INVOKER` 파라미터를 사용하는 프로시저를 생성합니다. 이 프로시저는 프로시저를 실행하는 사용자의 권한을 사용하여 실행됩니다.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_invoker()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY INVOKER;
```

# CREATE RLS POLICY
<a name="r_CREATE_RLS_POLICY"></a>

데이터베이스 객체에 대한 세분화된 액세스를 제공하는 새 행 수준 보안 정책을 생성합니다.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 정책을 생성할 수 있습니다.

## 구문
<a name="r_CREATE_RLS_POLICY-synopsis"></a>

```
CREATE RLS POLICY { policy_name | database_name.policy_name }
[ WITH (column_name data_type [, ...]) [ [AS] relation_alias ] ]
USING ( using_predicate_exp )
```

## 파라미터
<a name="r_CREATE_RLS_POLICY-parameters"></a>

 *policy\$1name*   
정책의 이름입니다.

database\$1name  
정책이 생성되는 데이터베이스 이름입니다. 정책은 연결된 데이터베이스 또는 데이터베이스에서 생성되거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

WITH (*column\$1name data\$1type [, ...]*)   
정책이 연결된 테이블의 열에 참조되는 *column\$1name*과 *data\$1type*을 지정합니다.  
연결된 테이블 열을 RLS 정책에서 참조하지 않는 경우에만 WITH 절을 생략할 수 있습니다.

AS *relation\$1alias*  
RLS 정책이 연결될 테이블의 별칭을 선택적으로 지정합니다.

USING (* using\$1predicate\$1exp *)  
쿼리의 WHERE 절에 적용되는 필터를 지정합니다. Amazon Redshift는 쿼리 수준 사용자 조건자를 지정하기 전에 정책 조건자를 적용합니다. 예를 들어 **current\$1user = ‘joe’ and price > 10**은 가격이 10 USD보다 큰 레코드만 Joe에게 표시하도록 제한합니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 CREATE RLS POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

## 사용 노트
<a name="r_CREATE_RLS_POLICY-usage"></a>

CREATE RLS POLICY 문과 관련한 작업을 수행할 때는 다음을 준수하세요.
+ Amazon Redshift는 쿼리의 WHERE 절에 포함될 수 있는 필터를 지원합니다.
+ 테이블에 연결되는 모든 정책은 동일한 테이블 별칭을 사용하여 생성되어야 합니다.
+ GRANT 및 REVOKE 문을 사용하여 조회 테이블을 참조하는 RLS 정책에 SELECT 권한을 명시적으로 부여하고 취소해야 합니다. 조회 테이블은 정책 정의 내에 사용되는 테이블 객체입니다. 자세한 내용은 [GRANT](r_GRANT.md) 및 [REVOKE](r_REVOKE.md)(을)를 참조하세요.
+ Amazon Redshift 행 수준 보안은 정책 정의 내에서 카탈로그 테이블, 교차 데이터베이스 관계, 외부 테이블, 일반 보기, 늦은 바인딩 보기, RLS 정책이 설정된 테이블, 임시 테이블 등의 객체 유형을 지원하지 않습니다.

## 예제
<a name="r_CREATE_RLS_POLICY-examples"></a>

다음 예제에서는 policy\$1concerts라는 RLS 정책을 만듭니다. 이 정책은 catgroup이라는 VARCHAR(10) 열에 적용되며 USING 필터를 설정하여 catgroup 값이 `'Concerts'`인 행만 반환합니다.

```
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'Concerts');
```

RLS 정책을 사용하는 엔드 투 엔드 예제는 [행 수준 보안 엔드 투 엔드 예제](t_rls-example.md) 섹션을 참조하세요.

# CREATE ROLE
<a name="r_CREATE_ROLE"></a>

권한 모음인 새 사용자 지정 역할을 생성합니다. Amazon Redshift 시스템 정의 역할 목록은 [Amazon Redshift 시스템 정의 역할](r_roles-default.md) 섹션을 참조하세요. [SVV\$1ROLES](r_SVV_ROLES.md)를 쿼리하여 클러스터 또는 작업 그룹에 현재 생성된 역할을 확인합니다.

생성할 수 있는 역할 수에는 할당량이 있습니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [Amazon Redshift의 할당량 및 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_ROLE-privileges"></a>

CREATE ROLE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE ROLE 권한이 있는 사용자

## 구문
<a name="r_CREATE_ROLE-synopsis"></a>

```
CREATE ROLE role_name
[ EXTERNALID external_id ]
```

## 파라미터
<a name="r_CREATE_ROLE-parameters"></a>

*role\$1name*  
역할의 이름. 역할의 이름은 고유해야 하며 사용자 이름과 같을 수 없습니다. 역할 이름은 예약어가 될 수 없습니다.  
CREATE ROLE 권한이 있는 슈퍼 사용자 또는 일반 사용자는 역할을 생성할 수 있습니다. 슈퍼 사용자가 아닌 사용자이지만 WITH GRANT OPTION과 ALTER 권한 역할에 USAGE가 부여되었다면 누구에게나 이 역할을 부여할 수 있습니다.

EXTERNALID *external\$1id*  
자격 증명 공급자와 연결된 역할의 식별자입니다. 자세한 내용은 [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)(Amazon Redshift용 네이티브 자격 증명 공급자(IdP) 페더레이션)를 참조하세요.

## 예제
<a name="r_CREATE_ROLE-examples"></a>

다음 예에서는 `sample_role1` 역할을 생성합니다.

```
CREATE ROLE sample_role1;
```

다음 예에서는 자격 증명 공급자와 연결된 외부 ID를 사용하여 역할 `sample_role1`을 생성합니다.

```
CREATE ROLE sample_role1 EXTERNALID "ABC123";
```

# CREATE SCHEMA
<a name="r_CREATE_SCHEMA"></a>

현재 데이터베이스에 대한 새 스키마를 정의합니다.

## 필수 권한
<a name="r_CREATE_SCHEMA-privileges"></a>

CREATE SCHEMA에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE SCHEMA 권한이 있는 사용자

## 구문
<a name="r_CREATE_SCHEMA-synopsis"></a>

```
CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

CREATE SCHEMA AUTHORIZATION username[ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ] ]
```

## 파라미터
<a name="r_CREATE_SCHEMA-parameters"></a>

 IF NOT EXISTS   
지정된 스키마가 이미 존재하는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 스키마가 존재한다는 메시지를 반환함을 나타내는 절입니다.  
이 절은 스크립트 작성 시 유용하므로, CREATE SCHEMA가 이미 존재하는 스키마의 생성을 시도하는 경우에는 스크립트가 실패하지 않습니다.

 *schema\$1name*   
새 스키마의 이름입니다. 스키마 이름은 `PUBLIC`일 수 없습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
똑같은 이름의 객체가 스키마 이름 없이 참조될 때 이런 객체의 우선 순위는 [search\$1path](r_search_path.md) 구성 파라미터에 있는 스키마의 목록에 따라 결정됩니다.

AUTHORIZATION   
지정된 사용자에게 소유권을 부여하는 절입니다.

 * 사용자 이름*   
스키마 소유자의 이름입니다.

 *schema\$1element*   
스키마 내에서 생성할 하나 이상의 객체에 대한 정의입니다.

QUOTA  
지정된 스키마에서 사용할 수 있는 최대 디스크 공간 양입니다. 이 공간은 총제적 디스크 사용량입니다. 여기에는 모든 영구 테이블, 지정된 스키마 아래의 구체화된 보기 및 각 컴퓨팅 노드에서 ALL 배포가 있는 모든 테이블의 중복 복사본이 포함됩니다. 임시 네임스페이스 또는 스키마의 일부로 생성된 임시 테이블은 스키마 할당량에서 고려되지 않습니다.  
구성된 스키마 할당량을 보려면 [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md) 섹션을 참조하세요.  
스키마 할당량이 초과된 레코드를 보려면 [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md) 섹션을 참조하세요.  
Amazon Redshift는 선택한 값을 메가바이트로 변환합니다. 값을 지정하지 않으면 기가바이트가 기본 측정 단위입니다.  
스키마 할당량을 설정하고 변경하려면 데이터베이스 수퍼유저여야 합니다. 수퍼유저는 아니어도 CREATE SCHEMA 권한이 있는 사용자는 정의된 할당량으로 스키마를 생성할 수 있습니다. 할당량을 정의하지 않고 스키마를 생성하면 스키마는 무제한 할당량을 가집니다. 스키마에서 사용하는 현재 값 이하로 할당량을 설정하면 Amazon Redshift에서는 디스크 공간을 확보할 때까지 추가 수집을 허용하지 않습니다. DELETE 문은 테이블에서 데이터를 삭제하고 VACUUM이 실행될 때만 디스크 공간이 확보됩니다.  
Amazon Redshift는 트랜잭션을 커밋하기 전에 각 트랜잭션에 할당량 위반이 있는지 확인합니다. Amazon Redshift는 설정된 할당량에 대해 수정된 각 스키마의 크기(스키마의 모든 테이블이 사용하는 디스크 공간)를 확인합니다. 트랜잭션이 끝날 때 할당량 위반 검사가 발생하기 때문에 크기 제한은 커밋되기 전에 트랜잭션 내에서 일시적으로 할당량을 초과할 수 있습니다. 트랜잭션이 할당량을 초과하면 Amazon Redshift는 트랜잭션을 중단하고 후속 수집 작업을 금지하며 디스크 공간을 확보할 때까지 모든 변경 사항을 되돌립니다. 백그라운드 VACUUM 및 내부 정리로 인해 취소된 트랜잭션 후 스키마를 검사할 때까지 스키마가 가득 차지 않을 수 있습니다.  
예외적으로 Amazon Redshift는 할당량 위반을 무시하고 특정 경우에 트랜잭션을 커밋합니다. Amazon Redshift는 동일한 트랜잭션에 INSERT 또는 COPY 수집 문이 없는 다음 문 중 하나 이상으로만 구성된 트랜잭션에 대해 이 작업을 수행합니다.  
+ DELETE
+ TRUNCATE
+ VACUUM
+ DROP TABLE
+ 전체 스키마에서 다른 비전체 스키마로 데이터를 이동할 때만 ALTER TABLE APPEND

 *UNLIMITED*   
Amazon Redshift는 스키마의 총 크기 증가에 제한을 두지 않습니다.

## 한도
<a name="r_CREATE_SCHEMA-limit"></a>

Amazon Redshift에서는 스키마에 대해 다음과 같은 제한 사항을 둡니다.
+ 데이터베이스당 스키마 수는 최대 9,900개입니다.

## 예제
<a name="r_CREATE_SCHEMA-examples"></a>

다음 예제에서는 US\$1SALES로 명명된 스키마를 생성하고 사용자 DWUSER에게 소유권을 부여합니다.

```
create schema us_sales authorization dwuser;
```

다음 예제에서는 US\$1SALES로 명명된 스키마를 생성하고 사용자 DWUSER에게 소유권을 부여하며 할당량을 50GB로 설정합니다.

```
create schema us_sales authorization dwuser QUOTA 50 GB;
```

새로운 스키마를 보려면 다음과 같이 PG\$1NAMESPACE 카탈로그 테이블을 쿼리하세요.

```
select nspname as schema, usename as owner
from pg_namespace, pg_user
where pg_namespace.nspowner = pg_user.usesysid
and pg_user.usename ='dwuser';

   schema |  owner
----------+----------
 us_sales | dwuser
(1 row)
```

다음 예제에서는 US\$1SALES 스키마를 생성하거나 이 스키마가 이미 존재하는 경우에는 아무 것도 하지 않고 메시지를 반환합니다.

```
create schema if not exists us_sales;
```

# CREATE TABLE
<a name="r_CREATE_TABLE_NEW"></a>

현재 데이터베이스에서 새 테이블을 생성합니다. 열 목록을 정의합니다. 각 열에는 고유한 유형의 데이터가 들어 있습니다. 테이블의 소유자는 CREATE TABLE 명령의 발행자입니다.

## 필수 권한
<a name="r_CREATE_TABLE-privileges"></a>

CREATE TABLE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE TABLE 권한이 있는 사용자

## 구문
<a name="r_CREATE_TABLE_NEW-synopsis"></a>

```
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE
[ IF NOT EXISTS ] table_name
( { column_name data_type [column_attributes] [ column_constraints ]
  | table_constraints
  | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
  [, ... ]  )
[ BACKUP { YES | NO } ]
[table_attributes]

where column_attributes are:
  [ DEFAULT default_expr ]
  [ IDENTITY ( seed, step ) ]
  [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ]
  [ ENCODE encoding ]
  [ DISTKEY ]
  [ SORTKEY ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]

and column_constraints are:
  [ { NOT NULL | NULL } ]
  [ { UNIQUE  |  PRIMARY KEY } ]
  [ REFERENCES reftable [ ( refcolumn ) ] ]

and table_constraints  are:
  [ UNIQUE ( column_name [, ... ] ) ]
  [ PRIMARY KEY ( column_name [, ... ] )  ]
  [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]


and table_attributes are:
  [ DISTSTYLE { AUTO | EVEN | KEY | ALL } ]
  [ DISTKEY ( column_name ) ]
  [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [,...]) |  [ SORTKEY AUTO ] ]
  [ ENCODE AUTO ]
```

## 파라미터
<a name="r_CREATE_TABLE_NEW-parameters"></a>

LOCAL   
선택 사항입니다. 이 키워드는 문에서 허용되지만, Amazon Redshift에는 아무런 효과도 없습니다.

TEMPORARY \$1 TEMP   
현재 세션 내에서만 보이는 임시 테이블을 생성하는 키워드입니다. 이 테이블은 자신이 생성된 세션이 끝날 때 자동으로 삭제됩니다. 임시 테이블의 이름은 영구 테이블의 이름과 같을 수 있습니다. 임시 테이블은 세션별로 별개의 스키마에서 생성됩니다. (이 스키마의 이름을 지정할 수는 없습니다.) 이 임시 스키마는 검색 경로의 첫 번째 스키마가 되므로, 영구 테이블에 액세스하려고 스키마 이름으로 테이블 이름을 정규화하지 않는 한 임시 테이블이 영구 테이블보다 우선하게 됩니다. 스키마와 우선 순위에 대한 자세한 내용은 [search\$1path](r_search_path.md) 섹션을 참조하세요.  
기본적으로, 데이터베이스 사용자는 PUBLIC 그룹에서 자동 멤버십으로 임시 테이블을 생성할 권한이 있습니다. 어떤 사용자에 대해 이 권한을 거부하려면 PUBLIC 그룹에서 TEMP 권한을 취소한 다음, 특정 사용자 또는 사용자 그룹에게만 TEMP 권한을 명시적으로 허용하세요.

IF NOT EXISTS  
지정된 테이블이 이미 존재하는 경우 오류 메시지와 함께 중지하는 대신, 명령이 아무 것도 변경하지 않고 테이블이 존재한다는 메시지를 반환함을 나타내는 절입니다. 참고로, 기존 테이블은 사용자가 생성하려고 했던 테이블과는 전혀 다를 수도 있습니다. 테이블 이름만 비교됩니다.  
이 절은 스크립트 작성 시 유용하므로, CREATE TABLE이 이미 존재하는 테이블의 생성을 시도하는 경우에는 스크립트가 실패하지 않습니다.

 *table\$1name*   
생성할 테이블의 이름입니다.  
'\$1'으로 시작하는 테이블 이름을 지정하면 테이블이 임시 테이블로 생성됩니다. 다음은 예제입니다.  

```
create table #newtable (id int);
```
'\$1' 기호를 사용하여 테이블을 참조할 수도 있습니다. 예제:   

```
select * from #newtable;
```
테이블 이름의 최대 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 최대 4바이트까지 UTF-8 멀티바이트 문자를 사용할 수 있습니다. Amazon Redshift는 사용자 정의 임시 테이블과 쿼리 처리 또는 시스템 유지 관리 중에 Amazon Redshift에서 생성한 임시 테이블을 포함하여 노드 유형별로 클러스터당 테이블 수 할당량을 적용합니다. 선택적으로, 데이터베이스 및 스키마 이름으로 테이블 이름을 정규화할 수 있습니다. 다음 예에서는 데이터베이스 이름이 `tickit`이고, 스키마 이름은 `public`이며, 테이블 이름은 `test`입니다.  

```
create table tickit.public.test (c1 int);
```
데이터베이스 또는 스키마가 존재하지 않는 경우 테이블이 생성되지 않으며, 이 명령문은 오류를 반환합니다. 시스템 데이터베이스 `template0`, `template1`, `padb_harvest` 또는 `sys:internal`에서 테이블 또는 뷰를 생성할 수 없습니다.  
스키마 이름이 주어지는 경우 새 테이블은 그 스키마에서 생성됩니다(생성자가 해당 스키마에 액세스할 수 있다고 가정). 테이블 이름은 그 스키마에 대한 고유한 이름이어야 합니다. 아무런 스키마도 지정되지 않으면 현재 데이터베이스 스키마를 사용하여 테이블이 생성됩니다. 임시 테이블을 생성할 경우, 임시 테이블이 특수한 스키마에 존재하므로 스키마 이름을 지정할 수 없습니다.  
같은 이름을 가진 여러 임시 테이블이 각각 별도의 세션에서 생성되는 경우에는 각기 다른 스키마에 할당되므로, 이런 테이블은 같은 데이터베이스에 동시에 존재할 수 있습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

 *column\$1name*   
새 테이블에 생성할 열의 이름입니다. 열 이름의 최대 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. 최대 4바이트까지 UTF-8 멀티바이트 문자를 사용할 수 있습니다. 단일 테이블에서 정의할 수 있는 최대 열 수는 1,600개입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  
"넓은 테이블"을 생성할 경우에는 로드 및 쿼리 처리 중에 열의 목록이 중간 결과에 대한 행 너비 경계를 초과하지 않도록 주의하세요. 자세한 내용은 [사용 노트](#r_CREATE_TABLE_usage) 섹션을 참조하세요.

 *data\$1type*   
생성되는 열의 데이터 형식입니다. CHAR 및 VARCHAR 열의 경우 최대 길이를 선언하는 대신 MAX 키워드를 사용할 수 있습니다. MAX는 최대 길이를 CHAR의 경우 4,096바이트, VARCHAR의 경우 65,535바이트로 설정합니다. GEOMETRY 객체의 최대 크기는 1,048,447바이트입니다.  
Amazon Redshift에서 지원하는 데이터 형식에 대한 자세한 내용은 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
열의 기본 데이터 값을 할당하는 절입니다. *default\$1expr*의 데이터 형식은 열의 데이터 형식과 일치해야 합니다. DEFAULT 값은 변수가 없는 표현식이어야 합니다. 하위 쿼리, 현재 테이블에 있는 다른 열과의 상호 참조, 사용자 정의 함수는 허용되지 않습니다.  
*default\$1expr* 표현식은 열의 값을 지정하지 않는 INSERT 작업에 사용됩니다. 기본값이 지정되지 않은 경우 열의 기본값은 Null입니다.  
열 목록이 정의된 COPY 작업에서 DEFAULT 값을 가진 열을 생략하는 경우 COPY 명령은 *default\$1expr*의 값을 삽입합니다.

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
열이 IDENTITY 열임을 지정하는 절입니다. IDENTITY 열에는 자동 생성되는 고유한 값이 있습니다. IDENTITY 열의 데이터 형식은 INT 또는 BIGINT여야 합니다.  
`INSERT` 또는 `INSERT INTO [tablename] VALUES()` 문을 사용하여 행을 추가할 때 이런 값은 *seed*로 지정되는 값으로 시작하고 *단계*로 지정되는 수만큼 증가합니다.  
`INSERT INTO [tablename] SELECT * FROM` 또는 `COPY` 문을 사용하여 테이블을 로드하면 데이터가 병렬로 로드되고 노드 조각으로 배포됩니다. 자격 증명 값을 생성할 때는 자격 증명 값이 고유할 수 있도록 Amazon Redshift가 다수의 값을 건너뜁니다. 자격 증명 값은 고유하지만 순서는 소스 파일의 순서와 일치하지 않을 수 있습니다.

GENERATED BY DEFAULT AS IDENTITY(*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
열이 기본 IDENTITY 열임을 지정하고, 사용자가 열에 고유한 값을 자동으로 할당할 수 있는 절. IDENTITY 열의 데이터 형식은 INT 또는 BIGINT여야 합니다. 값 없이 행을 추가할 때 이런 값은 *seed*로 지정되는 값으로 시작하고 *단계*로 지정되는 수만큼 증가합니다. 값이 생성되는 과정에 대한 자세한 내용은 [IDENTITY](#identity-clause)를 참조하세요.  
또한 INSERT, UPDATE 또는 COPY 중 EXPLICIT\$1IDS 없이 값을 제공할 수 있습니다. Amazon Redshift는 시스템 생성 값을 사용하는 대신 해당 값을 사용하여 자격 증명 열에 삽입합니다. 이 값은 seed보다 작은 중복 값 또는 단계 값 사이의 값일 수 있습니다. Amazon Redshift는 열에서 값의 고유성을 확인하지 않습니다. 값을 입력해도 다음 시스템 생성 값에는 영향을 미치지 않습니다.  
열에 고유성이 필요한 경우 중복 값을 추가하지 마세요. 대신, seed보다 작거나 단계 값 사이의 고유한 값을 추가합니다.
기본 자격 증명 열의 경우, 다음에 유의하세요.  
+ 기본 자격 증명 열은 NOT NULL입니다. NULL을 삽입할 수 없습니다.
+ 생성된 값을 기본 자격 증명 열에 삽입하려면 키워드 `DEFAULT`를 사용하세요.

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ 기본 자격 증명 열의 값을 재정의해도 다음에 생성되는 값에는 영향을 미치지 않습니다.
+ ALTER TABLE ADD COLUMN 문으로 기본 자격 증명 열을 추가할 수 없습니다.
+ ALTER TABLE APPEND 문으로 기본 자격 증명 열을 추가할 수 있습니다.

ENCODE *encoding*   
열에 대한 압축 인코딩입니다. ENCODE AUTO는 테이블의 기본값입니다. Amazon Redshift는 테이블의 모든 열에 대한 압축 인코딩을 자동으로 관리하지 않습니다. 테이블의 열에 압축 인코딩을 지정하면 테이블이 더 이상 ENCODE AUTO로 설정되지 않습니다. Amazon Redshift는 더 이상 테이블의 모든 열에 대한 압축 인코딩을 자동으로 관리하지 않습니다. 테이블에 대해 ENCODE AUTO 옵션을 지정하여 Amazon Redshift에서 테이블의 모든 열에 대한 압축 인코딩을 자동으로 관리하도록 할 수 있습니다.  
  
Amazon Redshift는 다음과 같이 압축 인코딩을 지정하지 않은 열에 초기 압축 인코딩을 자동으로 할당합니다.  
+ 임시 테이블의 모든 열은 기본적으로 RAW 압축으로 할당됩니다.
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY 또는 GEOGRAPHY 데이터 유형으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR, VARCHAR 또는 VARBYTE로 정의된 열에는 LZO 압축이 할당됩니다.
열을 압축하지 않으려면 RAW 인코딩을 명시적으로 지정하세요.
 다음 모듈을 지원합니다.[compression encodings](c_Compression_encodings.md#compression-encoding-list)  
+ AZ64
+ BYTEDICT
+ 델타
+ 델타
+ LZO
+ LZO
+ LZO
+ LZO
+ RAW(압축 없음)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
해당 열이 테이블에 대한 배포 키임을 지정하는 키워드입니다. 테이블에서는 한 개의 열만 배포 키일 수 있습니다. DISTKEY 키워드를 열 이름 뒤에 사용하거나 DISTKEY (*column\$1name*) 구문을 사용하여 테이블 정의의 일부로 사용할 수 있습니다. 둘 중 어떤 방법을 사용하든 그 효과는 똑같습니다. 자세한 내용은 이 주제의 뒷부분에 나오는 DISTSTYLE 파라미터를 참조하세요.  
배포 키 열의 데이터 형식은 BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ, CHAR 또는 VARCHAR일 수 있습니다.

SORTKEY  
해당 열이 테이블에 대한 정렬 키임을 지정하는 키워드입니다. 데이터가 테이블로 로드될 때 데이터는 정렬 키로 지정되는 하나 이상의 열을 기준으로 정렬됩니다. 열 이름 뒤에 SORTKEY 키워드를 사용하여 단일 열 정렬 키를 지정하거나, SORTKEY (*column\$1name* [, ...]) 구문을 사용하여 하나 이상의 열을 테이블의 정렬 키 열로 지정할 수 있습니다. 이 구문을 사용하면 복합 정렬 키만 생성됩니다.  
테이블당 최대 400개의 SORTKEY 열을 정의할 수 있습니다.  
정렬 키 열의 데이터 형식은 BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ, CHAR 또는 VARCHAR일 수 있습니다.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
열의 문자열 검색 또는 비교가 대소문자를 구분하는지, 구분하지 않는지를 지정하는 절입니다. 기본값은 데이터베이스의 현재 대/소문자 구분 구성과 동일합니다.  
COLLATE는 CHAR, VARCHAR 및 SUPER 열 내의 문자열 값을 포함한 문자열 기반 데이터 유형에서만 지원됩니다. SUPER 데이터의 대/소문자를 구분하지 않는 쿼리에 대한 자세한 내용은 [대소문자를 구분하지 않는 쿼리](query-super.md#case-insensitive-super-queries) 섹션을 참조하세요.  
데이터베이스 데이터 정렬 정보를 찾으려면 다음 명령을 사용합니다.  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE와 CS는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다. 마찬가지로 CASE\$1INSENSITIVE와 CI는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다.

NOT NULL \$1 NULL   
NOT NULL은 열이 null 값을 포함하도록 허용되지 않도록 지정합니다. 기본값인 NULL은 열이 null 값을 허용하도록 지정합니다. IDENTITY 열은 기본적으로 NOT NULL로 선언됩니다.

UNIQUE  
해당 열이 고유한 값만 포함할 수 있음을 지정하는 키워드입니다. 고유한 테이블 제약 조건의 동작은 여러 열에 적용할 수 있는 추가적인 기능과 함께, 열 제약 조건에 대한 동작과 동일합니다. 고유한 테이블 제약 조건을 정의하려면 UNIQUE ( *column\$1name* [, ... ] ) 구문을 사용하세요.  
고유 제약 조건은 정보를 제공하기 위한 것으로, 시스템에서 이를 강제 적용하지는 않습니다.

PRIMARY KEY  
해당 열이 테이블에 대한 기본 키임을 지정하는 키워드입니다. 열 정의를 사용하면 한 개의 열만 기본 키로 정의할 수 있습니다. 다중 열 기본 키로 테이블 제약 조건을 정의하려면 PRIMARY KEY ( *column\$1name* [, ... ] ) 구문을 사용하세요.  
열을 기본 키로 식별하면 스키마의 설계에 대한 메타데이터가 제공됩니다. 기본 키는 다른 테이블들이 이 열 집합을 행의 고유 식별자로 사용할 수 있음을 암시합니다. 테이블에 대해 한 개의 기본 키를 열 제약 조건이나 테이블 조약 조건으로 지정할 수 있습니다. 기본 키 제약 조건은 같은 테이블에 대해 정의된 고유 제약 조건에 의해 명명되는 다른 열 집합과는 상이한 열 집합을 명명해야 합니다.  
PRIMARY KEY 열도 NOT NULL로 정의됩니다.  
기본 키 제약 조건은 정보 제공만을 목적으로 합니다. 기본 키 제약 조건은 시스템에서 강제 적용되지 않지만, 플래너는 이 제약 조건을 사용합니다.

References *reftable* [ ( *refcolumn* ) ]  
외래 키 제약 조건을 지정하는 절로, 해당 열은 참조되는 테이블의 어떤 행에서 참조되는 열에 있는 값과 일치하는 값만 포함해야 함을 암시합니다. 참조되는 열은 참조되는 테이블에서 고유 키 또는 기본 키 제약 조건의 열이어야 합니다.  
 외래 키 제약 조건은 정보 제공만을 목적으로 합니다. 기본 키 제약 조건은 시스템에서 강제 적용되지 않지만, 플래너는 이 제약 조건을 사용합니다.

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
새 테이블이 열 이름, 데이터 형식 및 NOT NULL 제약 조건을 자동으로 복사하는 기존 원본 테이블을 지정하는 절입니다. 새 테이블과 상위 테이블이 분리되고, 상위 테이블에 대한 변경 사항이 새 테이블에 적용되지 않습니다. 복사된 열 정의에 대한 기본 표현식은 INCLUDING DEFAULTS가 지정된 경우에만 복사됩니다. 기본 표현식을 제외하는 것이 기본 동작이므로, 새 테이블의 모든 열에 null 기본값이 있습니다.  
LIKE 옵션으로 생성되는 테이블은 기본 키 및 외래 키 제약 조건을 상속하지 않습니다. 배포 스타일, 정렬 키, BACKUP 및 NULL 속성은 LIKE 테이블에 상속되지만 CREATE TABLE ...에서 명시적으로 설정할 수 없습니다. LIKE 문에서 이런 속성을 명시적으로 설정할 수 없습니다.

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
자동 및 수동 클러스터 스냅샷에 테이블을 포함해야 할지 여부를 지정하는 절입니다.  
중요한 데이터를 포함하지 않는 스테이징 테이블과 같은 테이블의 경우 BACKUP NO를 지정하여 스냅샷을 생성하고 스냅샷으로부터 복원할 때의 처리 시간을 절약하고 Amazon Simple Storage Service의 스토리지 공간을 줄입니다. BACKUP NO 설정은 클러스터 내에 있는 다른 노드로의 데이터 자동 복제에 아무런 영향도 미치지 않으므로, 노드 장애가 발생할 경우 BACKUP NO가 지정된 테이블이 복원됩니다. 기본값은 BACKUP YES입니다.  
RA3 프로비저닝된 클러스터 및 Amazon Redshift Serverless 작업 그룹에는 백업 없음 테이블이 지원되지 않습니다. RA3 클러스터 또는 서버리스 작업 그룹에서 백업 없음으로 표시된 테이블은 스냅샷을 생성하는 동안 항상 백업되고 스냅샷에서 복원할 때 항상 복원되는 영구 테이블로 처리됩니다. 백업이 없는 테이블의 스냅샷 비용을 방지하려면 스냅샷을 생성하기 전에 자릅니다.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
전체 테이블의 데이터 배포 스타일을 정의하는 키워드입니다. Amazon Redshift는 테이블에 대해 지정된 배포 스타일에 따라 컴퓨팅 노드에 테이블의 행을 배포합니다. 기본값은 AUTO입니다.  
테이블에 대해 선택하는 분산 스타일이 데이터베이스의 전체 성능에 영향을 미칩니다. 자세한 내용은 [쿼리 최적화를 위한 데이터 배포](t_Distributing_data.md) 섹션을 참조하세요. 가능한 분산 스타일은 다음과 같습니다.  
+ AUTO: Amazon Redshift에서 테이블 데이터를 기반으로 최적의 배포 스타일을 할당합니다. 예를 들어 AUTO 배포 스타일을 지정하면 Amazon Redshift는 처음에 작은 테이블에 ALL 배포 스타일을 할당합니다. 테이블이 커지면 Amazon Redshift는 배포 스타일을 KEY로 변경하여 기본 키(또는 복합 기본 키의 열)를 DISTKEY로 선택할 수 있습니다. 테이블이 커지고 DISTKEY로 적합한 열이 없으면 Amazon Redshift는 배포 스타일을 EVEN으로 변경합니다. 배포 스타일 변경은 사용자 쿼리에 미치는 영향을 최소화하면서 백그라운드에서 이루어집니다.

  테이블에 적용된 분산 스타일을 보려면 PG\$1CLASS 시스템 카탈로그 테이블을 쿼리합니다. 자세한 내용은 [분산 스타일 보기](viewing-distribution-styles.md) 섹션을 참조하세요.
+ EVEN: 테이블의 데이터가 클러스터의 노드들에 걸쳐 라운드 로빈 배포 방식으로 균등하게 분포됩니다. 행 ID는 배포의 결정에 사용되며, 대략적으로 같은 수의 행이 각 노드로 배포됩니다.
+ KEY: 데이터가 DISTKEY 열에 있는 값을 기준으로 배포됩니다. 조인 테이블의 조인 열을 배포 키로 설정하면 두 테이블 모두의 조인 행이 컴퓨팅 노드에 배치됩니다. 데이터가 배치되면 최적화 프로그램이 조인을 더 효율적으로 수행할 수 있습니다. DISTSTYLE KEY를 지정하는 경우 테이블에 대해, 또는 열 정의의 일부로서 DISTKEY 열의 이름을 지정해야 합니다. 자세한 내용은 이 주제의 앞부분에 나오는 DISTKEY 파라미터를 참조하세요.
+  ALL: 전체 테이블의 복사본이 모든 노드로 배포됩니다. 이 분산 스타일은 임의의 조인에 필요한 모든 행을 모든 노드에서 사용할 수 있도록 보장하지만, 스토리지 요구량이 몇 배로 늘고 테이블의 로드 시간과 유지 관리 시간도 증가합니다. ALL 배포는 KEY 배포가 적절하지 않은 특정 차원 테이블과 함께 사용할 때 실행 시간을 개선할 수 있지만, 성능 개선 정도를 유지 관리 비용과 비교 검토해야 합니다.

DISTKEY ( *column\$1name* )  
해당 열을 테이블에 대한 배포 키로 사용해야 함을 지정하는 제약 조건입니다. DISTKEY 키워드를 열 이름 뒤에 사용하거나 DISTKEY (*column\$1name*) 구문을 사용하여 테이블 정의의 일부로 사용할 수 있습니다. 둘 중 어떤 방법을 사용하든 그 효과는 똑같습니다. 자세한 내용은 이 주제의 앞부분에 나오는 DISTSTYLE 파라미터를 참조하세요.

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* column\$1name* [,...]) \$1 [ SORTKEY AUTO ]  
테이블에 대해 하나 이상의 정렬 키를 지정합니다. 데이터가 테이블로 로드될 때 데이터는 정렬 키로 지정되는 열을 기준으로 정렬됩니다. 열 이름 뒤에 SORTKEY 키워드를 사용하여 단일 열 정렬 키를 지정하거나, `SORTKEY (column_name [ , ... ] )` 구문을 사용하여 하나 이상의 열을 테이블의 정렬 키 열로 지정할 수 있습니다.  
COMPOUND 또는 INTERLEAVED 정렬 스타일을 선택적으로 지정할 수 있습니다. 열과 함께 SORTKEY를 지정하는 경우 기본값은 COMPOUND입니다. 자세한 내용은 [정렬 키](t_Sorting_data.md) 섹션을 참조하세요.  
정렬 키 옵션을 지정하지 않는 경우 기본값은 AUTO입니다.  
테이블당 최대 400개의 COMPOUND SORTKEY 열 또는 8개의 INTERLEAVED SORTKEY 열을 정의할 수 있습니다.    
AUTO  
Amazon Redshift에서 테이블 데이터를 기반으로 최적의 정렬 키를 할당하도록 지정합니다. 예를 들어 AUTO 정렬 키가 지정된 경우 Amazon Redshift는 처음에 테이블에 정렬 키를 할당하지 않습니다. 정렬 키가 쿼리 성능을 향상시킬 것이라고 판단되면 Amazon Redshift는 테이블의 정렬 키를 변경할 수 있습니다. 테이블의 실제 정렬은 자동 테이블 정렬에 의해 수행됩니다. 자세한 내용은 [자동 테이블 정렬](t_Reclaiming_storage_space202.md#automatic-table-sort) 섹션을 참조하세요.  
Amazon Redshift는 기존 정렬 또는 배포 키가 있는 테이블을 수정하지 않습니다. 한 가지 예외를 제외하고 테이블에 JOIN에서 사용된 적이 없는 배포 키가 있는 경우 Amazon Redshift에서 더 나은 키가 있다고 판단하면 키가 변경될 수 있습니다.  
테이블의 정렬 키를 보려면 SVV\$1TABLE\$1INFO 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md) 섹션을 참조하세요. 테이블에 대한 Amazon Redshift Advisor 권장 사항을 보려면 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md) 섹션을 참조하세요. Amazon Redshift에서 수행한 작업을 보려면 SVL\$1AUTO\$1WORKER\$1ACTION 시스템 카탈로그 뷰를 쿼리합니다. 자세한 내용은 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md) 섹션을 참조하세요.  
COMPOUND  
목록에 표시되는 모든 열로 구성된 복합 키를 사용하여 데이터가 나열되는 순서대로 정렬됨을 지정합니다. 복합 정렬 키는 쿼리가 정렬 열의 순서에 따라 행을 스캔할 때 가장 유용합니다. 쿼리가 보조 정렬 열에 의존할 때는 복합 키로 정렬함으로써 얻는 성능상의 이점이 감소합니다. 테이블당 최대 400개의 COMPOUND SORTKEY 열을 정의할 수 있습니다.  
INTERLEAVED  
데이터가 인터리브 정렬 키를 사용하여 정렬됨을 지정합니다. 인터리브 정렬 키에 대해 최대 8개의 열을 지정할 수 있습니다.  
인터리브 정렬에서는 정렬 키에서 각 열이나 열의 하위 집합에 똑같은 가중치를 부여하므로, 쿼리가 정렬 키에 있는 열의 순서에 종속되지 않습니다. 쿼리가 하나 이상의 보조 정렬 열을 사용하는 경우 인터리브 정렬은 쿼리 성능을 크게 높여줍니다. 인터리브 정렬에는 데이터 로드와 vacuum 작업에 약간의 오버헤드 비용이 수반됩니다.  
자격 증명 열, 날짜, 타임스탬프처럼 단순 증가하는 속성이 있는 열에 인터리브 정렬 키를 쓰지 마세요.

ENCODE AUTO   
Amazon Redshift에서 테이블의 모든 열에 대한 인코딩 형식을 자동으로 조정하여 쿼리 성능을 최적화할 수 있도록 합니다. ENCODE AUTO는 테이블 생성 시 지정한 초기 인코딩 형식을 유지합니다. 그런 다음 새 인코딩 형식이 쿼리 성능을 향상시킬 수 있다고 판단되면 Amazon Redshift가 테이블 열의 인코딩 형식을 변경할 수 있습니다. 테이블의 열에 인코딩 형식을 지정하지 않으면 ENCODE AUTO가 기본값입니다.

UNIQUE ( *column\$1name* [,...] )  
테이블에서 하나 이상의 열로 구성된 그룹은 고유한 값만 포함할 수 있음을 지정하는 제약 조건입니다. 고유한 테이블 제약 조건의 동작은 여러 열에 적용할 수 있는 추가적인 기능과 함께, 열 제약 조건에 대한 동작과 동일합니다. 고유한 제약 조건이라는 맥락에서, null 값은 같은 값으로 간주되지 않습니다. 각각의 고유 테이블 제약 조건은 테이블에 대해 정의된 다른 고유 제약 조건이나 기본 키 제약 조건에 의해 명명되는 열의 집합과는 상이한 열 집합을 명명해야 합니다.  
 고유 제약 조건은 정보를 제공하기 위한 것으로, 시스템에서 이를 강제 적용하지는 않습니다.

PRIMARY KEY ( *column\$1name* [,...] )  
테이블의 한 열 또는 여러 개의 열이 null이 아닌 고유한(중복되지 않는) 값만 포함할 수 있음을 지정하는 제약 조건입니다. 열 집합을 기본 키로 식별하면 스키마의 설계에 대한 메타데이터도 제공됩니다. 기본 키는 다른 테이블들이 이 열 집합을 행의 고유 식별자로 사용할 수 있음을 암시합니다. 테이블에 대해 한 개의 기본 키를 단일 열 제약 조건이나 테이블 조약 조건으로 지정할 수 있습니다. 기본 키 제약 조건은 같은 테이블에 대해 정의된 고유 제약 조건에 의해 명명되는 다른 열 집합과는 상이한 열 집합을 명명해야 합니다.  
 기본 키 제약 조건은 정보 제공만을 목적으로 합니다. 기본 키 제약 조건은 시스템에서 강제 적용되지 않지만, 플래너는 이 제약 조건을 사용합니다.

FOREIGN KEY ( *column\$1name* [, ... ] ) REFERENCES *reftable* [ ( *refcolumn* ) ]   
외래 키 제약 조건을 지정하는 제약 조건으로, 새 테이블에서 하나 이상의 열로 구성된 그룹이 참조되는 테이블의 어떤 행에서 참조되는 열에 있는 값과 일치하는 값만 포함해야 하도록 요구합니다. *refcolumn*이 생략된 경우에는 *reftable*의 기본 키가 사용됩니다. 참조되는 열은 참조되는 테이블에서 고유 키 또는 기본 키 제약 조건의 열이어야 합니다.  
외래 키 제약 조건은 정보 제공만을 목적으로 합니다. 기본 키 제약 조건은 시스템에서 강제 적용되지 않지만, 플래너는 이 제약 조건을 사용합니다.

## 사용 노트
<a name="r_CREATE_TABLE_usage"></a>

고유성, 프라이머리 키 및 외래 키 제약 조건은 참고용일 뿐 표를 채울 때 *Amazon Redshift에 적용되지는 않습니다*. 예를 들어 종속성이 있는 테이블에 데이터를 삽입하면 제약 조건을 위반하더라도 삽입이 성공할 수 있습니다. 그래도 기본 키와 외래 키는 계획 힌트로 사용되며, ETL 프로세스 또는 애플리케이션의 다른 프로세스가 무결성을 적용하는 경우에는 선언되어야 합니다. 종속성이 있는 테이블을 삭제하는 방법에 대한 내용은 [DROP TABLE](r_DROP_TABLE.md) 섹션을 참조하세요.

### 제한 및 할당량
<a name="r_CREATE_TABLE_usage-limits"></a>

테이블을 생성할 경우 다음 제한 사항을 고려하세요.
+ 노드 유형별로 클러스터의 최대 테이블 수가 제한되어 있습니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.
+ 테이블 이름으로 입력할 수 있는 최대 문자 수는 127자입니다.
+ 단일 테이블에서 정의할 수 있는 최대 열 수는 1,600개입니다.
+ 단일 테이블에서 정의할 수 있는 최대 SORTKEY 열 수는 400개입니다.

### 열 수준 설정 및 테이블 수준 설정의 요약
<a name="r_CREATE_TABLE_usage-summary_of_settings"></a>

 여러 속성과 설정은 열 수준 또는 테이블 수준에서 설정될 수 있습니다. 어떤 경우에는 열 수준 또는 테이블 수준에서 속성이나 제약 조건을 설정하는 효과가 동일합니다. 다른 경우에는 다른 결과를 낳습니다.

 다음 목록에 열 수준 설정 및 테이블 수준 설정이 요약되어 있습니다.

DISTKEY  
열 수준이나 테이블 수준 중 어떤 수준에서 설정되든 실제로는 차이가 없습니다.  
DISTKEY가 설정된 경우 열 수준 또는 테이블 수준 중 하나에서 DISTSTYLE이 KEY로 설정되거나 전혀 설정되지 않아야 합니다. DISTSTYLE은 테이블 수준에서만 설정될 수 있습니다.

SORTKEY  
열 수준에서 설정되는 경우 SORTKEY는 단일 열이어야 합니다. SORTKEY가 테이블 수준에서 설정된 경우 하나 이상의 열이 복합 또는 인터리브 합성 정렬 키를 구성할 수 있습니다.

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
Amazon Redshift는 열에 대한 대소문자 구분 구성 변경을 지원하지 않습니다. 테이블에 새 열을 추가하면 Amazon Redshift는 대소문자 구분에 기본값을 사용합니다. Amazon Redshift는 새 열을 추가할 때 COLLATE 키워드를 지원하지 않습니다.  
데이터베이스 데이터 정렬을 사용하여 데이터베이스를 생성하는 방법에 대한 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요.  
COLLATE 함수에 대한 자세한 내용은 [COLLATE 함수](r_COLLATE.md) 섹션을 참조하세요.

UNIQUE  
열 수준에서는 하나 이상의 키가 UNIQUE로 설정될 수 있고, UNIQUE 제약 조건이 각각의 열에 개별적으로 적용됩니다. UNIQUE가 테이블 수준에서 설정된 경우 하나 이상의 열이 복합 UNIQUE 제약 조건을 구성할 수 있습니다.

PRIMARY KEY  
열 수준에서 설정되는 경우 PRIMARY KEY는 단일 열이어야 합니다. PRIMARY KEY가 테이블 수준에서 설정된 경우 하나 이상의 열이 복합 기본 키를 구성할 수 있습니다.

FOREIGN KEY  
FOREIGN KEY가 열 수준이나 테이블 수준 중 어떤 수준에서 설정되든 실제로는 차이가 없습니다. 열 수준에서, 구문은 간단히 `REFERENCES` *reftable* [ ( *refcolumn* )]입니다.

### 수신 데이터의 배포
<a name="r_CREATE_TABLE_usage-distribution-of-incoming-data"></a>

수신 데이터의 해시 배포 구성표가 대상 테이블의 해시 배포 구성표와 일치하는 경우, 데이터 로드 시 데이터를 물리적으로 배포할 필요는 실제로 없습니다. 예를 들어, 새 테이블에 대해 배포 키가 설정되고 같은 키 열에 배포된 다른 테이블에서 데이터가 삽입되고 있는 경우, 같은 노드와 조각을 사용하여 데이터가 적절히 로드됩니다. 하지만 원본 테이블과 대상 테이블이 모두 EVEN 배포로 설정되어 있는 경우 데이터는 대상 테이블로 다시 배포됩니다.

### 넓은 테이블
<a name="r_CREATE_TABLE_usage-wide-tables"></a>

폭이 매우 넓은 테이블을 만들 수는 있겠지만 그런 테이블에서는 INSERT 또는 SELECT 문과 같은 쿼리 처리를 수행하지 못할 수도 있습니다. CHAR과 같이 열 너비가 고정된 테이블의 최대 너비는 64KB - 1(또는 65535바이트)입니다. 테이블에 VARCHAR 열이 포함되어 있는 경우, VARCHARS 열이 선언된 전체 너비를 계산된 쿼리 처리 제한에 산입하지 않기 때문에 테이블은 오류를 반환하지 않고 더 큰 값으로 선언된 너비를 가질 수 있습니다. VARCHAR 열을 포함한 유효 쿼리 처리 제한은 요소의 수에 따라 달라집니다.

테이블이 너무 넓어 삽입 또는 선택 작업을 수행할 수 없는 경우 다음 오류가 발생합니다.

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## 예제
<a name="r_CREATE_TABLE_usage-examples"></a>

CREATE TABLE 명령을 사용하는 방법을 보여주는 예제는 [예제](r_CREATE_TABLE_examples.md) 주제를 참조하세요.

# 예제
<a name="r_CREATE_TABLE_examples"></a>

다음 예에서는 Amazon Redshift CREATE TABLE 문에 있는 다양한 열 및 테이블 속성을 보여줍니다. 파라미터 정의를 비롯한 CREATE TABLE에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

대부분의 예제는 *TICKIT* 샘플 데이터 세트의 테이블과 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)를 참조하세요.

 CREATE TABLE 명령에서 데이터베이스 이름 및 스키마 이름을 테이블 이름 앞에 붙일 수 있습니다. 예를 들면 다음과 같습니다. `dev_database.public.sales` 데이터베이스 이름은 연결된 데이터베이스여야 합니다. 다른 데이터베이스에서 데이터베이스 객체를 만들려는 모든 시도는 실패하고 잘못된 작업 오류가 발생합니다.

## 배포 키, 복합 정렬 키 및 압축을 사용하여 테이블 생성
<a name="r_CREATE_TABLE_examples-create-a-table-with-distribution-key"></a>

다음 예에서는 여러 열에 대해 정의된 압축을 사용하여 TICKIT 데이터베이스에서 SALES 테이블을 생성합니다. LISTID는 배포 키로 선언되고, LISTID 및 SELLERID는 다중 열 복합 정렬 키로 선언됩니다. 테이블에 대한 기본 키 및 외래 키 제약 조건 역시 정의됩니다. 제약 조건이 없는 경우 예제에서 테이블을 만들기 전에 외래 키가 참조하는 각 열에 UNIQUE 제약 조건을 추가해야 할 수 있습니다.

```
create table sales(
salesid integer not null,
listid integer not null,
sellerid integer not null,
buyerid integer not null,
eventid integer not null encode mostly16,
dateid smallint not null,
qtysold smallint not null encode mostly8,
pricepaid decimal(8,2) encode delta32k,
commission decimal(8,2) encode delta32k,
saletime timestamp,
primary key(salesid),
foreign key(listid) references listing(listid),
foreign key(sellerid) references users(userid),
foreign key(buyerid) references users(userid),
foreign key(dateid) references date(dateid))
distkey(listid)
compound sortkey(listid,sellerid);
```

결과는 다음과 같습니다.

```
schemaname | tablename | column     | type                        | encoding | distkey | sortkey | notnull
-----------+-----------+------------+-----------------------------+----------+---------+---------+--------
public     | sales     | salesid    | integer                     | lzo      | false   |       0 | true
public     | sales     | listid     | integer                     | none     | true    |       1 | true
public     | sales     | sellerid   | integer                     | none     | false   |       2 | true
public     | sales     | buyerid    | integer                     | lzo      | false   |       0 | true
public     | sales     | eventid    | integer                     | mostly16 | false   |       0 | true
public     | sales     | dateid     | smallint                    | lzo      | false   |       0 | true
public     | sales     | qtysold    | smallint                    | mostly8  | false   |       0 | true
public     | sales     | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | commission | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

다음 예에서는 대/소문자를 구분하지 않는 col1 열이 있는 테이블 t1을 생성합니다.

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

테이블을 쿼리합니다.

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## 인터리브 정렬 키를 사용하여 테이블 생성
<a name="CREATE_TABLE_NEW-create-a-table-using-interleaved-sortkey"></a>

다음 예에서는 인터리브 정렬 키를 사용하여 CUSTOMER 테이블을 생성합니다.

```
create table customer_interleaved (
  c_custkey     	integer        not null,
  c_name        	varchar(25)    not null,
  c_address     	varchar(25)    not null,
  c_city        	varchar(10)    not null,
  c_nation      	varchar(15)    not null,
  c_region      	varchar(12)    not null,
  c_phone       	varchar(15)    not null,
  c_mktsegment      varchar(10)    not null)
diststyle all
interleaved sortkey (c_custkey, c_city, c_mktsegment);
```

## IF NOT EXISTS를 사용하여 테이블 생성
<a name="CREATE_TABLE_NEW-create-a-table-using-if-not-exists"></a>

 다음은 CITIES 테이블을 생성하거나, 이 스키마가 이미 존재하는 경우에는 아무 것도 하지 않고 메시지를 반환하는 예입니다.

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## ALL 배포로 테이블 생성
<a name="CREATE_TABLE_NEW-create-a-table-with-all-distribution"></a>

 다음 예에서는 ALL 배포로 VENUE 테이블을 생성합니다.

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## EVEN 배포로 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-even-distribution"></a>

다음 예에서는 3개의 열이 있는, MYEVENT라는 테이블을 생성합니다.

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

이 테이블은 균등하게 배포되고 정렬되지 않습니다. 테이블에 선언된 DISTKEY 또는 SORTKEY 열이 없습니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
            
  column   |          type          | encoding | distkey | sortkey
-----------+------------------------+----------+---------+---------
 eventid   | integer                | lzo      | f       |       0
 eventname | character varying(200) | lzo      | f       |       0
 eventcity | character varying(30)  | lzo      | f       |       0
(3 rows)
```

## 다른 테이블과 같은 임시 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-temporary-table-that-is-like-another-table"></a>

다음 예에서는 EVENT 테이블에서 열을 상속하는, TEMPEVENT라는 임시 테이블을 생성합니다.

```
create temp table tempevent(like event); 
```

이 테이블은 상위 테이블의 DISTKEY 및 SORTKEY 속성도 상속합니다.

```
select "column", type, encoding, distkey, sortkey
 from pg_table_def where tablename = 'tempevent';

  column   |            type             | encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+---------
 eventid   | integer                     | none     | t       |       1
 venueid   | smallint                    | none     | f       |       0
 catid     | smallint                    | none     | f       |       0
 dateid    | smallint                    | none     | f       |       0
 eventname | character varying(200)      | lzo      | f       |       0
 starttime | timestamp without time zone | bytedict | f       |       0
(6 rows)
```

## IDENTITY 열을 포함한 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-table-with-an-identity-column"></a>

다음 예에서는 VENUEID로 명명된 IDENTITY 열을 가진, VENUE\$1IDENT라는 테이블을 생성합니다. 이 열은 0으로 시작되고 각 레코드마다 1씩 증가합니다. VENUEID는 테이블의 기본 키로도 선언됩니다.

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## 기본 IDENTITY 열을 포함한 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-identity-column"></a>

다음 예제에서는 `t1`이라는 테이블을 생성합니다. 이 테이블에는 `hist_id`라는 IDENTITY 열과 `base_id`라는 기본 IDENTITY 열이 있습니다.

```
CREATE TABLE t1(
  hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */
  base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */
  business_key varchar(10) ,
  some_field varchar(10)
);
```

테이블에 행을 삽입하면 `hist_id` 및 `base_id` 값이 모두 생성됨을 알 수 있습니다.

```
INSERT INTO T1 (business_key, some_field) values ('A','MM');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
```

두 번째 행을 삽입하면 `base_id`의 기본 값이 생성됨을 알 수 있습니다.

```
INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
```

세 번째 행을 삽입하면 `base_id`의 값이 고유할 필요가 없음을 알 수 있습니다.

```
INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
```

```
SELECT * FROM t1;
            
 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
       3 |       2 | B            | MNNN
```

## DEFAULT 열 값을 포함한 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-column-values"></a>

다음 예에서는 각 열에 대한 기본값을 선언하는 CATEGORYDEF 테이블을 생성합니다.

```
create table categorydef(
catid smallint not null default 0,
catgroup varchar(10) default 'Special',
catname varchar(10) default 'Other',
catdesc varchar(50) default 'Special events',
primary key(catid));
            
insert into categorydef values(default,default,default,default);
```

```
select * from categorydef;
            
 catid | catgroup | catname |    catdesc
-------+----------+---------+----------------
     0 | Special  | Other   | Special events
(1 row)
```

## DISTSTYLE, DISTKEY 및 SORTKEY 옵션
<a name="r_CREATE_TABLE_NEW-diststyle-distkey-and-sortkey-options"></a>

다음 예에서는 DISTKEY, SORTKEY 및 DISTSTYLE 옵션의 작동 방식을 보여줍니다. 이 예에서, COL1은 분산 키이므로 분산 스타일이 KEY로 설정되거나 설정되지 않아야 합니다. 기본적으로, 이 테이블에는 정렬 키가 없으므로 테이블이 정렬되지 않습니다.

```
create table t1(col1 int distkey, col2 int) diststyle key;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't1';

column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | az64     | t       | 0
col2   | integer | az64     | f       | 0
```

다음 예에서는 동일한 열이 배포 키와 정렬 키로 정의되어 있습니다. 이때도 분산 스타일은 KEY로 설정되거나 설정되지 않아야 합니다.

```
create table t2(col1 int distkey sortkey, col2 int);
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't2';
            
column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | none     | t       | 1
col2   | integer | az64     | f       | 0
```

다음 예에서는 분산 키로 설정되는 열이 없고 COL2는 정렬 키로 설정되고 분산 스타일은 ALL로 설정됩니다.

```
create table t3(col1 int, col2 int sortkey) diststyle all;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't3';
            
Column |  Type   | Encoding | DistKey | SortKey
-------+---------+----------+---------+--------
col1   | integer | az64     | f       | 0
col2   | integer | none     | f       | 1
```

다음 예에서는 배포 키가 EVEN으로 설정되고 정렬 키는 명시적으로 정의되지 않으므로, 테이블이 균등하게 배포되지만 정렬되지 않습니다.

```
create table t4(col1 int, col2 int) diststyle even;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't4';
            
             column |  type   |encoding | distkey | sortkey
--------+---------+---------+---------+--------
col1    | integer | az64    | f       | 0
col2    | integer | az64    | f       | 0
```

## ENCODE AUTO 옵션을 사용하여 테이블 생성
<a name="r_CREATE_TABLE_NEW-create-a-table-with-encode-option"></a>

다음 예에서는 자동 압축 인코딩을 사용하여 테이블 `t1`을 생성합니다. 열에 대한 인코딩 형식을 지정하지 않으면 ENCODE AUTO가 기본값입니다.

```
create table t1(c0 int, c1 varchar);
```

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 `t2`를 생성합니다.

```
create table t2(c0 int, c1 varchar) encode auto;
```

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 `t3`를 생성합니다. 열 `c0`은 DELTA의 초기 인코딩 형식으로 정의됩니다. 다른 인코딩이 더 나은 쿼리 성능을 제공하는 경우 Amazon Redshift에서 인코딩을 변경할 수 있습니다.

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

다음 예에서는 ENCODE AUTO를 지정하여 자동 압축 인코딩으로 테이블 `t4`를 생성합니다. 열 `c0`은 초기 인코딩 DELTA로 정의되고, 열 `c1`은 LZO의 초기 인코딩으로 정의된다. 다른 인코딩이 더 나은 쿼리 성능을 제공하는 경우 Amazon Redshift에서 이러한 인코딩을 변경할 수 있습니다.

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [구문](#r_CREATE_TABLE_AS-synopsis)
+ [파라미터](#r_CREATE_TABLE_AS-parameters)
+ [CTAS 사용 시 주의 사항](r_CTAS_usage_notes.md)
+ [CTAS 예](r_CTAS_examples.md)

쿼리를 기반으로 새 테이블을 만듭니다. 이 테이블의 소유자는 명령을 발행하는 사용자입니다.

명령에서 쿼리에 의해 정의된 데이터와 함께 새 테이블이 로드됩니다. 테이블 열의 이름과 데이터 형식은 쿼리의 출력 열과 연결되어 있습니다. CREATE TABLE AS(CTAS) 명령을 실행하면 새 테이블이 생성되고 새 테이블을 로드하는 쿼리가 평가됩니다.

## 구문
<a name="r_CREATE_TABLE_AS-synopsis"></a>

```
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]
```

## 파라미터
<a name="r_CREATE_TABLE_AS-parameters"></a>

LOCAL   
이 선택적 키워드는 문에서 허용되지만, Amazon Redshift에는 아무런 효과도 없습니다.

TEMPORARY \$1 TEMP   
임시 테이블을 만듭니다. 임시 테이블은 자신이 생성된 세션이 끝날 때 자동으로 삭제됩니다.

 *table\$1name*   
생성할 테이블의 이름입니다.  
'\$1'으로 시작하는 테이블 이름을 지정하면 테이블이 임시 테이블로 생성됩니다. 예:  

```
create table #newtable (id) as select * from oldtable;
```
최대 테이블 이름 길이는 127바이트이며, 이보다 긴 이름은 127바이트까지 표시되고 나머지는 잘립니다. Amazon Redshift는 노드 유형별로 클러스터당 테이블 수 할당량을 적용합니다. 다음 테이블에서 보듯이, 데이터베이스 및 스키마 이름으로 테이블 이름을 정규화할 수 있습니다.  

```
create table tickit.public.test (c1) as select * from oldtable;
```
이 예에서는 `tickit`이 데이터베이스 이름이고, `public`이 스키마 이름입니다. 데이터베이스 또는 스키마가 존재하지 않는 경우 테이블이 생성되지 않으며, 이 명령문은 오류를 반환합니다.  
스키마 이름이 주어지는 경우 새 테이블은 그 스키마에서 생성됩니다(생성자가 해당 스키마에 액세스할 수 있다고 가정). 테이블 이름은 그 스키마에 대한 고유한 이름이어야 합니다. 아무런 스키마도 지정되지 않으면 현재 데이터베이스 스키마를 사용하여 테이블이 생성됩니다. 임시 테이블을 생성할 경우, 임시 테이블이 특수한 스키마에 존재하므로 스키마 이름을 지정할 수 없습니다.  
같은 이름을 가진 여러 임시 테이블이 각각 별도의 세션에서 생성되는 경우에는 같은 데이터베이스에 동시에 존재하도록 허용됩니다. 이러한 테이블은 서로 다른 스키마에 할당됩니다.

 *column\$1name*   
새 테이블에 있는 열의 이름입니다. 열 이름을 입력하지 않은 경우에는 쿼리의 출력 열 이름에서 열 이름을 따옵니다. 기본 열 이름은 표현식에 사용됩니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

BACKUP \$1 YES \$1 NO \$1   
자동 및 수동 클러스터 스냅샷에 테이블을 포함해야 할지 여부를 지정하는 절입니다.  
중요한 데이터를 포함하지 않는 스테이징 테이블과 같은 테이블의 경우 BACKUP NO를 지정하여 스냅샷을 생성하고 스냅샷으로부터 복원할 때의 처리 시간을 절약하고 Amazon Simple Storage Service의 스토리지 공간을 줄입니다. BACKUP NO 설정은 클러스터 내에 있는 다른 노드로의 데이터 자동 복제에 아무런 영향도 미치지 않으므로, 노드 장애가 발생할 경우 BACKUP NO가 지정된 테이블이 복원됩니다. 기본값은 BACKUP YES입니다.  
RA3 프로비저닝된 클러스터 및 Amazon Redshift Serverless 작업 그룹에는 백업 없음 테이블이 지원되지 않습니다. RA3 클러스터 또는 서버리스 작업 그룹에서 백업 없음으로 표시된 테이블은 스냅샷을 생성하는 동안 항상 백업되고 스냅샷에서 복원할 때 항상 복원되는 영구 테이블로 처리됩니다. 백업이 없는 테이블의 스냅샷 비용을 방지하려면 스냅샷을 생성하기 전에 자릅니다.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
전체 테이블의 데이터 배포 스타일을 정의하는 키워드입니다. Amazon Redshift는 테이블에 대해 지정된 배포 스타일에 따라 컴퓨팅 노드에 테이블의 행을 배포합니다. 기본값은 DISTSTYLE AUTO입니다.  
테이블에 대해 선택하는 분산 스타일이 데이터베이스의 전체 성능에 영향을 미칩니다. 자세한 내용은 [쿼리 최적화를 위한 데이터 배포](t_Distributing_data.md) 섹션을 참조하세요.  
+ AUTO: Amazon Redshift에서 테이블 데이터를 기반으로 최적의 배포 스타일을 할당합니다. 테이블에 적용된 분산 스타일을 보려면 PG\$1CLASS 시스템 카탈로그 테이블을 쿼리합니다. 자세한 내용은 [분산 스타일 보기](viewing-distribution-styles.md) 섹션을 참조하세요.
+ EVEN: 테이블의 데이터가 클러스터의 노드들에 걸쳐 라운드 로빈 배포 방식으로 균등하게 분포됩니다. 행 ID는 배포의 결정에 사용되며, 대략적으로 같은 수의 행이 각 노드로 배포됩니다. 이것이 기본 배포 방법입니다.
+ KEY: 데이터가 DISTKEY 열에 있는 값을 기준으로 배포됩니다. 조인 테이블의 조인 열을 배포 키로 설정하면 두 테이블 모두의 조인 행이 컴퓨팅 노드에 배치됩니다. 데이터가 배치되면 최적화 프로그램이 조인을 더 효율적으로 수행할 수 있습니다. DISTSTYLE KEY를 지정하는 경우 DISTKEY 열의 이름을 지정해야 합니다.
+  ALL: 전체 테이블의 복사본이 모든 노드로 배포됩니다. 이 분산 스타일은 임의의 조인에 필요한 모든 행을 모든 노드에서 사용할 수 있도록 보장하지만, 스토리지 요구량이 몇 배로 늘고 테이블의 로드 시간과 유지 관리 시간도 증가합니다. ALL 배포는 KEY 배포가 적절하지 않은 특정 차원 테이블과 함께 사용할 때 실행 시간을 개선할 수 있지만, 성능 개선 정도를 유지 관리 비용과 비교 검토해야 합니다.

DISTKEY (*column*)  
배포 키에 대해 열 이름이나 위치 번호를 지정합니다. 테이블에 대한 선택적 열 목록 또는 쿼리의 선택 목록 중 하나에 지정된 이름을 사용합니다. 또는 첫 번째로 선택한 열이 1, 두 번째로 선택한 열이 2 등과 같이 이어지는 경우에는 위치 번호를 사용합니다. 테이블에서는 한 개의 열만 배포 키일 수 있습니다.  
+ 어떤 열을 DISTKEY 열로 선언하는 경우 DISTSTYLE이 KEY로 설정되거나 전혀 설정되지 않아야 합니다.
+ 열을 DISTKEY 열로 선언하지 않은 경우 DISTSTYLE을 EVEN으로 설정할 수 있습니다.
+ DISTKEY 또는 DISTSTYLE을 지정하지 않으면 CTAS가 SELECT 절의 쿼리 계획을 기반으로 새 테이블의 분산 스타일을 결정합니다. 자세한 내용은 [열 및 테이블 속성의 상속](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes) 섹션을 참조하세요.
배포 키 및 정렬 키와 동일한 열을 정의할 수 있습니다. 이 접근 방식은 문제가 되는 열이 쿼리에서 조인 열일 때 조인을 가속화하는 경향이 있습니다.

[ COMPOUND \$1 INTERLEAVED ] SORTKEY ( *column\$1name* [, ... ] )  
테이블에 대해 하나 이상의 정렬 키를 지정합니다. 데이터가 테이블로 로드될 때 데이터는 정렬 키로 지정되는 열을 기준으로 정렬됩니다.  
COMPOUND 또는 INTERLEAVED 정렬 스타일을 선택적으로 지정할 수 있습니다. 기본 키워드는 COMPOUND입니다. 자세한 내용은 [정렬 키](t_Sorting_data.md) 섹션을 참조하세요.  
테이블당 최대 400개의 COMPOUND SORTKEY 열 또는 8개의 INTERLEAVED SORTKEY 열을 정의할 수 있습니다.  
SORTKEY를 지정하지 않으면 CTAS가 SELECT 절의 쿼리 계획을 기반으로 새 테이블의 정렬 키를 결정합니다. 자세한 내용은 [열 및 테이블 속성의 상속](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes) 섹션을 참조하세요.    
COMPOUND  
목록에 표시되는 모든 열로 구성된 복합 키를 사용하여 데이터가 나열되는 순서대로 정렬됨을 지정합니다. 복합 정렬 키는 쿼리가 정렬 열의 순서에 따라 행을 스캔할 때 가장 유용합니다. 쿼리가 보조 정렬 열에 의존할 때는 복합 키로 정렬함으로써 얻는 성능상의 이점이 감소합니다. 테이블당 최대 400개의 COMPOUND SORTKEY 열을 정의할 수 있습니다.  
INTERLEAVED  
데이터가 인터리브 정렬 키를 사용하여 정렬됨을 지정합니다. 인터리브 정렬 키에 대해 최대 8개의 열을 지정할 수 있습니다.  
인터리브 정렬에서는 정렬 키에서 각 열이나 열의 하위 집합에 똑같은 가중치를 부여하므로, 쿼리가 정렬 키에 있는 열의 순서에 종속되지 않습니다. 쿼리가 하나 이상의 보조 정렬 열을 사용하는 경우 인터리브 정렬은 쿼리 성능을 크게 높여줍니다. 인터리브 정렬에는 데이터 로드와 vacuum 작업에 약간의 오버헤드 비용이 수반됩니다.

AS *query*   
Amazon Redshift가 지원하는 쿼리(SELECT 문)입니다.

# CTAS 사용 시 주의 사항
<a name="r_CTAS_usage_notes"></a>

## 한도
<a name="r_CTAS_usage_notes-limits"></a>

Amazon Redshift는 노드 유형별로 클러스터당 테이블 수 할당량을 적용합니다.

테이블 이름으로 입력할 수 있는 최대 문자 수는 127자입니다.

단일 테이블에서 정의할 수 있는 최대 열 수는 1,600개입니다.

## 열 및 테이블 속성의 상속
<a name="r_CTAS_usage_notes-inheritance-of-column-and-table-attributes"></a>

CREATE TABLE AS(CTAS) 테이블은 자신이 생성된 테이블로부터 제약 조건, 자격 증명 열, 기본 열 값 또는 기본 키를 상속하지 않습니다.

CTAS 테이블에 대한 열 압축 인코딩을 지정할 수 없습니다. Amazon Redshift가 다음과 같이 압축 인코딩을 자동으로 할당합니다.
+ 정렬 키로 정의된 열은 RAW 압축이 할당됩니다.
+ BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY 또는 GEOGRAPHY 데이터 유형으로 정의된 열은 RAW 압축이 할당됩니다.
+ SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP 또는 TIMESTAMPTZ로 정의된 열에는 AZ64 압축이 할당됩니다.
+ CHAR, VARCHAR 또는 VARBYTE로 정의된 열에는 LZO 압축이 할당됩니다.

자세한 내용은 [압축 인코딩](c_Compression_encodings.md) 및 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.

열 인코딩을 명시적으로 할당하려면 [CREATE TABLE](r_CREATE_TABLE_NEW.md)을 사용하세요.

CTAS가 SELECT 절의 쿼리 계획을 기반으로 새 테이블의 분산 스타일과 정렬 키를 결정합니다.

조인, 집계, order by 절 또는 limit 절을 포함하는 쿼리와 같은 복잡한 쿼리인 경우, CTAS는 쿼리 계획을 기반으로 최적의 분산 스타일과 정렬 키를 선택하기 위해 최대한 시도합니다.

**참고**  
큰 데이터 집합 또는 복잡한 쿼리로 최상의 성능을 얻으려면 일반적인 데이터 집합을 사용하여 테스트하는 것이 좋습니다.

쿼리 최적화 프로그램이 데이터 정렬과 배포를 위해 선택하는 열이 있을 경우 어떤 열을 선택할지 살펴보는 쿼리 계획을 검사함으로써 CTAS가 선택할 배포 키와 정렬 키를 예측할 수 있는 경우가 종종 있습니다. 쿼리 계획의 최상위 노드가 단일 테이블(XN Seq Scan)의 간단한 순차적 스캔인 경우에는 CTAS가 일반적으로 원본 테이블의 분산 스타일과 정렬 키를 사용합니다. 쿼리 계획의 최상위 노드가 다른 순차적 스캔(예: XN Limit, XN Sort, XN HashAggregate 등)인 경우, CTAS는 쿼리 계획을 기반으로 최적의 분산 스타일과 정렬 키를 선택하기 위해 최대한 시도합니다.

예를 들어, 다음 유형의 SELECT 절을 사용하여 5개의 테이블을 만든다고 가정해봅시다.
+ 간단한 select 문 
+ limit 절 
+ LISTID를 사용하는 order by 절 
+ QTYSOLD를 사용하는 order by 절 
+ group by 절을 사용하는 SUM 집계 함수

다음 예에서는 각 CTAS 문에 대한 쿼리 계획을 보여 줍니다.

```
explain create table sales1_simple as select listid, dateid, qtysold from sales;
                           QUERY PLAN
----------------------------------------------------------------
 XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(1 row)


explain create table sales2_limit as select listid, dateid, qtysold from sales limit 100;
                              QUERY PLAN
----------------------------------------------------------------------
 XN Limit  (cost=0.00..1.00 rows=100 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)


explain create table sales3_orderbylistid as select listid, dateid, qtysold from sales order by listid;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: listid
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales4_orderbyqty as select listid, dateid, qtysold from sales order by qtysold;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: qtysold
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales5_groupby as select listid, dateid, sum(qtysold) from sales group by listid, dateid;
                              QUERY PLAN
----------------------------------------------------------------------
 XN HashAggregate  (cost=3017.98..3226.75 rows=83509 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)
```

각 테이블에 대한 배포 키와 정렬 키를 보려면 다음에 표시된 것처럼 PG\$1TABLE\$1DEF 시스템 카탈로그 테이블을 쿼리합니다.

```
select * from pg_table_def where tablename like 'sales%';

      tablename       |   column   | distkey | sortkey
----------------------+------------+---------+---------
 sales                | salesid    | f       |       0
 sales                | listid     | t       |       0
 sales                | sellerid   | f       |       0
 sales                | buyerid    | f       |       0
 sales                | eventid    | f       |       0
 sales                | dateid     | f       |       1
 sales                | qtysold    | f       |       0
 sales                | pricepaid  | f       |       0
 sales                | commission | f       |       0
 sales                | saletime   | f       |       0
 sales1_simple        | listid     | t       |       0
 sales1_simple        | dateid     | f       |       1
 sales1_simple        | qtysold    | f       |       0
 sales2_limit         | listid     | f       |       0
 sales2_limit         | dateid     | f       |       0
 sales2_limit         | qtysold    | f       |       0
 sales3_orderbylistid | listid     | t       |       1
 sales3_orderbylistid | dateid     | f       |       0
 sales3_orderbylistid | qtysold    | f       |       0
 sales4_orderbyqty    | listid     | t       |       0
 sales4_orderbyqty    | dateid     | f       |       0
 sales4_orderbyqty    | qtysold    | f       |       1
 sales5_groupby       | listid     | f       |       0
 sales5_groupby       | dateid     | f       |       0
 sales5_groupby       | sum        | f       |       0
```

다음 표에 결과가 요약되어 있습니다. 단순성을 기하기 위해 설명 계획에서 비용, 행 및 너비 세부 정보는 생략합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_CTAS_usage_notes.html)

CTAS 문에서 분산 스타일과 정렬 키를 명시적으로 지정할 수 있습니다. 예를 들어, 다음 문은 EVEN 분산을 사용하여 테이블을 생성하고 SALESID를 정렬 키로 지정합니다.

```
create table sales_disteven
diststyle even
sortkey (salesid)
as
select eventid, venueid, dateid, eventname
from event;
```

## 압축 인코딩
<a name="r_CTAS_usage_notes_encoding"></a>

ENCODE AUTO는 테이블의 기본값으로 사용됩니다. Amazon Redshift는 테이블의 모든 열에 대한 압축 인코딩을 자동으로 관리하지 않습니다.

## 수신 데이터의 배포
<a name="r_CTAS_usage_notes-distribution-of-incoming-data"></a>

수신 데이터의 해시 배포 구성표가 대상 테이블의 해시 배포 구성표와 일치하는 경우, 데이터 로드 시 데이터를 물리적으로 배포할 필요는 실제로 없습니다. 예를 들어, 새 테이블에 대해 배포 키가 설정되고 같은 키 열에 배포된 다른 테이블에서 데이터가 삽입되고 있는 경우, 같은 노드와 조각을 사용하여 데이터가 적절히 로드됩니다. 하지만 원본 테이블과 대상 테이블이 모두 EVEN 배포로 설정되어 있는 경우 데이터는 대상 테이블로 다시 배포됩니다.

## 자동 ANALYZE 작업
<a name="r_CTAS_usage_notes-automatic-analyze-operations"></a>

Amazon Redshift는 CTAS 명령으로 생성하는 테이블을 자동으로 분석합니다. 이 테이블들이 처음 생성될 때는 테이블에서 ANALYZE 명령을 실행할 필요가 없습니다. 테이블을 수정하는 경우, 다른 테이블과 같은 방법으로 분석해야 합니다.

# CTAS 예
<a name="r_CTAS_examples"></a>

다음 예에서는 EVENT 테이블에 대해 EVENT\$1BACKUP이라는 테이블을 생성합니다.

```
create table event_backup as select * from event;
```

결과 테이블은 EVENT 테이블에서 배포 키와 정렬 키를 상속합니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'event_backup';

column    | type                        | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+--------
catid     | smallint                    | none     | false   |       0
dateid    | smallint                    | none     | false   |       1
eventid   | integer                     | none     | true    |       0
eventname | character varying(200)      | none     | false   |       0
starttime | timestamp without time zone | none     | false   |       0
venueid   | smallint                    | none     | false   |       0
```

다음 명령은 EVENT 테이블에서 4개의 열을 선택하여 EVENTDISTSORT라는 새 테이블을 생성합니다. 새 테이블은 EVENTID를 기준으로 배포되고 EVENTID 및 DATEID를 기준으로 정렬됩니다.

```
create table eventdistsort
distkey (1)
sortkey (1,3)
as
select eventid, venueid, dateid, eventname
from event;
```

결과는 다음과 같습니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistsort';

column   |          type          | encoding | distkey | sortkey
---------+------------------------+----------+---------+-------
eventid   | integer               | none     | t       | 1
venueid   | smallint              | none     | f       | 0
dateid    | smallint              | none     | f       | 2
eventname | character varying(200)| none     | f       | 0
```

배포 키 및 정렬 키에 대한 열 이름을 사용하여 같은 테이블을 정확하게 생성할 수 있습니다. 예:

```
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
```

다음 문은 테이블에 균등 배포를 적용하지만 명시적인 정렬 키를 정의하지 않습니다.

```
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
```

새 테이블에 대해 EVEN 배포가 지정되어 있으므로 테이블이 EVENT 테이블(EVENTID)에서 정렬 키를 상속하지 않습니다. 새 테이블에는 정렬 키와 배포 키가 없습니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdisteven';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+---------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 0
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

다음 문은 균등 배포를 적용하고 정렬 키를 정의합니다.

```
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
```

 결과 테이블에 정렬 키는 있지만 배포 키는 없습니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistevensort';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+-------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 1
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

다음 문은 EVENTID 열에 정렬되어 있는 수신 데이터에서 다른 키 열에 EVENT 테이블을 다시 배포하고 SORTKEY 열은 정의하지 않으므로, 테이블이 정렬되지 않습니다.

```
create table venuedistevent distkey(venueid)
as select * from event;
```

결과는 다음과 같습니다.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'venuedistevent';

 column   |            type             | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+-------
eventid   | integer                     | none     | f       | 0
venueid   | smallint                    | none     | t       | 0
catid     | smallint                    | none     | f       | 0
dateid    | smallint                    | none     | f       | 0
eventname | character varying(200)      | none     | f       | 0
starttime | timestamp without time zone | none     | f       | 0
```

# CREATE TEMPLATE
<a name="r_CREATE_TEMPLATE"></a>

[COPY](r_COPY.md)와 같은 Amazon Redshift 명령에 재사용 가능한 템플릿을 생성합니다. 템플릿은 여러 명령 실행에서 참조할 수 있는 일반적으로 사용되는 파라미터를 저장하여 일관성을 개선하고 수동 파라미터 사양을 줄입니다.

템플릿은 여러 작업에서 동일한 형식 지정 파라미터를 반복적으로 지정할 필요가 없지만 소스 경로, 대상 테이블 및 권한 부여는 작업마다 다를 수 있습니다.

## 필수 권한
<a name="r_CREATE_TEMPLATE-privileges"></a>

템플릿을 생성하려면 다음 중 하나가 있어야 합니다.
+ 수퍼유저 권한
+ 템플릿을 생성하려는 스키마에 대한 CREATE 권한 또는 템플릿을 생성하려는 데이터베이스의 스키마에 대한 CREATE 범위 지정 권한

## 구문
<a name="r_CREATE_TEMPLATE-synopsis"></a>

```
CREATE [ OR REPLACE ] TEMPLATE [database_name.][schema_name.]template_name
FOR COPY [ AS ]
[ [ FORMAT ] [ AS ] data_format ]
[ parameter [ argument ] [ , ... ] ];
```

## 파라미터
<a name="r_CREATE_TEMPLATE-parameters"></a>

 *OR REPLACE*   
동일한 이름의 템플릿이 지정된 데이터베이스 및 스키마에 이미 있는 경우 기존 템플릿이 대체됩니다. 템플릿을 COPY와 같이 동일한 작업 유형을 정의하는 새 템플릿으로만 바꿀 수 있습니다. 템플릿을 교체하는 데 필요한 권한이 있어야 합니다.

*database\$1name*  
(선택 사항) 템플릿이 생성되는 데이터베이스의 이름입니다. 지정하지 않으면 템플릿이 현재 데이터베이스에 생성됩니다.  
데이터베이스 또는 스키마가 존재하지 않는 경우 템플릿이 생성되지 않으며, 이 명령문은 오류를 반환합니다. 시스템 데이터베이스 `template0`, `template1`, `padb_harvest` 또는 `sys:internal`에서는 템플릿을 생성할 수 없습니다.

*schema\$1name*  
(선택 사항) 템플릿을 생성할 스키마의 이름입니다. 지정하지 않으면 템플릿이 현재 스키마에 생성됩니다.  
스키마 이름이 주어지는 경우 새 템플릿은 그 스키마에서 생성됩니다(생성자가 해당 스키마에 액세스할 수 있다고 가정). 템플릿 이름은 그 스키마에 대한 고유한 이름이어야 합니다.

*template\$1name*  
생성될 템플릿의 이름입니다. 선택적으로, 데이터베이스 및 스키마 이름으로 템플릿 이름을 정규화할 수 있습니다. 다음 예에서는 데이터베이스 이름이 `demo_database`이고, 스키마 이름은 `demo_schema`이며, 템플릿 이름은 `test`입니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.  

```
CREATE TEMPLATE demo_database.demo_schema.test FOR COPY AS CSV;
```

COPY  
템플릿이 생성되는 Redshift 명령 유형을 지정합니다. 현재는 COPY 명령만 지원됩니다.

[ [ 형식 ] [ AS ] *data\$1format* ]   
이는 선택 가능한 파라미터입니다. COPY 작업의 데이터 형식을 지정합니다.

[ *파라미터* [ 인수 ]]  
지정된 redshift 명령에 유효한 파라미터입니다.  
예를 들어 COPY 명령의 템플릿에는 다음이 포함될 수 있습니다.  
+ [데이터 형식 파라미터](copy-parameters-data-format.md)
+ [파일 압축 파라미터](copy-parameters-file-compression.md)
+ [데이터 변환 파라미터](copy-parameters-data-conversion.md)
+ [데이터 로드 작업](copy-parameters-data-load.md)
지원되는 파라미터의 전체 목록은 [COPY](r_COPY.md) 명령을 참조하세요.

### 사용 노트
<a name="create_template-usage-notes"></a>
+ 기본적으로, 모든 사용자는 PUBLIC 스키마에 대해 CREATE 및 USAGE 권한이 있습니다. 사용자가 데이터베이스의 PUBLIC 스키마에 객체를 만들도록 허용하지 않으려면 REVOKE 명령을 사용하여 그 권한을 제거하세요.
+ 템플릿과 명령 모두에 파라미터가 있는 경우 명령 파라미터가 우선합니다.
+ 템플릿은 데이터베이스 객체이며 표준 Redshift 객체 이름 지정 및 권한 규칙을 따릅니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.
+ 템플릿에는 [COPY](r_COPY.md) 명령에 대한 매니페스트 파일 사양이 포함될 수 없습니다.

### 제한 사항
<a name="create_template-limitations"></a>
+ 템플릿을 생성할 때 하나 이상의 파라미터를 지정해야 합니다.
+ 제외된 파라미터 - 소스 경로, 대상 테이블, 권한 부여 자격 증명, 매니페스트 파일 사양과 같은 명령별 파라미터는 템플릿에 포함할 수 없습니다. 이러한 파라미터는 실제 명령에서 지정해야 합니다.
+ 클러스터당 최대 템플릿 수 - 클러스터당 최대 1,000개의 템플릿을 생성할 수 있습니다. 이 제한은 클러스터의 모든 데이터베이스 및 스키마에 있는 총 템플릿 수에 적용됩니다.
+ 데이터베이스 간 참조 - 데이터베이스 간에 템플릿을 참조할 수 없습니다.
+ 데이터 공유 - 템플릿은 데이터 공유에 포함될 수 없습니다. 템플릿은 필요한 각 클러스터에서 별도로 생성해야 합니다.

## 예제
<a name="r_CREATE_TEMPLATE-examples"></a>

다음 예제에서는 COPY 명령에 대한 템플릿을 생성합니다.

```
CREATE TEMPLATE test_schema.demo_template
FOR COPY
AS
FORMAT JSON 'auto'
NULL AS ''
MAXERROR 100;
```

[SHOW TEMPLATE](r_SHOW_TEMPLATE.md)을 사용하여 템플릿의 정의를 가져옵니다.

```
SHOW TEMPLATE test_schema.demo_template;
CREATE OR REPLACE TEMPLATE dev.test_schema.demo_template FOR COPY AS FORMAT AS JSON 'auto' NULL '' MAXERROR 100;
```

 [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md) 시스템 뷰를 쿼리하여 템플릿에 대한 자세한 내용을 확인합니다.

```
SELECT * FROM SYS_REDSHIFT_TEMPLATE;

database_name | schema_name | template_name | template_type |        create_time         |     last_modified_time     | owner_id | last_modified_by | template_parameters 
---------------+-------------+---------------+---------------+----------------------------+----------------------------+----------+------------------+---------------------
 dev           | test_schema | demo_template |             1 | 2025-12-17 20:06:01.944171 | 2025-12-17 20:06:01.944171 |        1 |                1 | {
    "JSON": "auto",
    "MAXERROR": 100,
    "NULL": ""
}
```

# CREATE USER
<a name="r_CREATE_USER"></a>

새 데이터베이스 사용자를 생성합니다. 데이터베이스 사용자는 권한 및 역할에 따라 데이터베이스에서 데이터를 검색하고, 명령을 실행하고, 기타 작업을 수행할 수 있습니다. 이 명령을 실행하려면 데이터베이스 슈퍼 사용자여야 합니다.

## 필수 권한
<a name="r_CREATE_USER-privileges"></a>

CREATE USER에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ CREATE USER 권한이 있는 사용자

## 구문
<a name="r_CREATE_USER-synopsis"></a>

```
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
```

## 파라미터
<a name="r_CREATE_USER-parameters"></a>

 *이름*   
생성할 사용자의 이름입니다. 사용자 이름은 `PUBLIC`일 수 없습니다. 유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

WITH  
선택적 키워드입니다. WITH는 Amazon Redshift에서 무시됩니다.

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
사용자의 암호를 설정합니다.  
기본적으로, 암호가 비활성화 상태가 아닌 이상 사용자는 암호를 변경할 수 있습니다. 사용자의 암호를 비활성화하려면 DISABLE을 지정하세요. 사용자 암호를 비활성화하면 시스템에서 해당 암호가 삭제되고 사용자는 임시 AWS Identity and Access Management(IAM) 사용자 자격 증명만 이용해 로그인할 수 있습니다. 자세한 내용은 [IAM 인증을 이용한 데이터베이스 사용자 자격 증명 생성](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html)을 참조하세요. 수퍼유저만이 암호를 활성화 또는 비활성화할 수 있습니다. 수퍼유저의 암호를 비활성화할 수는 없습니다. 암호를 활성화하려면 [ALTER USER](r_ALTER_USER.md) 섹션을 실행하고 암호를 지정하세요.  
암호를 일반 텍스트, MD5 해시 문자열 또는 SHA256 해시 문자열로 지정할 수 있습니다.  
 AWS Management Console, AWS CLI 또는 Amazon Redshift API를 사용하여 새 클러스터를 시작할 때 초기 데이터베이스 사용자를 위한 일반 텍스트 암호를 입력해야 합니다. 이후에 [ALTER USER](r_ALTER_USER.md)를 사용하여 암호를 변경할 수 있습니다.
일반 텍스트의 경우, 암호는 다음 제약 조건을 충족해야 합니다.  
+ 8\$164자 사이의 길이여야 합니다.
+ 최소한 대문자 1개, 소문자 1개 및 숫자 1개를 포함해야 합니다.
+ '(작은따옴표), "(큰따옴표), \$1, / 또는 @을 제외하고 모든 ASCII 문자(ASCII 코드 33\$1126)를 사용할 수 있습니다.
CREATE USER 암호 파라미터를 일반 텍스트로 전달하는 대신 사용할 수 있는 더 안전한 방법으로, 암호와 사용자 이름을 포함하는 문자열의 MD5 해시를 지정할 수 있습니다.  
MD5 해시 문자열을 지정하면 CREATE USER 명령이 유효한 MD5 해시 문자열이 있는지 확인하지만 그 문자열에서 암호 부분의 유효성을 검사하지는 않습니다. 이 경우에는 빈 문자열과 같은 암호를 생성할 수 있는데, 이 암호로 데이터베이스에 로그인할 수는 없습니다.
MD5 암호를 지정하려면 다음 단계를 따르세요.  

1. 암호와 사용자 이름을 연결합니다.

   예를 들어, 암호가 `ez`이고 사용자가 `user1`인 경우 연결된 문자열은 `ezuser1`입니다.

1. 연결된 문자열을 32자의 MD5 해시 문자열로 변환합니다. MD5 유틸리티를 사용하여 해시 문자열을 생성할 수 있습니다. 다음 예에서는 Amazon Redshift [MD5 함수](r_MD5.md) 및 연결 연산자(\$1\$1)를 사용하여 32자의 MD5 해시 문자열을 반환합니다.

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. MD5 해시 문자열 앞에 '`md5`'를 연결하고 연결된 문자열을 *md5hash* 인수로 제공합니다.

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. 로그인 자격 증명을 사용하여 데이터베이스에 로그인합니다.

   이 예의 경우 암호 `user1`를 사용하여 `ez`로 로그인합니다.
또 다른 안전한 대안은 암호 문자열의 SHA-256 해시를 지정하는 것입니다. 또는 사용자 고유의 유효한 SHA-256 다이제스트 및 다이제스트를 생성하는 데 사용된 256비트 솔트를 제공할 수 있습니다.  
+ 다이제스트 – 해싱 함수의 출력입니다.
+ 솔트 – 해시 함수 출력의 패턴을 줄이는 데 도움이 되도록 암호와 결합되는 무작위로 생성된 데이터입니다.

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
다음 예에서 Amazon Redshift는 솔트를 생성하고 관리합니다.  

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
다음 예에서는 유효한 SHA-256 다이제스트 및 다이제스트를 생성하는 데 사용된 256비트 솔트가 제공됩니다.  
비밀번호를 지정하고 자체 솔트로 해시하려면 다음 단계를 따릅니다.  

1. 256비트 솔트를 생성합니다. 16진수 문자열 생성기를 사용하여 64자 길이의 문자열을 생성하면 솔트를 확보할 수 있습니다. 이 예제에서 솔트는 `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`입니다.

1.  FROM\$1HEX 함수를 사용하여 솔트를 바이너리로 변환합니다. SHA2 함수에는 솔트의 바이너리 표현이 필요하기 때문입니다. 다음 문을 참조하세요.

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  CONCAT 함수를 사용하여 솔트를 비밀번호에 추가하세요. 이 예제의 암호는 `Mypassword1`입니다. 다음 문을 참조하세요.

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. SHA2 함수를 사용하여 암호와 솔트 조합으로 다이제스트를 만들 수 있습니다. 다음 문을 참조하세요.

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  이전 단계의 다이제스트와 솔트를 사용하여 사용자를 생성합니다. 다음 문을 참조하세요.

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. 로그인 자격 증명을 사용하여 데이터베이스에 로그인합니다.

    이 예의 경우 암호 `admin`를 사용하여 `Mypassword1`로 로그인합니다.
해싱 함수를 지정하지 않고 암호를 일반 텍스트로 설정하면 사용자 이름을 솔트로 사용하여 MD5 다이제스트가 생성됩니다.

CREATEDB \$1 NOCREATEDB   
CREATEDB 옵션을 사용하여 신규 사용자가 새 데이터베이스를 만들 수 있습니다. 기본값은 NOCREATEDB입니다.

CREATEUSER \$1 NOCREATEUSER   
CREATEUSER 옵션으로 CREATE USER를 포함한 모든 데이터베이스 권한을 가진 수퍼유저를 생성합니다. 기본값은 NOCREATEUSER입니다. 자세한 내용은 [슈퍼 사용자](r_superusers.md) 섹션을 참조하세요.

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
Amazon Redshift 시스템 테이블 및 뷰에 대한 사용자의 액세스 수준을 지정합니다.  
SYSLOG ACCESS RESTRICTED 권한이 있는 일반 사용자는 사용자 가시성 시스템 테이블 및 뷰에서 해당 사용자가 생성한 행만 볼 수 있습니다. 기본값은 RESTRICTED입니다.  
SYSLOG ACCESS UNRESTRICTED 권한이 있는 일반 사용자는 사용자 가시성 시스템 테이블 및 뷰에서 다른 사용자가 생성한 행을 포함한 모든 행을 볼 수 있습니다. UNRESTRICTED는 수퍼유저 가시성 테이블에 대한 일반 사용자 액세스를 부여하지 않습니다. 수퍼유저만 수퍼유저 가시성 테이블을 볼 수 있습니다.  
사용자에게 시스템 테이블에 대한 무제한 액세스를 제공하면 다른 사용자가 생성한 데이터에 대한 가시성이 사용자에게 제공됩니다. 예를 들어, STL\$1QUERY 및 STL\$1QUERYTEXT에는 INSERT, UPDATE 및 DELETE 문의 전체 텍스트가 포함되며, 여기에는 사용자가 생성한 민감한 데이터가 포함될 수 있습니다.
SVV\$1TRANSACTIONS의 모든 행은 모든 사용자에게 표시됩니다.  
자세한 내용은 [시스템 테이블 및 뷰에 있는 데이터의 가시성](cm_chap_system-tables.md#c_visibility-of-data) 섹션을 참조하세요.

IN GROUP *groupname*   
사용자가 속한 기존 그룹의 이름을 지정합니다. 여러 개의 그룹 이름이 목록에 표시될 수 있습니다.

VALID UNTIL *abstime*   
VALID UNTIL 옵션은 그 시간 이후로는 사용자 암호가 더 이상 유효하지 않게 되는 절대 시간을 설정합니다. 기본적으로 암호에는 제한 시간이 없습니다.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
사용자가 동시에 열어놓을 수 있는 데이터베이스 연결의 최대 개수입니다. 슈퍼 사용자에 대해서는 이 제한이 적용되지 않습니다. 최대 동시 연결 수를 허용하려면 UNLIMITED 키워드를 사용하세요. 각 데이터베이스에 대한 연결 개수 제한이 적용될 수도 있습니다. 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요. 기본값은 UNLIMITED입니다. 현재 연결을 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리하세요.  
사용자 및 데이터베이스 연결 제한이 모두 적용되는 경우 사용되지 않는 연결 슬롯은 사용자가 연결 시도 시 양쪽 제한 범위 내에서 모두 사용 가능해야 합니다.

SESSION TIMEOUT *limit*  
세션이 비활성 또는 유휴 상태로 유지되는 최대 시간(초)입니다. 범위는 60초(1분)\$11,728,000초(20일)입니다. 사용자에 대해 세션 시간 제한이 설정되지 않은 경우 클러스터 설정이 적용됩니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [Amazon Redshift의 할당량 및 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) 섹션을 참조하세요.  
세션 시간 제한을 설정하면 새 세션에만 적용됩니다.  
시작 시간, 사용자 이름 및 세션 시간 제한을 포함하여 활성 사용자 세션에 대한 정보를 보려면 [STV\$1SESSIONS](r_STV_SESSIONS.md) 시스템 뷰를 쿼리합니다. 사용자 세션 기록에 대한 정보를 보려면 [STL\$1SESSIONS](r_STL_SESSIONS.md) 뷰를 쿼리합니다. 세션 시간 제한 값을 포함하여 데이터베이스 사용자에 대한 정보를 검색하려면 [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md) 뷰를 쿼리합니다.

EXTERNALID *external\$1id*  
자격 증명 공급자와 연결된 사용자의 식별자입니다. 사용자는 암호를 비활성화해야 합니다. 자세한 내용은 [Amazon Redshift용 네이티브 자격 증명 공급자(IdP) 페더레이션](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)을 참조하세요.

### 사용 노트
<a name="create_user-usage-notes"></a>

기본적으로, 모든 사용자는 PUBLIC 스키마에 대해 CREATE 및 USAGE 권한이 있습니다. 사용자가 데이터베이스의 PUBLIC 스키마에 객체를 만들도록 허용하지 않으려면 REVOKE 명령을 사용하여 그 권한을 제거하세요.

IAM 인증을 이용해 데이터베이스 사용자 자격 증명을 만들 때는 임시 자격 증명만을 이용해 로그인할 수 있는 수퍼유저를 만들 수 있습니다. 수퍼유저의 암호를 비활성화할 수는 없지만 임의로 생성되는 MD5 해시 문자열을 이용해 알 수 없는 암호를 만들 수는 있습니다.

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

큰따옴표로 묶여 있는 *사용자 이름*의 대/소문자는 `enable_case_sensitive_identifier` 구성 옵션 설정과 관계없이 항상 유지됩니다. 자세한 내용은 [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md) 섹션을 참조하세요.

## 예제
<a name="r_CREATE_USER-examples"></a>

다음 명령은 이름이 dbuser이고 암호가 "abcD1234"이며 데이터베이스 생성 권한이 있고 연결 제한이 30인 사용자를 생성합니다.

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 PG\$1USER\$1INFO 카탈로그 테이블을 쿼리하여 데이터베이스 사용자에 대한 세부 정보를 봅니다.

```
select * from pg_user_info;
         
 usename   | usesysid | usecreatedb | usesuper | usecatupd | passwd   | valuntil | useconfig | useconnlimit
-----------+----------+-------------+----------+-----------+----------+----------+-----------+-------------
 rdsdb     |        1 | true        | true     | true      | ******** | infinity |           |
 adminuser |      100 | true        | true     | false     | ******** |          |           | UNLIMITED
 dbuser    |      102 | true        | false    | false     | ******** |          |           | 30
```

다음 예에서는 계정 암호가 2017년 6월 10일까지 유효합니다.

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 다음 예에서는 특수 문자를 포함하고 대/소문자를 구분하는 암호를 가진 사용자를 생성합니다.

```
create user newman with password '@AbC4321!';
```

 MD5 암호에 백래시('\$1')를 사용하려면 원본 문자열에 있는 백래시로 백래시를 이스케이프하세요. 다음 예에서는 이름이 `slashpass`이고 암호가 단일 백래시('`\`')인 사용자를 생성합니다.

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

md5 비밀번호로 사용자를 생성합니다.

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

다음 예에서는 유휴 세션 시간 제한이 120초로 설정된 `dbuser`라는 사용자를 생성합니다.

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

다음 예에서는 이름이 `bob`인 사용자를 생성합니다. 네임스페이스는 `myco_aad`입니다. 이것은 예시입니다. 명령을 성공적으로 실행하려면 등록된 ID 공급업체가 있어야 합니다. 자세한 내용은 [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)(Amazon Redshift용 네이티브 자격 증명 공급자(IdP) 페더레이션)를 참조하세요.

```
CREATE USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

# CREATE VIEW
<a name="r_CREATE_VIEW"></a>

데이터베이스에 뷰를 생성합니다. 뷰는 물리적으로 구체화되는 것은 아닙니다. 뷰를 정의하는 쿼리는 뷰가 쿼리에서 참조될 때마다 실행됩니다. 외부 테이블로 보기를 새로 만들려면 WITH NO SCHEMA BINDING 절을 포함시키세요.

표준 뷰를 생성하려면 기본 테이블 또는 기본 뷰에 대한 액세스 권한이 있어야 합니다. 표준 보기를 쿼리하려면 보기 자체에 대한 선택 권한이 필요하지만, 기본 테이블에 대한 선택 권한은 필요하지 않습니다. 다른 스키마의 테이블이나 뷰를 참조하는 뷰를 생성하거나 구체화된 뷰를 참조하는 뷰를 생성하는 경우 사용 권한이 필요합니다. 지연 바인딩 뷰를 쿼리하려면 지연 바인딩 뷰 자체에 대한 몇 가지 권한이 필요합니다. 또한 Late Binding 뷰의 소유자에게 참조 객체(테이블, 뷰, 사용자 정의 함수 등)에 대한 선택 권한이 있는지 확인해야 합니다. 지연 바인딩 뷰에 대한 자세한 내용은 [사용 노트](#r_CREATE_VIEW_usage_notes) 섹션을 참조하세요.

## 필수 권한
<a name="r_CREATE_VIEW-privileges"></a>

CREATE VIEW를 사용하려면 다음 권한 중 하나가 필요합니다.
+ CREATE [ OR REPLACE ] VIEW를 사용하여 뷰를 만들려면 다음을 수행하세요.
  + 수퍼유저
  + CREATE [ REPLACE ] VIEW 권한이 있는 사용자
+ CREATE OR REPLACE VIEW를 사용하여 기존 뷰를 바꾸려면 다음을 수행하세요.
  + 수퍼유저
  + CREATE [ OR REPLACE ] VIEW 권한이 있는 사용자
  + 보기 소유자

사용자가 사용자 정의 함수가 포함된 뷰에 액세스하려는 경우 해당 함수에 대한 EXECUTE 권한이 있어야 합니다.

## 구문
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

## 파라미터
<a name="r_CREATE_VIEW-parameters"></a>

OR REPLACE   
같은 이름의 뷰가 이미 있는 경우 뷰가 대체됩니다. 같은 열 이름과 데이터 형식을 사용하여 같은 열 집합을 생성하는 새 쿼리로만 뷰를 바꿀 수 있습니다. CREATE OR REPLACE VIEW는 작업 완료 시까지 읽기 및 쓰기를 위한 뷰를 잠급니다.  
뷰가 교체될 때 소유권과 부여된 권한 등의 다른 속성은 유지됩니다.

 * 이름*   
결과의 이름. 스키마 이름이 지정되어 있는 경우(예: `myschema.myview`), 뷰는 지정된 스키마를 사용하여 생성됩니다. 그렇지 않으면, 뷰가 현재 스키마로 생성됩니다. 보기 이름은 같은 스키마에 있는 다른 보기 또는 테이블의 이름과는 달라야 합니다.  
'\$1'으로 시작하는 보기 이름을 지정하면 보기가 현재 세션에서만 보이는 임시 보기로 생성됩니다.  
유효한 이름에 대한 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요. 시스템 데이터베이스 template0, template1, padb\$1harvest 또는 sys:internal에서 테이블 또는 뷰를 생성할 수 없습니다.

 *column\$1name*   
뷰에서 열에 사용할 이름의 선택적 목록입니다. 열 이름이 지정되지 않은 경우에는 쿼리에서 파생됩니다. 단일 뷰에서 정의할 수 있는 최대 열 수는 1,600개입니다.

 *query*()   
테이블로 평가되는 (SELECT 문 형식의) 쿼리입니다. 이 테이블은 뷰에 있는 열과 행을 정의합니다.

 WITH NO SCHEMA BINDING   
보기가 테이블, 사용자 정의 함수 같은 기본 데이터베이스 객체에 바인딩되지 않도록 지정하는 절입니다. 결과적으로 보기와 보기가 참조하는 객체 사이에 종속성이 없습니다. 참조 객체가 존재하지 않는 경우에도 보기를 새로 만들 수 있습니다. 종속성이 없기 때문에 뷰에 영향을 주지 않고서 참조 객체를 중단하거나 변경할 수 있습니다. Amazon Redshift는 뷰가 쿼리될 때까지 종속성을 확인하지 않습니다. 재귀 공통 테이블 표현식(rCTE)은 지연 바인딩 뷰에서 지원되지 않습니다. 지연 바인딩 뷰에 대한 자세한 내용을 보려면 [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md) 함수를 실행합니다.  
WITH NO SCHEMA BINDING 절을 포함할 때는 SELECT 문에서 참조한 테이블 및 보기를 스키마 이름으로 정규화해야 합니다. 참조 테이블이 존재하지 않더라도 보기를 새로 만들 때는 스키마가 반드시 존재해야 합니다. 예를 들어 다음과 같은 문은 오류를 반환합니다.  

```
create view myevent as select eventname from event
with no schema binding;
```
다음 문은 성공적으로 실행됩니다.  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**참고**  
뷰를 업데이트하거나 뷰에 삽입하거나 뷰에서 삭제할 수 없습니다.

## 사용 노트
<a name="r_CREATE_VIEW_usage_notes"></a>



### Late Binding 보기
<a name="r_CREATE_VIEW_late-binding-views"></a>

Late Binding 보기는 자신이 쿼리될 때까지 테이블 및 기타 보기와 같은 기본 데이터베이스 객체를 확인하지 않습니다. 따라서 보기를 삭제한 다음 다시 생성하지 않고 기본 객체를 수정 또는 삭제할 수 있습니다. 기본 객체를 삭제하는 경우 Late Binding 보기에 대한 쿼리가 실패합니다. Late Binding 보기에 대한 쿼리가 기본 객체에 존재하지 않는 열을 참조하는 경우 쿼리가 실패합니다.

 Late Binding 보기의 기본 테이블 또는 보기를 삭제한 후 다시 생성하면 기본 액세스 권한을 가진 새 객체가 생성됩니다. 뷰를 쿼리할 사용자에게 기본 객체에 대한 권한을 부여해야 할 수 있습니다.

Late Binding 보기를 생성하려면 WITH NO SCHEMA BINDING 절을 포함시키세요. 다음 예에서는 스키마 바인딩 없이 보기를 새로 만듭니다.

```
create view event_vw as select * from public.event
with no schema binding;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | eventname     | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

다음은 Late Binding 보기를 다시 생성하지 않고 기본 테이블을 변경할 수 있음을 보여주는 예입니다.

```
alter table event rename column eventname to title;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | title         | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

Amazon Redshift Spectrum 외부 테이블은 Late Binding 뷰에서만 참조할 수 있습니다. Late Binding 뷰의 애플리케이션 하나가 Amazon Redshift 및 Redshift Spectrum 테이블을 둘 다 쿼리합니다. 예를 들어 [UNLOAD](r_UNLOAD.md) 명령을 사용하여 오래된 데이터를 Amazon S3에 보관할 수 있습니다. 그런 다음 Amazon S3의 데이터를 참조하는 Redshift Spectrum 외부 테이블을 생성하고, 두 테이블을 쿼리하는 뷰를 생성합니다. 다음은 UNION ALL 절을 사용하여 Amazon Redshift `SALES` 테이블과 Redshift Spectrum `SPECTRUM.SALES` 테이블을 조인하는 예입니다.

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

`SPECTRUM.SALES` 테이블을 비롯한 Redshift Spectrum 외부 테이블 생성에 대한 자세한 내용은 [Amazon Redshift Spectrum 시작하기](c-getting-started-using-spectrum.md) 섹션을 참조하세요.

**중요**  
지연 바인딩 뷰에서 표준 뷰를 만드는 경우 표준 뷰의 정의에는 지연 바인딩 뷰의 소유자를 비롯하여 표준 뷰가 만들어질 당시 지연 바인딩 뷰의 정의가 포함됩니다. 기본 지연 바인딩 뷰를 변경하는 경우 표준 뷰를 다시 만들 때까지 표준 뷰에서 이러한 변경 사항이 사용되지 않습니다. 따라서 표준 뷰가 쿼리될 때 항상 지연 바인딩 뷰의 정의와 지연 바인딩 뷰의 소유자를 사용하여 해당 표준 뷰를 만들 때 권한을 확인합니다.

지연 바인딩 뷰의 최신 정의를 참조하도록 표준 뷰를 업데이트하려면 표준 뷰를 만들 때 사용한 초기 뷰 정의와 함께 CREATE OR REPLACE VIEW를 실행하세요.

지연 바인딩 뷰에서 표준 뷰를 만드는 다음 예시를 참조하세요.

```
create view sales_vw_lbv as 
select * from public.sales 
with no schema binding;

show view sales_vw_lbv;
                            Show View DDL statement
--------------------------------------------------------------------------------
 create view sales_vw_lbv as select * from public.sales with no schema binding;
(1 row)

create view sales_vw as 
select * from sales_vw_lbv;

show view sales_vw;
                                               Show View DDL statement
---------------------------------------------------------------------------------------------------------------------
 SELECT sales_vw_lbv.price, sales_vw_lbv."region" FROM (SELECT sales.price, sales."region" FROM sales) sales_vw_lbv;
(1 row)
```

참고로, 표준 뷰의 DDL 문에 표시된 지연 바인딩 뷰는 표준 뷰를 만들 때 정의되며 이후에 지연 바인딩 뷰를 변경해도 업데이트되지 않습니다.

## 예제
<a name="r_CREATE_VIEW-examples"></a>

예제 명령은 *TICKIT* 데이터베이스라는 샘플 객체 및 데이터 세트를 사용합니다. 자세한 내용은 [샘플 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)를 참조하세요.

다음 명령은 EVENT라는 테이블에서 *myevent*라는 뷰를 생성합니다.

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

다음 명령은 USERS라는 테이블에서 *myuser*라는 뷰를 생성합니다.

```
create view myuser as select lastname from users;
```

다음 명령은 USERS라는 테이블에서* myuser*라는 뷰를 생성하거나 대체합니다.

```
create or replace view myuser as select lastname from users;
```

다음 예에서는 스키마 바인딩 없이 보기를 새로 만듭니다.

```
create view myevent as select eventname from public.event
with no schema binding;
```

# DEALLOCATE
<a name="r_DEALLOCATE"></a>

준비된 문을 할당 취소합니다.

## 구문
<a name="r_DEALLOCATE-synopsis"></a>

```
DEALLOCATE [PREPARE] plan_name
```

## 파라미터
<a name="r_DEALLOCATE-parameters"></a>

PREPARE   
이 키워드는 선택 사항으로서 무시됩니다.

 *plan\$1name*   
할당 취소할 준비된 문의 이름입니다.

## 사용 관련 참고 사항
<a name="r_DEALLOCATE_usage_notes"></a>

DEALLOCATE는 이전에 준비된 SQL 문의 할당 취소에 사용됩니다. 준비된 문을 명시적으로 할당 취소하지 않으면 현재 세션 종료 시 할당 취소됩니다. 준비된 문에 대한 자세한 내용은 [PREPARE](r_PREPARE.md) 섹션을 참조하세요.

## 참고
<a name="r_DEALLOCATE-see-also"></a>

 [EXECUTE](r_EXECUTE.md), [PREPARE](r_PREPARE.md) 

# DECLARE
<a name="declare"></a>

새로운 커서를 정의합니다. 더 큰 쿼리의 결과 집합에서 한 번에 몇 개의 행을 검색하려면 커서를 사용하세요.

커서의 첫 행을 가져올 때, 필요한 경우 메모리나 디스크에서 리더 노드에 전체 결과 집합이 구체화됩니다. 큰 결과 집합을 가진 커서를 사용하면 성능에 나쁜 영향을 미칠 가능성이 있으므로, 가급적이면 다른 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 [커서 사용 시 성능 고려사항](#declare-performance) 섹션을 참조하세요.

트랜잭션 블록 내에 커서를 선언해야 합니다. 세션당 한 번에 한 개의 커서만 열 수 있습니다.

자세한 내용은 [FETCH](fetch.md), [CLOSE](close.md) 섹션을 참조하세요.

## 구문
<a name="declare-synopsis"></a>

```
DECLARE cursor_name CURSOR FOR query
```

## 파라미터
<a name="declare-parameters"></a>

*cursor\$1name*   
새 커서의 이름입니다.

 *query*()   
커서를 채우는 SELECT 문입니다.

## DECLARE CURSOR 사용 시 주의 사항
<a name="declare-usage"></a>

클라이언트 애플리케이션이 ODBC 연결을 사용하고 쿼리가 메모리에 비해 너무 큰 결과 집합을 생성하는 경우, 커서를 사용하여 결과 집합을 클라이언트 애플리케이션으로 스트리밍할 수 있습니다. 커서를 사용할 때, 리더 노드에서 전체 결과 집합이 구체화된 다음에 클라이언트가 결과를 증분 방식으로 가져올 수 있습니다.

**참고**  
Microsoft Windows용 ODBC에서 커서를 사용하려면 Amazon Redshift에 사용하는 ODBC DSN에서 [**선언/가져오기 사용(Use Declare/Fetch)**] 옵션을 사용합니다. 라운드 트립을 최소화하려면 다중 노드 클러스터에 대해 ODBC DSN 옵션 대화 상자에서 **캐시 크기** 필드를 사용하여 ODBC 캐시 크기를 4,000 이상으로 설정하는 것이 좋습니다. 단일 노드 클러스터에서 Cache Size를 1,000으로 설정합니다.

커서를 사용하면 성능에 나쁜 영향을 미칠 가능성이 있으므로, 가급적이면 다른 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 [커서 사용 시 성능 고려사항](#declare-performance) 섹션을 참조하세요.

Amazon Redshift 커서는 다음 제한 사항과 함께 지원됩니다.
+ 세션당 한 번에 한 개의 커서만 열 수 있습니다.
+ 트랜잭션 (BEGIN … END) 내에서 커서를 사용해야 합니다.
+ 모든 커서에 대한 최대 누적 결과 집합 크기는 클러스터 노드 유형을 기준으로 제한됩니다. 더 큰 결과 집합이 필요하면 XL 또는 8XL 노드 구성으로 크기를 조정할 수 있습니다.

  자세한 내용은 [커서 제약 조건](#declare-constraints) 섹션을 참조하세요.

## 커서 제약 조건
<a name="declare-constraints"></a>

커서의 첫 행을 가져올 때, 리더 노드에 전체 결과 집합이 구체화됩니다. 결과 집합이 메모리에 적합하지 않을 경우 필요에 따라 디스크에 기록됩니다. Amazon Redshift는 리더 노드의 무결성을 보호하려고 클러스터의 노드 유형을 기준으로 모든 커서 결과 집합의 크기에 제약 조건을 적용합니다.

다음 표에는 각 클러스터 노드 유형에 대한 최대 전체 결과 집합 크기가 나와 있습니다. 최대 결과 집합 크기의 단위는 메가바이트입니다.


| 노드 유형 | 클러스터당 최대 결과 집합 크기(MB) | 
| --- | --- | 
|   DC2 Large 다중 노드   | 192,000 | 
|   DC2 Large 단일 노드   | 8,000 | 
|   DC2 8XL 다중 노드   | 3,200,000 | 
|   RA3 16XL 다중 노드   | 14,400,000 | 
|   RA3 4XL 다중 노드   | 3,200,000 | 
|   RA3 XLPLUS 다중 노드   | 1,000,000 | 
|   RA3 XLPLUS 단일 노드   | 64,000 | 
|   RA3 LARGE 다중 노드   | 240,000 | 
|   RA3 LARGE 단일 노드   | 8,000 | 
| Amazon Redshift Serverless | 150,000 | 

클러스터에 대한 활성 커서 구성을 보려면 수퍼유저로서 [STV\$1CURSOR\$1CONFIGURATION](r_STV_CURSOR_CONFIGURATION.md) 시스템 테이블을 쿼리하세요. 활성 커서의 상태를 보려면 [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md) 시스템 테이블을 쿼리하세요. 사용자에게는 자신의 커서에 대한 행만 보이지만, 수퍼유저는 모든 커서를 볼 수 있습니다.

## 커서 사용 시 성능 고려사항
<a name="declare-performance"></a>

커서는 리더 노드의 전체 결과 집합을 구체화한 후 결과를 클라이언트로 반환하기 시작하므로, 매우 큰 결과 집합을 가진 커서를 사용하면 성능에 나쁜 영향을 미칠 수 있습니다. 결과 집합이 매우 클 때는 커서를 사용하지 않는 것이 좋습니다. 애플리케이션에서 ODBC 연결을 사용할 때와 같이, 경우에 따라서는 커서가 유일하게 실행 가능한 해결책일 수도 있습니다. 가능하면 다음과 같은 대안을 사용하는 것이 좋습니다.
+ [UNLOAD](r_UNLOAD.md)를 사용하여 큰 테이블을 내보냅니다. UNLOAD 사용 시, 컴퓨팅 노드가 병렬로 작동하여 Amazon Simple Storage Service에 있는 데이터 파일로 데이터를 직접 전송합니다. 자세한 내용은 [Amazon Redshift에서 데이터 언로드](c_unloading_data.md) 섹션을 참조하세요.
+ 클라이언트 애플리케이션에서 JDBC 가져오기 크기 파라미터를 설정합니다. JDBC 연결을 사용하는데 클라이언트 측 메모리 부족 오류가 발생할 경우, JDBC 가져오기 크기 파라미터를 설정하여 클라이언트가 더 작은 배치에서 결과 집합을 검색하도록 할 수 있습니다. 자세한 내용은 [JDBC Fetch Size 파라미터 설정](set-the-JDBC-fetch-size-parameter.md) 섹션을 참조하세요.

## DECLARE CURSOR 예제
<a name="declare-example"></a>

다음 예에서는 LOLLAPALOOZA로 명명된 커서를 선언하여 롤라팔루자(LOLLAPALOOZA) 행사를 위한 판매 정보를 선택한 후 커서를 사용하여 결과 집합에서 행을 가져옵니다.

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

다음 예제는 테이블의 모든 결과를 포함하는 refcursor를 반복합니다.

```
CREATE TABLE tbl_1 (a int, b int);
INSERT INTO tbl_1 values (1, 2),(3, 4);

CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$
DECLARE
    target record;
    curs1 cursor for select * from tbl_1;
BEGIN
    OPEN curs1;
    LOOP
        fetch curs1 into target;
        exit when not found;
        RAISE INFO 'a %', target.a;
    END LOOP;
    CLOSE curs1;
END;
$$ LANGUAGE plpgsql;

CALL sp_cursor_loop();
         
SELECT message 
   from svl_stored_proc_messages 
   where querytxt like 'CALL sp_cursor_loop()%';
         
  message
----------
      a 1
      a 3
```

# DELETE
<a name="r_DELETE"></a>

행을 테이블에서 삭제합니다.

**참고**  
단일 SQL 문의 최대 크기는 16MB입니다.

## 구문
<a name="r_DELETE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ { USING } table_name, ... ]
    [ WHERE condition ]
```

## 파라미터
<a name="r_DELETE-parameters"></a>

WITH 절  
하나 이상의 *common-table-expressions*를 지정하는 절(옵션)입니다. [WITH 절](r_WITH_clause.md)을(를) 참조하세요.

FROM  
USING 절이 지정되어 있을 때를 제외하면 FROM 키워드는 선택 사항입니다. `delete from event;` 및 `delete event;` 문은 똑같이 EVENT 테이블에서 모든 행을 제거하는 작업을 수행합니다.  
테이블에서 모든 행을 삭제하려면 테이블을 [TRUNCATE](r_TRUNCATE.md)합니다. TRUNCATE는 DELETE보다 훨씬 더 효율적이며 VACUUM 및 ANALYZE가 필요하지 않습니다. 하지만 TRUNCATE는 이 명령이 실행되는 트랜잭션을 커밋합니다.

 *table\$1name*   
임시 또는 영구 테이블입니다. 테이블의 소유자 또는 테이블에 대한 DELETE 권한을 가진 사용자만이 테이블에서 행을 삭제할 수 있습니다.  
대규모 테이블에서 정규화되지 않은 빠른 삭제 작업을 하려면 TRUNCATE 명령의 사용을 고려하세요([TRUNCATE](r_TRUNCATE.md) 참조).  
테이블에서 많은 수의 행을 삭제한 후  
+ 테이블을 완전히 비워 스토리지 스페이스를 회수하고 행을 다시 정렬합니다.
+ 테이블을 분석하여 쿼리 플래너에 대한 통계를 업데이트합니다.

 *materialized\$1view\$1name*   
구체화된 뷰 DELETE 문은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md)에서 사용되는 구체화된 뷰에서 작동합니다. 구체화된 뷰의 소유자 또는 구체화된 뷰에 대한 DELETE 권한을 가진 사용자만 구체화된 뷰에서 행을 삭제할 수 있습니다.  
사용자에게 RLS 무시 권한이 부여되지 않은 행 수준 보안(RLS) 정책을 사용하는 스트리밍 수집을 위해 구체화된 뷰에서 DELETE를 실행할 수 없습니다. 여기에는 예외가 있습니다. DELETE를 수행하는 사용자에게 IGNORE RLS가 부여되면 성공적으로 실행됩니다. 자세한 내용은 [RLS 정책 소유권 및 관리](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html)를 참조하세요.

USING *table\$1name*, ...  
USING 키워드는 WHERE 절 조건에서 추가적인 테이블이 참조될 때 테이블 목록을 소개하는 데 사용됩니다. 예를 들어, 다음 문은 EVENT 및 SALES 테이블에 대한 조인 조건을 충족시키는 EVENT 테이블에서 모든 행을 삭제합니다. SALES 테이블은 FROM 목록에 명시적으로 명명되어야 합니다.  

```
delete from event using sales where event.eventid=sales.eventid;
```
USING 절에서 대상 테이블 이름을 반복하는 경우 DELETE 작업은 자가 조인을 실행합니다. 같은 쿼리를 쓰는 방법의 대안으로서, WHERE 절에서 USING 구문 대신 하위 쿼리를 사용할 수 있습니다.

WHERE *condition*   
행 삭제를 조건과 일치하는 행으로 제한하는 선택적인 절입니다. 예를 들어, 조건은 열에 대한 제한, 조인 조건 또는 쿼리의 결과를 바탕으로 하는 조건일 수 있습니다. 쿼리는 DELETE 명령의 대상이 아닌 테이블을 참조할 수 있습니다. 예:  

```
delete from t1
where col1 in(select col2 from t2);
```
아무런 조건도 지정되지 않은 경우 테이블에 있는 모든 행이 삭제됩니다.

## 사용 노트
<a name="r_DELETE-usage"></a>
+ DELETE 작업은 다음 중 하나에 연결된 Amazon Redshift 스트리밍 구체화된 뷰에서 실행될 때 배타적 잠금을 유지합니다.
  +  Amazon Kinesis 데이터 스트림 
  +  Amazon Managed Streaming for Apache Kafka 주제 
  +  Confluent Cloud Kafka 주제와 같은 지원되는 외부 스트림 

  자세한 내용은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md) 섹션을 참조하세요.

## 예제
<a name="r_DELETE-examples"></a>

CATEGORY 테이블에서 모든 행을 삭제합니다.

```
delete from category;
```

CATEGORY 테이블에서 CATID 값이 0\$19 사이의 값인 행을 삭제합니다.

```
delete from category
where catid between 0 and 9;
```

SALES 테이블에 자신의 SELLERID 값이 존재하지 않는 LISTING 테이블에서 행을 삭제합니다.

```
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
```

다음 두 쿼리는 모두 EVENT 테이블에 대한 조인과 CATID 열에 대한 추가적인 제한 사항을 바탕으로 CATEGORY 테이블에서 한 개의 행을 삭제합니다.

```
delete from category
using event
where event.catid=category.catid and category.catid=9;
```

```
delete from category
where catid in
(select category.catid from category, event
where category.catid=event.catid and category.catid=9);
```

다음 쿼리는 `mv_cities` 구체화된 뷰에서 모든 행을 삭제합니다. 이 예의 구체화된 뷰 이름은 샘플입니다.

```
delete from mv_cities;
```

# DESC DATASHARE
<a name="r_DESC_DATASHARE"></a>

ALTER DATASHARE를 사용하여 추가된 datashare 내의 데이터베이스 객체 목록을 표시합니다. Amazon Redshift는 테이블, 뷰 및 함수의 이름, 데이터베이스, 스키마 및 형식을 표시합니다.

데이터 공유 객체에 대한 추가 정보는 시스템 보기를 사용하여 찾을 수 있습니다. 자세한 내용은 [SVV\$1DATASHARE\$1OBJECTS](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARE_OBJECTS.html) 및 [SVV\$1DATASHARES](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARES.html)를 참조하세요.

## 구문
<a name="r_DESC_DATASHARE-synopsis"></a>

```
DESC DATASHARE datashare_name [ OF [ ACCOUNT account_id ] NAMESPACE namespace_guid ]
```

## 파라미터
<a name="r_DESC_DATASHARE-parameters"></a>

 *datashare\$1name*   
datashare의 이름입니다.

NAMESPACE *namespace\$1guid*   
datashare에서 사용하는 네임스페이스를 지정하는 값입니다. 소비자 클러스터 관리자로 DESC DATAHSARE를 실행할 때 NAMESPACE 파라미터를 지정하여 인바운드 datashare를 봅니다.

ACCOUNT *account\$1id*  
datashare가 속한 계정을 지정하는 값입니다.

## 사용 관련 참고 사항
<a name="r_DESC_DATASHARE-usage"></a>

소비자 계정 관리자는 DESC DATASHARE를 실행하여 AWS 계정 내의 인바운드 datashare를 볼 때 NAMESPACE 옵션을 지정합니다. DESC DATASHARE를 실행하여 AWS 계정 간 인바운드 datashare를 볼 때 ACCOUNT 및 NAMESPACE 옵션을 지정합니다.

## 예제
<a name="r_DESC_DATASHARE-examples"></a>

다음 예에서는 생산자 클러스터의 아웃바운드 datashare에 대한 정보를 표시합니다.

```
DESC DATASHARE salesshare;

producer_account |          producer_namespace           | share_type  | share_name   | object_type |        object_name           |  include_new
-----------------+---------------------------------------+-------------+--------------+-------------+------------------------------+--------------
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | TABLE       | public.tickit_sales_redshift |
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | SCHEMA      | public                       |   t
```

다음 예에서는 소비자 클러스터의 인바운드 datashare에 대한 정보를 표시합니다.

```
DESC DATASHARE salesshare of ACCOUNT '123456789012' NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

 producer_account |          producer_namespace          | share_type | share_name | object_type |         object_name          |  include_new
------------------+--------------------------------------+------------+------------+-------------+------------------------------+--------------
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | table       | public.tickit_sales_redshift |
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | schema      | public                       |
(2 rows)
```

# DESC IDENTITY PROVIDER
<a name="r_DESC_IDENTITY_PROVIDER"></a>

자격 증명 공급자에 대한 정보를 표시합니다. 슈퍼 사용자만 자격 증명 공급자를 설명할 수 있습니다.

## 구문
<a name="r_DESC_IDENTITY_PROVIDER-synopsis"></a>

```
DESC IDENTITY PROVIDER identity_provider_name
```

## 파라미터
<a name="r_DESC_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
자격 증명 공급자 이름입니다.

## 예제
<a name="r_DESC_IDENTITY_PROVIDER-examples"></a>

다음 예에서는 자격 증명 공급자에 대한 정보를 표시합니다.

```
DESC IDENTITY PROVIDER azure_idp;
```

샘플 출력은 다음과 같습니다.

```
  uid   |   name    | type  |              instanceid              | namespc |                                                                                                                                                 params                                                                                                                                                  | enabled
--------+-----------+-------+--------------------------------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------
 126692 | azure_idp | azure | e40d4bb2-7670-44ae-bfb8-5db013221d73 | aad     | {"issuer":"https://login.microsoftonline.com/e40d4bb2-7670-44ae-bfb8-5db013221d73/v2.0", "client_id":"871c010f-5e61-4fb1-83ac-98610a7e9110", "client_secret":'', "audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift", "https://analysis.windows.net/powerbi/connector/AWSRDS"]} | t
(1 row)
```

# 마스킹 정책 분리
<a name="r_DETACH_MASKING_POLICY"></a>

이미 연결되어 있던 동적 데이터 마스킹 정책을 열에서 분리합니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md)(동적 데이터 마스킹(미리 보기)을 참조하세요.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 마스킹 정책을 분리할 수 있습니다.

## 구문
<a name="r_DETACH_MASKING_POLICY-synopsis"></a>

```
DETACH MASKING POLICY
{
  policy_name ON table_name
  | database_name.policy_name ON database_name.schema_name.table_name
}
( output_column_names )
FROM { user_name | ROLE role_name | PUBLIC };
```

## 파라미터
<a name="r_DETACH_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
분리할 마스킹 정책의 이름입니다.

database\$1name  
정책 및 관계가 생성되는 데이터베이스의 이름입니다. 정책과 관계는 동일한 데이터베이스에 있어야 합니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

schema\$1name  
관계가 속하는 스키마의 이름입니다.

 *table\$1name*   
마스킹 정책을 분리할 테이블의 이름입니다.

*output\$1column\$1names*   
마스킹 정책이 연결된 열의 이름입니다.

*user\$1name*   
마스킹 정책이 연결된 사용자의 이름입니다.  
단일 DETACH MASKING POLICY 문에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

*role\$1name*   
마스킹 정책이 연결된 역할의 이름입니다.  
단일 DETACH MASKING POLICY 문에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

*PUBLIC*   
정책이 테이블의 모든 사용자에게 연결되었음을 표시합니다.  
단일 DETACH MASKING POLICY 문에서 user\$1name, role\$1name 및 PUBLIC 중 하나만 설정할 수 있습니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 DETACH MASKING POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

# DETACH RLS POLICY
<a name="r_DETACH_RLS_POLICY"></a>

테이블에 대한 행 수준 보안 정책을 하나 이상의 사용자 또는 역할에서 분리합니다.

`sys:secadmin` 역할이 부여된 수퍼유저와 사용자 또는 역할은 정책을 분리할 수 있습니다.

## 구문
<a name="r_DETACH_RLS_POLICY-synopsis"></a>

```
DETACH RLS POLICY
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
FROM { user_name | ROLE role_name | PUBLIC } [, ...];
```

## 파라미터
<a name="r_DETACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
정책의 이름입니다.

database\$1name  
정책 및 관계가 생성되는 데이터베이스의 이름입니다. 정책과 관계는 동일한 데이터베이스에 있어야 합니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

schema\$1name  
관계가 속하는 스키마의 이름입니다.

table\$1name  
행 수준 보안 정책이 연결된 관계입니다.

FROM \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
정책이 하나 이상의 지정된 사용자 또는 역할에서 분리되는지 여부를 지정합니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 DETACH RLS POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

## 사용 노트
<a name="r_DETACH_RLS_POLICY-usage"></a>

DETACH RLS POLICY 문과 관련한 작업을 수행할 때는 다음을 준수하세요.
+ 관계, 사용자, 역할 또는 퍼블릭 객체에서 정책을 분리할 수 있습니다.

## 예제
<a name="r_DETACH_RLS_POLICY-examples"></a>

다음 예에서는 테이블에 대한 정책을 역할에서 분리합니다.

```
DETACH RLS POLICY policy_concerts ON tickit_category_redshift FROM ROLE analyst, ROLE dbadmin;
```

# DROP DATABASE
<a name="r_DROP_DATABASE"></a>

데이터베이스를 삭제합니다.

트랜잭션 블록(BEGIN ... END) 내에서는 DROP DATABASE를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

## 구문
<a name="r_DROP_DATABASE-synopsis"></a>

```
DROP DATABASE database_name [ FORCE ]
```

## 파라미터
<a name="r_DROP_DATABASE-parameters"></a>

 *database\$1name*   
삭제될 데이터베이스의 이름입니다. dev, padb\$1harvest, template0, template1 또는 sys:internal 데이터베이스를 삭제할 수 없고, 현재 데이터베이스도 삭제할 수 없습니다.  
외부 데이터베이스를 삭제하려면 외부 스키마를 삭제합니다. 자세한 내용은 [DROP SCHEMA](r_DROP_SCHEMA.md) 섹션을 참조하세요.

 FORCE   
FORCE를 지정하면 DROP DATABASE는 데이터베이스를 삭제하기 전에 활성 연결을 종료하려고 시도합니다. 제한 시간 내에 모든 활성 연결이 성공적으로 종료되면 삭제가 진행됩니다. 모든 연결이 종료되지 않으면 명령에서 오류가 발생합니다.

## DROP DATABASE 사용 참고 사항
<a name="r_DROP_DATABASE_usage"></a>

DROP DATABASE 문을 사용할 때 다음 사항을 고려하세요.
+ 일반적으로 DROP DATABASE 문을 사용하여 AWS Data Exchange datashare가 포함된 데이터베이스를 삭제하지 않는 것이 좋습니다. 그렇게 하면 datashare에 대한 액세스 권한이 있는 AWS 계정가 액세스 권한을 상실합니다. 이러한 유형의 변경을 수행하면 AWS Data Exchange의 데이터 제품 조건을 위반할 수 있습니다.

  다음 예에서는 AWS Data Exchange datashare가 포함된 데이터베이스가 삭제될 경우 오류를 보여줍니다.

  ```
  DROP DATABASE test_db;
  ERROR:   Drop of database test_db that contains ADX-managed datashare(s) requires session variable datashare_break_glass_session_var to be set to value 'ce8d280c10ad41'
  ```

  데이터베이스 삭제를 허용하려면 다음 변수를 설정하고 DROP DATABASE 문을 다시 실행합니다.

  ```
  SET datashare_break_glass_session_var to 'ce8d280c10ad41';
  ```

  ```
  DROP DATABASE test_db;
  ```

  이 경우 Amazon Redshift는 임의의 일회성 값을 생성하여 AWS Data Exchange datashare가 포함된 데이터베이스에 대해 DROP DATABASE를 허용하도록 세션 변수를 설정합니다.

## 예제
<a name="r_DROP_DATABASE-examples"></a>

다음 예에서는 TICKIT\$1TEST라는 데이터베이스를 삭제합니다.

```
drop database tickit_test;
```

# DROP DATASHARE
<a name="r_DROP_DATASHARE"></a>

datashare를 삭제합니다. 이 명령은 되돌릴 수 없습니다.

슈퍼 사용자 또는 datashare 소유자만 datashare를 삭제할 수 있습니다.

## 필수 권한
<a name="r_DROP_DATASHARE-privileges"></a>

DROP DATASHARE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP DATASHARE 권한이 있는 사용자
+ Datashare 소유자

## 구문
<a name="r_DROP_DATASHARE-synopsis"></a>

```
DROP DATASHARE datashare_name;
```

## 파라미터
<a name="r_DROP_DATASHARE-parameters"></a>

 *datashare\$1name*   
삭제될 datashare의 이름입니다.

## DROP DATASHARE 사용 참고 사항
<a name="r_DROP_DATASHARE_usage"></a>

DROP DATASHARE 문을 사용할 때 다음 사항을 고려하세요.
+ 일반적으로 DROP DATASHARE 문을 사용하여 AWS Data Exchange datashare를 삭제하지 않는 것이 좋습니다. 그렇게 하면 datashare에 대한 액세스 권한이 있는 AWS 계정가 액세스 권한을 상실합니다. 이러한 유형의 변경을 수행하면 AWS Data Exchange의 데이터 제품 조건을 위반할 수 있습니다.

  다음 예에서는 AWS Data Exchange datashare가 삭제될 경우 오류를 보여줍니다.

  ```
  DROP DATASHARE salesshare;
  ERROR:  Drop of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value '620c871f890c49'
  ```

  AWS Data Exchange datashare 삭제를 허용하려면 다음 변수를 설정하고 DROP DATASHARE 문을 다시 실행합니다.

  ```
  SET datashare_break_glass_session_var to '620c871f890c49';
  ```

  ```
  DROP DATASHARE salesshare;
  ```

  이 경우 Amazon Redshift는 임의의 일회성 값을 생성하여 AWS Data Exchange datashare에 대해 DROP DATASHARE를 허용하도록 세션 변수를 설정합니다.

## 예제
<a name="r_DROP_DATASHARE-examples"></a>

다음 예에서는 `salesshare`라는 datashare를 삭제합니다.

```
DROP DATASHARE salesshare;
```

# DROP EXTERNAL VIEW
<a name="r_DROP_EXTERNAL_VIEW"></a>

데이터베이스에서 외부 뷰를 삭제합니다. 외부 뷰를 삭제하면 뷰와 연결된 모든 SQL 엔진(예: Amazon Athena 및 Amazon EMR Spark)에서 해당 뷰가 제거됩니다. 이 명령은 되돌릴 수 없습니다. Data Catalog 뷰에 대한 자세한 내용은 [AWS Glue Data Catalog 뷰](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)를 참조하세요.

## 구문
<a name="r_DROP_EXTERNAL_VIEW-synopsis"></a>

```
DROP EXTERNAL VIEW schema_name.view_name [ IF EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
```

## 파라미터
<a name="r_DROP_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
AWS Glue 데이터베이스에 연결된 스키마이며, 뷰 이름이 뒤따릅니다.

IF EXISTS  
뷰가 있는 경우에만 뷰를 삭제합니다.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
뷰를 삭제할 때 사용하는 스키마의 표기법입니다. 직접 만든 Glue 데이터베이스인 AWS Glue Data Catalog 또는 직접 만든 외부 스키마를 사용하도록 지정할 수 있습니다. 자세한 내용은 [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 및 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)를 참조하세요.

 *query\$1definition*   
뷰를 변경하기 위해 Amazon Redshift가 실행하는 SQL 쿼리의 정의입니다.

## 예제
<a name="r_DROP_EXTERNAL_VIEW-examples"></a>

다음 예시에서는 sample\$1schema.glue\$1data\$1catalog\$1view라는 데이터 카탈로그 뷰를 삭제합니다.

```
DROP EXTERNAL VIEW sample_schema.glue_data_catalog_view IF EXISTS
```

# DROP FUNCTION
<a name="r_DROP_FUNCTION"></a>

데이터베이스에서 UDF(사용자 정의 함수)를 제거합니다. 이름은 같지만 서명은 다른 함수가 여러 개 존재할 수 있으므로 함수의 서명 또는 인수 데이터 형식의 목록을 지정해야 합니다. Amazon Redshift 내장 함수를 삭제할 수 없습니다.

이 명령은 되돌릴 수 없습니다.

## 필수 권한
<a name="r_DROP_FUNCTION-privileges"></a>

DROP FUNCTION에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP FUNCTION 권한이 있는 사용자
+ 함수 소유자

## 구문
<a name="r_DROP_FUNCTION-synopsis"></a>

```
DROP FUNCTION name
( [arg_name] arg_type   [, ...] )
[ CASCADE | RESTRICT ]
```

## 파라미터
<a name="r_DROP_FUNCTION-parameters"></a>

 *이름*   
제거할 기능의 이름입니다.

 *arg\$1name*   
입력 인수의 이름입니다. 함수의 자격 증명을 확인하는 데는 인수 데이터 형식만 있으면 되므로 DROP FUNCTION은 인수 이름을 무시합니다.

 *arg\$1type*   
입력 인수의 데이터 형식입니다. 최대 32가지 데이터 형식을 가진, 쉼표로 구분된 목록을 제공할 수 있습니다.

 CASCADE   
보기 같은 함수에 의존하는 객체를 자동으로 삭제하도록 지정하는 키워드입니다.  
함수에 종속되지 않는 보기를 새로 만들려면 보기 정의에 WITH NO SCHEMA BINDING 절을 포함시키세요. 자세한 내용은 [CREATE VIEW](r_CREATE_VIEW.md) 섹션을 참조하세요.

 RESTRICT   
객체가 해당 함수에 의존하는 경우 함수를 삭제하지 않고 메시지를 반환하도록 지정하는 키워드입니다. 이 동작이 기본값입니다.

## 예제
<a name="r_DROP_FUNCTION-examples"></a>

다음 예에서는 `f_sqrt`라는 함수를 삭제합니다.

```
drop function f_sqrt(int);
```

종속 항목이 있는 함수를 제거하려면 다음 예와 같이 CASCADE 옵션을 사용하세요.

```
drop function f_sqrt(int)cascade;
```

# DROP GROUP
<a name="r_DROP_GROUP"></a>

사용자 그룹을 삭제합니다. 이 명령은 되돌릴 수 없습니다. 이 명령은 그룹에 있는 개별 사용자를 삭제하지 않습니다.

개별 사용자를 삭제하려면 DROP USER 섹션을 참조하세요.

## 구문
<a name="r_DROP_GROUP-synopsis"></a>

```
DROP GROUP name
```

## 파라미터
<a name="r_DROP_GROUP-parameter"></a>

 * 이름*   
삭제할 사용자 그룹의 이름입니다.

## 예제
<a name="r_DROP_GROUP-example"></a>

다음 예에서는 `guests` 사용자 그룹을 삭제합니다.

```
DROP GROUP guests;
```

객체에 대해 어떤 권한을 가지고 있는 그룹은 삭제할 수 없습니다. 그런 그룹을 삭제하려고 하면 다음 오류를 수신하게 됩니다.

```
ERROR: group "guests" can't be dropped because the group has a privilege on some object
```

그룹이 객체에 대한 권한을 갖고 있을 경우 권한을 취소한 후 그룹을 삭제합니다. `guests` 그룹에 대한 권한을 가진 객체를 찾으려면 다음 예제를 사용합니다. 예제에 사용된 메타데이터 뷰에 대한 자세한 내용은 [SVV\$1RELATION\$1PRIVILEGES](https://docs.aws.amazon.com//redshift/latest/dg/r_SVV_RELATION_PRIVILEGES.html)를 참조하세요.

```
SELECT DISTINCT namespace_name, relation_name, identity_name, identity_type 
FROM svv_relation_privileges
WHERE identity_type='group' AND identity_name='guests';

+----------------+---------------+---------------+---------------+
| namespace_name | relation_name | identity_name | identity_type |
+----------------+---------------+---------------+---------------+
| public         | table1        | guests        | group         |
+----------------+---------------+---------------+---------------+
| public         | table2        | guests        | group         |
+----------------+---------------+---------------+---------------+
```

다음 예에서는 `public` 사용자 그룹에서 `guests` 스키마에 있는 모든 테이블에 대한 모든 권한을 취소한 후 그룹을 삭제합니다.

```
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM GROUP guests;
DROP GROUP guests;
```

# DROP IDENTITY PROVIDER
<a name="r_DROP_IDENTITY_PROVIDER"></a>

자격 증명 공급자를 삭제합니다. 이 명령은 되돌릴 수 없습니다. 슈퍼 사용자만 자격 증명 공급자를 삭제할 수 있습니다.

## 구문
<a name="r_DROP_IDENTITY_PROVIDER-synopsis"></a>

```
DROP IDENTITY PROVIDER identity_provider_name [ CASCADE ]
```

## 파라미터
<a name="r_DROP_IDENTITY_PROVIDER-parameter"></a>

 *identity\$1provider\$1name*   
삭제할 자격 증명 공급자의 이름입니다.

 CASCADE   
자격 증명 공급자를 삭제할 때 해당 자격 증명 공급자에 연결된 사용자 및 역할을 삭제합니다.

## 예제
<a name="r_DROP_IDENTITY_PROVIDER-example"></a>

다음 예에서는 *oauth\$1provider* 자격 증명 공급자를 삭제합니다.

```
DROP IDENTITY PROVIDER oauth_provider;
```

자격 증명 공급자를 삭제하면 일부 사용자가 로그인하지 못하거나 자격 증명 공급자를 사용하도록 구성된 클라이언트 도구를 사용할 수 없습니다.

# DROP LIBRARY
<a name="r_DROP_LIBRARY"></a>

데이터베이스에서 사용자 지정 Python 라이브러리를 제거합니다. 라이브러리 소유자 또는 수퍼유저만이 라이브러리를 삭제할 수 있습니다.

DROP LIBRARY를 트랜잭션 블록(BEGIN … END) 내에서 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

이 명령은 되돌릴 수 없습니다. DROP LIBRARY 명령은 즉시 커밋합니다. 라이브러리에 종속된 UDF가 동시에 실행 중인 경우 UDF는 트랜잭션 내에서 실행 중이더라도 실패할 수 있습니다.

자세한 내용은 [CREATE LIBRARY](r_CREATE_LIBRARY.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_DROP_LIBRARY-privileges"></a>

DROPLIBRARY에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP LIBRARY 권한이 있는 사용자
+ 라이브러리 소유자

## 구문
<a name="r_DROP_LIBRARY-synopsis"></a>

```
DROP LIBRARY library_name
```

## 파라미터
<a name="r_DROP_LIBRARY-parameters"></a>

 *library\$1name*   
라이브러리의 이름입니다.

# 마스킹 정책 삭제
<a name="r_DROP_MASKING_POLICY"></a>

모든 데이터베이스에서 동적 데이터 마스킹 정책을 삭제합니다. 아직 하나 이상의 테이블에 연결된 마스킹 정책을 삭제할 수 없습니다. 동적 데이터 마스킹에 대한 자세한 내용은 [동적 데이터 마스킹](t_ddm.md)(동적 데이터 마스킹(미리 보기)을 참조하세요.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 마스킹 정책을 삭제할 수 있습니다.

## 구문
<a name="r_DROP_MASKING_POLICY-synopsis"></a>

```
DROP MASKING POLICY { policy_name | database_name.policy_name };
```

## 파라미터
<a name="r_DROP_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
삭제될 마스킹 정책의 이름입니다.

database\$1name  
정책이 삭제될 데이터베이스의 이름입니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 DROP MASKING POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

# DROP MODEL
<a name="r_DROP_MODEL"></a>

데이터베이스에서 모델을 제거합니다. 모델 소유자나 슈퍼 사용자만 모델을 삭제할 수 있습니다.

DROP MODEL은 또한 이 모델에서 파생된 모든 연결된 예측 함수, 모델과 관련된 모든 Amazon Redshift 아티팩트 및 모델과 관련된 모든 Amazon S3 데이터를 삭제합니다. 모델이 Amazon SageMaker AI에서 계속 훈련되는 동안 DROP MODEL은 이러한 작업을 취소합니다.

이 명령은 되돌릴 수 없습니다. DROP MODEL 명령은 즉시 커밋됩니다.

## 필수 권한
<a name="r_DROP_MODEL-privileges"></a>

DROP MODEL에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP MODEL 권한이 있는 사용자
+ 모델 소유자
+ 스키마 소유자

## 구문
<a name="r_DROP_MODEL-synopsis"></a>

```
DROP MODEL [ IF EXISTS ] model_name
```

## 파라미터
<a name="r_DROP_MODEL-parameters"></a>

 *IF EXISTS*   
지정된 스키마가 이미 존재하는 경우 명령이 아무 것도 변경하지 않고 스키마가 존재한다는 메시지를 반환함을 나타내는 절입니다.

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

## 예제
<a name="r_DROP_MODEL-examples"></a>

다음 예에서는 demo\$1ml.customer\$1churn 모델을 삭제합니다.

```
DROP MODEL demo_ml.customer_churn
```

# DROP MATERIALIZED VIEW
<a name="materialized-view-drop-sql-command"></a>

구체화된 보기를 제거합니다.

구체화된 뷰에 대한 자세한 내용은 [Amazon Redshift의 구체화된 뷰](materialized-view-overview.md) 섹션을 참조하세요.

## 구문
<a name="mv_DROP_MATERIALIZED_VIEW-synopsis"></a>

```
DROP MATERIALIZED VIEW [ IF EXISTS ] mv_name [, ... ] [ CASCADE | RESTRICT ]
```

## 파라미터
<a name="mv_DROP_MATERIALIZED_VIEW-parameters"></a>

IF EXISTS  
명명된 구체화된 보기가 있는지 확인하기 위해 지정하는 절입니다. 구체화된 보기가 없으면 `DROP MATERIALIZED VIEW` 명령이 오류 메시지를 반환합니다. 이 절은 존재하지 않는 구체화된 보기를 삭제해도 스크립트가 실패하지 않도록 스크립팅할 때 유용합니다.

*mv\$1name*  
삭제할 구체화된 보기의 이름입니다.

CASCADE  
다른 뷰와 같이, 구체화된 뷰가 종속되는 객체를 자동으로 삭제함을 나타내는 절입니다.

RESTRICT  
종속된 객체가 있는 경우 구체화된 뷰를 삭제하지 않음을 나타내는 절입니다. 이 값이 기본값입니다.

## 사용 관련 참고 사항
<a name="mv_DROP_MATERIALIZED_VIEW-usage"></a>

구체화된 보기의 소유자만 해당 보기에서 `DROP MATERIALIZED VIEW`를 사용할 수 있습니다. 수퍼유저 또는 특별히 DROP 권한이 부여된 사용자는 예외일 수 있습니다.

구체화된 뷰에 대한 drop 문을 작성하고 일치하는 이름을 가진 뷰가 있는 경우 DROP VIEW를 사용하도록 지시하는 오류가 발생합니다. `DROP MATERIALIZED VIEW IF EXISTS`를 사용하는 경우에도 오류가 발생합니다.

## 예제
<a name="mv_DROP_MATERIALIZED_VIEW-examples"></a>

다음 예제는 `tickets_mv` 구체화된 보기를 삭제합니다.

```
DROP MATERIALIZED VIEW tickets_mv;
```

# DROP PROCEDURE
<a name="r_DROP_PROCEDURE"></a>

프로시저를 삭제합니다. 프로시저를 삭제하려면 프로시저 이름과 입력 인수 데이터 형식(서명)이 모두 필요합니다. OUT 인수를 포함하여 전체 인수 데이터 형식을 포함시킬 수도 있습니다. 프로시저의 서명을 찾으려면 [SHOW PROCEDURE](r_SHOW_PROCEDURE.md) 명령을 사용합니다. 프로시저 서명에 대한 자세한 내용은 [PG\$1PROC\$1INFO](r_PG_PROC_INFO.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_DROP_PROCEDURE-privileges"></a>

DROP PROCEDURE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP PROCEDURE 권한이 있는 사용자
+ 프로시저 소유자

## 구문
<a name="r_DROP_PROCEDURE-synopsis"></a>

```
DROP PROCEDURE sp_name ( [ [ argname ] [ argmode ] argtype [, ...] ] )
```

## 파라미터
<a name="r_DROP_PROCEDURE-parameters"></a>

 *sp\$1name*   
제거할 프로시저의 이름입니다.

 *argname*   
입력 인수의 이름입니다. 프로시저의 자격 증명을 확인하는 데는 인수 데이터 형식만 있으면 되므로 DROP PROCEDURE는 인수 이름을 무시합니다.

 *argmode*   
인수 모드입니다. IN, OUT 또는 INOUT일 수 있습니다. OUT 인수는 저장 프로시저를 식별하는 데 사용되지 않으므로 선택 사항입니다.

 *argtype*   
입력 인수의 데이터 형식입니다. 지원되는 데이터 형식의 전체 목록은 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요.

## 예제
<a name="r_DROP_PROCEDURE-examples"></a>

다음 예제에서는 `quarterly_revenue`라는 저장 프로시저를 삭제합니다.

```
DROP PROCEDURE quarterly_revenue(volume INOUT bigint, at_price IN numeric,result OUT int);
```

# DROP RLS POLICY
<a name="r_DROP_RLS_POLICY"></a>

모든 데이터베이스의 전체 테이블에 대한 행 수준 보안 정책을 삭제합니다.

sys:secadmin 역할이 부여된 수퍼유저와 사용자 또는 역할은 정책을 삭제할 수 있습니다.

## 구문
<a name="r_DROP_RLS_POLICY-synopsis"></a>

```
DROP RLS POLICY [ IF EXISTS ] 
{ policy_name | database_name.policy_name }
[ CASCADE | RESTRICT ]
```

## 파라미터
<a name="r_DROP_RLS_POLICY-parameters"></a>

 *IF EXISTS*   
지정된 정책이 이미 존재하는지 여부를 나타내는 절입니다.

 *policy\$1name*   
정책의 이름입니다.

database\$1name  
정책이 삭제될 데이터베이스의 이름입니다. 데이터베이스는 연결된 데이터베이스이거나 Amazon Redshift 페더레이션 권한을 지원하는 데이터베이스일 수 있습니다.

 *CASCADE*   
정책을 삭제하기 전에 연결된 모든 테이블에서 정책을 자동으로 분리하도록 지정하는 절입니다.

 *RESTRICT*   
정책이 일부 테이블에 연결되어 있는 경우 정책을 삭제하지 않도록 지정하는 절입니다. 이 값이 기본값입니다.

Amazon Redshift 페더레이션 권한 카탈로그에서 DROP RLS POLICY를 사용하려면 [Amazon Redshift 페더레이션 권한을 사용하여 액세스 제어 관리](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)를 참조하세요.

## 예제
<a name="r_DROP_RLS_POLICY-examples"></a>

다음 예에서는 행 수준 보안 정책을 삭제합니다.

```
DROP RLS POLICY policy_concerts;
```

# DROP ROLE
<a name="r_DROP_ROLE"></a>

데이터베이스에서 역할을 제거합니다. 역할을 만든 역할 소유자, WITH ADMIN 옵션이 있는 사용자 또는 슈퍼 사용자만 역할을 삭제할 수 있습니다.

사용자에게 부여된 역할 또는 이 역할에 종속된 다른 역할은 삭제할 수 없습니다.

## 필수 권한
<a name="r_DROP_ROLE-privileges"></a>

DROP ROLE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ 역할을 만들었거나 WITH ADMIN OPTION 권한이 있는 역할이 부여된 사용자인 역할 소유자.

## 구문
<a name="r_DROP_ROLE-synopsis"></a>

```
DROP ROLE role_name [ FORCE | RESTRICT ] 
```

## 파라미터
<a name="r_DROP_ROLE-parameters"></a>

*role\$1name*  
역할의 이름.

[ FORCE \$1 RESTRICT ]  
기본 설정은 RESTRICT입니다. 다른 역할을 상속한 역할을 삭제하려고 하면 Amazon Redshift에서 오류가 발생합니다. 역할 할당이 있는 경우 FORCE를 사용하여 모든 역할 할당을 제거합니다.

## 예제
<a name="r_DROP_ROLE-examples"></a>

다음 예에서는 `sample_role` 역할을 제거합니다.

```
DROP ROLE sample_role FORCE;
```

다음 예에서는 기본 RESTRICT 옵션을 사용하여 사용자에게 부여된 sample\$1role1 역할을 삭제하려고 시도합니다.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
DROP ROLE sample_role1;
ERROR:  cannot drop this role since it has been granted on a user
```

사용자에게 부여된 sample\$1role1을 성공적으로 삭제하려면 FORCE 옵션을 사용합니다.

```
DROP ROLE sample_role1 FORCE;
```

다음 예에서는 기본 RESTRICT 옵션을 사용하여 종속된 다른 역할이 있는 sample\$1role1 역할을 삭제하려고 시도합니다.

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO sample_role2;
DROP ROLE sample_role2;
ERROR:  cannot drop this role since it depends on another role
```

종속된 다른 역할이 있는 sample\$1role2를 성공적으로 삭제하려면 FORCE 옵션을 사용합니다.

```
DROP ROLE sample_role2 FORCE;
```

# DROP SCHEMA
<a name="r_DROP_SCHEMA"></a>

스키마를 삭제합니다. 외부 스키마의 경우 스키마와 연관된 외부 데이터베이스도 삭제할 수 있습니다. 이 명령은 되돌릴 수 없습니다.

## 필수 권한
<a name="r_DROP_SCHEMA-privileges"></a>

DROP SCHEMA에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ 스키마 소유자
+ DROP SCHEMA 권한이 있는 사용자

## 구문
<a name="r_DROP_SCHEMA-synopsis"></a>

```
DROP SCHEMA [ IF EXISTS ] name [, ...]
[ DROP EXTERNAL DATABASE ]
[ CASCADE | RESTRICT ]
```

## 파라미터
<a name="r_DROP_SCHEMA-parameters"></a>

IF EXISTS  
지정된 스키마가 존재하지 않는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 스키마가 존재하지 않는다는 메시지를 반환함을 나타내는 절입니다.  
이 절은 스크립트 작성 시 유용하므로, DROP SCHEMA가 존재하지 않는 스키마에 대해 실행되는 경우에는 스크립트가 실패하지 않습니다.

 * 이름*   
삭제할 스키마의 이름입니다. 여러 스키마 이름을 쉼표로 구분하여 지정할 수 있습니다.

 DROP EXTERNAL DATABASE   
외부 스키마가 삭제되면 해당 외부 스키마와 연관된 외부 데이터베이스(있는 경우)를 삭제함을 나타내는 절입니다. 외부 데이터베이스가 없는 경우 이 명령은 외부 데이터베이스가 없다는 메시지를 반환합니다. 외부 스키마를 여러 개 삭제하면 지정된 스키마와 연관된 데이터베이스가 모두 삭제됩니다.  
외부 데이터베이스에 테이블과 같은 종속 객체가 포함되어 있는 경우 종속 객체도 함께 삭제하려면 CASCADE 옵션을 포함합니다.  
외부 데이터베이스를 삭제하는 경우 삭제하려는 데이터베이스와 연관된 기타 모든 외부 스키마에 대한 데이터베이스도 삭제됩니다. 해당 데이터베이스를 사용해 다른 외부 스키마에 정의된 테이블 역시 삭제됩니다.  
DROP EXTERNAL DATABASE는 HIVE 메타스토어에 저장된 외부 데이터베이스는 지원하지 않습니다.

CASCADE  
스키마에 있는 모든 객체를 자동으로 삭제함을 나타내는 키워드입니다. DROP EXTERNAL DATABASE가 지정되어 있으면 외부 데이터베이스의 모든 객체 역시 삭제됩니다.

RESTRICT  
객체를 포함하고 있는 스키마 또는 외부 데이터베이스는 삭제하지 않음을 나타내는 키워드입니다. 이 동작이 기본값입니다.

## 예제
<a name="r_DROP_SCHEMA-example"></a>

다음 예에서는 S\$1SALES로 명명된 스키마를 삭제합니다. 이 예에서는 객체를 포함하고 있는 스키마는 삭제되지 않도록 하는 안전 메커니즘으로서 RESTRICT를 사용합니다. 이 경우에는 스키마 객체를 삭제한 후에 스키마를 삭제해야 합니다.

```
drop schema s_sales restrict;
```

다음 예에서는 S\$1SALES로 명명된 스키마와 그 스키마에 종속되는 모든 객체를 삭제합니다.

```
drop schema s_sales cascade;
```

다음 예에서는 S\$1SALES 스키마가 존재하는 경우에는 이를 삭제하고 존재하지 않는 경우에는 아무 작업도 수행하지 않고 메시지를 반환합니다.

```
drop schema if exists s_sales;
```

다음 예에서는 외부 스키마 S\$1SPECTRUM과 이 스키마와 연관된 외부 데이터베이스를 삭제합니다. 이 예에서는 RESTRICT 사용합니다. 따라서 객체가 포함되어 있으면 스키마와 데이터베이스가 삭제되지 않습니다. 이 경우에는 스키마 및 데이터베이스를 삭제하기 전에 종속 객체를 삭제해야 합니다.

```
drop schema s_spectrum drop external database restrict;
```

다음 예에서는 종속 객체와 함께 여러 스키마와 이러한 스키마와 연관된 외부 데이터를 삭제합니다.

```
drop schema s_sales, s_profit, s_revenue drop external database cascade;
```

# DROP TABLE
<a name="r_DROP_TABLE"></a>

데이터베이스에서 테이블을 제거합니다.

테이블을 제거하지 않고 여러 행으로 구성된 테이블을 비우려면 DELETE 또는 TRUNCATE 명령을 사용하세요.

DROP TABLE은 대상 테이블에 존재하는 제약 조건을 제거합니다. 단 한 번의 DROP TABLE 명령으로 여러 테이블을 제거할 수 있습니다.

트랜잭션(BEGIN … END) 내에서 외부 테이블을 포함한 DROP TABLE을 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

그룹에 DROP 권한이 부여된 예를 보려면 GRANT [예제](r_GRANT-examples.md)를 참조하세요.

## 필수 권한
<a name="r_DROP_TABLE-privileges"></a>

DROP TABLE에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP TABLE 권한이 있는 사용자
+ 스키마에 대한 USAGE 권한이 있는 테이블 소유자

## 구문
<a name="r_DROP_TABLE-synopsis"></a>

```
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```

## 파라미터
<a name="r_DROP_TABLE-parameters"></a>

IF EXISTS  
지정된 테이블이 존재하지 않는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 테이블이 존재하지 않는다는 메시지를 반환함을 나타내는 절입니다.  
이 절은 스크립트 작성 시 유용하므로, DROP TABLE이 존재하지 않는 테이블에 대해 실행되는 경우에는 스크립트가 실패하지 않습니다.

 * 이름*   
삭제할 테이블의 이름입니다.

CASCADE  
뷰와 같이, 테이블에 종속되는 객체를 자동으로 삭제함을 나타내는 절입니다.  
보기, 테이블 같은 다른 데이터베이스 객체에 종속되지 않는 보기를 새로 만들려면 보기 정의에 WITH NO SCHEMA BINDING 절을 포함시키세요. 자세한 내용은 [CREATE VIEW](r_CREATE_VIEW.md) 섹션을 참조하세요.

RESTRICT   
테이블에 종속된 객체가 있는 경우 테이블을 삭제하지 않음을 나타내는 절입니다. 이 동작이 기본값입니다.

## 예제
<a name="r_DROP_TABLE-examples"></a>

 **종속 항목이 없는 테이블 삭제** 

다음 예에서는 종속 항목이 없는, FEEDBACK이라는 테이블을 생성하고 삭제합니다.

```
create table feedback(a int);

drop table feedback;
```

 테이블의 열을 뷰 또는 다른 테이블에서 참조할 경우 Amazon Redshift는 다음과 같은 메시지를 표시합니다.

```
Invalid operation: cannot drop table feedback because other objects depend on it
```

 **두 테이블 동시 삭제** 

다음 명령 집합은 FEEDBACK 테이블과 BUYERS 테이블을 생성한 다음, 단일 명령으로 두 테이블을 모두 삭제합니다.

```
create table feedback(a int);

create table buyers(a int);

drop table feedback, buyers;
```

 **종속 항목이 있는 테이블 삭제** 

다음 절차에서는 CASCADE 스위치를 사용하여 FEEDBACK이라는 테이블을 삭제하는 방법을 보여줍니다.

먼저 CREATE TABLE 명령을 사용하여 FEEDBACK이라는 간단한 테이블을 만듭니다.

```
create table feedback(a int);
```

 다음으로, CREATE VIEW 명령을 사용하여 테이블 FEEDBACK에 종속된 FEEDBACK\$1VIEW라는 뷰를 만듭니다.

```
create view feedback_view as select * from feedback;
```

 다음 예에서는 테이블 FEEDBACK을 삭제하고 뷰 FEEDBACK\$1VIEW도 삭제합니다. FEEDBACK\$1VIEW가 테이블 FEEDBACK에 종속되기 때문입니다.

```
drop table feedback cascade;
```

 **테이블에 대한 종속 항목 보기** 

테이블에 대한 종속성을 반환하려면 다음 예시를 사용하세요. *my\$1schema* 및 *my\$1table*을 실제 스키마와 테이블로 바꾸세요.

```
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;
```

*my\$1table*과 종속성을 삭제하려면 다음 예시를 사용하세요. 이 예시는 삭제된 테이블에 대한 모든 종속성도 반환합니다.

```
DROP TABLE my_table CASCADE;
         
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;

+------------------+----------------+---------------+--------------+-------------+
| dependent_schema | dependent_view | source_schema | source_table | column_name |
+------------------+----------------+---------------+--------------+-------------+
```

 **IF EXISTS를 사용하여 테이블 삭제** 

다음 예에서는 FEEDBACK 테이블이 존재하는 경우에는 이를 삭제하고 존재하지 않는 경우에는 아무 작업도 수행하지 않고 메시지를 반환합니다.

```
drop table if exists feedback;
```

# DROP TEMPLATE
<a name="r_DROP_TEMPLATE"></a>

데이터베이스에서 템플릿을 삭제합니다.

## 필수 권한
<a name="r_DROP_TEMPLATE-privileges"></a>

템플릿을 삭제하려면 다음 중 하나가 있어야 합니다.
+ 수퍼유저 권한
+ 템플릿이 포함된 스키마에 대한 DROP TEMPLATE 권한 및 USAGE 권한

## 구문
<a name="r_DROP_TEMPLATE-synopsis"></a>

```
DROP TEMPLATE [database_name.][schema_name.]template_name;
```

## 파라미터
<a name="r_DROP_TEMPLATE-parameters"></a>

 *database\$1name*   
(선택 사항) 템플릿이 생성되는 데이터베이스의 이름입니다. 지정하지 않으면 현재 데이터베이스가 사용됩니다.

 *schema\$1name*   
(선택 사항) 템플릿이 생성되는 스키마의 이름입니다. 지정하지 않으면 현재 검색 경로에서 템플릿이 검색됩니다.

 *template\$1name*   
제거할 템플릿의 이름입니다. 다음 예에서는 데이터베이스 이름이 `demo_database`이고, 스키마 이름은 `demo_schema`이며, 템플릿 이름은 `test`입니다.  

```
DROP TEMPLATE demo_database.demo_schema.test;
```

## 예제
<a name="r_DROP_TEMPLATE-examples"></a>

다음 예시에서는 현재 스키마에서 test\$1template 템플릿을 삭제합니다.

```
DROP TEMPLATE test_template;
```

다음 예시에서는 스키마 test\$1schema에서 템플릿 test\$1template을 삭제합니다.

```
DROP TEMPLATE test_schema.test_template;
```

# DROP USER
<a name="r_DROP_USER"></a>

데이터베이스에서 사용자를 삭제합니다. 단 한 번의 DROP USER 명령으로 여러 사용자를 삭제할 수 있습니다. 이 명령을 실행하려면 데이터베이스 수퍼유저이거나 DROP USER 권한이 있어야 합니다.

## 구문
<a name="r_DROP_USER-synopsis"></a>

```
DROP USER [ IF EXISTS ] name [, ... ]
```

## 파라미터
<a name="r_DROP_USER-parameters"></a>

IF EXISTS  
지정된 사용자가 존재하지 않는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 사용자가 존재하지 않는다는 메시지를 반환함을 나타내는 절입니다.  
이 절은 스크립트 작성 시 유용하므로, DROP USER가 존재하지 않는 사용자에 대해 실행되는 경우에는 스크립트가 실패하지 않습니다.

 * 이름*   
제거할 사용자의 이름입니다. 제거할 각 사용자의 이름을 다음으로 제거할 이름과 구분하는 쉼표를 사용하여 여러 사용자를 지정할 수 있습니다.

## 사용 노트
<a name="r_DROP_USER-notes"></a>

일반적으로 이름이 `rdsdb`인 사용자 또는 보통 이름이 `awsuser` 또는 `admin`인 데이터베이스의 관리자 사용자는 삭제할 수 없습니다.

스키마, 데이터베이스, 테이블 또는 뷰와 같은 데이터베이스 객체를 소유하거나 데이터베이스, 테이블, 열 또는 그룹에 대한 권한이 있는 사용자는 삭제할 수 없습니다. 그런 사용자를 삭제하려고 하면 다음 오류 중 하나를 수신합니다.

```
ERROR: user "username" can't be dropped because the user owns some object [SQL State=55006]

ERROR: user "username" can't be dropped because the user has a privilege on some object [SQL State=55006]
```

데이터베이스 사용자가 소유한 객체를 찾는 방법에 대한 자세한 지침은 **지식 센터에서 [Amazon Redshift에서 '사용자를 삭제할 수 없습니다' 오류를 해결하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/redshift-user-cannot-be-dropped)를 참조하세요.

**참고**  
Amazon Redshift는 현재 데이터베이스만 확인한 후 사용자를 삭제합니다. 사용자가 데이터베이스 객체를 소유하고 있거나 다른 데이터베이스에 있는 객체에 대해 어떤 권한이든 있으면 DROP USER가 오류를 반환하지 않습니다. 다른 데이터베이스에 있는 객체를 소유한 사용자를 삭제하면 해당 객체의 소유자가 'unknown'으로 변경됩니다.

사용자가 객체를 소유한 경우에는 먼저 객체를 삭제하거나 그 소유권을 다른 사용자로 변경한 후 원래 사용자를 삭제합니다. 사용자가 객체에 대한 권한을 가지고 있을 경우 먼저 권한을 취소한 후 사용자를 삭제하세요. 다음 예에서는 객체 삭제, 소유권 변경 및 권한 취소 후 사용자 삭제를 보여줍니다.

```
drop database dwdatabase;
alter schema dw owner to dwadmin;
revoke all on table dwtable from dwuser;
drop user dwuser;
```

## 예제
<a name="r_DROP_USER-examples"></a>

다음 예에서는 paulo라는 사용자를 삭제합니다.

```
drop user paulo;
```

다음 예시에서는 paulo와 martha라는 두 명의 사용자를 삭제합니다.

```
drop user paulo, martha;
```

다음 예에서는 사용자 paulo가 존재하는 경우에는 이를 삭제하고 존재하지 않는 경우에는 아무 작업도 수행하지 않고 메시지를 반환합니다.

```
drop user if exists paulo;
```

# DROP VIEW
<a name="r_DROP_VIEW"></a>

데이터베이스에서 뷰를 제거합니다. 단 한 번의 DROP VIEW 명령으로 여러 뷰를 삭제할 수 있습니다. 이 명령은 되돌릴 수 없습니다.

## 필수 권한
<a name="r_DROP_VIEW-privileges"></a>

DROP VIEW에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ DROP VIEW 권한이 있는 사용자
+ 보기 소유자

## 구문
<a name="r_DROP_VIEW-synopsis"></a>

```
DROP VIEW [ IF EXISTS ] name [, ... ] [ CASCADE | RESTRICT ] 
```

## 파라미터
<a name="r_DROP_VIEW-parameters"></a>

IF EXISTS  
지정된 뷰가 존재하지 않는 경우 오류 메시지와 함께 종료하는 대신, 명령이 아무 것도 변경하지 않고 뷰가 존재하지 않는다는 메시지를 반환함을 나타내는 절입니다.  
이 절은 스크립트 작성 시 유용하므로, DROP USER가 존재하지 않는 뷰에 대해 실행되는 경우에는 스크립트가 실패하지 않습니다.

 * 이름*   
제거할 뷰의 이름입니다.

CASCADE  
다른 뷰와 같이, 뷰에 종속되는 객체를 자동으로 삭제함을 나타내는 절입니다.  
보기, 테이블 같은 다른 데이터베이스 객체에 종속되지 않는 보기를 새로 만들려면 보기 정의에 WITH NO SCHEMA BINDING 절을 포함시키세요. 자세한 내용은 [CREATE VIEW](r_CREATE_VIEW.md) 섹션을 참조하세요.  
CASCADE를 포함하고 삭제된 데이터베이스 객체 수가 10개 이상인 경우 데이터베이스 클라이언트가 요약 결과에 삭제된 객체를 모두 나열하지 않을 수도 있습니다. 이는 일반적으로 SQL 클라이언트 도구에 반환되는 결과에 대한 기본 제한이 있기 때문입니다.

RESTRICT  
테이블에 종속된 객체가 있는 경우 뷰를 삭제하지 않음을 나타내는 절입니다. 이 동작이 기본값입니다.

## 예제
<a name="r_DROP_VIEW-examples"></a>

다음 예에서는 *event*라는 뷰를 삭제합니다.

```
drop view event;
```

종속 항목이 있는 뷰를 제거하려면 CASCADE 옵션을 사용하세요. 예를 들어, EVENT라는 테이블로 시작해봅시다. 다음 예에서 보듯이, CREATE VIEW 명령을 사용하여 EVENT 테이블의 eventview 뷰를 생성합니다.

```
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
```

이제 첫 번째 뷰 *eventview*를 기반으로 하는 *myeventview*라는 두 번째 뷰를 생성합니다.

```
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
```

*eventview* 및 *myeventview*의 두 가지 뷰가 생성되었습니다.

*myeventview* 뷰는 *eventview*를 상위 뷰로 둔 하위 뷰입니다.

*eventview* 뷰를 삭제하기 위해 사용할 명령은 분명히 다음과 같습니다.

```
drop view eventview;
```

참고로, 이 경우에 이 명령을 실행하면 다음과 같은 오류가 발생합니다.

```
drop view eventview;
ERROR: can't drop view eventview because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
```

이 문제를 해결하려면 오류 메시지의 제안에 따라 다음 명령을 실행합니다.

```
drop view eventview cascade;
```

*eventview* 및 *myeventview*가 모두 올바로 삭제되었습니다.

다음 예에서는 *eventview* 뷰가 존재하는 경우에는 이를 삭제하고 존재하지 않는 경우에는 아무 작업도 수행하지 않고 메시지를 반환합니다.

```
drop view if exists eventview;
```

# END
<a name="r_END"></a>

현재 트랜잭션을 커밋합니다. COMMIT 명령과 정확히 똑같은 기능을 수행합니다.

더 상세한 설명서는 [COMMIT](r_COMMIT.md) 설명서를 참조하세요.

## 구문
<a name="r_END-synopsis"></a>

```
END [ WORK | TRANSACTION ]
```

## 파라미터
<a name="r_END-parameters"></a>

Work  
선택적 키워드입니다.

TRANSACTION  
선택적 키워드: WORK와 TRANSACTION은 동의어입니다.

## 예제
<a name="r_END-examples"></a>

다음 예에서는 모두 트랜잭션 블록을 종료하고 트랜잭션을 커밋합니다.

```
end;
```

```
end work;
```

```
end transaction;
```

이런 명령 중 어느 명령이든 실행된 후 Amazon Redshift는 트랜잭션 블록을 종료하고 변경 내용을 커밋합니다.

# EXECUTE
<a name="r_EXECUTE"></a>

이전에 준비된 문을 실행합니다.

## 구문
<a name="r_EXECUTE-synopsis"></a>

```
EXECUTE plan_name [ (parameter [, ...]) ]
```

## 파라미터
<a name="r_EXECUTE-parameters"></a>

 *plan\$1name*   
실행할 준비된 문의 이름입니다.

 *파라미터*   
준비된 문에 대한 파라미터의 실제 값입니다. 이것은 준비된 문을 생성한 PREPARE 명령에서 이 명령 위치에 대해 지정된 데이터 형식과 호환 가능한 유형의 값을 산출하는 표현식이어야 합니다.

## 사용 노트
<a name="r_EXECUTE_usage_notes"></a>

EXECUTE는 이전에 준비된 문의 실행에 사용됩니다. 준비된 문은 세션 기간 동안에만 존재하므로 준비된 문은 현재 세션의 앞부분에서 실행된 PREPARE 문에 의해 생성되었음에 틀림없습니다.

이전 PREPARE 문에서 일부 파라미터를 지정한 경우 호환 가능한 파라미터 집합은 EXECUTE 문으로 전달되어야 합니다. 그렇지 않으면 Amazon Redshift가 오류를 반환합니다. 함수와는 달리, 준비된 문은 지정된 파라미터의 유형이나 수를 기준으로 오버로드되지 않습니다. 준비된 문의 이름은 데이터베이스 세션 내에서 고유해야 합니다.

준비된 문에 대해 EXECUTE 명령이 실행될 때 Amazon Redshift는 (지정된 파라미터 값을 기반으로 성능을 개선하기 위해) 쿼리 실행 계획을 선택적으로 수정한 후 준비된 문을 실행할 수 있습니다. 또한, 준비된 문을 새로 실행할 때마다 Amazon Redshift는 EXECUTE 문과 함께 지정된 다양한 파라미터 값을 기반으로 쿼리 실행 계획을 다시 수정할 수 있습니다. Amazon Redshift가 주어진 EXECUTE 문에 대해 선택한 쿼리 실행 계획을 검사하려면 [EXPLAIN](r_EXPLAIN.md) 명령을 사용합니다.

준비된 문의 생성 및 사용에 대한 자세한 내용과 예는 [PREPARE](r_PREPARE.md) 섹션을 참조하세요.

## 다음 사항도 참조하세요.
<a name="r_EXECUTE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [PREPARE](r_PREPARE.md) 

# EXPLAIN
<a name="r_EXPLAIN"></a>

쿼리를 실행하지 않고 쿼리 문에 대한 실행 계획을 표시합니다. 쿼리 분석 워크플로에 대한 자세한 내용은 [쿼리 분석 워크플로우](c-query-analysis-process.md) 섹션을 참조하세요.

## 구문
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

## 파라미터
<a name="r_EXPLAIN-parameters"></a>

상세 표시   
단순한 요약 대신 전체 쿼리 계획을 표시합니다.

 *query*()   
설명할 쿼리 문입니다. 쿼리는 SELECT, INSERT, CREATE TABLE AS, UPDATE 또는 DELETE 문일 수 있습니다.

## 사용 노트
<a name="r_EXPLAIN-usage-notes"></a>

EXPLAIN 성능은 때때로 임시 테이블 생성에 걸리는 시간의 영향을 받습니다. 예를 들어, 공통 하위 표현식 최적화를 사용하는 쿼리는 EXPLAIN 출력을 반환하기 위해 임시 테이블을 생성하고 분석해야 합니다. 쿼리 계획은 임시 테이블의 스키마와 통계에 따라 다릅니다. 따라서 이 유형의 쿼리에 대한 EXPLAIN 명령 실행 시간은 예상보다 길 수 있습니다.

다음 명령에만 EXPLAIN을 사용할 수 있습니다.
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

EXPLAIN 명령을 DDL(데이터 정의 언어) 또는 데이터베이스 작업 등의 다른 SQL 명령에 사용할 경우 실패하게 됩니다.

EXPLAIN 출력 상대 단위 비용은 Amazon Redshift에서 쿼리 계획을 선택하는 데 사용됩니다. Amazon Redshift는 다양한 리소스 추정치의 크기를 비교하여 계획을 결정합니다.

## 쿼리 계획 및 실행 단계
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

특정 Amazon Redshift 쿼리 문에 대한 실행 계획은 쿼리의 실행과 계산을 별개의 단계 순서와 테이블 작업으로 분리하며, 결국은 쿼리에 대한 최종 결과 집합을 생성하게 됩니다. 쿼리 계획에 대한 자세한 내용은 [쿼리 처리](c-query-processing.md) 섹션을 참조하세요.

다음 표에는 Amazon Redshift에서 사용자가 실행을 위해 제출하는 쿼리를 위한 실행 계획을 개발하는 데 사용할 수 있는 단계가 요약되어 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_EXPLAIN.html)

## RLS에 EXPLAIN 사용
<a name="r_EXPLAIN-RLS"></a>

쿼리에 행 수준 보안(RLS) 정책이 적용되는 테이블이 포함되어 있는 경우 EXPLAIN은 특별한 RLS SecureScan 노드를 표시합니다. 또한 Amazon Redshift는 STL\$1EXPLAIN 시스템 테이블에 동일한 노드 유형을 로깅합니다. EXPLAIN은 dim\$1tbl에 적용되는 RLS 조건자를 표시하지 않습니다. RLS SecureScan 노드 유형은 현재 사용자에게 보이지 않는 추가 작업이 실행 계획에 포함되어 있음을 나타내는 표시자로 사용됩니다.

다음 예는 RLS SecureScan 노드를 보여줍니다.

```
EXPLAIN
SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   ->  *XN* *RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)*
         Filter: ((k_dim / 10) > 0)
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

RLS가 적용되는 전체 쿼리 계획을 살펴볼 수 있도록, Amazon Redshift는 EXPLAIN RLS 시스템 권한을 제공합니다. 이 권한이 부여된 사용자는 RLS 조건자까지 포함한 전체 쿼리 계획을 살펴볼 수 있습니다.

다음 예는 RLS SecureScan 노드 아래의 추가 Seq Scan에 RLS 정책 조건자(k\$1dim > 1)도 포함되어 있음을 보여줍니다.

```
EXPLAIN SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   *->  XN RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)
         Filter: ((k_dim / 10) > 0)*
         ->  *XN* *Seq Scan on fact_tbl rls_table  (cost=0.00..0.06 rows=5 width=8)
               Filter: (k_dim > 1)*
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

사용자에게 EXPLAIN RLS 권한이 부여되지만, Amazon Redshift는 RLS 조건자를 포함한 전체 쿼리 계획을 STL\$1EXPLAIN 시스템 테이블에 로깅합니다. 이 권한이 부여되지 않은 상태에서 실행되는 쿼리는 RLS 내부 정보 없이 로깅됩니다. EXPLAIN RLS 권한을 부여하거나 제거해도 Amazon Redshift가 이전 쿼리와 관련하여 STL\$1EXPLANT에 로깅한 내용은 변경되지 않습니다.

### AWS Lake Formation-RLS 보호 Redshift 관계
<a name="r_EXPLAIN_RLS-LF"></a>

다음 예는 Lake Formation-RLS 관계를 보는 데 사용할 수 있는 LF SecureScan 노드를 보여줍니다.

```
EXPLAIN
SELECT *
FROM lf_db.public.t_share
WHERE a > 1;
QUERY PLAN
---------------------------------------------------------------
XN LF SecureScan t_share  (cost=0.00..0.02 rows=2 width=11)
(2 rows)
```

## 예제
<a name="r_EXPLAIN-examples"></a>

**참고**  
다음 예의 경우 샘플 출력은 Amazon Redshift 구성에 따라 다를 수 있습니다.

다음 예에서는 EVENT 및 VENUE 테이블에서 EVENTID, EVENTNAME, VENUEID 및 VENUENAME을 선택하는 쿼리를 위한 쿼리 계획을 반환합니다.

```
explain
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(5 rows)
```

다음 예에서는 상세한 출력을 포함한 동일한 쿼리를 위한 쿼리 계획을 반환합니다.

```
explain verbose
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
{HASHJOIN
:startup_cost 2.52
:total_cost 58653620.93
:plan_rows 8712
:plan_width 43
:best_pathkeys <>
:dist_info DS_DIST_OUTER
:dist_info.dist_keys (
TARGETENTRY
{
VAR
:varno 2
:varattno 1
...

XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(519 rows)
```

다음 예에서는 CREATE TABLE AS(CTAS) 문을 위한 쿼리 계획을 반환합니다.

```
explain create table venue_nonulls as
select * from venue
where venueseats is not null;

QUERY PLAN
-----------------------------------------------------------
XN Seq Scan on venue  (cost=0.00..2.02 rows=187 width=45)
Filter: (venueseats IS NOT NULL)
(2 rows)
```

# FETCH
<a name="fetch"></a>

커서를 사용하여 행을 가져옵니다. 커서 선언에 대한 자세한 내용은 [DECLARE](declare.md) 섹션을 참조하세요.

FETCH는 커서 내에서 현재 위치를 기준으로 행을 가져옵니다. 생성되는 커서는 첫 번째 행 앞에 배치됩니다. FETCH 후, 커서는 마지막으로 가져온 행에 배치됩니다. FETCH ALL을 실행한 후와 같이, 사용 가능한 행의 끝에서 FETCH 실행이 끝나는 경우 커서는 마지막 행 다음에 배치된 상태로 남습니다.

FORWARD 0은 커서를 이동하지 않고 현재 행을 가져옵니다. 즉, 가장 최근에 가져온 행을 가져옵니다. 커서가 첫 번째 행 앞이나 마지막 행 뒤에 있는 경우에는 아무런 행도 반환되지 않습니다.

커서의 첫 행을 가져올 때, 필요한 경우 메모리나 디스크에서 리더 노드에 전체 결과 집합이 구체화됩니다. 큰 결과 집합을 가진 커서를 사용하면 성능에 나쁜 영향을 미칠 가능성이 있으므로, 가급적이면 다른 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 [커서 사용 시 성능 고려사항](declare.md#declare-performance) 섹션을 참조하세요.

자세한 내용은 [DECLARE](declare.md), [CLOSE](close.md) 섹션을 참조하세요.

## 구문
<a name="fetch-synopsis"></a>

```
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
```

## 파라미터
<a name="fetch-parameters"></a>

next  
다음 행을 가져옵니다. 이 값이 기본값입니다.

ALL  
나머지 행을 전부 가져옵니다. (FORWARD ALL과 동일합니다.) ALL은 단일 노드 클러스터에 대해 지원되지 않습니다.

FORWARD [ *count* \$1 ALL ]   
다음 *count*개의 행 또는 나머지 행 전부를 가져옵니다. `FORWARD 0`은 현재 행을 가져옵니다. 단일 노드 클러스터의 경우 count의 최댓값은 `1000`입니다. 단일 노드 클러스터에서는 FORWARD ALL이 지원되지 않습니다.

*cursor*   
새 커서의 이름입니다.

## FETCH 예
<a name="fetch-example"></a>

다음 예에서는 LOLLAPALOOZA로 명명된 커서를 선언하여 롤라팔루자(LOLLAPALOOZA) 행사를 위한 판매 정보를 선택한 후 커서를 사용하여 결과 집합에서 행을 가져옵니다.

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

# GRANT
<a name="r_GRANT"></a>

사용자 또는 역할에 대한 액세스 권한을 정의합니다.

권한에는 테이블 및 뷰의 데이터 읽기, 데이터 쓰기, 테이블 생성 및 테이블 삭제와 같은 액세스 옵션이 포함됩니다. 테이블, 데이터베이스, 스키마, 함수, 프로시저, 언어 또는 열에 대한 특정 권한을 부여하려면 이 명령을 사용합니다. 데이터베이스 객체에서 권한을 취소하려면 [REVOKE](r_REVOKE.md) 명령을 사용하세요.

권한에는 다음과 같은 데이터 공유 생산자 액세스 옵션도 포함됩니다.
+  소비자 네임스페이스 및 계정에 대한 데이터 공유 액세스 권한 부여 
+  데이터 공유에 객체를 추가하거나 데이터 공유에서 객체를 제거하여 데이터 공유를 변경할 수 있는 권한 부여 
+  데이터 공유에 소비자 네임스페이스를 추가하거나 데이터 공유에서 소비자 네임스페이스를 제거하여 데이터 공유를 공유할 수 있는 권한 부여 

데이터 공유 소비자 액세스 옵션은 다음과 같습니다.
+ 데이터 공유에서 생성된 데이터베이스 또는 해당 데이터베이스를 가리키는 외부 스키마에 대한 전체 액세스 권한을 사용자에게 부여
+ 로컬 데이터베이스 객체에서와 마찬가지로 데이터 공유에서 생성된 데이터베이스에 대한 객체 수준 권한을 사용자에게 부여. 이 수준의 권한을 부여하려면 데이터 공유에서 데이터베이스를 만들 때 WITH PERMISSIONS 절을 사용해야 합니다. 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요.

데이터 공유 권한에 대한 자세한 내용은 [데이터 공유에 부여할 수 있는 권한](permissions-datashares.md) 섹션을 참조하세요.

권한에는 다음 Amazon Redshift 페더레이션 권한 카탈로그도 포함됩니다.
+ 사용자 및 역할에 테이블 수준 권한을 부여합니다.
+ 테이블, 뷰 및 구체화된 뷰에 대한 세분화된 열 수준 권한을 부여합니다.
+ 사용자 및 역할에 범위가 지정된 권한을 부여합니다.
+ Amazon Redshift 페더레이션 권한 카탈로그에 대한 데이터베이스 수준 권한을 부여합니다.

Amazon Redshift 페더레이션 권한 카탈로그의 권한 관리에 대한 자세한 내용은 [Amazon Redshift 페더레이션 권한 카탈로그에서 액세스 제어 관리권한 부여/취소](federated-permissions-managing-access.md) 섹션을 참조하세요. Amazon Redshift 페더레이션 권한 카탈로그 지원 권한 부여/취소 구문에 대한 자세한 내용은 [권한 부여/취소](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke)를 참조하세요.

권한에는 AWS IAM Identity Center 페더레이션 사용자를 위한 CONNECT 권한도 포함됩니다. 이 권한을 통해 관리자는 Amazon Redshift 페더레이션 권한이 활성화된 각 Amazon Redshift 작업 그룹 또는 클러스터에서 세분화된 권한을 통해 사용자 액세스를 제어할 수 있습니다. Amazon Redshift 관리자는 Amazon Redshift 작업 그룹에 직접 연결할 수 있는 액세스 권한이 있는 AWS IAM Identity Center 페더레이션 사용자 또는 그룹을 지정하여 각 작업 그룹 또는 클러스터에서 AWS IAM Identity Center 사용자 액세스를 세밀하게 제어할 수 있습니다.

데이터베이스 권한을 관리하고 데이터와 관련하여 사용자가 수행할 수 있는 작업을 제어하는 역할을 부여할 수도 있습니다. 역할을 정의하고 사용자에게 역할을 할당하여 사용자가 수행할 수 있는 작업을 제한할 수 있습니다 예를 들어, CREATE TABLE 및 INSERT 명령만 사용하도록 제한할 수 있습니다. CREATE ROLE 명령에 대한 자세한 내용은 [CREATE ROLE](r_CREATE_ROLE.md) 섹션을 참조하세요. Amazon Redshift에는 사용자에게 특정 권한을 부여하는 데 사용할 수 있는 몇 가지 시스템 정의 역할이 있습니다. 자세한 내용은 [Amazon Redshift 시스템 정의 역할](r_roles-default.md) 섹션을 참조하세요.

ON SCHEMA 구문을 사용하는 데이터베이스 사용자 및 사용자 그룹에 외부 스키마에 대한 사용 권한만 부여하거나 취소할 수 있습니다. AWS Lake Formation에서 ON EXTERNAL SCHEMA를 사용하는 경우 AWS Identity and Access Management(IAM) 역할에 대한 권한의 GRANT 및 REVOKE만 허용됩니다. 권한 목록은 구문을 참조하세요.

저장 프로시저의 경우 부여할 수 있는 유일한 권한은 EXECUTE입니다.

트랜잭션 블록(BEGIN ... END) 내에서 GRANT(외부 리소스에 대해)를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

데이터베이스에 대해 사용자에게 부여된 권한을 확인하려면 [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md)를 사용합니다. 스키마에 대해 사용자에게 부여된 사용 권한을 확인하려면 [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md)를 사용합니다. 테이블에 대해 사용자에게 부여된 사용 권한을 확인하려면 [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md)를 사용합니다.

## 구문
<a name="r_GRANT-synopsis"></a>



```
GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE db_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT USAGE
    ON LANGUAGE language_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]             

GRANT { { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE [database_name.][schema_name.]template_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 테이블에 대한 열 수준 권한 부여
<a name="grant-column-level"></a>

다음은 Amazon Redshift 테이블 및 뷰에 대한 열 수준 권한에 대한 구문입니다.

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### ASSUMEROLE 권한 부여
<a name="grant-assumerole-permissions"></a>

다음은 지정된 역할을 가진 사용자 및 그룹에 부여된 ASSUMEROLE 권한에 대한 구문입니다. ASSUMEROLE 권한을 사용하기 시작하려면 [ASSUMEROLE 권한 부여에 대한 사용 노트](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole) 섹션을 참조하세요.

```
GRANT ASSUMEROLE
       ON { 'iam_role' [, ...] | default | ALL }
       TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
       FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL } [, ...]
```

### Redshift Spectrum과 Lake Formation의 통합을 위한 권한 부여
<a name="grant-spectrum-integration-with-lf-syntax"></a>

다음은 Lake Formation과 Redshift Spectrum 통합을 위한 구문입니다.

```
GRANT { SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    TO { { IAM_ROLE iam_role } [, ...] | PUBLIC } [ WITH GRANT OPTION ]

GRANT { { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]
```

### 데이터 공유 권한 부여
<a name="grant-datashare-syntax"></a>

**생산자 측 데이터 공유 권한**  
다음은 GRANT를 사용하여 사용자 또는 역할에 ALTER 또는 SHARE 권한을 부여할 때 사용하는 구문입니다. 사용자는 ALTER 권한으로 데이터 공유를 변경하거나 SHARE 권한으로 소비자에게 사용 권한을 부여할 수 있습니다. ALTER 및 SHARE는 데이터 공유에서 사용자 및 역할에 부여할 수 있는 유일한 권한입니다.

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

다음은 Amazon Redshift에서 데이터 공유 사용 권한에 GRANT를 사용하는 구문입니다. USAGE 권한을 사용하여 소비자에게 데이터 공유에 대한 액세스 권한을 부여합니다. 사용자 또는 사용자 그룹에는 이 권한을 부여할 수 없습니다. 이 권한은 GRANT 문에 대한 WITH GRANT OPTION도 지원하지 않습니다. 이전에 데이터 공유에 대한 SHARE 권한이 부여된 사용자 또는 사용자 그룹만 이 유형의 GRANT 문을 실행할 수 있습니다.

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

다음은 Lake Formation 계정에 데이터 공유 사용 권한을 부여하는 방법의 예입니다.

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**소비자 측 데이터 공유 권한**  
다음은 datashare에서 생성된 특정 데이터베이스 또는 스키마에 대한 GRANT datashare 사용 권한에 대한 구문입니다.

소비자가 데이터 공유에서 생성된 데이터베이스에 액세스하는 데 필요한 추가 권한은 데이터 공유에서 데이터베이스를 생성하는 데 사용된 CREATE DATABASE 명령에서 WITH PERMISSIONS 절을 사용했는지에 따라 달라집니다. CREATE DATABASE 명령과 WITH PERMISSIONS에 대한 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요.

**WITH PERMISSIONS 절을 사용하지 않고 생성된 데이터베이스**  
WITH PERMISSIONS 절을 사용하지 않은 데이터 공유에서 생성된 데이터베이스에 USAGE를 부여하면 공유 데이터베이스의 객체에 대해 별도로 권한을 부여할 필요가 없습니다. WITH PERMISSIONS 절을 사용하지 않은 데이터 공유에서 생성된 데이터베이스에 대해 사용 권한을 부여받은 엔터티는 데이터베이스의 모든 객체에 대한 액세스 권한을 자동으로 갖게 됩니다.

**WITH PERMISSIONS 절을 사용하여 생성된 데이터베이스**  
WITH PERMISSIONS 절을 사용하여 데이터베이스가 생성된 데이터 공유에 USAGE를 부여할 때 로컬 데이터베이스 객체에 대한 권한을 부여하는 것과 마찬가지로 공유 데이터베이스의 데이터베이스 객체에 대한 관련 권한을 소비자 측 자격 증명에 부여해야 액세스할 수 있습니다. 데이터 공유에서 만든 데이터베이스의 객체에 권한을 부여하려면 세 부분으로 구성된 `database_name.schema_name.object_name` 구문을 사용합니다. 공유 데이터베이스 내의 공유 스키마를 가리키는 외부 스키마의 객체에 권한을 부여하려면 두 부분으로 구성된 `schema_name.object_name` 구문을 사용합니다.

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 범위가 지정된 권한 부여
<a name="grant-scoped-syntax"></a>

범위가 지정된 권한을 사용하면 데이터베이스 또는 스키마 내 특정 유형의 모든 객체에 대한 권한을 사용자 또는 역할에 부여할 수 있습니다. 범위가 지정된 권한이 있는 사용자와 역할은 데이터베이스 또는 스키마 내의 모든 현재 및 미래 객체에 대한 지정된 권한을 갖습니다.

[SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md)에서 데이터베이스 수준 범위 지정 권한의 범위를 볼 수 있습니다. [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md)에서 스키마 수준 범위 지정 권한의 범위를 볼 수 있습니다.

범위가 지정된 권한에 대한 자세한 내용은 [범위가 지정된 권한](t_scoped-permissions.md) 섹션을 참조하세요.

다음은 사용자 또는 역할에 범위가 지정된 권한을 부여할 때 사용하는 구문입니다.

```
GRANT { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT 
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name} [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT USAGE
FOR LANGUAGES IN
{DATABASE db_name}
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]  

GRANT { { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]
```

범위가 지정된 권한은 함수에 대한 권한과 프로시저에 대한 권한을 구별하지 않습니다. 예를 들어 다음 문은 `Sales_schema` 스키마의 함수와 프로시저 모두에 대한 `EXECUTE` 권한을 `bob`에게 부여합니다.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### 기계 학습 권한 부여
<a name="grant-model-syntax"></a>

다음은 Amazon Redshift의 기계 학습 모델 권한을 위한 구문입니다.

```
GRANT CREATE MODEL
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 역할 권한 부여
<a name="grant-roles"></a>

다음은 Amazon Redshift에서 역할을 부여할 때 사용하는 구문입니다.

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

다음은 Amazon Redshift에서 역할에 시스템 권한을 부여하기 위한 구문입니다. 사용자가 아닌 역할에만 권한을 부여할 수 있습니다.

```
GRANT
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG | ACCESS SYSTEM TABLE
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE |
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL |
    IGNORE RLS | EXPLAIN RLS | 
    EXPLAIN MASKING }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
TO ROLE role_name [, ...]
```

### 보안 정책 필터에 대한 설명 권한 부여
<a name="grant-row-level-security"></a>

다음은 EXPLAIN 계획에서 쿼리의 보안 정책 필터를 설명할 권한을 부여하는 구문입니다. 가능한 보안 정책에는 행 수준 보안 정책 및 동적 데이터 마스킹 정책이 포함됩니다.

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

다음은 쿼리에 대한 행 수준 보안 정책을 우회할 수 있는 권한을 부여하는 구문입니다. 이 구문은 동적 데이터 마스킹 정책에 적용되지 않습니다.

```
GRANT IGNORE RLS TO ROLE rolename 
```

다음은 지정된 보안 정책에 조회 테이블 권한을 부여하는 구문입니다. 가능한 보안 정책에는 행 수준 보안 정책 및 동적 데이터 마스킹 정책이 포함됩니다.

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### 연결 권한 부여
<a name="grant-connection-permissions"></a>

다음은 AWS IAM Identity Center 페더레이션 사용자(또는 그룹)가 작업 그룹/클러스터에 연결할 수 있는 권한을 부여하는 구문입니다.

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

## 파라미터
<a name="r_GRANT-parameters"></a>

SELECT   <a name="grant-select"></a>
SELECT 문을 사용하여 테이블 또는 뷰에서 데이터를 선택하는 권한을 부여합니다. UPDATE 또는 DELETE 작업을 위해 기존의 열 값을 참조하는 데도 SELECT 권한이 필요합니다.

INSERT   <a name="grant-insert"></a>
INSERT 문 또는 COPY 문을 사용하여 데이터를 테이블로 로드하는 권한을 부여합니다.

UPDATE   <a name="grant-update"></a>
UPDATE 문을 사용하여 테이블 열을 업데이트하는 권한을 부여합니다. UPDATE 작업에서는 테이블 열을 참조하여 업데이트할 행을 결정하거나 열에 대한 값을 새로 계산해야 하므로, SELECT 권한도 필요합니다.

DELETE  <a name="grant-delete"></a>
테이블에서 데이터 행을 삭제하는 권한을 부여합니다. DELETE 작업에서는 테이블 열을 참조하여 삭제할 행을 결정해야 하므로, SELECT 권한도 필요합니다.

DROP  <a name="grant-drop"></a>
데이터베이스 객체에 따라, 사용자 또는 역할에 다음 권한을 부여합니다.  
+  테이블의 경우 DROP은 테이블 또는 뷰를 삭제할 수 있는 권한을 부여합니다. 자세한 내용은 [DROP TABLE](r_DROP_TABLE.md) 섹션을 참조하세요.
+  데이터베이스의 경우 DROP은 데이터베이스를 삭제할 수 있는 권한을 부여합니다. 자세한 내용은 [DROP DATABASE](r_DROP_DATABASE.md) 섹션을 참조하세요.
+  스키마의 경우 DROP은 스키마를 삭제할 수 있는 권한을 부여합니다. 자세한 내용은 [DROP SCHEMA](r_DROP_SCHEMA.md) 섹션을 참조하세요.

REFERENCES   <a name="grant-references"></a>
외래 키 제약 조건을 생성하는 권한을 부여합니다. 참조되는 테이블과 참조하는 테이블 모두에 대해 이 권한을 허용해야 하며, 그러지 않으면 사용자가 제약 조건을 생성할 수 없습니다.

ALTER  <a name="grant-alter"></a>
데이터베이스 객체에 따라, 사용자 또는 사용자 그룹에 다음 권한을 부여합니다.  
+ 테이블의 경우 ALTER는 테이블 또는 뷰를 변경할 수 있는 권한을 부여합니다. 자세한 내용은 [ALTER TABLE](r_ALTER_TABLE.md) 섹션을 참조하세요.
+ 데이터베이스의 경우 ALTER는 데이터베이스를 변경할 수 있는 권한을 부여합니다. 자세한 내용은 [ALTER DATABASE](r_ALTER_DATABASE.md) 섹션을 참조하세요.
+ 스키마의 경우 ALTER는 스키마를 변경할 수 있는 권한을 부여합니다. 자세한 내용은 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 섹션을 참조하세요.
+ 외부 테이블의 경우 ALTER는 Lake Formation에 활성화된 AWS Glue Data Catalog의 테이블을 변경할 수 있는 권한을 부여합니다. 이 권한은 Lake Formation을 사용하는 경우에만 적용됩니다.

TRUNCATE  <a name="grant-truncate"></a>
테이블을 자를 수 있는 권한을 부여합니다. 이 권한이 없으면 테이블 소유자 또는 수퍼유저만 테이블을 자를 수 있습니다. TRUNCATE 명령에 대한 자세한 내용은 [TRUNCATE](r_TRUNCATE.md) 섹션을 참조하세요.

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
지정된 사용자 또는 역할에 사용 가능한 모든 권한을 한 번에 부여합니다. PRIVILEGES 키워드는 옵션입니다.  
GRANT ALL ON SCHEMA는 외부 스키마에 대한 CREATE 권한을 부여하지 않습니다.  
Lake Formation에 사용되는 AWS Glue Data Catalog의 테이블에 ALL 권한을 부여할 수 있습니다. 이 경우 개별 권한(예: SELECT, ALTER 등)이 Data Catalog에 기록됩니다.  
 Amazon Redshift는 RULE 및 TRIGGER 권한을 지원하지 않습니다. 자세한 내용은 [지원되지 않는 PostgreSQL 기능](c_unsupported-postgresql-features.md) 섹션을 참조하세요.

ASSUMEROLE  <a name="assumerole"></a>
지정된 역할을 가진 사용자, 역할 또는 그룹에 COPY, UNLOAD, EXTERNAL FUNCTION 및 CREATE MODEL 명령을 실행하는 권한을 부여합니다. 사용자, 역할 또는 그룹은 지정된 명령을 실행할 때 해당 역할을 맡습니다. ASSUMEROLE 권한을 사용하기 시작하려면 [ASSUMEROLE 권한 부여에 대한 사용 노트](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole) 섹션을 참조하세요.

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
테이블 또는 뷰에 대해 지정된 권한을 부여합니다. TABLE 키워드는 옵션입니다. 하나의 문에 여러 개의 테이블과 뷰를 나열할 수 있습니다.

ON ALL TABLES IN SCHEMA *schema\$1name*   <a name="grant-all-tables"></a>
참조되는 스키마에 있는 모든 테이블과 뷰에 대해 지정된 권한을 부여합니다.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
Amazon Redshift 테이블 또는 뷰의 지정된 열에서 사용자, 그룹 또는 PUBLIC에 지정된 권한을 부여합니다.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
참조된 스키마에서 Lake Formation 테이블의 지정된 열에 있는 IAM 역할에 지정된 권한을 부여합니다.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
참조된 스키마에서 지정된 Lake Formation 테이블의 IAM 역할에 지정된 권한을 부여합니다.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
참조된 스키마에 있는 IAM 역할에 지정된 권한을 부여합니다.

ON *iam\$1role*   <a name="grant-iam_role"></a>
IAM 역할에 지정된 권한을 부여합니다.

TO *username*   <a name="grant-to"></a>
권한을 받는 사용자를 나타냅니다.

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
권한을 받는 IAM 역할을 나타냅니다.

WITH GRANT OPTION   <a name="grant-with-grant"></a>
권한을 받은 사용자가 동일한 권한을 다른 사용자에게 부여할 수 있음을 나타냅니다. 그룹 또는 PUBLIC에는 WITH GRANT OPTION이 허용될 수 없습니다.

ROLE *role\$1name*   <a name="grant-role"></a>
역할에 권한을 부여합니다.

GROUP *group\$1name*   <a name="grant-group"></a>
사용자 그룹에 권한을 부여합니다. 쉼표로 구분된 목록으로 여러 사용자 그룹을 지정할 수 있습니다.

PUBLIC   <a name="grant-public"></a>
이후에 생성되는 사용자를 포함하여, 모든 사용자에게 지정된 권한을 부여합니다. PUBLIC은 모든 사용자를 항상 포함하는 그룹을 나타냅니다. 개별 사용자의 권한은 PUBLIC에 부여된 권한, 사용자가 속한 그룹에 부여된 권한, 사용자에게 개별적으로 부여된 모든 권한의 합입니다.  
Lake Formation EXTERNAL TABLE에 PUBLIC을 부여하면 Lake Formation *모든 사람* 그룹에 권한이 부여됩니다.

CONNECT [ON WORKGROUP] TO \$1 [USER] <prefix>:<username> \$1 ROLE <prefix>:<rolename> \$1 PUBLIC \$1  
작업 그룹 또는 클러스터에 AWS IAM Identity Center 페더레이션 사용자 또는 그룹에 연결할 수 있는 권한을 부여합니다. 접두사는 ID 공급자를 식별합니다. PUBLIC에 부여된 권한은 나중에 생성된 사용자를 포함하여 모든 AWS IAM Identity Center 페더레이션 사용자에게 적용됩니다. 이 권한은 작업 그룹 또는 클러스터에서 Amazon Redshift 페더레이션 권한이 활성화된 경우에만 적용됩니다.

CREATE   <a name="grant-create"></a>
데이터베이스 객체에 따라, 사용자 또는 사용자 그룹에 다음 권한을 부여합니다.  
+ 데이터베이스의 경우 CREATE를 통해 사용자가 데이터베이스 내에 스키마를 생성하도록 허용합니다.
+ 스키마의 경우 CREATE를 통해 사용자가 스키마 내에 객체를 생성하도록 허용합니다. 객체의 이름을 바꾸려면 사용자가 CREATE 권한이 있고 이름을 바꿀 객체를 소유해야 합니다.
+ Amazon Redshift Spectrum 외부 스키마에는 CREATE ON SCHEMA를 사용할 수 없습니다. 외부 스키마에서 외부 테이블 사용 권한을 부여하려면 액세스 권한이 필요한 사용자에게 USAGE ON SCHEMA를 부여합니다. 외부 스키마의 소유자 또는 슈퍼유저만 외부 스키마에 외부 테이블을 생성할 수 있습니다. 외부 스키마의 소유권을 이전하려면 [ALTER SCHEMA](r_ALTER_SCHEMA.md)를 사용해 소유자를 변경합니다.

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
지정된 데이터베이스에서 임시 테이블을 생성할 권한을 부여합니다. Amazon Redshift Spectrum 쿼리를 실행하려면 데이터베이스 사용자가 데이터베이스에서 임시 테이블을 생성할 수 있는 권한을 보유해야 합니다.  
기본적으로, 사용자는 PUBLIC 그룹에서 자동 멤버십으로 임시 테이블을 생성할 권한이 허용됩니다. 사용자가 임시 테이블을 만들 수 있는 권한을 제거하려면 PUBLIC 그룹에서 TEMP 권한을 취소합니다. 그런 다음 특정 사용자 또는 사용자 그룹에 임시 테이블을 만들 수 있는 권한을 명시적으로 부여합니다.

ON DATABASE *db\$1name*   <a name="grant-database"></a>
데이터베이스에 대해 지정된 권한을 부여합니다.

객체   <a name="grant-usage"></a>
사용자가 특정 스키마의 객체에 액세스할 수 있도록, 해당 스키마에 대해 USAGE 권한을 부여합니다. 이러한 객체에 대한 특정 작업은 로컬 Amazon Redshift 스키마에 대해 별도로 부여되어야 합니다(예: 테이블에 대한 SELECT 또는 UPDATE 권한). 기본적으로 모든 사용자는 PUBLIC 스키마에서 CREATE 및 USAGE 권한을 갖습니다.  
 ON SCHEMA 구문을 사용하여 외부 스키마에 USAGE를 부여하면 외부 스키마의 객체에 대해 별도로 작업을 부여할 필요가 없습니다. 해당 카탈로그 권한은 외부 스키마 객체에 대한 세분화된 권한을 제어합니다.

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
스키마에 대해 지정된 권한을 부여합니다.  
Amazon Redshift Spectrum 외부 스키마에서 GRANT CREATE ON SCHEMA와 GRANT ALL ON SCHEMA의 CREATE 권한은 사용할 수 없습니다. 외부 스키마에서 외부 테이블 사용 권한을 부여하려면 액세스 권한이 필요한 사용자에게 USAGE ON SCHEMA를 부여합니다. 외부 스키마의 소유자 또는 슈퍼유저만 외부 스키마에 외부 테이블을 생성할 수 있습니다. 외부 스키마의 소유권을 이전하려면 [ALTER SCHEMA](r_ALTER_SCHEMA.md)를 사용해 소유자를 변경합니다.

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
참조되는 스키마에 있는 모든 함수에 대해 지정된 권한을 부여합니다.  
Amazon Redshift는 pg\$1catalog 네임스페이스에 정의된 pg\$1proc 기본 제공 항목에 대해 GRANT 또는 REVOKE 문을 지원하지 않습니다.

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
특정 저장 프로시저에 대해 EXECUTE 권한을 부여합니다. 저장 프로시저 이름은 오버로딩될 수 있기 때문에 해당 프로시저에 대한 인수 목록을 포함해야 합니다. 자세한 내용은 [저장 프로시저 명명](stored-procedure-naming.md) 섹션을 참조하세요.

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
참조되는 스키마에 있는 모든 저장 프로시저에 대해 지정된 권한을 부여합니다.

USAGE ON LANGUAGE *language\$1name*   
언어에 대한 USAGE 권한을 부여합니다.  
Amazon Redshift는 2025년 11월 1일부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. Amazon Redshift는 2026년 7월 1일부터 Python UDF를 더 이상 지원하지 않습니다. 2025년 11월 1일 이전에 기존 Python UDF를 Lambda UDF로 마이그레이션하는 것이 좋습니다. Lambda UDF 생성 및 사용에 대한 자세한 내용은 [Scalar Lambda UDF](udf-creating-a-lambda-sql-udf.md) 섹션을 참조하세요. 기존 Python UDF를 Lambda UDF로 변환하는 방법에 대한 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.
[CREATE FUNCTION](r_CREATE_FUNCTION.md) 명령을 실행하여 사용자 정의 함수(UDF)를 생성하려면 USAGE ON LANGUAGE 권한이 필요합니다. 자세한 내용은 [UDF 보안 및 권한](udf-security-and-privileges.md) 섹션을 참조하세요.  
[CREATE PROCEDURE](r_CREATE_PROCEDURE.md) 명령을 실행하여 저장 프로시저를 생성하려면 USAGE ON LANGUAGE 권한이 필요합니다. 자세한 내용은 [저장 프로시저의 보안 및 권한](stored-procedure-security-and-privileges.md) 섹션을 참조하세요.  
Python UDF에는 `plpythonu`를 사용합니다. SQL UDF에는 `sql`을 사용합니다. 저장 프로시저에는 `plpgsql`을 사용합니다.

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
복사 작업에 대해 지정된 권한을 부여합니다.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
권한이 부여된 SQL 명령을 지정합니다. ALL을 지정하여 COPY, UNLOAD, EXTERNAL FUNCTION 및 CREATE MODEL 문에 대한 권한을 부여할 수 있습니다. 이 절은 ASSUMEROLE 권한을 부여하는 경우에만 적용됩니다.

ALTER  
사용자에게 데이터 공유에서 객체를 추가 또는 제거하거나 속성 PUBLICACCESSIBLE을 설정할 수 있는 ALTER 권한을 부여합니다. 자세한 내용은 [ALTER DATASHARE](r_ALTER_DATASHARE.md) 섹션을 참조하세요.

SHARE  
데이터 소비자를 데이터 공유에 추가할 수 있는 권한을 사용자 및 사용자 그룹에 부여합니다. 이 권한은 특정 소비자(계정 또는 네임스페이스)가 클러스터에서 데이터 공유에 액세스할 수 있도록 하는 데 필요합니다. 소비자는 GUID(Globally Unique Identifier)로 지정된 클러스터 네임스페이스가 같거나 다른 AWS 계정일 수도 있고 다를 수도 있습니다.

ON DATASHARE *datashare\$1name*   <a name="grant-datashare"></a>
참조된 데이터 공유에 대해 지정된 권한을 부여합니다. 소비자 액세스 제어 세분화에 대한 자세한 내용은 [Amazon Redshift에서 다양한 수준의 데이터 공유](datashare-overview.md#granularity) 섹션을 참조하세요.

객체  
USAGE가 소비자 계정 또는 동일한 계정 내의 네임스페이스에 부여된 경우 특정 소비자 계정 또는 계정 내의 네임스페이스는 읽기 전용 방식으로 datashare 및 datashare 객체에 액세스할 수 있습니다.

TO NAMESPACE 'clusternamespace GUID'  
소비자가 데이터 공유에 대해 지정된 권한을 받을 수 있는 동일한 계정의 네임스페이스를 나타냅니다. 네임스페이스는 128비트 영숫자 GUID를 사용합니다.

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
소비자가 데이터 공유에 대해 지정된 권한을 받을 수 있는 다른 계정의 번호를 나타냅니다. VIA DATA CATALOG'를 지정하면 Lake Formation 계정에 데이터 공유 사용 권한을 부여하고 있음을 나타냅니다. 이 파라미터를 생략하면 클러스터를 소유한 계정에 사용 권한을 부여한다는 의미입니다.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="grant-datashare"></a>
지정된 데이터 공유에서 생성된 지정된 데이터베이스에 대해 지정된 사용 권한을 부여합니다.

ON SCHEMA* shared\$1schema*   <a name="grant-datashare"></a>
지정된 데이터 공유에서 생성된 지정된 스키마에 대해 지정된 권한을 부여합니다.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
권한을 부여할 데이터베이스 객체를 지정합니다. IN 다음의 파라미터는 부여된 권한의 범위를 정의합니다.

CREATE MODEL  
특정 사용자 또는 사용자 그룹에 CREATE MODEL 권한을 부여합니다.

ON MODEL *model\$1name*  
특정 모델에 대해 EXECUTE 권한을 부여합니다.

ACCESS CATALOG  
역할이 액세스할 수 있는 객체의 관련 메타데이터를 볼 수 있는 권한을 부여합니다.

\$1 role \$1 [, ...]  
다른 역할, 사용자 또는 PUBLIC에 부여할 역할입니다.  
PUBLIC은 모든 사용자를 항상 포함하는 그룹을 나타냅니다. 개별 사용자의 권한은 PUBLIC에 부여된 권한, 사용자가 속한 그룹에 부여된 권한, 사용자에게 개별적으로 부여된 모든 권한의 합입니다.

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, ...]  
WITH ADMIN OPTION, 다른 역할 또는 PUBLIC을 사용하여 지정된 사용자에게 지정된 역할을 부여합니다.  
WITH ADMIN OPTION 절에서 모든 피부여자에게 부여된 모든 역할에 대한 관리 옵션을 제공합니다.

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
EXPLAIN 계획에서 쿼리의 보안 정책 필터를 설명할 수 있는 권한을 특정 역할에 부여합니다. RLS는 행 수준 보안 정책 필터에 대한 설명 권한을 부여합니다. MASKING은 동적 데이터 마스킹 정책 필터를 설명할 수 있는 권한을 부여합니다.

IGNORE RLS TO ROLE *rolename*   
쿼리에 대한 행 수준 보안 정책을 우회할 수 있는 권한을 역할에 부여합니다.

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
권한을 받는 보안 정책을 나타냅니다. TO RLS POLICY는 행 수준 보안 정책을 나타냅니다. TO MASKING POLICY는 동적 데이터 마스킹 정책을 나타냅니다.

## 사용 노트
<a name="r_GRANT-usage-notes-link"></a>

GRANT 사용 노트에 대한 자세한 내용은 [사용 노트](r_GRANT-usage-notes.md) 섹션을 참조하세요.

## 예제
<a name="r_GRANT-examples-link"></a>

GRANT 사용 방법의 예는 [예제](r_GRANT-examples.md) 섹션을 참조하세요.

# 사용 노트
<a name="r_GRANT-usage-notes"></a>

객체에 대한 권한을 허용하려면 다음 조건 중 하나를 충족해야 합니다.
+ 객체 소유자입니다.
+ 수퍼유저입니다.
+ 그 객체와 권한에 대해 허용된 권한이 있습니다.

예를 들어, 다음 명령을 실행하면 사용자 HR은 직원 테이블에서 SELECT 명령을 수행할 뿐 아니라 다른 사용자에 대해 같은 권한을 허용하고 취소할 수 있습니다.

```
grant select on table employees to HR with grant option;
```

HR은 SELECT 이외의 작업 권한이나 직원 이외의 테이블에 대한 권한을 허용할 수 없습니다.

또 다른 예로, 다음 명령을 실행하면 사용자 HR은 직원 테이블에서 ALTER 명령을 수행할 뿐 아니라 다른 사용자에 대해 같은 권한을 허용하고 취소할 수 있습니다.

```
grant ALTER on table employees to HR with grant option;
```

HR은 ALTER 이외의 작업 권한이나 직원 이외의 테이블에 대한 권한을 허용할 수 없습니다.

뷰에 대해 허용된 권한을 갖는다고 해서 기본 테이블에 대한 권한을 갖는다는 의미는 아닙니다. 마찬가지로, 스키마에 대해 허용된 권한을 갖는다고 해서 스키마에 있는 테이블에 대한 권한을 갖는다는 의미는 아닙니다. 대신에 기본 테이블에 대한 액세스 권한을 명시적으로 부여합니다.

AWS Lake Formation 테이블에 권한을 부여하려면 해당 테이블의 외부 스키마와 연결된 IAM 역할에 외부 테이블에 권한을 부여할 권한이 있어야 합니다. 다음 예제에서는 연결된 IAM 역할 `myGrantor`가 있는 외부 스키마를 생성합니다. IAM 역할 `myGrantor`는 다른 사람에게 권한을 부여할 권한이 있습니다. GRANT 명령은 외부 스키마와 연결된 IAM 역할 `myGrantor`의 권한을 사용하여 IAM 역할 `myGrantee`에 권한을 부여합니다.

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
grant select
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

IAM 역할에 GRANT ALL 권한을 부여하면 관련된 Lake Formation 사용 Data Catalog에서 개별 권한이 부여됩니다. 예를 들어 다음 GRANT ALL은 부여된 개별 권한(SELECT, ALTER, DROP, DELETE, INSERT)을 Lake Formation 콘솔에 표시합니다.

```
grant all
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

수퍼유저는 객체 권한을 설정하는 GRANT 및 REVOKE 명령과는 무관하게 모든 객체에 액세스할 수 있습니다.

## 열 수준 액세스 제어 사용 시 주의 사항
<a name="r_GRANT-usage-notes-clp"></a>

다음 사용 노트는 Amazon Redshift 테이블 및 뷰에 대한 열 수준 권한에 적용됩니다. 이러한 주의 사항은 테이블에 대해 설명합니다. 예외를 명시적으로 언급하지 않는 한 뷰에 동일한 주의 사항이 적용됩니다.
+ Amazon Redshift 테이블의 경우 열 수준에서 SELECT 및 UPDATE 권한만 부여할 수 있습니다. Amazon Redshift 뷰의 경우 열 수준에서 SELECT 권한만 부여할 수 있습니다.
+ ALL 키워드는 테이블의 열 수준 GRANT 컨텍스트에서 사용될 때 결합된 SELECT 및 UPDATE 권한의 동의어입니다.
+ 테이블의 모든 열에 대해 SELECT 권한이 없는 경우 SELECT \$1 작업을 수행하면 액세스 권한이 있는 열만 반환됩니다. 뷰를 사용할 때 SELECT \$1 작업은 뷰의 모든 열에 액세스하려고 시도합니다. 모든 열에 액세스할 수 있는 권한이 없는 경우 이러한 쿼리는 권한 거부 오류와 함께 실패합니다.
+ SELECT \$1는 다음과 같은 경우 액세스 가능한 열로만 확장되지 않습니다.
  + SELECT \$1를 사용하여 액세스 가능한 열만 포함하는 일반 뷰를 생성할 수 없습니다.
  + SELECT \$1를 사용하여 액세스 가능한 열만 포함하는 구체화된 뷰를 생성할 수 없습니다.
+ 테이블 또는 뷰에 대해 SELECT 또는 UPDATE 권한이 있고 열을 추가하는 경우 테이블 또는 뷰 및 모든 열에 대해 동일한 권한이 여전히 있습니다.
+ 테이블의 소유자 또는 수퍼유저만 열 수준 권한을 부여할 수 있습니다.
+ 열 수준 권한에는 WITH GRANT OPTION 절이 지원되지 않습니다.
+ 테이블 수준과 열 수준 모두에서 동일한 권한을 보유할 수 없습니다. 예를 들어 `data_scientist` 사용자는 `employee` 테이블에 대한 SELECT 권한과 `employee.department` 열에 대한 SELECT 권한을 모두 가질 수 없습니다. 테이블 및 테이블 내의 열에 동일한 권한을 부여할 때 다음 결과를 고려하세요.
  + 사용자에게 테이블에 대한 테이블 수준 권한이 있는 경우 열 수준에서 동일한 권한을 부여해도 아무런 효과가 없습니다.
  + 사용자에게 테이블에 대한 테이블 수준 권한이 있는 경우 테이블의 하나 이상의 열에 대해 동일한 권한을 취소하면 오류가 반환됩니다. 대신 테이블 수준에서 권한을 취소합니다.
  + 사용자에게 열 수준 권한이 있는 경우 테이블 수준에서 동일한 권한을 부여하면 오류가 반환됩니다.
  + 사용자에게 열 수준 권한이 있는 경우 테이블 수준에서 동일한 권한을 취소하면 테이블의 모든 열에 대한 열 및 테이블 권한이 모두 취소됩니다.
+ Late-Binding 보기에 대한 열 수준 권한은 부여할 수 없습니다.
+ 구체화된 뷰를 생성하려면 기본 테이블에 대해 테이블 수준 SELECT 권한이 있어야 합니다. 특정 열에 대한 열 수준 권한이 있더라도 해당 열에 대해서만 구체화된 보기를 생성할 수 없습니다. 그러나 일반 보기와 마찬가지로 구체화된 보기의 열에 SELECT 권한을 부여할 수 있습니다.
+ 열 수준 권한의 권한 부여를 조회하려면 [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md) 보기를 사용합니다.

## ASSUMEROLE 권한 부여에 대한 사용 노트
<a name="r_GRANT-usage-notes-assumerole"></a>

다음 사용 노트는 Amazon Redshift에서 ASSUMEROLE 권한을 부여하는 데 적용됩니다.

ASSUMEROLE 권한을 사용하여 COPY, UNLOAD, EXTERNAL FUNCTION 또는 CREATE MODEL과 같은 명령에 대한 데이터베이스 사용자, 역할 또는 그룹의 IAM 역할 액세스 권한을 제어합니다. IAM 역할에 대해 사용자, 역할 또는 그룹에 ASSUMEROLE 권한을 부여한 후 해당 사용자, 역할 또는 그룹은 명령을 실행할 때 해당 역할을 맡을 수 있습니다. ASSUMEROLE 권한을 사용하면 필요에 따라 적절한 명령에 대한 액세스 권한을 부여할 수 있습니다.

데이터베이스 슈퍼유저만 사용자, 역할 및 그룹에 대한 ASSUMEROLE 권한을 부여하거나 취소할 수 있습니다. 슈퍼유저는 항상 ASSUMEROLE 권한을 유지합니다.

사용자, 역할 및 그룹에 ASSUMEROLE 권한을 사용하도록 설정하기 위해 슈퍼유저는 다음 두 가지 작업을 수행합니다.
+ 클러스터에서 다음 문을 한 번 실행합니다.

  ```
  revoke assumerole on all from public for all;
  ```
+ 적절한 명령에 대해 사용자, 역할 및 그룹에 ASSUMEROLE 권한을 부여합니다.

ASSUMEROLE 권한을 부여할 때 ON 절에서 역할 체인을 지정할 수 있습니다. 쉼표를 사용하여 역할 체인에서 역할을 구분합니다(예: `Role1,Role2,Role3`). ASSUMEROLE 권한을 부여할 때 역할 체인을 지정한 경우 ASSUMEROLE 권한으로 부여된 작업을 수행할 때 역할 체인을 지정해야 합니다. ASSUMEROLE 권한으로 부여된 작업을 수행할 때 역할 체인 내에서 개별 역할을 지정할 수 없습니다. 예를 들어 사용자, 역할 또는 그룹에 역할 체인 `Role1,Role2,Role3`이 부여된 경우 작업을 수행하도록 `Role1`만 지정할 수 없습니다.

사용자가 COPY, UNLOAD, EXTERNAL FUNCTION 또는 CREATE MODEL 작업을 수행하려고 하고 ASSUMEROLE 권한이 부여되지 않은 경우 다음과 유사한 메시지가 나타납니다.

```
ERROR:  User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY 
```

ASSUMEROLE 권한을 통해 IAM 역할 및 명령에 대한 액세스 권한이 부여된 사용자를 나열하려면 [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md) 섹션을 참조하세요. 지정한 사용자에게 부여된 IAM 역할 및 명령 권한을 나열하려면 [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md) 섹션을 참조하세요. 지정한 IAM 역할에 대한 액세스 권한이 부여된 사용자, 역할 및 그룹을 나열하려면 [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md) 섹션을 참조하세요.

## 기계 학습 권한 부여에 대한 사용 노트
<a name="r_GRANT-usage-notes-create-model"></a>

ML 함수와 관련된 권한을 직접 부여하거나 취소할 수 없습니다. ML 함수는 ML 모델에 속하며 권한은 모델을 통해 제어됩니다. 대신 ML 모델과 관련된 권한을 부여할 수 있습니다. 다음 예제는 모든 사용자에게 `customer_churn` 모델과 연결된 ML 함수를 실행할 수 있는 권한을 부여하는 방법을 보여줍니다.

```
GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;
```

ML 모델 `customer_churn`에 대한 모든 권한을 사용자에게 부여할 수도 있습니다.

```
GRANT ALL on MODEL customer_churn TO ml_user;
```

스키마에 ML 함수가 있는 경우 해당 ML 함수가 이미 `GRANT EXECUTE ON MODEL`을 통해 `EXECUTE` 권한을 부여받았더라도 ML 함수와 관련된 `EXECUTE` 권한 부여는 실패합니다. `CREATE MODEL` 명령을 사용할 때는 별도의 스키마를 사용하여 ML 함수를 별도의 스키마에 따로 보관하는 것이 좋습니다. 다음 예제에서는 이 작업을 수행하는 방법을 보여 줍니다.

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# 예제
<a name="r_GRANT-examples"></a>

 다음 예에서는 사용자 `fred`에게 SALES 테이블에 대한 SELECT 권한을 허용합니다.

```
grant select on table sales to fred;
```

다음 예에서는 사용자 `fred`에게 QA\$1TICKIT 스키마에 있는 모든 테이블에 대한 SELECT 권한을 허용합니다.

```
grant select on all tables in schema qa_tickit to fred;
```

다음 예에서는 사용자 그룹 QA\$1USERS에게 스키마 QA\$1TICKIT에 대한 모든 스키마 권한을 허용합니다. 스키마 권한은 CREATE 및 USAGE입니다. USAGE는 스키마에 있는 객체에 대한 액세스 권한을 사용자에게 허용하지만, 해당 객체에 대한 INSERT 또는 SELECT 같은 권한은 허용하지 않습니다. 각 객체에 대한 권한을 개별적으로 부여합니다.

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

다음 예에서는 그룹 QA\$1USERS의 모든 사용자에게 QA\$1TICKIT 스키마에 있는 SALES 테이블에 대한 모든 권한을 허용합니다.

```
grant all on table qa_tickit.sales to group qa_users;
```

다음 예제에서는 그룹 QA\$1USERS 및 RO\$1USERS의 모든 사용자에게 QA\$1TICKIT 스키마에 있는 SALES 테이블에 대한 모든 권한을 부여합니다.

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

다음 예에서는 그룹 QA\$1USERS의 모든 사용자에게 QA\$1TICKIT 스키마에 있는 SALES 테이블에 대한 DROP 권한을 허용합니다.

```
grant drop on table qa_tickit.sales to group qa_users;>
```

다음 명령 시퀀스는 어떻게 스키마에 대한 액세스가 스키마에 있는 테이블에 대한 권한을 허용하지 않는지 보여줍니다.

```
create user schema_user in group qa_users password 'Abcd1234';
create schema qa_tickit;
create table qa_tickit.test (col1 int);
grant all on schema qa_tickit to schema_user;

set session authorization schema_user;
select current_user;


current_user
--------------
schema_user
(1 row)


select count(*) from qa_tickit.test;


ERROR: permission denied for relation test [SQL State=42501]


set session authorization dw_user;
grant select on table qa_tickit.test to schema_user;
set session authorization schema_user;
select count(*) from qa_tickit.test;


count
-------
0
(1 row)
```

다음 명령 시퀀스는 어떻게 뷰에 대한 액세스가 기본 테이블에 대한 액세스를 의미하는 것은 아닌지 보여줍니다. VIEW\$1USER라는 사용자에게는 VIEW\$1DATE에 대한 모든 권한이 허용되었지만, 이 사용자는 DATE 테이블에서 선택할 수 없습니다.

```
create user view_user password 'Abcd1234';
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
select current_user;


current_user
--------------
view_user
(1 row)


select count(*) from view_date;


count
-------
365
(1 row)


select count(*) from date;


ERROR:  permission denied for relation date
```

다음 예에서는 `cust_name` 사용자에게 `cust_phone` 테이블의 `cust_profile` 및 `user1` 열에 대한 SELECT 권한을 부여합니다.

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

다음 예에서는 `cust_name` 그룹에 `cust_phone` 테이블의 `cust_contact_preference` 및 `cust_profile` 열에 대한 SELECT 권한과 `sales_group` 열에 대한 UPDATE 권한을 부여합니다.

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

다음 예에서는 ALL 키워드를 사용하여 `cust_profile` 테이블의 세 열에 대한 SELECT 및 UPDATE 권한을 모두 `sales_admin` 그룹에 부여하는 것을 보여 줍니다.

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

다음 예에서는 `cust_name` 뷰의 `cust_profile_vw` 열에 대한 SELECT 권한을 `user2` 사용자에게 부여합니다.

```
grant select(cust_name) on cust_profile_vw to user2;
```

## 데이터 공유에 대한 액세스 권한 부여의 예
<a name="r_GRANT-examples-datashare"></a>

다음 예에서는 datashare에서 생성된 특정 데이터베이스 또는 스키마에 대한 GRANT datashare 사용 권한을 보여줍니다.

다음 예시에서는 생산자 측 관리자가 `salesshare` 데이터 공유에 대한 USAGE 권한을 지정된 네임스페이스에 부여합니다.

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

다음 예시에서는 소비자 측 관리자가 `sales_db`에 대한 USAGE 권한을 `Bob`에게 부여합니다.

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

다음 예시에서는 소비자 측 관리자가 `sales_schema` 스키마에 대한 GRANT USAGE 권한을 `Analyst_role` 역할에 부여합니다. `sales_schema`는 sales\$1db를 가리키는 외부 스키마입니다.

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

이때 `Bob` 및 `Analyst_role`은 `sales_schema` 및 `sales_db`에 있는 모든 데이터베이스 객체에 액세스할 수 있습니다.

다음 예시에서는 공유 데이터베이스의 객체에 추가 객체 수준 권한을 부여하는 방법을 보여줍니다. 이러한 추가 권한은 공유 데이터베이스를 만드는 데 사용된 CREATE DATABASE 명령에서 WITH PERMISSIONS 절을 사용한 경우에만 필요합니다. CREATE DATABASE 명령에서 WITH PERMISSIONS를 사용하지 않은 경우 공유 데이터베이스에 대한 USAGE를 부여하면 해당 데이터베이스의 모든 객체에 대한 전체 액세스 권한이 부여됩니다.

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## 범위가 지정된 권한 부여의 예
<a name="r_GRANT-examples-scoped"></a>

다음 예시에서는 `Sales_db` 데이터베이스의 모든 현재 및 미래 스키마에 대한 사용 권한을 `Sales` 역할에 부여합니다.

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

다음 예시에서는 `Sales_db` 데이터베이스의 모든 현재 및 미래 테이블에 대한 SELECT 권한을 `alice`라는 사용자에게 부여하고, `Sales_db`에 있는 테이블에 대한 범위가 지정된 권한을 다른 사용자에게 부여할 수 있는 권한도 `alice`에게 부여합니다.

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

다음 예시에서는 `Sales_schema` 스키마의 함수에 대한 EXECUTE 권한을 `bob`이라는 사용자에게 부여합니다.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

다음 예시에서는 `ShareDb` 데이터베이스의 `ShareSchema` 스키마에 있는 모든 테이블에 대한 모든 권한을 `Sales` 역할에 부여합니다. 스키마를 지정할 때 두 부분으로 구성된 `database.schema` 형식을 사용하여 스키마의 데이터베이스를 지정할 수 있습니다.

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

다음 예시는 이전 예시와 동일합니다. 두 부분으로 구성된 형식을 사용하는 대신 `DATABASE` 키워드를 사용하여 데이터베이스를 지정할 수 있습니다.

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## ASSUMEROLE 권한 부여의 예
<a name="r_GRANT-examples-assumerole"></a>

다음은 ASSUMEROLE 권한을 부여하는 예입니다.

다음 예에서는 슈퍼 사용자가 사용자 및 그룹에 대해 ASSUMEROLE 권한을 사용할 수 있도록 클러스터에서 한 번 실행하는 REVOKE 문을 보여줍니다. 그런 다음 슈퍼 사용자는 적절한 명령에 대해 사용자 및 그룹에 ASSUMEROLE 권한을 부여합니다. 사용자 및 그룹에 대한 ASSUMEROLE 권한 사용 설정에 대한 내용은 [ASSUMEROLE 권한 부여에 대한 사용 노트](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole) 섹션을 참조하세요.

```
revoke assumerole on all from public for all;
```

다음 예에서는 COPY 작업을 수행할 IAM 역할 `Redshift-S3-Read`에 대한 ASSUMEROLE 권한을 사용자 `reg_user1`에게 부여합니다.

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

다음 예에서는 UNLOAD 작업을 수행하기 위해 IAM 역할 체인 `RoleA`, `RoleB`에 대한 ASSUMEROLE 권한을 사용자 `reg_user1`에게 부여합니다.

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

다음은 IAM 역할 체인 `RoleA`, `RoleB`를 사용하는 UNLOAD 명령의 예입니다.

```
unload ('select * from venue limit 10')
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

다음 예에서는 외부 기능을 생성할 IAM 역할 `Redshift-Exfunc`에 대한 ASSUMEROLE 권한을 사용자 `reg_user1`에게 부여합니다.

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

다음 예에서는 기계 학습 모델을 생성할 IAM 역할 `Redshift-model`에 대한 ASSUMEROLE 권한을 사용자 `reg_user1`에게 부여합니다.

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## ROLE 권한 부여의 예
<a name="r_GRANT-examples-role"></a>

다음은 sample\$1role1을 user1에 부여하는 예입니다.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

다음 예에서는 WITH ADMIN OPTION을 사용하여 sample\$1role1을 user1에 부여하고, user1에 대한 현재 세션을 설정하며, user1은 sample\$1role1을 user2에 부여합니다.

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

다음은 sample\$1role1을 sample\$1role2에 부여하는 예입니다.

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

다음은 sample\$1role2를 sample\$1role3 및 sample\$1role4에 부여하는 예입니다. 그런 다음 sample\$1role3을 sample\$1role1에 부여하려고 시도합니다.

```
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2;
ERROR: cannot grant this role, a circular dependency was detected between these roles
```

다음 예에서는 CREATE USER 시스템 권한을 sample\$1role1에 부여합니다.

```
GRANT CREATE USER TO ROLE sample_role1;
```

다음은 `sys:dba` 시스템 정의 역할을 user1에 부여하는 예입니다.

```
GRANT ROLE sys:dba TO user1;
```

다음 예에서는 순환 종속성에서 sample\$1role3을 sample\$1role2에 부여하려고 시도합니다.

```
CREATE ROLE sample_role3;
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2; -- fail
ERROR:  cannot grant this role, a circular dependency was detected between these roles
```

# INSERT
<a name="r_INSERT_30"></a>

**Topics**
+ [구문](#r_INSERT_30-synopsis)
+ [파라미터](#r_INSERT_30-parameters)
+ [사용 노트](#r_INSERT_30_usage_notes)
+ [INSERT 예](c_Examples_of_INSERT_30.md)

테이블에 새 행을 삽입합니다. VALUES 구문을 포함한 단일 행, VALUES 구문을 포함한 다중 행, 또는 쿼리(INSERT INTO...SELECT)의 결과에 의해 정의되는 하나 이상의 행을 삽입할 수 있습니다.

**참고**  
대량의 데이터를 로드하려면 [COPY](r_COPY.md) 명령을 사용하는 것이 가장 좋습니다. 테이블을 채우는 데 개별적인 INSERT문을 사용하는 방식은 엄청나게 느릴 수 있습니다. 대안으로 데이터가 이미 다른 Amazon Redshift 데이터베이스 테이블에 존재하는 경우 성능을 개선하려면 INSERT INTO SELECT 또는 [CREATE TABLE AS](r_CREATE_TABLE_AS.md)를 사용합니다. COPY 명령을 사용한 테이블 로드에 대한 자세한 내용은 [Amazon Redshift에서 데이터 로드](t_Loading_data.md) 섹션을 참조하세요.

**참고**  
단일 SQL 문의 최대 크기는 16MB입니다.

## 구문
<a name="r_INSERT_30-synopsis"></a>

```
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
```

## 파라미터
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
임시 또는 영구 테이블입니다. 테이블의 소유자 또는 테이블에 대한 INSERT 권한을 가진 사용자만이 행을 삽입할 수 있습니다. *query* 절을 사용하여 행을 삽입할 경우 쿼리에 이름이 지정된 테이블에 대한 SELECT 권한이 있어야 합니다.  
INSERT(외부 테이블)를 사용하여 외부 카탈로그의 기존 테이블에 SELECT 쿼리의 결과를 삽입합니다. 자세한 내용은 [INSERT(외부 테이블)](r_INSERT_external_table.md) 섹션을 참조하세요.

 *열*   
테이블의 한 개 이상의 열에 값을 삽입할 수 있습니다. 임의의 순서대로 대상 열 이름을 나열할 수 있습니다. 열 목록을 지정하지 않은 경우 삽입되는 값은 CREATE TABLE 문에서 선언된 순서대로 테이블 열에 상응해야 합니다. 삽입되는 값의 개수가 테이블에 있는 열의 개수보다 작을 경우 처음 *n*개의 열이 로드됩니다.  
INSERT 문에 (암시적으로 또는 명시적으로) 나열되지 않은 임의의 열로 선언된 기본값 또는 null 값이 로드됩니다.

DEFAULT VALUES   
테이블 생성 시 테이블의 열에 기본값이 할당된 경우 이런 키워드를 사용하여 전적으로 기본값으로 구성되는 행을 삽입합니다. 어떤 열에도 기본값이 없는 경우에는 이러한 열에 null이 삽입됩니다. NOT NULL로 선언된 열이 있는 경우에는 INSERT 문이 오류를 반환합니다.

VALUES   
각각 하나 이상의 값으로 구성된 하나 이상의 행을 삽입하려면 이 키워드를 사용하세요. 각 행에 대한 VALUES 목록은 열 목록과 일치해야 합니다. 여러 행을 삽입하려면 표현식의 각 목록 사이에 쉼표를 구분 기호로 사용하세요. VALUES 키워드를 반복하지 마세요. 다중 행 INSERT 문에 대한 모든 VALUES 목록은 같은 수의 값을 포함해야 합니다.

 * expression*   
단일 값 또는 단일 값으로 계산되는 표현식입니다. 각각의 값은 자신이 삽입되는 열의 데이터 형식과 호환 가능해야 합니다. 가능한 경우 데이터 형식이 열의 선언된 데이터 형식과 일치하지 않는 값은 자동으로 호환 가능한 데이터 형식으로 변환됩니다. 예:   
+ 10진수 값 `1.1`은 INT 열에 `1`로 삽입됩니다.
+ 10진수 값 `100.8976`은 DEC(5,2) 열에 `100.90`으로 삽입됩니다.
표현식에 형식 캐스팅 구문을 포함시킴으로써 값을 호환 가능한 데이터 형식으로 명시적으로 변환할 수 있습니다. 테이블 T1에서 열 COL1이 CHAR(3) 열인 경우를 예로 들면 다음과 같습니다.  

```
insert into t1(col1) values('Incomplete'::char(3));
```
이 문은 값 `Inc`를 열에 삽입합니다.  
단일 행 INSERT VALUES 문의 경우 스칼라 하위 쿼리를 표현식으로 사용할 수 있습니다. 하위 쿼리의 결과는 적절한 열에 삽입됩니다.  
하위 쿼리는 다중 행 INSERT VALUES 문을 위한 표현식으로 지원되지 않습니다.

DEFAULT   
테이블 생성 시 정의된 대로, 열의 기본값을 삽입하려면 이 키워드를 사용하세요. 열에 대한 기본값이 존재하지 않으면 null이 삽입됩니다. NOT NULL 제약 조건이 있는 열이 CREATE TABLE 문에서 자신에게 할당된 명시적 기본값이 없는 경우에는 이 열에 기본값을 삽입할 수 없습니다.

 *query*()   
임의의 쿼리를 정의하여 테이블에 하나 이상의 행을 삽입합니다. 쿼리가 생성하는 모든 행이 테이블에 삽입됩니다. 쿼리는 테이블에 있는 열과 호환되는 열 목록을 반환해야 하지만, 열 이름이 일치할 필요는 없습니다.

## 사용 노트
<a name="r_INSERT_30_usage_notes"></a>

**참고**  
대량의 데이터를 로드하려면 [COPY](r_COPY.md) 명령을 사용하는 것이 가장 좋습니다. 테이블을 채우는 데 개별적인 INSERT문을 사용하는 방식은 엄청나게 느릴 수 있습니다. 대안으로 데이터가 이미 다른 Amazon Redshift 데이터베이스 테이블에 존재하는 경우 성능을 개선하려면 INSERT INTO SELECT 또는 [CREATE TABLE AS](r_CREATE_TABLE_AS.md)를 사용합니다. COPY 명령을 사용한 테이블 로드에 대한 자세한 내용은 [Amazon Redshift에서 데이터 로드](t_Loading_data.md) 섹션을 참조하세요.

삽입되는 값의 데이터 형식은 CREATE TABLE 정의에 의해 지정된 데이터 형식과 일치해야 합니다.

 테이블에 많은 수의 행을 새로 삽입한 후.
+ 테이블을 완전히 비워 스토리지 스페이스를 회수하고 행을 다시 정렬합니다.
+ 테이블을 분석하여 쿼리 플래너에 대한 통계를 업데이트합니다.

값이 DECIMAL 열에 삽입되고 지정된 규모를 초과할 때, 로드된 값은 적당히 반올림됩니다. 예를 들어, `20.259`라는 값이 DECIMAL(8,2) 열에 삽입되는 경우 저장되는 값은 `20.26`입니다.

GENERATED BY DEFAULT AS IDENTITY 열에 추가할 수 있습니다. GENERATED BY DEFAULT AS IDENTITY로 정의된 열을 직접 입력하는 값으로 업데이트할 수 있습니다. 자세한 내용은 [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause) 섹션을 참조하세요.

# INSERT 예
<a name="c_Examples_of_INSERT_30"></a>

TICKIT 데이터베이스의 CATEGORY 테이블은 다음 행을 포함합니다.

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
     1 | Sports   | MLB       | Major League Baseball
     2 | Sports   | NHL       | National Hockey League
     3 | Sports   | NFL       | National Football League
     4 | Sports   | NBA       | National Basketball Association
     5 | Sports   | MLS       | Major League Soccer
     6 | Shows    | Musicals  | Musical theatre
     7 | Shows    | Plays     | All non-musical theatre
     8 | Shows    | Opera     | All opera and light opera
     9 | Concerts | Pop       | All rock and pop music concerts
    10 | Concerts | Jazz      | All jazz singers and bands
    11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

 CATEGORY 테이블에 대한 유사한 스키마를 가진 CATEGORY\$1STAGE 테이블을 생성하되, 열에 대한 기본값을 정의합니다.

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

다음 INSERT 문은 CATEGORY 테이블에서 모든 행을 선택하여 CATEGORY\$1STAGE 테이블로 삽입합니다.

```
insert into category_stage
(select * from category);
```

쿼리 주변의 괄호는 선택 사항입니다.

이 명령은 각 열에 대해 순서대로 값이 지정된 CATEGORY\$1STAGE 테이블에 새 행을 삽입합니다.

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

특정 값과 기본값을 결합하는 새로운 행을 삽입할 수도 있습니다.

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

다음 쿼리를 실행하여 삽입된 행을 반환합니다.

```
select * from category_stage
where catid in(12,13) order by 1;

 catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
    12 | Concerts | Comedy  | All stand-up comedy performances
    13 | Concerts | Other   | General
(2 rows)
```

다음 예에서는 몇 가지 다중 행 INSERT VALUES 문을 보여줍니다. 첫 번째 예에서는 두 행에 대한 특정 CATID 값과 다른 열의 기본값을 두 행에 모두 삽입합니다.

```
insert into category_stage values
(14, default, default, default),
(15, default, default, default);

select * from category_stage where catid in(14,15) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
    14 | General  | General | General
    15 | General  | General | General
(2 rows)
```

그 다음 예에서는 특정한 값과 기본값이 다양하게 조합된 세 개의 행을 삽입합니다.

```
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);

select * from category_stage where catid in(0,20,21) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
     0 | General  | General | General
    20 | General  | Country | General
    21 | Concerts | Rock    | General
(3 rows)
```

이 예에서 첫 번째 VALUES 집합은 단일 행 INSERT 문에 대한 DEFAULT VALUES를 지정하는 것과 똑같은 결과를 만들어냅니다.

다음 예에서는 테이블에 IDENTITY 열이 있을 때 INSERT의 동작을 보여줍니다. 먼저 CATEGORY 테이블의 새 버전을 만든 다음, CATEGORY에서 테이블에 행을 삽입합니다.

```
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');


insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
```

참고로, 특정한 정수 값을 CATID IDENTITY 열에 삽입할 수 없습니다. IDENTITY 열 값은 자동으로 생성됩니다.

다음 예에서는 다중 행 INSERT VALUES 문에 하위 쿼리를 표현식으로 사용할 수 없음을 보여줍니다.

```
insert into category(catid) values
((select max(catid)+1 from category)),
((select max(catid)+2 from category));

ERROR: can't use subqueries in multi-row VALUES
```

다음 예에서는 `WITH SELECT` 절을 사용하여 `venue` 테이블의 데이터로 채워진 임시 테이블에 삽입하는 방법을 보여줍니다. `venue` 테이블에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

먼저 임시 테이블 `#venuetemp`를 생성합니다.

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

`#venuetemp` 테이블의 행을 나열합니다.

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756	
...
```

`WITH SELECT` 절을 사용하여 `#venuetemp` 테이블에 10개의 중복 행을 삽입합니다.

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

`#venuetemp` 테이블의 행을 나열합니다.

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756
5        Gillette Stadium           Foxborough   MA          68756
...
```

# INSERT(외부 테이블)
<a name="r_INSERT_external_table"></a>

AWS Glue, AWS Lake Formation 또는 Apache Hive 메타스토어와 같은 외부 카탈로그의 기존 외부 테이블에 SELECT 쿼리의 결과를 삽입합니다. 외부 카탈로그 및 Amazon S3와 상호 작용하려면 CREATE EXTERNAL SCHEMA 명령에 사용된 것과 동일한 AWS Identity and Access Management(IAM) 역할을 사용합니다.

분할되지 않은 테이블의 경우 INSERT(외부 테이블) 명령은 지정된 테이블 속성과 파일 형식에 따라 테이블에 정의된 Amazon S3 위치에 데이터를 작성합니다.

분할된 테이블의 경우 INSERT(외부 테이블)는 테이블에 지정된 파티션 키에 따라 Amazon S3 위치에 데이터를 작성합니다. 또한 INSERT 작업이 완료된 후 외부 카탈로그에 새 파티션을 자동으로 등록합니다.

트랜잭션 블록(BEGIN ... END) 내에서는 INSERT(외부 테이블)를 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.

## 구문
<a name="r_INSERT_external_table-synopsis"></a>

```
INSERT INTO external_schema.table_name
{ select_statement }
```

## 파라미터
<a name="r_INSERT_external_table-parameters"></a>

 *external\$1schema.table\$1name*   
기존 외부 스키마 및 삽입할 대상 외부 테이블의 이름입니다.

 *select\$1statement*   
쿼리를 정의하여 외부 테이블에 하나 이상의 행을 삽입하는 문입니다. 쿼리가 생성하는 모든 행은 테이블 정의에 따라 텍스트 또는 Parquet 형식으로 Amazon S3에 작성됩니다. 쿼리는 외부 테이블의 열 데이터 형식과 호환되는 열 목록을 반환해야 합니다. 그러나 열 이름은 일치하지 않아도 됩니다.

## 사용 노트
<a name="r_INSERT_external_table_usage_notes"></a>

SELECT 쿼리의 열 수는 데이터 열 및 파티션 열의 합계와 같아야 합니다. 각 데이터 열의 위치 및 데이터 형식은 외부 테이블의 위치 및 데이터 형식과 일치해야 합니다. 파티션 열의 위치는 CREATE EXTERNAL TABLE 명령에 정의된 것과 동일한 순서로 SELECT 쿼리의 끝에 있어야 합니다. 열 이름은 일치하지 않아도 됩니다.

경우에 따라 AWS Glue 데이터 카탈로그 또는 Hive 메타스토어에 대해 INSERT(외부 테이블) 명령을 실행할 수 있습니다. AWS Glue의 경우 외부 스키마를 생성하는 데 사용되는 IAM 역할은 Amazon S3 및 AWS Glue에 대한 읽기 및 쓰기 권한이 모두 있어야 합니다. AWS Lake Formation 카탈로그를 사용하는 경우 이 IAM 역할이 새 Lake Formation 테이블의 소유자가 됩니다. 이 IAM 역할에는 최소한 다음 권한이 있어야 합니다.
+ 외부 테이블에 대한 SELECT, INSERT, UPDATE 권한
+ 외부 테이블의 Amazon S3 경로에 대한 데이터 위치 권한

파일 이름이 고유한지 확인하기 위해 Amazon Redshift에서는 기본적으로 Amazon S3에 업로드된 각 파일의 이름에 다음 형식을 사용합니다.

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

예를 들면, `20200303_004509_810669_1007_0001_part_00.parquet`입니다.

INSERT(외부 테이블) 명령을 실행할 때 다음 사항을 고려하세요.
+ PARQUET 또는 TEXTFILE이 아닌 다른 형식의 외부 테이블은 지원되지 않습니다.
+ 이 명령은 'write.parallel', 'write.maxfilesize.mb', 'compression\$1type’, 'serialization.null.format' 같은 기존 테이블 속성을 지원합니다. 이러한 값을 업데이트하려면 ALTER TABLE SET TABLE PROPERTIES 명령을 실행합니다.
+ 'numRows' 테이블 속성은 자동으로 INSERT 작업의 끝으로 업데이트됩니다. CREATE EXTERNAL TABLE AS 작업에 의해 생성되지 않은 경우 테이블 속성을 정의하거나 테이블에 추가해야 합니다.
+ LIMIT 절은 외부 SELECT 쿼리에서 지원되지 않습니다. 대신 중첩 LIMIT 절을 사용합니다.
+ [STL\$1UNLOAD\$1LOG](r_STL_UNLOAD_LOG.md) 테이블을 사용하여 각 INSERT(외부 테이블) 작업에서 Amazon S3에 작성된 파일을 추적할 수 있습니다.
+ Amazon Redshift는 INSERT(외부 테이블)에 대해 Amazon S3 Standard 암호화만 지원합니다.

## INSERT(외부 테이블) 예
<a name="c_Examples_of_INSERT_external_table"></a>

다음 예에서는 SELECT 문의 결과를 외부 테이블에 삽입합니다.

```
INSERT INTO spectrum.lineitem
SELECT * FROM local_lineitem;
```

다음 예에서는 정적 분할을 사용하여 분할된 외부 테이블에 SELECT 문의 결과를 삽입합니다. 파티션 열은 SELECT 문에서 하드 코딩됩니다. 파티션 열은 쿼리의 끝에 있어야 합니다.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, 'May', 28 FROM local_customer;
```

다음 예에서는 동적 분할을 사용하여 분할된 외부 테이블에 SELECT 문의 결과를 삽입합니다. 파티션 열은 하드 코딩되지 않습니다. 데이터는 기존 파티션 폴더에 자동으로 추가되거나 새 파티션이 추가된 경우 새 폴더에 추가됩니다.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, month, day FROM local_customer;
```

# LOCK
<a name="r_LOCK"></a>

데이터베이스 테이블에 대한 액세스를 제한합니다. 이 명령은 트랜잭션 블록 내에서 실행될 때만 의미가 있습니다.

LOCK 명령은 "ACCESS EXCLUSIVE" 모드에서 테이블 수준 잠금을 통해, 필요한 경우 서로 상충하는 잠금이 해제될 때까지 대기합니다. 이런 식으로 테이블을 명시적으로 잠그면 다른 트랜잭션 또는 세션에서 테이블에 대한 읽기 및 쓰기 작업을 시도할 때 이런 작업이 대기 상태로 전환됩니다. 한 사용자에 의해 생성되는 명시적 테이블 잠금은 일시적으로 다른 사용자가 그 테이블에서 데이터를 선택하거나 테이블로 데이터를 로드하지 못하게 막습니다. LOCK 명령을 포함한 트랜잭션이 완료되면 잠금이 해제됩니다.

쓰기 작업과 같이, 테이블을 참조하는 명령에 의해 덜 제한적인 테이블 잠금이 암시적으로 이루어집니다. 예를 들어, 한 사용자가 테이블을 업데이트하는 동안 다른 사용자가 테이블에서 데이터 읽기를 시도할 경우 이미 커밋된 데이터의 스냅샷이 읽히게 됩니다. (경우에 따라 쿼리가 직렬화 가능 격리 규칙을 위반한 경우에는 중지됩니다.) [동시 쓰기 작업 관리](c_Concurrent_writes.md)을(를) 참조하세요.

DROP TABLE 및 TRUNCATE와 같은 일부 DDL 작업은 배타적 잠금을 생성합니다. 이런 작업으로 인해 데이터를 읽을 수 없습니다.

잠금 충돌이 발생하는 경우 Amazon Redshift는 충돌이 발생한 트랜잭션을 시작한 사용자에게 알리는 오류 메시지를 표시합니다. 잠금 충돌을 수신한 트랜잭션은 중지됩니다. 잠금 충돌이 발생할 때마다 Amazon Redshift가 [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md) 테이블에 항목을 작성합니다.

## 구문
<a name="section_r_LOCK-synopsis"></a>

```
LOCK [ TABLE ] table_name [, ...]
```

## 파라미터
<a name="parameters"></a>

TABLE   
선택적 키워드입니다.

 *table\$1name*   
잠글 테이블의 이름입니다. 테이블 이름의 쉼표로 구분된 목록을 사용하여 두 개 이상의 테이블을 잠글 수 있습니다. 뷰를 잠글 수 없습니다.

## 예제
<a name="example2"></a>

```
begin;

lock event, sales;

...
```

# MERGE
<a name="r_MERGE"></a>

소스 테이블의 행을 대상 테이블에 조건부로 병합합니다. 기존에 이는 여러 삽입, 업데이트 또는 삭제 문을 개별적으로 사용해야만 달성할 수 있습니다. MERGE를 통해 결합할 수 있는 작업에 대한 자세한 내용은 [UPDATE](https://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html), [DELETE](https://docs.aws.amazon.com/redshift/latest/dg/r_DELETE.html) 및 [INSERT](https://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html)를 참조하세요.

## 구문
<a name="r_MERGE-synopsis"></a>

```
MERGE INTO target_table 
USING source_table [ [ AS ] alias ] 
ON match_condition 
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) |
REMOVE DUPLICATES ]
```

## 파라미터
<a name="r_MERGE-parameters"></a>

 *target\$1table*  
MERGE 문이 병합되는 임시 또는 영구 테이블입니다.

 *source\$1table*  
**target\$1table에 병합할 행을 제공하는 임시 또는 영구 테이블입니다. **source\$1table은 스펙트럼 테이블일 수도 있습니다.

 *별칭*  
*source\$1table*의 임시 대체 이름입니다.  
이 파라미터는 선택 사항입니다. AS로 시작하는 *별칭*도 선택 사항입니다.

 *match\$1condition*  
*source\$1table*의 행이 *target\$1table*의 행과 일치할 수 있는지 여부를 결정하는 데 사용되는 소스 테이블 열과 대상 테이블 열 사이에 동일한 술어를 지정합니다. 조건이 충족되면 MERGE는 해당 행에 대해 *matching\$1clause*를 실행합니다 그렇지 않으면 MERGE는 해당 행에 대해 *not\$1matched\$1clause*를 실행합니다.

WHEN MATCHED  
 소스 행과 대상 행 간의 일치 조건이 참으로 평가될 때 실행할 작업을 지정합니다. UPDATE 조치 또는 DELETE 조치를 지정할 수 있습니다.

UPDATE  
 *target\$1table*에서 일치하는 행을 업데이트합니다. 지정한 *col\$1name*의 값만 업데이트됩니다.

DELETE  
 *target\$1table*에서 일치하는 행을 삭제합니다.

WHEN NOT MATCHED  
 일치 조건이 거짓 또는 알 수 없음으로 평가될 때 실행할 작업을 지정합니다. 이 절에 대한 INSERT 삽입 조치만 지정할 수 있습니다.

INSERT  
 **match\$1condition에 따라 **target\$1table의 행과 일치하지 않는 **source\$1table의 **target\$1table 행에 삽입합니다. 임의의 순서대로 대상 *col\$1name*을 나열할 수 있습니다. *col\$1name* 값을 제공하지 않으면 기본 순서는 선언된 순서의 모든 테이블 열입니다.

 *col\$1name*  
수정하려는 하나 이상의 열 이름입니다. 대상 열을 지정할 때 테이블 이름을 포함하지 마세요.

 *\$1 expr*  
*col\$1name*의 새 값을 정의하는 표현식입니다.

 REMOVE DUPLICATES  
MERGE 명령이 단순 모드에서 실행되도록 지정합니다. 단순 모드의 요구 사항은 다음과 같습니다.  
+  *target\$1table*과 *source\$1table*은 열 수와 호환 가능한 열 유형 그리고 열 순서가 같아야 합니다.
+  MERGE 명령에서 WHEN 절과 UPDATE 및 INSERT 절을 생략해야 합니다.
+  MERGE 명령에서 REMOVE DUPLICATES 절을 사용해야 합니다.
단순 모드에서 MERGE는 다음 작업을 수행합니다.  
+  *target\$1table*에서 *source\$1table*과 일치하는 행이 있으면 *source\$1table*의 값과 일치하도록 업데이트됩니다.
+  *source\$1table*에서 *target\$1table*과 일치하지 않는 행은 *target\$1table*에 삽입됩니다.
+  *target\$1table*의 여러 행이 *source\$1table*의 동일한 행과 일치하면 중복된 행이 제거됩니다. Amazon Redshift는 한 행을 유지하고 업데이트합니다. *source\$1table*의 행과 일치하지 않는 중복된 행은 변경되 않습니다.
REMOVE DUPLICATES를 사용하면 WHEN MATCHED와 WHEN NOT MATCHED를 사용하는 것보다 성능이 향상됩니다. *target\$1table*과 *source\$1table*이 호환되고 *target\$1table*에 중복된 행을 보존할 필요가 없는 경우에는 REMOVE DUPLICATES를 사용하는 것이 좋습니다.

## 사용 노트
<a name="r_MERGE_usage_notes"></a>
+ MERGE 문을 실행하려면 *source\$1table* 및 *target\$1table*의 소유자이거나 해당 테이블에 대한 SELECT 권한이 있어야 합니다. 또한 MERGE 문에 포함된 작업에 따라 *target\$1table*에 대한 UPDATE, DELETE 및 INSERT 권한이 있어야 합니다.
+  *target\$1table*은 시스템 테이블, 카탈로그 테이블 또는 외부 테이블일 수 없습니다.
+  *source\$1table* 및 *target\$1table*은 동일한 테이블일 수 없습니다.
+  MERGE 문에는 WITH 절을 사용할 수 없습니다.
+  *target\$1table*의 행은 *source\$1table*의 여러 행과 일치할 수 없습니다.

  다음 예제를 검토하세요.

  ```
  CREATE TABLE target (id INT, name CHAR(10));
  CREATE TABLE source (id INT, name CHAR(10));
  
  INSERT INTO target VALUES (1, 'Bob'), (2, 'John');
  INSERT INTO source VALUES (1, 'Tony'), (1, 'Alice'), (3, 'Bill');
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN DELETE
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  ```

  `source` 테이블에 ID 값이 `1`인 행이 여러 개 있기 때문에 두 MERGE 문 모두에서 작업이 실패합니다.
+  *match\$1condition* 및 *expr*은 SUPER 형식 열을 부분적으로 참조할 수 없습니다. 예를 들어 *SUPER 형식 객체가 배열이나 구조체인 경우 *match\$1condition* 또는 expr에* 해당 열의 개별 요소를 사용할 수 없지만 전체 열을 사용할 수는 있습니다.

  다음 예제를 검토하세요.

  ```
  CREATE TABLE IF NOT EXISTS target (key INT, value SUPER);
  CREATE TABLE IF NOT EXISTS source (key INT, value SUPER);
  
  INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}'));
  INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill'));
  
  MERGE INTO target USING source ON target.key = source.key
  WHEN matched THEN UPDATE SET value = source.value[0]
  WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]);
  ERROR: Partial reference of SUPER column is not supported in MERGE statement.
  ```

  SUPER 유형형식에 대한 자세한 내용은 [SUPER 형식](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)을 참조하세요.
+ *source\$1table*이 큰 경우 *target\$1table*과 *source\$1table* 모두의 조인 열을 분산 키로 정의하면 성능이 향상될 수 있습니다.
+ REMOVE DUPLICATES 절을 사용하려면 *target\$1table*에 대한 SELECT, INSERT, DELETE 권한이 필요합니다.
+  **source\$1table은 뷰 또는 하위 쿼리일 수 있습니다. 다음은 **source\$1table이 중복 행을 제거하는 하위 쿼리인 MERGE 문의 예제입니다.

  ```
  MERGE INTO target
  USING (SELECT id, name FROM source GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```
+ 대상은 동일한 MERGE 문의 하위 쿼리의 데이터 소스가 될 수 없습니다. 예를 들어 다음 SQL 명령은 하위 쿼리가 `source` 대신 `target`을 참조하기 때문에 ERROR: Source view/subquery in Merge statement cannot reference target table과 같은 오류를 반환합니다.

  ```
  MERGE INTO target
  USING (SELECT id, name FROM target GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```

## 예제
<a name="sub-examples-merge"></a>

다음 예에서는 두 개의 테이블을 만든 다음 테이블에서 MERGE 작업을 실행하여 대상 테이블에서 일치하는 행을 업데이트하고 일치하지 않는 행을 삽입합니다. 그런 다음 소스 테이블에 다른 값을 삽입하고 다른 MERGE 작업을 실행합니다. 이번에는 일치하는 행을 삭제하고 소스 테이블에서 새 행을 삽입합니다.

먼저 소스 및 대상 테이블을 만들고 채웁니다.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan');
INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill');

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | John
 103 | Susan
(3 rows)

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
(3 rows)
```

그런 다음 소스 테이블을 대상 테이블에 병합하여 대상 테이블을 일치하는 행으로 업데이트하고 일치하는 행이 없는 소스 테이블의 행을 삽입합니다.

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | Tony
 103 | Alice
 104 | Bill
(4 rows)
```

id 값이 102 및 103인 행은 대상 테이블의 name 값과 일치하도록 업데이트됩니다. 또한 id 값이 104이고 name 값이 Bill인 새 행이 대상 테이블에 삽입됩니다.

그런 다음 소스 테이블에 새 행을 삽입합니다.

```
INSERT INTO source VALUES (105, 'David');

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
 105 | David
(4 rows)
```

마지막으로 대상 테이블에서 일치하는 행을 삭제하고 일치하지 않는 행을 삽입하는 병합 작업을 실행합니다.

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 105 | David
(2 rows)
```

id 값이 102, 103 및 104인 행이 대상 테이블에서 삭제되고 id 값이 105이고 name 값이 David인 새 행이 대상 테이블에 삽입됩니다.

다음 예제는 REMOVE DUPLICATES 절을 사용하는 MERGE 명령의 단순화된 구문을 보여줍니다.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (11, 'Alice'), (23, 'Bill');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
11 | Alice
23 | David
22 | Clarence
(4 rows)
```

다음 예제는 REMOVE DUPLICATES 절을 사용하여 **source\$1table에 일치하는 행이 있는 경우 **target\$1table에서 중복 행을 제거하는 MERGE 명령의 단순화된 구문을 보여줍니다.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
30 | Daisy
11 | Alice
23 | David
22 | Clarence
(5 rows)
```

MERGE가 실행된 후에는 *target\$1table*에서 ID 값이 23인 행이 하나뿐입니다. *source\$1table*에 ID 값이 30인 행이 없었기 때문에 ID 값이 30인 두 개의 중복된 행은 *target\$1table*에 그대로 남아 있습니다.

## 다음 사항도 참조하세요.
<a name="r_MERGE-see-also"></a>

 [INSERT](r_INSERT_30.md), [UPDATE](r_UPDATE.md), [DELETE](r_DELETE.md) 

# PREPARE
<a name="r_PREPARE"></a>

실행을 위한 문을 준비합니다.

PREPARE는 준비된 문을 생성합니다. PREPARE 문이 실행될 때 지정된 문(SELECT, INSERT, UPDATE 또는 DELETE)이 구문 분석, 재작성 및 계획됩니다. 준비된 문에 대해 EXECUTE 명령이 실행될 때 Amazon Redshift는 (지정된 파라미터 값을 기반으로 성능을 개선하기 위해) 쿼리 실행 계획을 선택적으로 수정한 후 준비된 문을 실행할 수 있습니다.

## 구문
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

## 파라미터
<a name="r_PREPARE-parameters"></a>

 *plan\$1name*   
이 특정한 준비된 문에 주어지는 임의의 이름입니다. 단일 세션 내에서 고유해야 하며 후속적으로 이전에 준비된 문을 실행하거나 할당 취소하는 데 사용됩니다.

 *DataType*   
준비된 문에 대한 파라미터의 데이터 형식입니다. 준비된 문 자체의 파라미터를 참조하려면 \$11, \$12 등(최대 \$132767까지 가능)을 사용합니다.

 * 명령문*   
임의의 SELECT, INSERT, UPDATE 또는 DELETE 문입니다.

## 사용 노트
<a name="r_PREPARE_usage_notes"></a>

준비된 문은 파라미터를 취할 수 있습니다. 파라미터는 준비된 문이 실행될 때 문으로 대체되어 입력되는 값입니다. 준비된 문에 파라미터를 포함하려면 PREPARE 문에 데이터 형식 목록을 제공하고, 준비되는 문 자체에서 \$11, \$12의 표기법을 사용하여 위치에 따라 파라미터를 참조합니다. 파라미터의 최대 개수는 32767입니다. 문을 실행할 때 EXECUTE 문에서 이런 파라미터의 실제 값을 지정합니다. 자세한 내용은 [EXECUTE](r_EXECUTE.md) 섹션을 참조하세요.

준비된 문은 현재 세션이 진행되는 기간 동안만 지속됩니다. 세션이 종료되면 준비된 문이 삭제되므로 다시 사용하려면 준비된 문을 다시 만들어야 합니다. 이는 곧 다중 동시 데이터베이스 클라이언트가 단 하나의 준비된 문을 사용할 수는 없다는 의미이기도 하지만, 각 클라이언트는 사용할 준비된 문을 스스로 만들 수 있습니다. DEALLOCATE 명령을 사용하여 준비된 문을 수동으로 제거할 수 있습니다.

준비된 문은 단일 세션을 사용하여 많은 수의 유사한 문을 실행할 때 최대의 성능상 이점이 있습니다. 언급한 바와 같이, 준비된 문을 새로 실행할 때마다 Amazon Redshift는 지정된 파라미터 값을 기반으로 성능을 개선하도록 쿼리 실행 계획을 수정할 수 있습니다. Amazon Redshift가 특정 EXECUTE 문에 대해 선택한 쿼리 실행 계획을 검사하려면 [EXPLAIN](r_EXPLAIN.md) 명령을 사용합니다.

Amazon Redshift가 쿼리 최적화를 위해 수집하는 통계와 쿼리 계획에 대한 자세한 내용은 [ANALYZE](r_ANALYZE.md) 명령을 참조하세요.

## 예제
<a name="sub-examples-prepare"></a>

임시 테이블을 생성하고 INSERT 문을 준비한 후 실행합니다.

```
DROP TABLE IF EXISTS prep1;
CREATE TABLE prep1 (c1 int, c2 char(20));
PREPARE prep_insert_plan (int, char)
AS insert into prep1 values ($1, $2);
EXECUTE prep_insert_plan (1, 'one');
EXECUTE prep_insert_plan (2, 'two');
EXECUTE prep_insert_plan (3, 'three');
DEALLOCATE prep_insert_plan;
```

SELECT 문을 준비한 후 실행합니다.

```
PREPARE prep_select_plan (int)
AS select * from prep1 where c1 = $1;
EXECUTE prep_select_plan (2);
EXECUTE prep_select_plan (3);
DEALLOCATE prep_select_plan;
```

## 다음 사항도 참조하세요.
<a name="r_PREPARE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [EXECUTE](r_EXECUTE.md) 

# REFRESH MATERIALIZED VIEW
<a name="materialized-view-refresh-sql-command"></a>

구체화된 보기를 새로 고칩니다.

구체화된 보기를 생성할 때 그 콘텐츠는 해당 시점에서 기본 데이터베이스 테이블의 상태를 반영합니다. 애플리케이션이 기본 테이블의 데이터를 변경하더라도 구체화된 보기의 데이터는 변경되지 않습니다.

구체화된 뷰에서 데이터를 업데이트하기 위해 언제든지 `REFRESH MATERIALIZED VIEW` 문을 사용할 수 있습니다. 이 문을 사용하면 Amazon Redshift가 기본 테이블 또는 테이블에서 발생한 변경 사항을 식별한 다음 해당 변경 사항을 구체화된 뷰에 적용합니다.

구체화된 뷰에 대한 자세한 내용은 [Amazon Redshift의 구체화된 뷰](materialized-view-overview.md) 섹션을 참조하세요.

## 구문
<a name="mv_REFRESH_MATERIALIZED_VIEW-synopsis"></a>

```
REFRESH MATERIALIZED VIEW mv_name [ RESTRICT | CASCADE ]
```

## 파라미터
<a name="mv_REFRESH_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
새로 고칠 구체화된 보기의 이름입니다.

RESTRICT  
선택적 키워드입니다. 지정된 구체화된 뷰를 새로 고치지만 그에 종속된 구체화된 뷰는 새로 고치지 않습니다. RESTRICT 또는 CASCADE가 지정되지 않은 경우의 기본값입니다.

CASCADE  
선택적 키워드입니다. 지정된 구체화된 뷰와 그에 종속된 모든 구체화된 뷰를 새로 고칩니다.

## 사용 노트
<a name="mv_REFRESH_MARTERIALIZED_VIEW_usage"></a>

구체화된 보기의 소유자만 해당 구체화된 보기에 대한 `REFRESH MATERIALIZED VIEW` 작업을 수행할 수 있습니다. 또한 `REFRESH MATERIALIZED VIEW`를 성공적으로 실행하려면 소유자에게 기준 기본 테이블에 대한 SELECT 권한이 있어야 합니다.

`REFRESH MATERIALIZED VIEW` 명령은 자체 트랜잭션으로 실행됩니다. Amazon Redshift 트랜잭션 의미 체계에 따라 `REFRESH` 명령에 표시되는 기본 테이블의 데이터 또는 `REFRESH` 명령에 의한 변경 사항이 Amazon Redshift에서 실행 중인 다른 트랜잭션에 표시되는 시기를 결정합니다.
+ 증분 구체화된 보기의 경우 `REFRESH MATERIALIZED VIEW`는 이미 커밋된 기본 테이블 행만 사용합니다. 따라서 동일한 트랜잭션에서 데이터 조작 언어(DML) 문 이후에 새로 고침 작업이 실행되면 해당 DML 문의 변경 내용이 새로 고침되지 않습니다.
+ 전체 새로 고침한 구체화된 뷰의 경우 `REFRESH MATERIALIZED VIEW`를 실행하면 일반적인 Amazon Redshift 트랜잭션 의미 체계에 따라 새로 고침 트랜잭션에 모든 기본 테이블 행이 표시됩니다.
+ 입력 인수 유형에 따라 Amazon Redshift는 DATE(타임스탬프), DATE\$1PART(날짜, 시간, 간격, 시간-tz), DATE\$1TRUNC(타임스탬프, 간격) 등 특정 입력 인수 유형을 사용하는 함수에 대한 구체화된 보기에 대한 증분 새로 고침을 계속 지원합니다.
+ 증분 새로 고침은 기본 테이블이 데이터 공유에 있는 구체화된 뷰에서 지원됩니다.
+ 원격 데이터 공유 클러스터에서 공유 구체화된 뷰의 새로 고침은 다른 구체화된 뷰, Spectrum 테이블, 다른 Redshift 클러스터 또는 UDF에 정의된 테이블에 대한 참조가 포함된 구체화된 뷰에는 지원되지 않습니다. 이러한 구체화된 뷰는 로컬(생산자) 클러스터에서 새로 고칠 수 있습니다.

Amazon Redshift의 일부 작업은 구체화된 뷰와 상호 작용합니다. 구체화된 보기를 정의하는 쿼리가 증분 새로 고침에 적합한 SQL 기능만 사용하더라도 이러한 작업 중 일부는 `REFRESH MATERIALIZED VIEW` 작업이 구체화된 보기를 완전히 다시 계산하도록 강제할 수 있습니다. 예:
+ 구체화된 보기를 새로 고치지 않으면 백그라운드 vacuum 작업이 차단될 수 있습니다. 내부적으로 정의된 임계값 기간이 지나면 vacuum 작업을 실행할 수 있습니다. 이러한 vacuum 작업이 발생하면 다음에 새로 고칠 때 종속 구체화된 보기가 다시 계산되도록 표시됩니다(증분인 경우에도 해당). VACUUM에 대한 자세한 내용은 [VACUUM](r_VACUUM_command.md) 섹션을 참조하세요. 이벤트 및 상태 변경에 대한 자세한 내용은 [STL\$1MV\$1STATE](r_STL_MV_STATE.md) 섹션을 참조하세요.
+ 일부 작업은 기본 테이블에서 사용자가 시작한 경우 다음에 REFRESH 작업이 실행될 때 구체화된 보기가 완전히 다시 계산됩니다. 이러한 작업의 예로는 수동으로 호출되는 VACUUM, 클래식 크기 조정, ALTER DISTKEY 작업, ALTER SORTKEY 작업 및 자르기 작업이 있습니다. 경우에 따라 자동 작업으로 인해 다음에 REFRESH 작업을 실행할 때 구체화된 뷰가 완전히 다시 계산될 수도 있습니다. 예를 들어 자동 진공 삭제 작업으로 인해 전체 재계산이 발생할 수 있습니다. 이벤트 및 상태 변경에 대한 자세한 내용은 [STL\$1MV\$1STATE](r_STL_MV_STATE.md) 섹션을 참조하세요.

## 캐스케이드 새로 고침
<a name="mv_REFRESH_MATERIALIZED_VIEW_cascading"></a>

CASCADE 옵션은 지정된 구체화된 뷰와 그에 종속된 모든 구체화된 뷰를 종속성 순서대로 새로 고칩니다. 즉, 기본 MV가 맨 위의 MV보다 먼저 새로 고쳐집니다(토폴로지 순서). 이렇게 하면 단일 명령으로 중첩된 구체화된 뷰 세트를 업데이트할 수 있습니다.

RESTRICT 옵션(RESTRICT 또는 CASCADE가 지정되지 않은 경우의 기본값)은 지정된 구체화된 뷰만 새로 고칩니다.

CASCADE 옵션을 사용할 때는 다음 규칙이 적용됩니다.
+ 구체화된 뷰의 소유자 또는 수퍼유저만 `REFRESH MATERIALIZED VIEW ... CASCADE` 명령을 실행할 수 있습니다.
+ 캐스케이드의 구체화된 뷰를 새로 고칠 수 없는 경우 전체 캐스케이드 작업이 중지됩니다.

캐스케이드 새로 고침 기능은 로컬 및 스트리밍 구체화된 뷰 위에 중첩된 MV에만 지원됩니다. Spectrum 또는 Data Sharing과 같은 다른 소스 유형이 있는 구체화된 뷰는 캐스케이드 모드에서 지원되지 않습니다. CASCADE는 모든 중첩된 MV에 대해 단일 트랜잭션으로 새로 고침을 실행합니다.

## 데이터 공유의 구체화된 뷰에 대한 증분 새로 고침
<a name="mv_REFRESH_MATERIALIZED_VIEW_datashare"></a>

 Amazon Redshift는 기본 테이블이 공유될 때 소비자 데이터 공유의 구체화된 뷰에 대한 자동 및 증분 새로 고침을 지원합니다. 증분 새로 고침은 Amazon Redshift가 이전 새로 고침 이후에 발생한 기본 테이블의 변경 사항을 식별하고 구체화된 뷰의 해당 레코드만 업데이트하는 작업입니다. 이 동작에 대한 자세한 내용은 [구체화된 뷰 생성](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare)을 참조하세요.

## 증분 새로 고침에 대한 제한 사항
<a name="mv_REFRESH_MARTERIALIZED_VIEW_limitations"></a>

Amazon Redshift는 다음 SQL 요소 중 하나를 사용하는 쿼리로 정의된 구체화된 뷰에 대해 증분 새로 고침을 지원하지 않습니다.
+ OUTER JOIN(RIGHT, LEFT 또는 FULL).
+ 세트 작업: UNION, INTERSECT, EXCEPT, MINUS.
+ UNION ALL이 하위 쿼리 및 집계 함수에서 발생하거나, 쿼리에 GROUP BY 절이 존재하거나, 대상 구체화된 뷰에 정렬 키가 포함된 경우
+ 집계 함수: MEDIAN, PERCENTILE\$1CONT, LISTAGG, STDDEV\$1SAMP, STDDEV\$1POP, APPROXIMATE COUNT, APPROXIMATE PERCENTILE 및 비트 단위 집계 함수.
**참고**  
COUNT, SUM, MIN, MAX 및 AVG 집계 함수가 지원됩니다.
+ DISTINCT COUNT, DISTINCT SUM 등과 같은 DISTINCT 집계 함수.
+ 창 함수.
+ 일반 하위 표현식 최적화와 같은 쿼리 최적화를 위해 임시 테이블을 사용하는 쿼리입니다.
+ 하위 쿼리
+ 구체화된 뷰를 정의하는 쿼리에서 다음 형식을 참조하는 외부 테이블 
  +  Delta Lake 
  +  Hudi 

  위에 나열된 형식 외의 다른 형식을 사용하는 정의된 구체화된 뷰에 대한 증분 새로 고침이 지원됩니다. 자세한 내용은 [Amazon Redshift Spectrum의 외부 데이터 레이크 테이블에 대한 구체화된 뷰외부 데이터 레이크 테이블의 구체화된 뷰](materialized-view-external-table.md) 섹션을 참조하세요.
+ 변경 가능한 함수 - 날짜-시간 함수, RANDOM 및 STABLE이 아닌 사용자 정의 함수 등.
+ 제로 ETL 통합을 위한 증분 새로 고침과 관련된 제한 사항은 [Amazon Redshift와 제로 ETL 통합을 사용할 때 고려할 사항](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html)을 참조하세요.
+ 둘 이상의 데이터베이스에서 테이블에 액세스.

VACUUM과 같은 백그라운드 작업이 구체화된 뷰 새로 고침 작업에 미치는 영향을 포함하여 구체화된 뷰 제한에 대한 자세한 내용은 [사용 노트](#mv_REFRESH_MARTERIALIZED_VIEW_usage) 섹션을 참조하세요.

## 예제
<a name="mv_REFRESH_MARTERIALIZED_VIEW_examples"></a>

다음 예제는 `tickets_mv` 구체화된 보기를 새로 고칩니다.

```
REFRESH MATERIALIZED VIEW tickets_mv;
```

다음 예시에서는 `products_mv` 구체화된 뷰와 그에 종속된 모든 구체화된 뷰를 새로 고칩니다.

```
REFRESH MATERIALIZED VIEW products_mv CASCADE; 
```

# reset
<a name="r_RESET"></a>

구성 파라미터의 값을 기본값으로 복원합니다.

지정된 단일 파라미터 또는 모든 파라미터를 한 번에 재설정할 수 있습니다. 파라미터를 특정 값으로 설정하려면 [SET](r_SET.md) 명령을 사용합니다. 파라미터의 현재 값을 표시하려면 [SHOW](r_SHOW.md) 명령을 사용합니다.

## 구문
<a name="r_RESET-synopsis"></a>

```
RESET { parameter_name | ALL }
```

다음 문은 세션 컨텍스트 변수의 값을 NULL로 설정합니다.

```
RESET { variable_name | ALL }
```

## 파라미터
<a name="r_RESET-parameters"></a>

 *parameter\$1name*   
설정할 파라미터의 이름. 파라미터에 대한 추가 설명서는 [서버 구성 수정](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) 섹션을 참조하세요.

ALL   
모든 세션 컨텍스트 변수를 포함하여 모든 런타임 파라미터를 재설정합니다.

*variable*   
재설정할 변수의 이름입니다. RESET 값이 세션 컨텍스트 변수인 경우 Amazon Redshift는 이를 NULL로 설정합니다.

## 예제
<a name="r_RESET-examples"></a>

다음 예에서는 `query_group` 파라미터를 기본값으로 재설정합니다.

```
reset query_group;
```

다음 예에서는 모든 런타임 파라미터를 기본값으로 재설정합니다.

```
reset all;
```

다음 예에서는 컨텍스트 변수를 재설정합니다.

```
RESET app_context.user_id;
```

# REVOKE
<a name="r_REVOKE"></a>

사용자 또는 역할에서 테이블 생성, 삭제 또는 업데이트 권한과 같은 액세스 권한을 제거합니다.

ON SCHEMA 구문을 사용하는 데이터베이스 사용자 및 역할에 외부 스키마에 대한 사용 권한을 부여하거나 취소할 수 있습니다. AWS Lake Formation에서 ON EXTERNAL SCHEMA를 사용하는 경우 AWS Identity and Access Management(IAM) 역할에 대한 권한의 GRANT 및 REVOKE만 허용됩니다. 권한 목록은 구문을 참조하세요.

저장 프로시저의 경우 USAGE ON LANGUAGE `plpgsql` 권한은 기본적으로 PUBLIC에 허용됩니다. EXECUTE ON PROCEDURE 권한은 기본적으로 소유자 및 수퍼유저에게만 허용됩니다.

REVOKE 명령에서 제거하려는 권한을 지정합니다. 권한을 부여하려면 [GRANT](r_GRANT.md) 명령을 사용합니다.

## 구문
<a name="r_REVOKE-synopsis"></a>

```
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
EXECUTE
    ON FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { EXECUTE } [,...] | ALL [ PRIVILEGES ] }
    ON PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
USAGE
    ON LANGUAGE language_name [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [GRANT OPTION FOR] 
{ { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]    

REVOKE [GRANT OPTION FOR]
{ { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE template_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 테이블에 대한 열 수준 권한 취소
<a name="revoke-column-level"></a>

다음은 Amazon Redshift 테이블 및 뷰에 대한 열 수준 권한에 대한 구문입니다.

```
REVOKE { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }
     FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
     [ RESTRICT ]
```

### ASSUMEROLE 권한 취소
<a name="revoke-assumerole-permissions"></a>

다음은 지정된 역할을 가진 사용자 및 그룹에서 ASSUMEROLE 권한을 취소하는 구문입니다.

```
REVOKE ASSUMEROLE
    ON { 'iam_role' [, ...]  | default | ALL }
    FROM { user_name | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL }
```

### Lake Formation용 Redshift Spectrum에 대한 권한 취소
<a name="revoke-spectrum-integration-with-lf-permissions"></a>

다음은 Lake Formation과 Redshift Spectrum 통합을 위한 구문입니다.

```
REVOKE [ GRANT OPTION FOR ]
{ SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    FROM { IAM_ROLE iam_role } [, ...]

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    FROM { { IAM_ROLE iam_role } [, ...] | PUBLIC }

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    FROM { IAM_ROLE iam_role } [, ...]
```

### 데이터 공유 권한 취소
<a name="revoke-datashare-permissions"></a>

**생산자 측 데이터 공유 권한**  
다음은 REVOKE를 사용하여 사용자 또는 역할에서 ALTER 또는 SHARE 권한을 제거할 때 사용하는 구문입니다. 권한이 취소된 사용자는 더 이상 데이터 공유를 변경하거나 소비자에게 사용 권한을 부여할 수 없습니다.

```
REVOKE { ALTER | SHARE } ON DATASHARE datashare_name
 FROM { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

다음은 REVOKE를 사용하여 데이터 공유에 대한 소비자의 액세스 권한을 제거하는 구문입니다.

```
REVOKE USAGE
 ON DATASHARE datashare_name
 FROM NAMESPACE 'namespaceGUID' [, ...] | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ] [, ...]
```

다음은 Lake Formation 계정에서 데이터 공유 사용 권한을 취소하는 방법의 예입니다.

```
REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012' VIA DATA CATALOG;
```

**소비자 측 데이터 공유 권한**  
다음은 datashare에서 생성된 특정 데이터베이스 또는 스키마에 대한 datashare 사용 권한에 대한 REVOKE 구문입니다. WITH PERMISSIONS 절을 사용하여 생성된 데이터베이스에서 사용 권한을 취소해도 기본 객체에 부여된 객체 수준 권한을 포함하여 사용자 또는 역할에 부여한 추가 권한은 취소되지 않습니다. 해당 사용자 또는 역할에 사용 권한을 다시 부여하면 사용 권한을 취소하기 전에 가졌던 추가 권한이 모두 유지됩니다.

```
REVOKE USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
 FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 범위가 지정된 권한 취소
<a name="revoke-scoped-permissions"></a>

범위가 지정된 권한을 사용하면 데이터베이스 또는 스키마 내 특정 유형의 모든 객체에 대한 권한을 사용자 또는 역할에 부여할 수 있습니다. 범위가 지정된 권한이 있는 사용자와 역할은 데이터베이스 또는 스키마 내의 모든 현재 및 미래 객체에 대한 지정된 권한을 갖습니다.

[SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md)에서 데이터베이스 수준 범위 지정 권한의 범위를 볼 수 있습니다. [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md)에서 스키마 수준 범위 지정 권한의 범위를 볼 수 있습니다.

범위가 지정된 권한에 대한 자세한 내용은 [범위가 지정된 권한](t_scoped-permissions.md) 섹션을 참조하세요.

다음은 사용자 또는 역할에서 범위가 지정된 권한을 취소할 때 사용하는 구문입니다.

```
REVOKE [ GRANT OPTION ] 
{ CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{ SCHEMA schema_name [ DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] USAGE
FOR LANGUAGES IN
DATABASE db_name
FROM { username | ROLE role_name } [, ...]  

REVOKE [GRANT_OPTION] 
{ { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
FROM { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]      

REVOKE [ GRANT OPTION ]
{ {ALTER | DROP  | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]
```

범위가 지정된 권한은 함수에 대한 권한과 프로시저에 대한 권한을 구별하지 않습니다. 예를 들어 다음 문은 `Sales_schema` 스키마의 함수와 프로시저 모두에 대한 `bob`의 `EXECUTE` 권한을 취소합니다.

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

### 기계 학습 권한 취소
<a name="revoke-model-permissions"></a>

다음은 Amazon Redshift의 기계 학습 모델 권한을 위한 구문입니다.

```
REVOKE [ GRANT OPTION FOR ]
    CREATE MODEL FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]
```

### 역할 권한 취소
<a name="revoke-roles"></a>

다음은 Amazon Redshift에서 역할 권한을 취소하기 위한 구문입니다.

```
REVOKE [ ADMIN OPTION FOR ] { ROLE role_name } [, ...] FROM { user_name } [, ...]
```

```
REVOKE { ROLE role_name } [, ...] FROM { ROLE role_name } [, ...]
```

다음은 Amazon Redshift에서 역할에 대한 시스템 권한을 취소하기 위한 구문입니다.

```
REVOKE
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG |
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
FROM { ROLE role_name } [, ...]
```

### 보안 정책에 대한 권한 취소
<a name="revoke-role-level"></a>

다음은 EXPLAIN 계획에서 쿼리의 보안 정책 필터를 설명할 권한을 취소하는 구문입니다. 가능한 보안 정책에는 행 수준 보안 정책 및 동적 데이터 마스킹 정책이 포함됩니다.

```
REVOKE EXPLAIN { RLS | MASKING } FROM ROLE rolename 
```

다음은 쿼리에 대한 행 수준 보안 정책을 우회할 수 있는 권한을 취소하는 구문입니다.

```
REVOKE IGNORE RLS FROM ROLE rolename 
```

다음은 지정된 보안 정책에서 SELECT 권한을 취소하는 구문입니다. 가능한 보안 정책에는 행 수준 보안 정책 및 동적 데이터 마스킹 정책이 포함됩니다.

```
REVOKE SELECT ON [ TABLE ] table_name [, ...]
            FROM { RLS | MASKING } POLICY policy_name [, ...]
```

## 파라미터
<a name="r_REVOKE-parameters"></a>

GRANT OPTION FOR   
다른 사용자에게 지정된 권한을 허용하는 옵션만 취소하고 권한 자체를 취소하지는 않습니다. 그룹 또는 PUBLIC에서 GRANT OPTION을 취소할 수 없습니다.

SELECT   
SELECT 문을 사용하여 테이블 또는 뷰에서 데이터를 선택하는 권한을 취소합니다.

INSERT   
INSERT 문 또는 COPY 문을 사용하여 데이터를 테이블로 로드하는 권한을 취소합니다.

UPDATE   
UPDATE 문을 사용하여 테이블 열을 업데이트하는 권한을 취소합니다.

DELETE   
테이블에서 데이터 행을 삭제하는 권한을 취소합니다.

REFERENCES   
외래 키 제약 조건을 생성하는 권한을 취소합니다. 참조되는 테이블과 참조하는 테이블 모두에 대해 이 권한을 취소해야 합니다.

TRUNCATE  
테이블을 자를 수 있는 권한을 취소합니다. 이 권한이 없으면 테이블 소유자 또는 수퍼유저만 테이블을 자를 수 있습니다. TRUNCATE 명령에 대한 자세한 내용은 [TRUNCATE](r_TRUNCATE.md) 섹션을 참조하세요.

ALL [ PRIVILEGES ]   
지정된 사용자 또는 그룹에서 사용 가능한 모든 권한을 한 번에 취소합니다. PRIVILEGES 키워드는 옵션입니다.  
 Amazon Redshift는 RULE 및 TRIGGER 권한을 지원하지 않습니다. 자세한 내용은 [지원되지 않는 PostgreSQL 기능](c_unsupported-postgresql-features.md) 섹션을 참조하세요.

ALTER  
데이터베이스 객체에 따라, 사용자 또는 사용자 그룹에서 다음 권한을 취소합니다.  
+ 테이블의 경우 ALTER는 테이블 또는 뷰를 변경할 수 있는 권한을 철회합니다. 자세한 내용은 [ALTER TABLE](r_ALTER_TABLE.md) 섹션을 참조하세요.
+ 데이터베이스의 경우 ALTER는 데이터베이스를 변경할 수 있는 권한을 철회합니다. 자세한 내용은 [ALTER DATABASE](r_ALTER_DATABASE.md) 섹션을 참조하세요.
+ 스키마의 경우 ALTER는 스키마를 변경할 수 있는 권한을 철회합니다. 자세한 내용은 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 섹션을 참조하세요.
+ 외부 테이블의 경우 ALTER는 Lake Formation에 활성화된 AWS Glue Data Catalog의 테이블을 변경할 수 있는 권한을 철회합니다. 이 권한은 Lake Formation을 사용하는 경우에만 적용됩니다.

DROP  
데이터베이스 객체에 따라, 사용자 또는 역할에서 다음 권한을 취소합니다.  
+  테이블의 경우 DROP은 테이블 또는 뷰를 삭제할 수 있는 권한을 취소합니다. 자세한 내용은 [DROP TABLE](r_DROP_TABLE.md) 섹션을 참조하세요.
+  데이터베이스의 경우 DROP은 데이터베이스를 삭제할 수 있는 권한을 취소합니다. 자세한 내용은 [DROP DATABASE](r_DROP_DATABASE.md) 섹션을 참조하세요.
+  스키마의 경우 DROP은 스키마를 삭제할 수 있는 권한을 취소합니다. 자세한 내용은 [DROP SCHEMA](r_DROP_SCHEMA.md) 섹션을 참조하세요.

ASSUMEROLE  <a name="assumerole"></a>
지정된 역할을 가진 사용자, 역할 또는 그룹에서 COPY, UNLOAD, EXTERNAL FUNCTION 또는 CREATE MODEL 명령을 실행할 수 있는 권한을 취소합니다.

ON [ TABLE ] *table\$1name*   
테이블 또는 뷰에 대해 지정된 권한을 취소합니다. TABLE 키워드는 옵션입니다.

ON ALL TABLES IN SCHEMA *schema\$1name*   
참조되는 스키마에 있는 모든 테이블에 대해 지정된 권한을 취소합니다.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="revoke-column-level-privileges"></a>
Amazon Redshift 테이블 또는 뷰의 지정된 열에서 사용자, 그룹 또는 PUBLIC에서 지정된 권한을 취소합니다.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table-column"></a>
참조된 스키마에서 Lake Formation 테이블의 지정된 열에 있는 IAM 역할에 지정된 권한을 취소합니다.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table"></a>
참조된 스키마에 지정된 Lake Formation 테이블의 IAM 역할에서 지정된 권한을 취소합니다.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="revoke-external-schema"></a>
참조된 스키마에 있는 IAM 역할에서 지정된 권한을 취소합니다.

FROM IAM\$1ROLE *iam\$1role*   <a name="revoke-from-iam-role"></a>
권한을 잃는 IAM 사용자를 나타냅니다.

ROLE *role\$1name*   
지정된 역할에서 권한을 취소합니다.

GROUP *group\$1name*   
지정된 사용자 그룹에서 권한을 취소합니다.

PUBLIC   
모든 사용자에게서 지정된 권한을 취소합니다. PUBLIC은 모든 사용자를 항상 포함하는 그룹을 나타냅니다. 개별 사용자의 권한은 PUBLIC에 부여된 권한, 사용자가 속한 그룹에 부여된 권한, 사용자에게 개별적으로 부여된 모든 권한의 합입니다.  
Lake Formation 외부 테이블에서 PUBLIC을 취소하면 Lake Formation *모든 사람* 그룹에서 권한이 취소됩니다.

CREATE   
데이터베이스 객체에 따라, 사용자 또는 그룹에서 다음 권한을 취소합니다.  
+ 데이터베이스의 경우 REVOKE를 위한 CREATE 절을 사용하면 사용자가 데이터베이스 내에 스키마를 생성하지 못합니다.
+ 스키마의 경우 REVOKE를 위한 CREATE 절을 사용하면 사용자가 스키마 내에 객체를 생성하지 못합니다. 객체의 이름을 바꾸려면 사용자가 CREATE 권한이 있고 이름을 바꿀 객체를 소유해야 합니다.
기본적으로 모든 사용자는 PUBLIC 스키마에서 CREATE 및 USAGE 권한을 갖습니다.

TEMPORARY \$1 TEMP   
지정된 데이터베이스에서 임시 테이블을 생성할 권한을 취소합니다.  
기본적으로, 사용자는 PUBLIC 그룹에서 자동 멤버십으로 임시 테이블을 생성할 권한이 허용됩니다. 임의의 사용자가 임시 테이블을 생성할 권한을 제거하려면 PUBLIC 그룹에서 TEMP 권한을 취소한 다음, 특정 사용자 또는 사용자 그룹에 임시 테이블을 생성할 권한을 명시적으로 허용하세요.

ON DATABASE *db\$1name*   
지정된 데이터베이스에 대한 권한을 취소합니다.

객체   
특정 스키마 내의 객체에 대한 USAGE 권한을 취소하여 사용자가 객체에 액세스할 수 없게 만듭니다. 이런 객체에 대한 특정한 작업은 따로 취소해야 합니다(예: 함수에 대한 EXECUTE 권한).  
기본적으로 모든 사용자는 PUBLIC 스키마에서 CREATE 및 USAGE 권한을 갖습니다.

ON SCHEMA *schema\$1name*   
지정된 스키마에 대한 권한을 취소합니다. 스키마 권한을 사용하여 테이블의 생성을 제어할 수 있으며, 데이터베이스에 대한 CREATE 권한으로는 스키마의 생성만 제어할 수 있습니다.

RESTRICT   
사용자가 직접 부여한 권한만 취소합니다. 이것이 기본 동작입니다.

EXECUTE ON PROCEDURE *procedure\$1name*   
특정 저장 프로시저에 대해 EXECUTE 권한을 취소합니다. 저장 프로시저 이름은 오버로딩될 수 있기 때문에 해당 프로시저에 대한 인수 목록을 포함해야 합니다. 자세한 내용은 [저장 프로시저 명명](stored-procedure-naming.md) 섹션을 참조하세요.

EXECUTE ON ALL PROCEDURES IN SCHEMA *procedure\$1name*   
참조되는 스키마에 있는 모든 프로시저에 대해 지정된 권한을 취소합니다.

USAGE ON LANGUAGE *language\$1name*   
언어에 대한 USAGE 권한을 취소합니다. Python 사용자 정의 함수(UDF)에는 `plpythonu`를 사용합니다. SQL UDF에는 `sql`을 사용합니다. 저장 프로시저에는 `plpgsql`을 사용합니다.  
UDF를 새로 만들려면 SQL 또는 `plpythonu`(Python)에 대한 언어에 사용 권한이 필요합니다. 기본적으로 USAGE ON LANGUAGE SQL은 PUBLIC에 허용됩니다. 그러나 특정 사용자 또는 그룹에 USAGE ON LANGUAGE PLPYTHONU 권한을 명시적으로 허용해야 합니다.  
SQL에 대한 사용을 취소하려면 먼저 PUBLIC에서의 사용을 취소해야 합니다. 그런 다음 SQL UDF 생성이 허용된 사용자 또는 그룹에게만 SQL에 대한 사용 권한을 허용합니다. 다음은 PUBLIC에서의 SQL 사용을 취소한 후 사용자 그룹 `udf_devs`에 사용을 허용하는 예시입니다.  

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```
자세한 내용은 [UDF 보안 및 권한](udf-security-and-privileges.md) 섹션을 참조하세요.  
저장 프로시저에 대한 사용을 취소하려면 먼저 PUBLIC에서의 사용을 취소해야 합니다. 그런 다음 저장 프로시저 생성이 허용된 사용자 또는 그룹에게만 `plpgsql`에 대한 사용 권한을 허용합니다. 자세한 내용은 [저장 프로시저의 보안 및 권한](stored-procedure-security-and-privileges.md) 섹션을 참조하세요.

ON COPY JOB *job\$1name*  <a name="on-copy-job-revoke"></a>
복사 작업에 대해 지정된 권한을 취소합니다.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]  <a name="revoke-for"></a>
권한이 취소되는 SQL 명령을 지정합니다. ALL을 지정하여 COPY, UNLOAD, EXTERNAL FUNCTION 및 CREATE MODEL 문에 대한 권한을 취소할 수 있습니다. 이 절은 ASSUMEROLE 권한을 취소하는 경우에만 적용됩니다.

ALTER  
데이터 공유를 소유하지 않은 사용자 또는 사용자 그룹이 데이터 공유를 변경할 수 있도록 하는 ALTER 권한을 취소합니다. 이 권한은 데이터 공유에서 객체를 추가 또는 제거하거나 PUBLICACCESSIBLE 속성을 설정하는 데 필요합니다. 자세한 내용은 [ALTER DATASHARE](r_ALTER_DATASHARE.md) 섹션을 참조하세요.

SHARE  
사용자 및 사용자 그룹이 데이터 공유에 소비자를 추가할 수 있는 권한을 취소합니다. 특정 소비자가 해당 클러스터에서 데이터 공유에 액세스하지 못하게 하려면 이 권한을 취소해야 합니다.

ON DATASHARE *datashare\$1name *  
참조된 데이터 공유에 대해 지정된 권한을 부여합니다.

FROM username  
권한을 잃는 사용자를 나타냅니다.

FROM GROUP *group\$1name*  
권한을 잃는 사용자 그룹을 나타냅니다.

WITH GRANT OPTION  
권한을 잃은 사용자가 다른 사용자의 동일한 권한을 취소할 수 있음을 나타냅니다. 그룹 또는 PUBLIC에 대해 WITH GRANT OPTION을 취소할 수 없습니다.

객체  
소비자 계정 또는 동일한 계정 내의 네임스페이스에 대해 USAGE가 취소되면 지정된 소비자 계정 또는 계정 내의 네임스페이스는 읽기 전용 방식으로 datashare 및 datashare 객체에 액세스할 수 없습니다.  
USAGE 권한을 취소하면 소비자에게서 데이터 공유에 대한 액세스 권한이 취소됩니다.

FROM NAMESPACE 'clusternamespace GUID'  
소비자가 데이터 공유에 대한 권한을 상실한 동일한 계정의 네임스페이스를 나타냅니다. 네임스페이스는 128비트 영숫자 전역 고유 식별자(GUID)를 사용합니다.

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
소비자가 데이터 공유에 대한 권한을 상실한 다른 계정의 계정 번호를 나타냅니다. 'VIA DATA CATALOG'를 지정하면 Lake Formation 계정에서 데이터 공유 사용이 취소됨을 나타냅니다. 계정 번호를 생략하면 클러스터를 소유한 계정에서 해지한다는 의미입니다.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="revoke-datashare"></a>
지정된 데이터 공유에서 생성된 지정된 데이터베이스에 대해 지정된 사용 권한을 취소합니다.

ON SCHEMA* shared\$1schema*   <a name="revoke-datashare"></a>
지정된 데이터 공유에서 생성된 지정된 스키마에 대해 지정된 권한을 취소합니다.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
권한을 취소할 데이터베이스 객체를 지정합니다. IN 다음의 파라미터는 취소된 권한의 범위를 정의합니다.

CREATE MODEL  
지정된 데이터베이스에서 기계 학습 모델을 생성하기 위한 CREATE MODEL 권한을 취소합니다.

ON MODEL *model\$1name*  
특정 모델에 대해 EXECUTE 권한을 취소합니다.

ACCESS CATALOG  
역할이 액세스할 수 있는 객체의 관련 메타데이터를 볼 수 있는 권한을 취소합니다.

[ ADMIN OPTION FOR ] \$1 role \$1 [, ...]  
WITH ADMIN OPTION이 있는 지정된 사용자로부터 취소한 역할.

FROM \$1 role \$1 [, ...]  
지정된 역할을 취소하는 역할.

EXPLAIN \$1 RLS \$1 MASKING \$1 FROM ROLE *rolename*  
EXPLAIN 계획에서 쿼리의 보안 정책 필터를 설명할 수 있는 특정 역할의 권한을 취소합니다. RLS는 행 수준 보안 정책 필터를 설명할 수 있는 권한을 취소합니다. MASKING은 동적 데이터 마스킹 정책 필터를 설명할 수 있는 권한을 취소합니다.

IGNORE RLS FROM ROLE *rolename*   
쿼리에 대한 행 수준 보안 정책을 우회할 수 있는 특정 역할의 권한을 취소합니다.

FROM \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
권한을 잃는 보안 정책을 나타냅니다. TO RLS POLICY는 행 수준 보안 정책을 나타냅니다. TO MASKING POLICY는 동적 데이터 마스킹 정책을 나타냅니다.

## 사용 노트
<a name="r_REVOKE-usage-notes-link"></a>

REVOKE 사용 노트에 대한 자세한 내용은 [사용 노트](r_REVOKE-usage-notes.md) 섹션을 참조하세요.

## 예제
<a name="r_REVOKE-examples-link"></a>

REVOKE 사용 방법의 예는 [예제](r_REVOKE-examples.md) 섹션을 참조하세요.

# 사용 노트
<a name="r_REVOKE-usage-notes"></a>

객체에서 권한을 취소하려면 다음 조건 중 하나를 충족해야 합니다.
+ 객체 소유자입니다.
+ 수퍼유저입니다.
+ 그 객체와 권한에 대해 허용된 권한이 있습니다.

  예를 들어, 다음 명령을 실행하면 사용자 HR은 직원 테이블에서 SELECT 명령을 수행할 뿐 아니라 다른 사용자에 대해 같은 권한을 허용하고 취소할 수 있습니다.

  ```
  grant select on table employees to HR with grant option;
  ```

  HR은 SELECT 이외의 작업 권한이나 직원 이외의 테이블에 대한 권한을 취소할 수 없습니다.

수퍼유저는 객체 권한을 설정하는 GRANT 및 REVOKE 명령과는 무관하게 모든 객체에 액세스할 수 있습니다.

PUBLIC은 모든 사용자를 항상 포함하는 그룹을 나타냅니다. 기본적으로 모든 PUBLIC 구성원은 PUBLIC 스키마에서 CREATE 및 USAGE 권한을 갖습니다. PUBLIC 스키마에 대한 사용자 권한을 제한하려면 먼저 PUBLIC 스키마에 대한 PUBLIC의 모든 권한을 취소한 다음 특정 사용자 혹은 그룹에게 권한을 허용합니다. 다음 예에서는 PUBLIC 스키마에서 테이블 생성 권한을 제어합니다.

```
revoke create on schema public from public;
```

Lake Formation 테이블에서 권한을 취소하려면 해당 테이블의 외부 스키마와 연결된 IAM 역할에 외부 테이블의 권한을 취소할 권한이 있어야 합니다. 다음 예제에서는 연결된 IAM 역할 `myGrantor`가 있는 외부 스키마를 생성합니다. IAM 역할 `myGrantor`는 다른 사람의 권한을 취소할 권한이 있습니다. REVOKE 명령은 외부 스키마와 연결된 IAM 역할 `myGrantor`의 권한을 사용하여 IAM 역할 `myGrantee`의 권한을 취소합니다.

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
revoke select
on external table mySchema.mytable
from iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

**참고**  
IAM 역할에 Lake Formation에 사용되는 AWS Glue Data Catalog의 `ALL` 권한도 있는 경우 `ALL` 권한이 취소되지 않습니다. `SELECT` 권한만 취소됩니다. Lake Formation 콘솔에서 Lake Formation 권한을 볼 수 있습니다.

## ASSUMEROLE 권한 취소에 대한 사용 노트
<a name="r_REVOKE-usage-notes-assumerole"></a>

다음 사용 노트는 Amazon Redshift에서 ASSUMEROLE 권한을 취소하는 데 적용됩니다.

데이터베이스 슈퍼 사용자만 사용자 및 그룹에 대한 ASSUMEROLE 권한을 취소할 수 있습니다. 슈퍼 사용자는 항상 ASSUMEROLE 권한을 유지합니다.

사용자와 그룹에 ASSUMEROLE 권한을 사용하도록 설정하기 위해 슈퍼 사용자가 클러스터에서 다음 문을 한 번 실행합니다. 사용자와 그룹에 ASSUMEROLE 권한을 부여하기 전에 슈퍼 사용자가 클러스터에서 다음 문을 한 번 실행해야 합니다.

```
revoke assumerole on all from public for all;
```

## 기계 학습 권한 취소에 대한 사용 노트
<a name="r_REVOKE-usage-notes-create-model"></a>

ML 함수와 관련된 권한을 직접 부여하거나 취소할 수 없습니다. ML 함수는 ML 모델에 속하며 권한은 모델을 통해 제어됩니다. 대신 ML 모델과 관련된 권한을 취소할 수 있습니다. 다음 예제는 `customer_churn` 모델과 연결된 모든 사용자로부터 실행 권한을 취소하는 방법을 보여줍니다.

```
REVOKE EXECUTE ON MODEL customer_churn FROM PUBLIC;
```

ML 모델 `customer_churn`에 대한 사용자의 모든 권한을 취소할 수도 있습니다.

```
REVOKE ALL on MODEL customer_churn FROM ml_user;
```

스키마에 ML 함수가 있는 경우 해당 ML 함수가 이미 `GRANT EXECUTE ON MODEL`을 통해 `EXECUTE` 권한을 부여받았더라도 ML 함수와 관련된 `EXECUTE` 권한 부여 또는 취소는 실패합니다. `CREATE MODEL` 명령을 사용할 때는 별도의 스키마를 사용하여 ML 함수를 별도의 스키마에 따로 보관하는 것이 좋습니다. 다음 예제에서는 이 작업을 수행하는 방법을 보여 줍니다.

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# 예제
<a name="r_REVOKE-examples"></a>

다음 예에서는 GUESTS 사용자 그룹에서 SALES 테이블에 대한 INSERT 권한을 취소합니다. 이 명령을 실행하면 GUESTS의 구성원이 INSERT 명령을 사용하여 SALES 테이블로 데이터를 로드할 수 없게 됩니다.

```
revoke insert on table sales from group guests;
```

다음 예에서는 사용자 `fred`에게서 QA\$1TICKIT 스키마에 있는 모든 테이블에 대한 SELECT 권한을 취소합니다.

```
revoke select on all tables in schema qa_tickit from fred;
```

다음 예에서는 사용자 `bobr`에 대한 뷰에서 선택할 권한을 취소합니다.

```
revoke select on table eventview from bobr;
```

다음 예에서는 모든 사용자에게서 TICKIT 데이터베이스에 임시 테이블을 만들 권한을 취소합니다.

```
revoke temporary on database tickit from public;
```

다음 예에서는 사용자 `cust_name`에게서 `cust_phone` 테이블의 `cust_profile` 및 `user1` 열에 대한 SELECT 권한을 취소합니다.

```
revoke select(cust_name, cust_phone) on cust_profile from user1;
```

다음 예에서는 `cust_name` 그룹에서 `cust_phone` 테이블의 `cust_contact_preference` 및 `cust_profile` 열에 대한 SELECT 권한과 `sales_group` 열에 대한 UPDATE 권한을 취소합니다.

```
revoke select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile from group sales_group;
```

다음 예에서는 ALL 키워드를 사용하여 `cust_profile` 그룹에서 `sales_admin` 테이블의 세 열에 대한 SELECT 및 UPDATE 권한을 모두 취소하는 것을 보여 줍니다.

```
revoke ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile from group sales_admin;
```

다음 예에서는 `cust_name` 사용자에게서 `cust_profile_vw` 뷰의 `user2` 열에 대한 SELECT 권한을 취소합니다.

```
revoke select(cust_name) on cust_profile_vw from user2;
```

## 데이터 공유에서 생성된 데이터베이스에서 USAGE 권한 취소의 예
<a name="r_REVOKE-examples-datashare"></a>

다음 예시에서는 `13b8833d-17c6-4f16-8fe4-1a018f5ed00d` 네임스페이스에서 `salesshare` 데이터 공유에 대한 액세스 권한을 취소합니다.

```
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

다음 예시에서는 `Bob`에게서 `sales_db`에 대한 USAGE 권한을 취소합니다.

```
REVOKE USAGE ON DATABASE sales_db FROM Bob;
```

다음 예시에서는 `Analyst_role`에게서 `sales_schema`에 대한 USAGE 권한을 취소합니다.

```
REVOKE USAGE ON SCHEMA sales_schema FROM ROLE Analyst_role;
```

## 범위가 지정된 권한 취소의 예
<a name="r_REVOKE-examples-scoped"></a>

다음 예시에서는 `Sales_db` 데이터베이스의 모든 현재 및 미래 스키마에 대한 사용 권한을 `Sales` 역할에게서 취소합니다.

```
REVOKE USAGE FOR SCHEMAS IN DATABASE Sales_db FROM ROLE Sales;
```

다음 예시에서는 `Sales_db` 데이터베이스의 모든 현재 및 미래 테이블에 대한 SELECT 권한을 부여하는 권한을 `alice`라는 사용자에게서 취소합니다. `alice`는 `Sales_db`의 모든 테이블에 대한 액세스 권한을 유지합니다.

```
REVOKE GRANT OPTION SELECT FOR TABLES IN DATABASE Sales_db FROM alice;
```

다음 예시에서는 `Sales_schema` 스키마의 함수에 대한 EXECUTE 권한을 `bob`이라는 사용자에게서 취소합니다.

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

다음 예시에서는 `ShareDb` 데이터베이스의 `ShareSchema` 스키마에 있는 모든 테이블에 대한 모든 권한을 `Sales` 역할에게서 취소합니다. 스키마를 지정할 때 두 부분으로 구성된 `database.schema` 형식을 사용하여 스키마의 데이터베이스를 지정할 수도 있습니다.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema FROM ROLE Sales;
```

다음 예시는 이전 예시와 동일합니다. 두 부분으로 구성된 형식을 사용하는 대신 `DATABASE` 키워드를 사용하여 스키마의 데이터베이스를 지정할 수 있습니다.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb FROM ROLE Sales;
```

## ASSUMEROLE 권한 취소의 예
<a name="r_REVOKE-examples-assumerole"></a>

다음은 ASSUMEROLE 권한을 취소하는 예입니다.

슈퍼 사용자는 클러스터에서 다음 문을 한 번 실행하여 사용자와 그룹에 ASSUMEROLE 권한을 사용하도록 설정해야 합니다.

```
revoke assumerole on all from public for all;
```

다음 문은 모든 작업에 대한 모든 역할에 대한 사용자 reg\$1user1의 ASSUMEROLE 권한을 취소합니다.

```
revoke assumerole on all from reg_user1 for all;
```

## ROLE 권한 취소의 예
<a name="r_REVOKE-examples-role"></a>

다음은 sample\$1role1을 sample\$1role2에서 취소하는 예입니다.

```
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO ROLE sample_role2;
REVOKE ROLE sample_role1 FROM ROLE sample_role2;
```

다음은 user1에서 시스템 권한을 취소하는 예입니다.

```
GRANT ROLE sys:DBA TO user1;
REVOKE ROLE sys:DBA FROM user1;
```

다음은 sample\$1role1 및 sample\$1role2를 user1에서 취소하는 예입니다.

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1, ROLE sample_role2 TO user1;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM user1;
```

다음은 user1에서 ADMIN OPTION을 사용하여 sample\$1role2를 취소하는 예입니다.

```
GRANT ROLE sample_role2 TO user1 WITH ADMIN OPTION;
REVOKE ADMIN OPTION FOR ROLE sample_role2 FROM user1;
REVOKE ROLE sample_role2 FROM user1;
```

다음은 sample\$1role1 및 sample\$1role2를 sample\$1role5에서 취소하는 예입니다.

```
CREATE ROLE sample_role5;
GRANT ROLE sample_role1, ROLE sample_role2 TO ROLE sample_role5;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM ROLE sample_role5;
```

다음은 sample\$1role1에 대한 CREATE SCHEMA 및 DROP SCHEMA 시스템 권한을 취소하는 예입니다.

```
GRANT CREATE SCHEMA, DROP SCHEMA TO ROLE sample_role1;
REVOKE CREATE SCHEMA, DROP SCHEMA FROM ROLE sample_role1;
```

# ROLLBACK
<a name="r_ROLLBACK"></a>

현재 트랜잭션을 중지하고 그 트랜잭션에서 이루어진 모든 업데이트를 삭제합니다.

이 명령은 [ABORT](r_ABORT.md) 명령과 똑같은 기능을 수행합니다.

## 구문
<a name="r_ROLLBACK-synopsis"></a>

```
ROLLBACK [ WORK | TRANSACTION ]
```

## 파라미터
<a name="r_ROLLBACK-parameters"></a>

Work  
선택적 키워드입니다. 이 키워드는 저장 프로시저 내에서 지원되지 않습니다.

TRANSACTION  
선택적 키워드입니다. WORK와 TRANSACTION은 동의어입니다. 둘 다 저장 프로시저 내에서 지원되지 않습니다.

저장 프로시저 내의 ROLLBACK 사용에 대한 자세한 내용은 [트랜잭션 관리](stored-procedure-transaction-management.md)를 참조하세요.

## 예제
<a name="r_ROLLBACK-example"></a>

다음 예에서는 테이블을 생성한 다음에 데이터가 테이블에 삽입되는 트랜잭션을 시작합니다. 그런 다음 ROLLBACK 명령으로 데이터 삽입을 롤백하여 테이블이 비어 있는 상태로 둡니다.

다음 명령을 실행하면 MOVIE\$1GROSS라는 예 테이블이 생성됩니다.

```
create table movie_gross( name varchar(30), gross bigint );
```

다음 명령 세트는 테이블에 2개의 데이터 행을 삽입하는 트랜잭션을 시작합니다.

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

다음으로, 아래 명령을 실행하면 데이터가 올바로 삽입되었음을 보여주기 위해 테이블에서 해당 데이터가 선택됩니다.

```
select * from movie_gross;
```

명령 출력에는 두 행 모두 올바로 삽입된 것으로 표시됩니다.

```
name           |  gross
-------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

이제는 다음 명령으로 트랜잭션이 시작된 지점으로 데이터 변경 내용을 롤백합니다.

```
rollback;
```

테이블에서 데이터를 선택하면 빈 테이블이 표시됩니다.

```
select * from movie_gross;

name | gross
------+-------
(0 rows)
```

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

테이블, 뷰 및 사용자 정의 함수에서 행을 반환합니다.

**참고**  
단일 SQL 문의 최대 크기는 16MB입니다.

## 구문
<a name="r_SELECT_synopsis-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

**Topics**
+ [구문](#r_SELECT_synopsis-synopsis)
+ [WITH 절](r_WITH_clause.md)
+ [SELECT 목록](r_SELECT_list.md)
+ [EXCLUDE column\$1list](r_EXCLUDE_list.md)
+ [FROM 절](r_FROM_clause30.md)
+ [WHERE 절](r_WHERE_clause.md)
+ [GROUP BY 절](r_GROUP_BY_clause.md)
+ [HAVING 절](r_HAVING_clause.md)
+ [QUALIFY 절](r_QUALIFY_clause.md)
+ [UNION, INTERSECT 및 EXCEPT](r_UNION.md)
+ [ORDER BY 절](r_ORDER_BY_clause.md)
+ [CONNECT BY 절](r_CONNECT_BY_clause.md)
+ [하위 쿼리 예](r_Subquery_examples.md)
+ [상관관계가 있는 하위 쿼리](r_correlated_subqueries.md)

# WITH 절
<a name="r_WITH_clause"></a>

WITH 절은 쿼리에 있는 SELECT 목록에 선행하는 선택적 절입니다. WITH 절은 하나 이상의 *common\$1table\$1expressions*를 정의합니다. 각 공통 테이블 표현식(CTE) 은 뷰 정의와 유사한 임시 테이블을 정의합니다. FROM 절에서 이러한 임시 테이블을 참조할 수 있습니다. 임시 테이블은 자신이 속한 쿼리가 실행되는 동안에만 사용됩니다. WITH 절에 있는 각각의 CTE는 테이블 이름, 열 이름의 선택적 목록, 테이블로 평가되는 쿼리 표현식(SELECT 문)을 지정합니다. 임시 테이블 이름을 정의하는 동일한 쿼리 식의 FROM 절에서 임시 테이블 이름을 참조하는 경우 CTE는 재귀적입니다.

WITH 절 하위 쿼리는 단일 쿼리를 실행하는 내내 사용 가능한 테이블을 정의하는 효율적인 방법입니다. 모든 경우에 있어 SELECT 문의 본문에 하위 쿼리를 사용하여 같은 결과를 얻을 수 있지만, WITH 절 하위 쿼리는 더 간단하게 쓰고 읽을 수 있습니다. 가능한 경우 여러 번 참조되는 WITH 절 하위 쿼리는 공통 하위 표현식으로 최적화됩니다. 즉, WITH 하위 쿼리를 한 번 평가하고 그 결과를 재사용할 수 있습니다. (공통 하위 표현식은 WITH 절에 정의되는 하위 표현식으로 제한되지 않습니다.)

## 구문
<a name="r_WITH_clause-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
```

여기서 *common\$1table\$1expression*은 비재귀적이거나 재귀적일 수 있습니다. 다음은 비재귀 형식입니다.

```
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
```

다음은 *common\$1table\$1expression*의 재귀 형식입니다.

```
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
```

## 파라미터
<a name="r_WITH_clause-parameters"></a>

 RECURSIVE   
쿼리를 재귀 CTE로 식별하는 키워드입니다. WITH 절에 정의된 *common\$1table\$1expression*이 재귀적이면 이 키워드가 필요합니다. WITH 절에 여러 재귀 CTE가 포함된 경우에도 WITH 키워드 바로 다음에 RECURSIVE 키워드를 한 번만 지정할 수 있습니다. 일반적으로 재귀 CTE는 두 부분으로 구성된 UNION ALL 하위 쿼리입니다.

 *common\$1table\$1expression*   
[FROM 절](r_FROM_clause30.md)에서 참조할 수 있는 임시 테이블을 정의하고 해당 테이블이 속한 쿼리 실행 중에만 사용됩니다.

 *CTE\$1table\$1name*   
WITH 절 하위 쿼리의 결과를 정의하는 임시 테이블의 고유한 이름입니다. 단일 WITH 절 내에서 중복되는 이름을 사용할 수 없습니다. 각각의 하위 쿼리에는 [FROM 절](r_FROM_clause30.md)에서 참조될 수 있는 테이블 이름이 주어져야 합니다.

 *column\$1name*   
 WITH 절 하위 쿼리에 대한 출력 열 이름의 목록으로, 쉼표로 구분됩니다. 지정되는 열 이름의 수는 하위 쿼리로 정의되는 열 개수보다 적거나 같아야 합니다. 비재귀 CTE의 경우 *column\$1name* 절은 옵션입니다. 재귀 CTE의 경우 *column\$1name* 목록은 필수입니다.

 *query*()   
 Amazon Redshift에서 지원하는 SELECT 쿼리입니다. [SELECT](r_SELECT_synopsis.md)을(를) 참조하세요.

 *recursive\$1query*   
2개의 SELECT 하위 쿼리로 구성된 UNION ALL 쿼리:  
+ 첫 번째 SELECT 하위 쿼리에는 동일한 *CTE\$1table\$1name*에 대한 재귀 참조가 없습니다. 재귀의 초기 시드인 결과 집합을 반환합니다. 이 부분을 초기 멤버 또는 시드 멤버라고 합니다.
+ 두 번째 SELECT 하위 쿼리는 FROM 절에서 동일한 *CTE\$1table\$1name*을 참조합니다. 이를 재귀 멤버라고합니다. *recursive\$1query*는 *recursive\$1query*를 종료하기 위한 WHERE 조건을 포함합니다.

## 사용 노트
<a name="r_WITH_clause-usage-notes"></a>

다음 SQL 문에 WITH 절을 사용할 수 있습니다.
+ SELECT 
+ SELECT INTO
+ CREATE TABLE AS
+ CREATE VIEW
+ DECLARE
+ EXPLAIN
+ INSERT INTO...SELECT 
+ PREPARE
+ UPDATE(WHERE 절 하위 쿼리 내. 하위 쿼리에서 재귀 CTE를 정의할 수 없습니다. 재귀 CTE는 UPDATE 절 앞에 와야 합니다.)
+ DELETE

WITH 절을 포함한 쿼리의 FROM 절이 WITH 절로 정의되는 테이블 중 참조하지 않는 테이블이 있을 경우 WITH 절이 무시되고 쿼리가 정상적으로 실행됩니다.

WITH 절 하위 쿼리로 정의되는 테이블은 WITH 절이 시작하는 SELECT 쿼리의 범위에서만 참조될 수 있습니다. 예를 들어, SELECT 목록, WHERE 절 또는 HAVING 절에 있는 하위 쿼리의 FROM 절에서 그와 같은 테이블을 참조할 수 있습니다. 하위 쿼리에 WITH 절을 사용할 수 없고 기본 쿼리 또는 다른 하위 쿼리의 FROM 절에서 WITH 절의 테이블을 참조할 수 없습니다. 이 쿼리 패턴으로 인해 WITH 절 테이블에 대해 `relation table_name doesn't exist` 형식의 오류 메시지가 발생합니다.

WITH 절 하위 쿼리 내에서 다른 WITH 절을 지정할 수 없습니다.

WITH 절 하위 쿼리에 의해 정의되는 테이블에 대한 전방 참조를 할 수 없습니다. 예를 들어, 다음 쿼리는 테이블 W1의 정의에서 테이블 W2에 대한 전방 참조 때문에 오류를 반환합니다.

```
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR:  relation "w2" does not exist
```

WITH 절 하위 쿼리는 SELECT INTO 문으로 구성되지 않을 수 있지만, SELECT INTO 문에 WITH 절을 사용할 수 있습니다.

## 재귀적인 공통 테이블 표현식
<a name="r_WITH_clause-recursive-cte"></a>

재귀 *공통 테이블 표현식(CTE)*은 자신을 참조하는 CTE입니다. 재귀 CTE는 직원과 관리자 간의 보고 관계를 보여주는 조직도와 같은 계층적 데이터를 쿼리하는 데 유용합니다. [예: 재귀 CTE](#r_WITH_clause-recursive-cte-example)을(를) 참조하세요.

또 다른 일반적인 용도는 제품이 여러 구성 요소로 이루어지고 각 구성 요소 자체도 다른 구성 요소 또는 하위 어셈블리로 이루어진 다단계 BOM입니다.

재귀 쿼리의 두 번째 SELECT 하위 쿼리에 WHERE 절을 포함하여 재귀 깊이를 제한해야 합니다. 문제 해결 예는 [예: 재귀 CTE](#r_WITH_clause-recursive-cte-example)을(를) 참조하세요. 그렇지 않으면 다음과 비슷한 오류가 발생할 수 있습니다.
+ `Recursive CTE out of working buffers.`
+ `Exceeded recursive CTE max rows limit, please add correct CTE termination predicates or change the max_recursion_rows parameter.`

**참고**  
`max_recursion_rows`는 무한 재귀 루프를 방지하기 위해 재귀 CTE가 반환할 수 있는 최대 행 수를 설정하는 파라미터입니다. 이 값을 기본값보다 큰 값으로 변경하지 않는 것이 좋습니다. 이렇게 하면 쿼리의 무한 재귀 문제가 클러스터에서 과도한 공간을 차지하는 것을 방지할 수 있습니다.

 재귀 CTE 결과에 대한 정렬 순서 및 제한을 지정할 수 있습니다. 재귀 CTE의 최종 결과에 group by 및 distinct 옵션을 포함할 수 있습니다.

하위 쿼리 내에 WITH RECURSIVE 절을 지정할 수 없습니다. *recursive\$1query* 멤버는 order by 또는 limit 절을 포함할 수 없습니다.

## 예제
<a name="r_WITH_clause-examples"></a>

다음 예에서는 WITH 절을 포함하는 쿼리로서 가능한 가장 간단한 사례를 보여줍니다. VENUECOPY라는 이름의 WITH 쿼리는 VENUE 테이블에서 모든 행을 선택합니다. 다음에는 기본 쿼리가 VENUECOPY에서 모든 행을 선택합니다. VENUECOPY 테이블은 이 쿼리의 지속 시간 동안에만 존재합니다.

```
with venuecopy as (select * from venue)
select * from venuecopy order by 1 limit 10;
```

```
 venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |          0
2 | Columbus Crew Stadium      | Columbus        | OH         |          0
3 | RFK Stadium                | Washington      | DC         |          0
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |          0
5 | Gillette Stadium           | Foxborough      | MA         |      68756
6 | New York Giants Stadium    | East Rutherford | NJ         |      80242
7 | BMO Field                  | Toronto         | ON         |          0
8 | The Home Depot Center      | Carson          | CA         |          0
9 | Dick's Sporting Goods Park | Commerce City   | CO         |          0
v     10 | Pizza Hut Park             | Frisco          | TX         |          0
(10 rows)
```

다음 예에서는 VENUE\$1SALES와 TOP\$1VENUES라는 두 테이블을 생성하는 WITH 절을 보여줍니다. 두 번째 WITH 절 테이블은 첫 번째 WITH 절 테이블에서 선택합니다. 다음에는, 기본 쿼리 블록의 WHERE 절이 TOP\$1VENUES 테이블을 포함하는 하위 쿼리를 포함합니다.

```
with venue_sales as
(select venuename, venuecity, sum(pricepaid) as venuename_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
group by venuename, venuecity),

top_venues as
(select venuename
from venue_sales
where venuename_sales > 800000)

select venuename, venuecity, venuestate,
sum(qtysold) as venue_qty,
sum(pricepaid) as venue_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
and venuename in(select venuename from top_venues)
group by venuename, venuecity, venuestate
order by venuename;
```

```
        venuename       |   venuecity   | venuestate | venue_qty | venue_sales
------------------------+---------------+------------+-----------+-------------
August Wilson Theatre   | New York City | NY         |      3187 |  1032156.00
Biltmore Theatre        | New York City | NY         |      2629 |   828981.00
Charles Playhouse       | Boston        | MA         |      2502 |   857031.00
Ethel Barrymore Theatre | New York City | NY         |      2828 |   891172.00
Eugene O'Neill Theatre  | New York City | NY         |      2488 |   828950.00
Greek Theatre           | Los Angeles   | CA         |      2445 |   838918.00
Helen Hayes Theatre     | New York City | NY         |      2948 |   978765.00
Hilton Theatre          | New York City | NY         |      2999 |   885686.00
Imperial Theatre        | New York City | NY         |      2702 |   877993.00
Lunt-Fontanne Theatre   | New York City | NY         |      3326 |  1115182.00
Majestic Theatre        | New York City | NY         |      2549 |   894275.00
Nederlander Theatre     | New York City | NY         |      2934 |   936312.00
Pasadena Playhouse      | Pasadena      | CA         |      2739 |   820435.00
Winter Garden Theatre   | New York City | NY         |      2838 |   939257.00
(14 rows)
```

다음 두 예에서는 WITH 절 하위 쿼리를 기반으로 테이블 참조의 범위에 대한 규칙을 보여줍니다. 첫 번째 쿼리가 실행되지만 두 번째 쿼리는 예상된 오류가 발생하며 실패합니다. 첫 번째 쿼리는 기본 쿼리의 SELECT 목록 내에 WITH 절 하위 쿼리가 있습니다. WITH 절(HOLIDAYS)에 의해 정의되는 테이블은 SELECT 목록에 있는 하위 쿼리의 FROM 절에 참조됩니다.

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join date on sales.dateid=date.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

caldate   | daysales | dec25sales
-----------+----------+------------
2008-12-25 | 70402.00 |   70402.00
2008-12-31 | 12678.00 |   70402.00
(2 rows)
```

기본 쿼리뿐 아니라 SELECT 목록 하위 쿼리에서 HOLIDAYS 테이블 참조를 시도하므로 두 번째 쿼리는 실패합니다. 기본 쿼리 참조는 범위를 벗어나는 주제입니다.

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join holidays on sales.dateid=holidays.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

ERROR:  relation "holidays" does not exist
```

## 예: 재귀 CTE
<a name="r_WITH_clause-recursive-cte-example"></a>

다음은 John에게 직간접적으로 보고하는 직원을 반환하는 재귀 CTE의 예입니다. 재귀 쿼리에는 WHERE 절이 포함되어 있어 재귀 수준을 4단계 미만으로 제한합니다.

```
--create and populate the sample table
  create table employee (
  id int,
  name varchar (20),
  manager_id int
  );
  
  insert into employee(id, name, manager_id)  values
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
  
--run the recursive query
  with recursive john_org(id, name, manager_id, level) as
( select id, name, manager_id, 1 as level
  from employee
  where name = 'John'
  union all
  select e.id, e.name, e.manager_id, level + 1 as next_level
  from employee e, john_org j
  where e.manager_id = j.id and level < 4
  )
 select distinct id, name, manager_id from john_org order by manager_id;
```

다음은 쿼리 결과입니다.

```
    id        name      manager_id
  ------+-----------+--------------
   101    John           100
   102    Jorge          101
   103    Kwaku          101
   110    Liu            101
   201    Sofía          102
   106    Mateo          102
   110    Nikki          103
   104    Paulo          103
   105    Richard        103
   120    Saanvi         104
   200    Shirley        104
   205    Zhang          104
```

다음은 John의 부서의 조직도입니다.

![\[John의 부서의 조직도 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/images/org-chart.png)


# SELECT 목록
<a name="r_SELECT_list"></a>

**Topics**
+ [구문](#r_SELECT_list-synopsis)
+ [파라미터](#r_SELECT_list-parameters)
+ [사용 노트](#r_SELECT_list_usage_notes)
+ [예제](#r_SELECT_list-examples)

SELECT 목록은 쿼리에서 반환하도록 하려는 열, 함수 및 표현식의 이름을 지정합니다. 목록은 쿼리의 출력을 나타냅니다.

SQL 함수에 대한 자세한 내용은 [SQL 함수 참조](c_SQL_functions.md) 섹션을 참조하세요. 표현식에 대한 자세한 내용은 [조건 표현식](c_conditional_expressions.md) 섹션을 참조하세요.

## 구문
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

## 파라미터
<a name="r_SELECT_list-parameters"></a>

TOP *number*   
TOP은 양의 정수를 인수로 취해 클라이언트로 반환되는 행의 수를 한정합니다. TOP 절을 이용한 동작은 LIMIT 절을 이용한 동작과 같습니다. 반환되는 행 수는 고정되지만 행 집합은 그렇지 않습니다. 일관된 행 집합을 반환하려면 ORDER BY 절과 함께 TOP 또는 LIMIT를 사용하십시오.

ALL   
DISTINCT를 지정하지 않을 경우의 기본 동작을 정의하는 중복 키워드입니다. `SELECT ALL *`은 `SELECT *`와 동일한 의미입니다(즉, 모든 열에 대해 모든 행을 선택하고 중복 항목을 유지함).

DISTINCT   
하나 이상의 열에서 일치하는 값을 바탕으로 결과 집합에서 중복된 행을 제거하는 옵션입니다.  
애플리케이션이 잘못된 외래 키 또는 프라이머리 키를 허용하는 경우에는 쿼리가 잘못된 결과를 반환할 수 있습니다. 예를 들어 SELECT DISTINCT 쿼리는 프라이머리 키 열이 고유한 값만을 포함하지 않을 경우 중복 행을 반환할 수도 있습니다. 자세한 내용은 [테이블 제약 조건 정의](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html) 단원을 참조하세요.

\$1(별표)   
테이블의 전체 내용(모든 열과 모든 행)을 반환합니다.

 * expression*   
쿼리에서 참조하는 테이블에 존재하는 하나 이상의 열에서 형성되는 표현식입니다. 표현식은 SQL 함수를 포함할 수 있습니다. 예:   

```
avg(datediff(day, listtime, saletime))
```

AS *column\$1alias*   
최종 결과 집합에 사용될 열의 임시 이름입니다. AS 키워드는 옵션입니다. 예:   

```
avg(datediff(day, listtime, saletime)) as avgwait
```
표현식에 대해 단순한 열 이름이 아닌 별칭을 지정하지 않을 경우 결과 집합은 그 열에 기본 이름을 적용합니다.  
별칭은 대상 목록에 정의되는 즉시 인식됩니다. 동일한 대상 목록에서 별칭 뒤에 정의된 다른 표현식에 별칭을 사용할 수 있습니다. 다음 예는 이를 보여 줍니다.  

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
측방 별칭 참조를 사용하면 동일한 대상 목록에서 더 복잡한 표현식을 작성할 때 별칭 처리된 표현식을 반복할 필요가 없다는 이점이 있습니다. Amazon Redshift에서는 이런 형식의 참조를 구문 분석할 때 이전에 정의된 별칭을 일렬로 정렬합니다. `FROM` 절에 이전에 별칭 처리된 표현식과 동일한 이름을 가진 열이 정의되어 있는 경우 `FROM` 절의 열에 우선 순위가 적용됩니다. 예를 들어 위의 쿼리에서 raw\$1data 테이블에 'probability' 열이 있는 경우 대상 목록의 두 번째 표현식에 있는 'probability'는 별칭 이름 'probability' 대신 이 열을 나타냅니다.

## 사용 노트
<a name="r_SELECT_list_usage_notes"></a>

TOP은 SQL 확장으로, LIMIT 동작에 대한 대안을 제공합니다. 같은 쿼리에 TOP과 LIMIT를 사용할 수 없습니다.

## 예제
<a name="r_SELECT_list-examples"></a>

다음 예에서는 SALES 테이블의 행 10개를 반환합니다. 쿼리는 TOP 절을 사용하지만 ORDER BY 절이 지정되지 않았으므로, 여전히 예측할 수 없는 행 집합을 반환합니다.

```
select top 10 *
from sales;
```

다음 쿼리는 기능적으로는 동일하지만 TOP 절 대신 LIMIT 절을 사용합니다.

```
select *
from sales
limit 10;
```

다음 예에서는 TOP 절을 사용하여 SALES 테이블에서 최초 10개의 행을 반환하며, QTYSOLD 열을 기준으로 내림차순으로 정렬합니다.

```
select top 10 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
8 |      574
8 |      718
8 |      868
8 |     2663
8 |     3396
8 |     3726
8 |     5250
8 |     6216
(10 rows)
```

다음 예에서는 QTYSOLD 열을 기준으로 정렬된 SALES 테이블에서 최초 2개의 QTYSOLD 및 SELLERID 값을 반환합니다.

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

다음 예에서는 CATEGORY 테이블의 개별 범주 그룹 목록을 확인할 수 있습니다.

```
select distinct catgroup from category
order by 1;

catgroup
----------
Concerts
Shows
Sports
(3 rows)

--the same query, run without distinct
select catgroup from category
order by 1;

catgroup
----------
Concerts
Concerts
Concerts
Shows
Shows
Shows
Sports
Sports
Sports
Sports
Sports
(11 rows)
```

다음 예에서는 2008년 12월의 고유한 주 번호 집합을 반환합니다. DISTINCT 절을 사용하지 않으면 문은 행 31개를 반환하거나 해당 월의 날짜별로 행을 하나씩 반환합니다.

```
select distinct week, month, year
from date
where month='DEC' and year=2008
order by 1, 2, 3;

week | month | year
-----+-------+------
49 | DEC   | 2008
50 | DEC   | 2008
51 | DEC   | 2008
52 | DEC   | 2008
53 | DEC   | 2008
(5 rows)
```



# EXCLUDE column\$1list
<a name="r_EXCLUDE_list"></a>

EXCLUDE column\$1list는 쿼리 결과에서 제외되는 열의 이름을 나열합니다. EXCLUDE 옵션을 사용하는 것은 많은 열이 포함된 테이블인 *넓은* 테이블에서 열의 하위 집합만 제외해야 하는 경우에 유용합니다.

**Topics**
+ [구문](#r_EXCLUDE_list-synopsis)
+ [파라미터](#r_EXCLUDE_list-parameters)
+ [예제](#r_EXCLUDE_list-examples)

## 구문
<a name="r_EXCLUDE_list-synopsis"></a>

```
EXCLUDE column_list
```

## 파라미터
<a name="r_EXCLUDE_list-parameters"></a>

 *column\$1list*   
쿼리에서 참조하는 테이블에 있는 하나 이상의 열 이름을 쉼표로 구분한 목록입니다. *column\$1list*는 선택적으로 괄호로 묶을 수 있습니다. 열 이름의 제외 목록에는 열 이름만 지원되며 표현식(예: `upper(col1)`) 또는 별표(\$1)는 지원되지 않습니다.  

```
column-name, ... | ( column-name, ... )
```
예제:   

```
SELECT * EXCLUDE col1, col2 FROM tablea;
```

```
SELECT * EXCLUDE (col1, col2) FROM tablea;
```

## 예제
<a name="r_EXCLUDE_list-examples"></a>

다음 예에서는 salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 열이 포함된 SALES 테이블을 사용합니다. SALES 테이블에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음 예에서는 SALES 테이블에서 행을 반환하지만 SALETIME 열은 제외합니다.

```
SELECT * EXCLUDE saletime FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

다음 예에서는 SALES 테이블에서 행을 반환하지만 QTYSOLD 및 SALETIME 열은 제외합니다.

```
SELECT * EXCLUDE (qtysold, saletime) FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 482        |  72.3	
...
```

다음 예에서는 SALES 테이블에서 행을 반환하지만 SALETIME 열은 제외하는 보기를 생성합니다.

```
CREATE VIEW sales_view AS SELECT * EXCLUDE saletime FROM sales;
SELECT * FROM sales_view;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

다음 예에서는 임시 테이블에 제외되지 않는 열만 선택합니다.

```
SELECT * EXCLUDE saletime INTO TEMP temp_sales FROM sales;
SELECT * FROM temp_sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

# FROM 절
<a name="r_FROM_clause30"></a>

쿼리의 FROM 절은 데이터가 선택되는 테이블 참조(테이블, 뷰, 하위 쿼리)를 나열합니다. 여러 개의 테이블 참조가 목록에 표시되는 경우 FROM 절 또는 WHERE 절에서 알맞은 구문을 사용하여 테이블을 조인해야 합니다. 조인 기준이 지정되지 않은 경우 시스템에서는 쿼리를 크로스 조인(데카르트 곱)으로 처리합니다.

**Topics**
+ [구문](#r_FROM_clause30-synopsis)
+ [파라미터](#r_FROM_clause30-parameters)
+ [사용 노트](#r_FROM_clause_usage_notes)
+ [PIVOT 및 UNPIVOT 예](r_FROM_clause-pivot-unpivot-examples.md)
+ [JOIN 예](r_Join_examples.md)
+ [UNNEST 예제](r_FROM_clause-unnest-examples.md)

## 구문
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

여기서 *table\$1reference*는 다음 중 하나입니다.

```
with_subquery_table_name [ table_alias ]
table_name [ * ] [ table_alias ]
( subquery ) [ table_alias ]
table_reference [ NATURAL ] join_type table_reference
   [ ON join_condition | USING ( join_column [, ...] ) ]
table_reference  join_type super_expression 
   [ ON join_condition ]
table_reference PIVOT ( 
   aggregate(expr) [ [ AS ] aggregate_alias ]
   FOR column_name IN ( expression [ AS ] in_alias [, ...] )
) [ table_alias ]
table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] ( 
   value_column_name 
   FOR name_column_name IN ( column_reference [ [ AS ]
   in_alias ] [, ...] )
) [ table_alias ]
UNPIVOT expression AS value_alias [ AT attribute_alias ]
( super_expression.attribute_name ) AS value_alias [ AT index_alias ]
UNNEST ( column_reference )
  [AS] table_alias ( unnested_column_name )
UNNEST ( column_reference ) WITH OFFSET
  [AS] table_alias ( unnested_column_name, [offset_column_name] )
```

선택적 *table\$1alias*를 사용하여 다음과 같이 테이블 및 복합 테이블 참조와 원하는 경우 해당 열에 임시 이름을 지정할 수 있습니다.

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

## 파라미터
<a name="r_FROM_clause30-parameters"></a>

 *with\$1subquery\$1table\$1name*   
[WITH 절](r_WITH_clause.md)에서 하위 쿼리에 의해 정의되는 테이블입니다.

 *table\$1name*   
테이블 또는 뷰의 이름입니다.

 *별칭*   
테이블 또는 뷰의 임시 대체 이름입니다. 하위 쿼리에서 파생되는 테이블에 대해 별칭을 입력해야 합니다. 다른 테이블 참조에서 별칭은 옵션입니다. AS 키워드는 항상 옵션입니다. 테이블 별칭은 WHERE 절과 같이 쿼리의 다른 부분에 있는 테이블을 편리하게 식별하는 바로 가기의 역할을 합니다. 예:   

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\$1alias*   
테이블 또는 뷰에 있는 열의 임시 대체 이름입니다.

 *subquery*   
테이블로 평가되는 쿼리 표현식입니다. 테이블은 쿼리의 지속 시간 동안만 존재하며 일반적으로 이름 또는 *별칭*이 주어집니다. 그러나 별칭이 필수는 아닙니다. 하위 쿼리에서 파생되는 테이블의 열 이름을 정의할 수도 있습니다. 하위 쿼리의 결과를 다른 테이블에 조인하고 쿼리의 다른 곳에서 열을 선택하거나 제한하려는 경우 열 별칭의 이름 지정이 중요합니다.  
하위 쿼리는 ORDER BY 절을 포함할 수 있지만, LIMIT 또는 OFFSET 절도 지정하지 않으면 ORDER BY 절이 아무런 효과도 없을 수 있습니다.

NATURAL   
두 테이블에서 조인 열로서 똑같이 명명된 열의 쌍을 전부 자동으로 사용하는 조인을 정의합니다. 명시적 조인 조건은 필요하지 않습니다. 예를 들어, CATEGORY 및 EVENT 테이블에 모두 CATID로 명명된 열이 있는 경우 이러한 테이블의 자연 조인은 CATID 열에 적용되는 조인입니다.  
NATURAL 조인이 지정되어 있지만 조인되는 테이블에 똑같은 이름의 열 쌍이 존재하지 않는 경우 쿼리는 기본적으로 크로스 조인이 됩니다.

 *join\$1type*   
다음과 같은 조인 유형 중 하나를 지정합니다.  
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
크로스 조인은 정규화되지 않은 조인으로, 두 테이블의 데카르트 곱을 반환합니다.  
내부 및 외부 조인은 정규화된 조인입니다. 이런 조인은 FROM 절에서 ON 또는 USING 구문으로 암시적으로(자연 조인으로) 정규화되거나 WHERE 절 조건으로 암시적으로 정규화됩니다.  
내부 조인은 조인 조건이나 조인 열의 목록을 기반으로 일치하는 행만 반환합니다. 외부 조인은 동등한 내부 조인이 반환하는 모든 행과 "왼쪽" 테이블, "오른쪽" 테이블 또는 두 테이블 모두에서 일치하지 않는 행을 반환합니다. 왼쪽 테이블은 처음에 목록으로 표시되는 테이블이고, 오른쪽 테이블은 두 번째로 목록으로 표시되는 테이블입니다. 일치하지 않는 행은 출력 열의 간격을 채우기 위해 NULL 값을 포함합니다.

ON *join\$1condition*   
조인 열이 ON 키워드 뒤에 나오는 조건으로 규정되는 조인 사양의 유형입니다. 예:   

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *join\$1column* [, ...] )   
조인 열이 괄호 안에 묶여 표시되는 조인 사양의 유형입니다. 여러 개의 조인 열이 지정되어 있는 경우 이런 열은 쉼표로 구분됩니다. USING 키워드는 목록에 선행해야 합니다. 예제:   

```
sales join listing
using (listid,eventid)
```

PIVOT  
읽기 쉬운 형식으로 테이블형 데이터를 표시하기 위해 행에서 열로 출력을 회전합니다. 출력은 여러 열에 가로로 표시됩니다. PIVOT은 집계 표현식을 사용하여 출력 형식을 지정하는 집계가 있는 GROUP BY 쿼리와 유사합니다. 그러나 GROUP BY와 달리 결과는 행 대신 열로 반환됩니다.  
PIVOT 및 UNPIVOT을 사용하여 쿼리하는 방법을 보여주는 예는 [PIVOT 및 UNPIVOT 예](r_FROM_clause-pivot-unpivot-examples.md) 섹션을 참조하세요.

UNPIVOT  
*UNPIVOT을 사용하여 열을 행으로 교체* - 이 연산자는 입력 테이블 또는 쿼리 결과의 결과 열을 행으로 변환하여 출력을 더 읽기 쉽게 만듭니다. UNPIVOT은 입력 열의 데이터를 이름 열과 값 열의 두 결과 열로 결합합니다. 이름 열에는 입력의 열 이름이 행 항목으로 포함됩니다. 값 열에는 집계 결과와 같은 입력 열의 값이 포함됩니다. 예를 들어 다양한 카테고리의 항목 수입니다.  
*UNPIVOT(SUPER)을 사용한 객체 피벗 해제* - 객체 피벗을 해제할 수 있습니다. 여기서 *표현식*은 다른 FROM 절 항목을 참조하는 SUPER 표현식입니다. 자세한 내용은 [객체 피벗 해제](query-super.md#unpivoting) 섹션을 참조하세요. JSON 형식 데이터와 같은 반정형 데이터를 쿼리하는 방법을 보여주는 예도 있습니다.

*super\$1expression*  
유효한 SUPER 표현식입니다. Amazon Redshift는 지정된 속성의 각 값에 대해 하나의 행을 반환합니다. SUPER 데이터 유형에 대한 자세한 내용은 [SUPER 형식](r_SUPER_type.md) 섹션을 참조하세요. 중첩 해제되는 SUPER 값에 대한 자세한 내용은 [쿼리 중첩 해제](query-super.md#unnest) 섹션을 참조하세요.

*attribute\$1name*  
SUPER 표현식에 있는 속성의 이름입니다.

*index\$1alias*  
SUPER 표현식에서 값의 위치를 나타내는 인덱스의 별칭입니다.

UNNEST  
일반적으로 SUPER 배열인 중첩 구조를 중첩되지 않은 요소가 포함된 열로 확장합니다. SUPER 데이터 중첩 해제에 대한 자세한 내용은 [반정형 데이터 쿼리](query-super.md) 섹션을 참조하세요. 예시는 [UNNEST 예제](r_FROM_clause-unnest-examples.md) 섹션을 참조하세요.

*unnested\$1column\$1name*  
중첩되지 않은 요소가 포함된 열의 이름입니다.

UNNEST ... WITH OFFSET  
중첩되지 않은 출력에 오프셋 열을 추가합니다. 여기서 오프셋은 배열에 있는 각 요소의 0부터 시작하는 인덱스를 나타냅니다. 이 변형은 배열 내 요소의 위치를 확인하려는 경우에 유용합니다. SUPER 데이터 중첩 해제에 대한 자세한 내용은 [반정형 데이터 쿼리](query-super.md) 섹션을 참조하세요. 예시는 [UNNEST 예제](r_FROM_clause-unnest-examples.md) 섹션을 참조하세요.

*offset\$1column\$1name*  
인덱스 열이 출력에 표시되는 방식을 명시적으로 정의할 수 있는 오프셋 열의 사용자 지정 이름입니다. 이 파라미터는 선택 사항입니다. 기본적으로 오프셋 열 이름은 `offset_col`입니다.

## 사용 노트
<a name="r_FROM_clause_usage_notes"></a>

조인 열은 비교 가능한 데이터 형식이 있어야 합니다.

NATURAL 또는 USING 조인은 중간 결과 집합에 조인 열의 각 쌍 중 하나만 유지합니다.

ON 구문이 있는 조인은 중간 결과 집합에 두 조인 열을 모두 유지합니다.

또한 [WITH 절](r_WITH_clause.md) 섹션도 참조하세요.

# PIVOT 및 UNPIVOT 예
<a name="r_FROM_clause-pivot-unpivot-examples"></a>

PIVOT 및 UNPIVOT은 각각 쿼리 출력을 행에서 열로, 열에서 행으로 회전하는 FROM 절의 파라미터입니다. 테이블 쿼리 결과를 읽기 쉬운 형식으로 나타냅니다. 다음 예제에서는 테스트 데이터와 쿼리를 사용하여 사용 방법을 보여줍니다.

이러한 파라미터 및 기타 파라미터에 대한 자세한 내용은 [FROM 절](https://docs.aws.amazon.com/redshift/latest/dg/r_FROM_clause30.html) 단원을 참조하세요.

## PIVOT 예
<a name="r_FROM_clause-pivot-examples"></a>

샘플 테이블과 데이터를 설정하고 이를 사용하여 후속 예제 쿼리를 실행합니다.

```
CREATE TABLE part (
    partname varchar,
    manufacturer varchar,
    quality int,
    price decimal(12, 2)
);

INSERT INTO part VALUES ('prop', 'local parts co', 2, 10.00);
INSERT INTO part VALUES ('prop', 'big parts co', NULL, 9.00);
INSERT INTO part VALUES ('prop', 'small parts co', 1, 12.00);

INSERT INTO part VALUES ('rudder', 'local parts co', 1, 2.50);
INSERT INTO part VALUES ('rudder', 'big parts co', 2, 3.75);
INSERT INTO part VALUES ('rudder', 'small parts co', NULL, 1.90);

INSERT INTO part VALUES ('wing', 'local parts co', NULL, 7.50);
INSERT INTO part VALUES ('wing', 'big parts co', 1, 15.20);
INSERT INTO part VALUES ('wing', 'small parts co', NULL, 11.80);
```

`price`에 대한 `AVG` 집계가 있는 `partname`에 대한 PIVOT.

```
SELECT *
FROM (SELECT partname, price FROM part) PIVOT (
    AVG(price) FOR partname IN ('prop', 'rudder', 'wing')
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
  prop   |  rudder  |  wing
---------+----------+---------
 10.33   | 2.71     | 11.50
```

이전 예에서 결과는 열로 변환됩니다. 다음 예는 평균 가격을 열이 아닌 행으로 반환하는 `GROUP BY` 쿼리를 보여줍니다.

```
SELECT partname, avg(price)
FROM (SELECT partname, price FROM part)
WHERE partname IN ('prop', 'rudder', 'wing')
GROUP BY partname;
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 partname |  avg
----------+-------
 prop     | 10.33
 rudder   |  2.71
 wing     | 11.50
```

암시적 열로 `manufacturer`가 있는 `PIVOT` 예.

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) FOR quality IN (1, 2, NULL)
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 manufacturer      | 1  | 2  | null
-------------------+----+----+------
 local parts co    | 1  | 1  |  1
 big parts co      | 1  | 1  |  1
 small parts co    | 1  | 0  |  2
```

 `PIVOT` 정의에서 참조되지 않는 입력 테이블 열은 암시적으로 결과 테이블에 추가됩니다. 이는 앞의 예에서 `manufacturer` 열의 경우입니다. 이 예는 또한 `NULL`이 `IN` 연산자에 유효한 값임을 보여줍니다.

`PIVOT`위의 예에서 은 가 포함된 다음 쿼리와 유사한 정보를 반환합니다.`GROUP BY` 차이점은 `PIVOT`이 열 `2`와 제조업체 `small parts co`에 대해 값 `0`을 반환한다는 것입니다. `GROUP BY` 쿼리에는 해당 행이 없습니다. 대부분의 경우 행에 지정된 열에 대한 입력 데이터가 없으면 `PIVOT`은 `NULL`을 삽입합니다. 그러나 count 집계는 `NULL`을 반환하지 않고 `0`이 기본값입니다.

```
SELECT manufacturer, quality, count(*)
FROM (SELECT quality, manufacturer FROM part)
WHERE quality IN (1, 2) OR quality IS NULL
GROUP BY manufacturer, quality
ORDER BY manufacturer;
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 manufacturer        | quality | count
---------------------+---------+-------
 big parts co        |         |     1
 big parts co        |       2 |     1
 big parts co        |       1 |     1
 local parts co      |       2 |     1
 local parts co      |       1 |     1
 local parts co      |         |     1
 small parts co      |       1 |     1
 small parts co      |         |     2
```

 PIVOT 연산자는 집계 표현식과 `IN` 연산자의 각 값에 대한 선택적 별칭을 허용합니다. 별칭을 사용하여 열 이름을 사용자 지정합니다. 집계 별칭이 없는 경우 `IN` 목록 별칭이 사용됩니다. 그렇지 않으면 이름을 구분하기 위해 집계 별칭이 밑줄과 함께 열 이름에 추가됩니다.

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) AS count FOR quality IN (1 AS high, 2 AS low, NULL AS na)
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 manufacturer      | high_count  | low_count | na_count
-------------------+-------------+-----------+----------
 local parts co    |           1 |         1 |        1
 big parts co      |           1 |         1 |        1
 small parts co    |           1 |         0 |        2
```

다음 샘플 테이블과 데이터를 설정하고 이를 사용하여 후속 예제 쿼리를 실행합니다. 데이터는 여러 호텔의 예약 날짜를 나타냅니다.

```
CREATE TABLE bookings (
    booking_id int,
    hotel_code char(8),
    booking_date date,
    price decimal(12, 2)
);

INSERT INTO bookings VALUES (1, 'FOREST_L', '02/01/2023', 75.12);
INSERT INTO bookings VALUES (2, 'FOREST_L', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (3, 'FOREST_L', '02/04/2023', 85.54);

INSERT INTO bookings VALUES (4, 'FOREST_L', '02/08/2023', 75.00);
INSERT INTO bookings VALUES (5, 'FOREST_L', '02/11/2023', 75.00);
INSERT INTO bookings VALUES (6, 'FOREST_L', '02/14/2023', 90.00);

INSERT INTO bookings VALUES (7, 'FOREST_L', '02/21/2023', 60.00);
INSERT INTO bookings VALUES (8, 'FOREST_L', '02/22/2023', 85.00);
INSERT INTO bookings VALUES (9, 'FOREST_L', '02/27/2023', 90.00);

INSERT INTO bookings VALUES (10, 'DESERT_S', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (11, 'DESERT_S', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (12, 'DESERT_S', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (13, 'DESERT_S', '02/05/2023', 75.00);
INSERT INTO bookings VALUES (14, 'DESERT_S', '02/06/2023', 34.00);
INSERT INTO bookings VALUES (15, 'DESERT_S', '02/09/2023', 85.00);

INSERT INTO bookings VALUES (16, 'DESERT_S', '02/12/2023', 23.00);
INSERT INTO bookings VALUES (17, 'DESERT_S', '02/13/2023', 76.00);
INSERT INTO bookings VALUES (18, 'DESERT_S', '02/14/2023', 85.00);

INSERT INTO bookings VALUES (19, 'OCEAN_WV', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (20, 'OCEAN_WV', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (21, 'OCEAN_WV', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (22, 'OCEAN_WV', '02/06/2023', 75.00);
INSERT INTO bookings VALUES (23, 'OCEAN_WV', '02/09/2023', 34.00);
INSERT INTO bookings VALUES (24, 'OCEAN_WV', '02/12/2023', 85.00);

INSERT INTO bookings VALUES (25, 'OCEAN_WV', '02/13/2023', 23.00);
INSERT INTO bookings VALUES (26, 'OCEAN_WV', '02/14/2023', 76.00);
INSERT INTO bookings VALUES (27, 'OCEAN_WV', '02/16/2023', 85.00);

INSERT INTO bookings VALUES (28, 'CITY_BLD', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (29, 'CITY_BLD', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (30, 'CITY_BLD', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (31, 'CITY_BLD', '02/12/2023', 75.00);
INSERT INTO bookings VALUES (32, 'CITY_BLD', '02/13/2023', 34.00);
INSERT INTO bookings VALUES (33, 'CITY_BLD', '02/17/2023', 85.00);

INSERT INTO bookings VALUES (34, 'CITY_BLD', '02/22/2023', 23.00);
INSERT INTO bookings VALUES (35, 'CITY_BLD', '02/23/2023', 76.00);
INSERT INTO bookings VALUES (36, 'CITY_BLD', '02/24/2023', 85.00);
```

 이 샘플 쿼리에서는 예약 기록을 집계하여 각 주의 합계를 산출합니다. 각 주의 종료일은 열 이름이 됩니다.

```
SELECT * FROM
    (SELECT
       booking_id,
       (date_trunc('week', booking_date::date) + '5 days'::interval)::date as enddate,
       hotel_code AS "hotel code"
FROM bookings
) PIVOT (
    count(booking_id) FOR enddate IN ('2023-02-04','2023-02-11','2023-02-18') 
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 hotel code | 2023-02-04  | 2023-02-11 | 2023-02-18
------------+-------------+------------+----------
 FOREST_L   |           3 |          2 |        1
 DESERT_S   |           4 |          3 |        2
 OCEAN_WV   |           3 |          3 |        3
 CITY_BLD   |           3 |          1 |        2
```

 Amazon Redshift는 여러 열에서 피벗하기 위한 CROSSTAB을 지원하지 않습니다. 그러나 다음과 같은 쿼리를 사용하여 PIVOT을 사용한 집계와 유사한 방식으로 행 데이터를 열로 변경할 수 있습니다. 이전 예와 동일한 예약 샘플 데이터를 사용합니다.

```
SELECT 
  booking_date,
  MAX(CASE WHEN hotel_code = 'FOREST_L' THEN 'forest is booked' ELSE '' END) AS FOREST_L,
  MAX(CASE WHEN hotel_code = 'DESERT_S' THEN 'desert is booked' ELSE '' END) AS DESERT_S,
  MAX(CASE WHEN hotel_code = 'OCEAN_WV' THEN 'ocean is booked' ELSE '' END)  AS OCEAN_WV
FROM bookings
GROUP BY booking_date
ORDER BY booking_date asc;
```

샘플 쿼리를 실행하면 예약된 호텔을 나타내는 짧은 문구 옆에 예약 날짜가 표시됩니다.

```
 booking_date  | forest_l         | desert_s         | ocean_wv
---------------+------------------+------------------+--------------------
 2023-02-01    | forest is booked | desert is booked |  ocean is booked
 2023-02-02    | forest is booked | desert is booked |  ocean is booked
 2023-02-04    | forest is booked | desert is booked |  ocean is booked
 2023-02-05    |                  | desert is booked |        
 2023-02-06    |                  | desert is booked |
```

다음은 `PIVOT`에 대한 사용 참고 사항입니다.
+ `PIVOT`은 테이블, 하위 쿼리 및 공통 테이블 표현식(CTE)에 적용할 수 있습니다. `JOIN` 표현식, 재귀 CTE, `PIVOT` 또는 `UNPIVOT` 표현식에는 `PIVOT`을 적용할 수 없습니다. 또한 `SUPER` 비중척 표현식과 Redshift Spectrum 중첩 테이블은 지원되지 않습니다.
+  `PIVOT`에서는 `COUNT`, `SUM`, `MIN`, `MAX` 및 `AVG` 집계 함수를 지원합니다.
+ `PIVOT` 집계 표현식은 지원되는 집계 함수의 호출이어야 합니다. 집계 위의 복잡한 표현식은 지원되지 않습니다. 집계 인수는 `PIVOT` 입력 테이블 이외의 테이블에 대한 참조를 포함할 수 없습니다. 상위 쿼리에 대한 상관 관계가 있는 참조도 지원되지 않습니다. 집계 인수에는 하위 쿼리가 포함될 수 있습니다. 이들은 내부적으로 또는 `PIVOT` 입력 테이블에서 상관될 수 있습니다.
+  `PIVOT IN` 목록 값은 열 참조 또는 하위 쿼리일 수 없습니다. 각 값은 `FOR` 열 참조와 호환되는 유형이어야 합니다.
+  `IN` 목록 값에 별칭이 없으면 `PIVOT`은 기본 열 이름을 생성합니다. 'abc' 또는 5와 같은 상수 `IN` 값의 경우 기본 열 이름은 상수 자체입니다. 복잡한 표현식의 경우 열 이름은 `?column?`와 같은 표준 Amazon Redshift 기본 이름입니다.

## UNPIVOT 예
<a name="r_FROM_clause-unpivot-examples"></a>

샘플 데이터를 설정하고 이를 사용하여 후속 예제를 실행합니다.

```
CREATE TABLE count_by_color (quality varchar, red int, green int, blue int);

INSERT INTO count_by_color VALUES ('high', 15, 20, 7);
INSERT INTO count_by_color VALUES ('normal', 35, NULL, 40);
INSERT INTO count_by_color VALUES ('low', 10, 23, NULL);
```

`UNPIVOT`빨간색, 녹색 및 파란색 입력 열의 .

```
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |  23
 blue  |   7
 blue  |  40
```

기본적으로 입력 열의 `NULL` 값은 건너뛰고 결과 행을 생성하지 않습니다.

다음은 `INCLUDE NULLS`가 있는 `UNPIVOT`의 예입니다.

```
SELECT *
FROM (
    SELECT red, green, blue
    FROM count_by_color
) UNPIVOT INCLUDE NULLS (
    cnt FOR color IN (red, green, blue)
);
```

결과 출력값은 다음과 같습니다.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |
 green |  23
 blue  |   7
 blue  |  40
 blue  |
```

`INCLUDING NULLS` 파라미터가 설정되면 `NULL` 입력 값이 결과 행을 생성합니다.

암시적 열로 `quality`가 있는 `The following query shows UNPIVOT`.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

쿼리 결과는 다음과 같이 출력됩니다.

```
 quality | color | cnt
---------+-------+-----
 high    | red   |  15
 normal  | red   |  35
 low     | red   |  10
 high    | green |  20
 low     | green |  23
 high    | blue  |   7
 normal  | blue  |  40
```

`UNPIVOT` 정의에서 참조되지 않는 입력 테이블의 열은 암시적으로 결과 테이블에 추가됩니다. 이 예에서는 `quality` 열의 경우입니다.

다음 예는 `IN` 목록의 값에 대한 별칭이 있는 `UNPIVOT`을 보여줍니다.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red AS r, green AS g, blue AS b)
);
```

이전 쿼리 결과는 다음과 같이 출력됩니다.

```
 quality | color | cnt
---------+-------+-----
 high    | r     |  15
 normal  | r     |  35
 low     | r     |  10
 high    | g     |  20
 low     | g     |  23
 high    | b     |   7
 normal  | b     |  40
```

`UNPIVOT` 연산자는 각 `IN` 목록 값에서 선택적 별칭을 허용합니다. 각 별칭을 통해 각 `value` 열의 데이터를 사용자 지정할 수 있습니다.

다음은 `UNPIVOT`에 대한 사용 참고 사항입니다.
+ `UNPIVOT`은 테이블, 하위 쿼리 및 공통 테이블 표현식(CTE)에 적용할 수 있습니다. `JOIN` 표현식, 재귀 CTE, `UNPIVOT` 또는 `UNPIVOT` 표현식에는 `PIVOT`을 적용할 수 없습니다. 또한 `SUPER` 비중척 표현식과 Redshift Spectrum 중첩 테이블은 지원되지 않습니다.
+ `UNPIVOT IN` 목록에는 입력 테이블 열 참조만 포함되어야 합니다. `IN` 목록 열에는 모두 호환되는 공통 유형이 있어야 합니다. `UNPIVOT` 값 열에는 이러한 공통 유형이 있습니다. `UNPIVOT` 이름 열은 `VARCHAR`유형입니다.
+ `IN` 목록 값에 별칭이 없으면 `UNPIVOT`은 열 이름을 기본값으로 사용합니다.

# JOIN 예
<a name="r_Join_examples"></a>

SQL JOIN 절은 공통 필드를 기반으로 두 개 이상의 테이블에서 데이터를 결합하는 데 사용됩니다. 지정된 조인 메서드에 따라 결과가 변경될 수도 있고 변경되지 않을 수도 있습니다. JOIN 절의 구문에 대한 자세한 내용은 [파라미터](r_FROM_clause30.md#r_FROM_clause30-parameters) 섹션을 참조하세요.

다음 예에서는 `TICKIT` 샘플 데이터의 데이터를 사용합니다. 데이터베이스 스키마에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요. 샘플 데이터를 로드하는 방법을 알아보려면 Amazon Redshift 시작 안내서**의 [데이터 로드](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) 단원을 참조하세요.

다음 쿼리는 LISTING 테이블과 SALES 테이블 간의 내부 조인(JOIN 키워드 사용 안 함)이며, 여기서 LISTING 테이블의 LISTID는 1에서 5 사이입니다. 이 쿼리는 LISTING 테이블(왼쪽 테이블) 및 SALES 테이블(오른쪽 테이블)에 있는 LISTID 열 값과 일치합니다. 결과는 LISTID 1, 4, 5가 조건과 일치한다는 것을 보여줍니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing, sales
where listing.listid = sales.listid
and listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

다음 쿼리는 왼쪽 외부 조인입니다. 왼쪽 및 오른쪽 외부 조인은 다른 테이블에서 일치 항목이 발견되지 않을 때 조인된 테이블 중 하나에서 값을 유지합니다. 왼쪽 및 오른쪽 테이블은 구문에 나열되는 첫 번째 및 두 번째 테이블입니다. NULL 값은 결과 집합의 "간격"을 채우는 데 사용됩니다. 이 쿼리는 LISTING 테이블(왼쪽 테이블) 및 SALES 테이블(오른쪽 테이블)에 있는 LISTID 열 값과 일치합니다. 결과는 LISTID 2 및 3이 어떤 판매로도 이어지지 않았음을 보여줍니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

다음 쿼리는 오른쪽 외부 조인입니다. 이 쿼리는 LISTING 테이블(왼쪽 테이블) 및 SALES 테이블(오른쪽 테이블)에 있는 LISTID 열 값과 일치합니다. 결과는 LISTID 1, 4, 5가 조건과 일치한다는 것을 보여줍니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing right outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

다음 쿼리는 전체 조인입니다. 전체 조인은 다른 테이블에서 일치 항목이 발견되지 않을 때 조인된 테이블의 값을 유지합니다. 왼쪽 및 오른쪽 테이블은 구문에 나열되는 첫 번째 및 두 번째 테이블입니다. NULL 값은 결과 집합의 "간격"을 채우는 데 사용됩니다. 이 쿼리는 LISTING 테이블(왼쪽 테이블) 및 SALES 테이블(오른쪽 테이블)에 있는 LISTID 열 값과 일치합니다. 결과는 LISTID 2 및 3이 어떤 판매로도 이어지지 않았음을 보여줍니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

다음 쿼리는 전체 조인입니다. 이 쿼리는 LISTING 테이블(왼쪽 테이블) 및 SALES 테이블(오른쪽 테이블)에 있는 LISTID 열 값과 일치합니다. 판매로 이어지지 않는 행(LISTID 2 및 3)만 결과에 있습니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
and (listing.listid IS NULL or sales.listid IS NULL)
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     2 | NULL   | NULL
     3 | NULL   | NULL
```

다음 예는 ON 절과의 내부 조인입니다. 이 경우 NULL 행은 반환되지 않습니다.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

다음 쿼리는 결과를 제한하는 술어가 있는, LISTING 테이블과 SALES 테이블의 교차 조인 또는 데카르트 조인입니다. 이 쿼리는 SALES 테이블과 LISTING 테이블의 LISTID(두 테이블 모두 LISTID 1, 2, 3, 4, 5) 열 값과 일치합니다. 결과는 20개의 행이 조건과 일치한다는 것을 보여줍니다.

```
select sales.listid as sales_listid, listing.listid as listing_listid
from sales cross join listing
where sales.listid between 1 and 5
and listing.listid between 1 and 5
order by 1,2;

sales_listid | listing_listid
-------------+---------------
1            | 1
1            | 2
1            | 3
1            | 4
1            | 5
4            | 1
4            | 2
4            | 3
4            | 4
4            | 5
5            | 1
5            | 1
5            | 2
5            | 2
5            | 3
5            | 3
5            | 4
5            | 4
5            | 5
5            | 5
```

다음 예는 두 테이블 간의 자연 조인입니다. 이 경우 listid, sellerid, eventid, dateid 열은 두 테이블 모두에서 동일한 이름과 데이터 형식을 가지므로 조인 열로 사용됩니다. 결과는 5개 행으로 제한됩니다.

```
select listid, sellerid, eventid, dateid, numtickets
from listing natural join sales
order by 1
limit 5;

listid | sellerid  | eventid | dateid | numtickets
-------+-----------+---------+--------+-----------
113    | 29704     | 4699    | 2075   | 22
115    | 39115     | 3513    | 2062   | 14
116    | 43314     | 8675    | 1910   | 28
118    | 6079      | 1611    | 1862   | 9
163    | 24880     | 8253    | 1888   | 14
```

다음 예는 USING 절을 사용한 두 테이블 간의 조인입니다. 이 경우 listid 및 eventid 열이 조인 열로 사용됩니다. 결과는 5개 행으로 제한됩니다.

```
select listid, listing.sellerid, eventid, listing.dateid, numtickets
from listing join sales
using (listid, eventid)
order by 1
limit 5;

listid | sellerid | eventid | dateid | numtickets
-------+----------+---------+--------+-----------
1      | 36861    | 7872    | 1850   | 10
4      | 8117     | 4337    | 1970   | 8
5      | 1616     | 8647    | 1963   | 4
5      | 1616     | 8647    | 1963   | 4
6      | 47402    | 8240    | 2053   | 18
```

다음 쿼리는 FROM 절에 있는 두 하위 쿼리의 내부 조인입니다. 다음 쿼리는 다양한 범주의 이벤트(콘서트 및 쇼)에 대해 판매된 티켓과 판매되지 않은 티켓의 수를 찾습니다. 이러한 FROM 절 하위 쿼리는 *table* 하위 쿼리로서, 여러 개의 열과 행을 반환할 수 있습니다.

```
select catgroup1, sold, unsold
from
(select catgroup, sum(qtysold) as sold
from category c, event e, sales s
where c.catid = e.catid and e.eventid = s.eventid
group by catgroup) as a(catgroup1, sold)
join
(select catgroup, sum(numtickets)-sum(qtysold) as unsold
from category c, event e, sales s, listing l
where c.catid = e.catid and e.eventid = s.eventid
and s.listid = l.listid
group by catgroup) as b(catgroup2, unsold)

on a.catgroup1 = b.catgroup2
order by 1;

catgroup1 |  sold  | unsold
----------+--------+--------
Concerts  | 195444 |1067199
Shows     | 149905 | 817736
```

# UNNEST 예제
<a name="r_FROM_clause-unnest-examples"></a>

UNNEST는 중첩된 데이터를 데이터의 중첩되지 않은 요소를 포함하는 열로 확장하는 FROM 절의 파라미터입니다. 데이터 중첩 해제에 대한 자세한 내용은 [반정형 데이터 쿼리](query-super.md) 섹션을 참조하세요.

다음 문은 제품 ID 배열이 포함된 `products` 열이 있는 `orders` 테이블을 생성하고 채웁니다. 이 섹션의 예에서는 이 테이블의 샘플 데이터를 사용합니다.

```
CREATE TABLE orders (
    order_id INT,
    products SUPER
);

-- Populate table
INSERT INTO orders VALUES
(1001, JSON_PARSE('[
        {
            "product_id": "P456",
            "name": "Monitor",
            "price": 299.99,
            "quantity": 1,
            "specs": {
                "size": "27 inch",
                "resolution": "4K"
            }
        }
    ]
')),
(1002, JSON_PARSE('
    [
        {
            "product_id": "P567",
            "name": "USB Cable",
            "price": 9.99,
            "quantity": 3
        },
        {
            "product_id": "P678",
            "name": "Headphones",
            "price": 159.99,
            "quantity": 1,
            "specs": {
                "type": "Wireless",
                "battery_life": "20 hours"
            }
        }
    ]
'));
```

다음은 PartiQL 구문을 사용하여 샘플 데이터로 쿼리를 중첩 해제하는 몇 가지 예입니다.

## OFFSET 열을 사용하지 않고 배열 중첩 해제
<a name="r_FROM_clause-unnest-examples-no-offset"></a>

다음 쿼리는 제품 열에서 SUPER 배열을 중첩 해제하며, 각 행은 `order_id` 주문의 항목을 나타냅니다.

```
SELECT o.order_id, unnested_products.product
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(3 rows)
```

다음 쿼리는 각 주문에서 가장 비싼 제품을 찾습니다.

```
SELECT o.order_id, MAX(unnested_products.product)
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(2 rows)
```

## 암시적 OFFSET 열을 사용하여 배열 중첩 해제
<a name="r_FROM_clause-unnest-examples-implicit-offset"></a>

다음 쿼리는 `UNNEST ... WITH OFFSET` 파라미터를 사용하여 주문 배열 내 각 제품의 0부터 시작하는 위치를 표시합니다.

```
SELECT o.order_id, up.product, up.offset_col
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product);

 order_id |                                                           product                                                           | offset_col 
----------+-----------------------------------------------------------------------------------------------------------------------------+------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |          0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |          0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |          1
(3 rows)
```

이 문은 오프셋 열에 대한 별칭을 지정하지 않으므로 Amazon Redshift는 기본적으로 `offset_col`이라는 이름을 지정합니다.

## 명시적 OFFSET 열을 사용하여 배열 중첩 해제
<a name="r_FROM_clause-unnest-examples-explicit-offset"></a>

다음 쿼리는 `UNNEST ... WITH OFFSET` 파라미터를 사용하여 주문 배열 내의 제품을 표시합니다. 이전 예제의 쿼리와 비교하여 이 쿼리의 차이점은 오프셋 열의 이름을 별칭 `idx`로 명시적으로 지정한다는 것입니다.

```
SELECT o.order_id, up.product, up.idx
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product, idx);

 order_id |                                                           product                                                           | idx 
----------+-----------------------------------------------------------------------------------------------------------------------------+-----
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |   0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |   0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |   1
(3 rows)
```

# WHERE 절
<a name="r_WHERE_clause"></a>

WHERE 절은 테이블을 조인하거나 테이블의 열에 조건자를 적용하는 조건을 포함합니다. WHERE 절 또는 FROM 절에서 알맞은 구문을 사용하여 테이블을 내부 조인할 수 있습니다. FROM 절에는 외부 조인 기준을 지정해야 합니다.

## 구문
<a name="r_WHERE_clause-synopsis"></a>

```
[ WHERE condition ]
```

## *조건*
<a name="r_WHERE_clause-synopsis-condition"></a>

테이블 열에서 조인 조건 또는 조건자 같이, 부울 결과를 포함한 임의의 검색 조건입니다. 다음 예는 유효한 조인 조건입니다.

```
sales.listid=listing.listid
sales.listid<>listing.listid
```

다음 예는 테이블의 열에 유효한 조건입니다.

```
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys','Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
```

조건은 단순하거나 복잡할 수 있는데, 복잡한 조건의 경우 괄호를 사용하여 논리 단위를 분리할 수 있습니다. 다음 예에서는 조인 조건이 괄호로 묶여 있습니다.

```
where (category.catid=event.catid) and category.catid in(6,7,8)
```

## 사용 노트
<a name="r_WHERE_clause_usage_notes"></a>

select list 표현식을 참조하기 위해 WHERE 절의 별칭을 사용할 수 있습니다.

WHERE 절에서 집계 함수의 결과를 제한할 수 없습니다. 결과를 제한하려면 HAVING 절을 사용하십시오.

WHERE 절에서 제한되는 열은 FROM 절의 테이블 참조로부터 파생해야 합니다.

## 예제
<a name="r_SELECT_synopsis-example"></a>

다음 쿼리는 SALES 및 EVENT 테이블에 대한 조인 조건, EVENTNAME 열의 조건자, STARTTIME 열의 두 조건자를 비롯한 다양한 WHERE 절 제한 사항의 조합을 사용합니다.

```
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Hannah Montana'
and date_part(quarter, starttime) in(1,2)
and date_part(year, starttime) = 2008
order by 3 desc, 4, 2, 1 limit 10;

eventname    |      starttime      |   costperticket   | qtysold
----------------+---------------------+-------------------+---------
Hannah Montana | 2008-06-07 14:00:00 |     1706.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |     1658.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       3
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       4
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       1
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       4
(10 rows)
```

# WHERE 절의 Oracle 스타일 외부 조인
<a name="r_WHERE_oracle_outer"></a>

Oracle 호환성을 위해 Amazon Redshift는 WHERE 절 조인 조건에서 Oracle 외부 조인 연산자(\$1)를 지원합니다. 이 연산자는 외부 조인 조건을 정의하는 데만 사용하는 연산자이므로, 다른 컨텍스트에서는 사용하지 마십시오. 이 연산자를 달리 사용하면 대부분의 경우에는 자동으로 무시됩니다.

외부 조인은 동등한 내부 조인이 반환하는 모든 행과 한 테이블 또는 두 테이블 모두에서 일치하지 않는 행을 반환합니다. FROM 절에서 왼쪽, 오른쪽 및 전체 외부 조인을 지정할 수 있습니다. WHERE 절에서 왼쪽 및 오른쪽 외부 조인만 지정할 수 있습니다.

외부 조인 테이블 TABLE1 및 TABLE2를 지정하고 TABLE1(왼쪽 외부 조인)에서 일치하지 않는 행을 반환하려면 FROM 절에 `TABLE1 LEFT OUTER JOIN TABLE2`를 지정하거나 WHERE 절의 TABLE2에서 모든 조인 열에 (\$1) 연산자를 적용합니다. TABLE2에 일치하는 행이 없는 TABLE1의 모든 행에 대해, 쿼리의 결과는 TABLE2의 열을 포함한 모든 select list 표현식을 위한 null을 포함합니다.

TABLE1에 일치하는 행이 없는 TABLE2의 모든 행에 대해 동일한 동작을 생성하려면 FROM 절에 `TABLE1 RIGHT OUTER JOIN TABLE2`를 지정하거나 WHERE 절의 TABLE1에서 모든 조인 열에 (\$1) 연산자를 적용합니다.

## 기본 구문
<a name="r_WHERE_oracle_outer-basic-syntax"></a>

```
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
```

첫 번째 조건은 다음과 동등합니다.

```
from table1 left outer join table2
on table1.column1=table2.column1
```

두 번째 조건은 다음과 동등합니다.

```
from table1 right outer join table2
on table1.column1=table2.column1
```

**참고**  
여기에 표시된 구문은 한 쌍의 조인 열에 대해 간단한 동등 조인 케이스를 포함합니다. 하지만 다른 유형의 비교 조건과 여러 쌍의 조인 열 역시 유효합니다.

예를 들어, 다음 WHERE 절은 두 쌍의 열에 대해 외부 조인을 정의합니다. 두 조건에서 모두 (\$1) 연산자를 같은 테이블에 연결해야 합니다.

```
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
```

## 사용 노트
<a name="r_WHERE_oracle_outer_usage_notes"></a>

가능하면 WHERE 절에 (\$1) 연산자 대신 표준 FROM 절 OUTER JOIN 구문을 사용하십시오. (\$1) 연산자를 포함하는 쿼리는 다음 규칙에 따릅니다.
+ WHERE 절에는 (\$1) 연산자만 사용할 수 있고, 테이블 또는 뷰의 열에 대한 참조에만 사용할 수 있습니다.
+ 표현식에는 (\$1) 연산자를 적용할 수 없습니다. 하지만 표현식은 (\$1) 연산자를 사용하는 열을 포함할 수 있습니다. 예를 들어 다음과 같은 조인 조건은 구문 오류를 반환합니다.

  ```
  event.eventid*10(+)=category.catid
  ```

  그러나 다음 조인 조건이 유효합니다.

  ```
  event.eventid(+)*10=category.catid
  ```
+ FROM 절 조인 구문도 포함하는 쿼리 블록에 (\$1) 연산자를 사용할 수 없습니다.
+ 여러 조인 조건에 걸쳐 두 테이블이 조인되는 경우 이런 조건 전부에 (\$1) 연산자를 사용하거나 아무런 조건에도 이 연산자를 사용하면 안 됩니다. 혼합 구문 스타일의 조인은 따로 경고 없이 내부 조인으로 실행됩니다.
+ 외부 쿼리의 테이블을 내부 쿼리에서 생성되는 테이블과 조인하는 경우 (\$1) 연산자는 외부 조인을 생성하지 않습니다.
+ (\$1) 연산자를 사용하여 테이블을 그 자체에 외부 조인하려면 FROM 절에서 테이블 별칭을 정의하고 이런 별칭을 조인 조건에서 참조해야 합니다.

  ```
  select count(*)
  from event a, event b
  where a.eventid(+)=b.catid;
  
  count
  -------
  8798
  (1 row)
  ```
+ (\$1) 연산자를 포함하는 조인 조건을 OR 조건 또는 IN 조건과 결합할 수 없습니다. 예: 

  ```
  select count(*) from sales, listing
  where sales.listid(+)=listing.listid or sales.salesid=0;
  ERROR:  Outer join operator (+) not allowed in operand of OR or IN.
  ```
+  2개보다 많은 테이블을 외부 조인하는 WHERE 절에서는 (\$1) 연산자를 주어진 테이블에 한 번만 적용할 수 있습니다. 다음 예에서는 2개의 연속 조인에서 (\$1) 연산자로 SALES 테이블을 참조할 수 없습니다.

  ```
  select count(*) from sales, listing, event
  where sales.listid(+)=listing.listid and sales.dateid(+)=date.dateid;
  ERROR:  A table may be outer joined to at most one other table.
  ```
+  WHERE 절 외부 조인 조건이 TABLE2의 열을 상수와 비교하는 경우 그 열에 (\$1) 연산자를 적용합니다. 이 연산자를 포함하지 않으면 제한된 열을 위한 null을 포함하는 TABLE1의 외부 조인된 행이 제거됩니다. 아래 예시 섹션을 참조하세요.

## 예제
<a name="r_WHERE_oracle_outer-examples"></a>

다음 조인 쿼리는 LISTID 열에 대한 SALES 및 LISTING 테이블의 왼쪽 외부 조인을 지정합니다.

```
select count(*)
from sales, listing
where sales.listid = listing.listid(+);

count
--------
172456
(1 row)
```

위와 동등한 다음의 쿼리는 결과는 같지만 FROM 절 조인 구문을 사용합니다.

```
select count(*)
from sales left outer join listing on sales.listid = listing.listid;

count
--------
172456
(1 row)
```

SALES 테이블은 모든 목록이 판매로 이어지는 것은 아니므로 LISTING 테이블의 모든 목록에 대한 레코드를 포함하지는 않습니다. 다음 쿼리는 SALES와 LISTING을 외부 조인하고 SALES 테이블이 주어진 목록 ID에 대해 아무런 판매도 보고하지 않을 때도 LISTING에서 행을 반환합니다. SALES 테이블에서 파생되는 PRICE 및 COMM 열은 일치하지 않는 행에 대한 결과 집합에 null이 있습니다.

```
select listing.listid, sum(pricepaid) as price,
sum(commission) as comm
from listing, sales
where sales.listid(+) = listing.listid and listing.listid between 1 and 5
group by 1 order by 1;

listid | price  |  comm
--------+--------+--------
1 | 728.00 | 109.20
2 |        |
3 |        |
4 |  76.00 |  11.40
5 | 525.00 |  78.75
(5 rows)
```

WHERE 절 조인 연산자가 사용될 때 FROM 절에서 테이블의 순서는 중요하지 않습니다.

WHERE 절에서 더 복잡한 외부 조인 조건의 예시는 조건이 두 테이블 열 사이의 비교 *and* 상수와의 비교로 구성되는 경우입니다.

```
where category.catid=event.catid(+) and eventid(+)=796;
```

(\$1) 연산자는 두 곳에 사용되는데, 첫째로는 테이블 사이의 동등성 비교에 사용되고 둘째로는 EVENTID 열에 대한 비교 조건에 사용됩니다. 이 구문의 결과는 EVENTID에 대한 제한이 평가될 때 외부 조인된 행이 보존되는 것입니다. EVENTID 제한에서 (\$1) 연산자를 제거하는 경우 쿼리는 이 제한을 외부 조인 조건의 일부가 아니라 필터로 취급합니다. 그러면 EVENTID에 대해 null을 포함하는 외부 조인된 행이 결과 집합에서 제거됩니다.

다음은 이 동작을 설명하는 완전한 쿼리입니다.

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid(+)=796;

catname | catgroup | eventid
-----------+----------+---------
Classical | Concerts |
Jazz | Concerts |
MLB | Sports   |
MLS | Sports   |
Musicals | Shows    | 796
NBA | Sports   |
NFL | Sports   |
NHL | Sports   |
Opera | Shows    |
Plays | Shows    |
Pop | Concerts |
(11 rows)
```

FROM 절 구문을 사용하는 동등한 쿼리는 다음과 같습니다.

```
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
```

이 쿼리의 WHERE 절 버전에서 두 번째 (\$1) 연산자를 제거하는 경우 1개의 행만 반환합니다(`eventid=796`인 행).

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid=796;

catname | catgroup | eventid
-----------+----------+---------
Musicals | Shows    | 796
(1 row)
```

# GROUP BY 절
<a name="r_GROUP_BY_clause"></a>

GROUP BY 절은 쿼리에 대한 그룹화 열을 식별합니다. 이는 테이블에서 나열된 모든 열에 같은 값이 있는 행을 그룹화하는 데 사용됩니다. 열이 나열된 순서는 중요하지 않습니다. 결과는 공통 값을 가진 각 행 세트를 그룹의 모든 행을 나타내는 하나의 그룹 행으로 결합하는 것입니다. GROUP BY를 사용하여 출력의 중복을 제거하고 그룹에 적용되는 집계를 계산합니다. 쿼리가 SUM, AVG 및 COUNT와 같은 표준 함수로 집계를 계산할 때 그룹화 열을 선언해야 합니다. 자세한 내용은 [집계 함수](c_Aggregate_Functions.md) 섹션을 참조하세요.

## 구문
<a name="r_GROUP_BY_clause-syntax"></a>

```
[ GROUP BY  expression [, ...] | ALL | aggregation_extension  ]
```

여기서 *aggregation\$1extension*은 다음 중 하나입니다.

```
GROUPING SETS ( () | aggregation_extension [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
```

## 파라미터
<a name="r_GROUP_BY_clause-parameters"></a>

 * expression*  
열 또는 표현식의 목록은 쿼리의 선택 목록에 있는 비집계 표현식의 목록과 일치해야 합니다. 예를 들어, 다음과 같이 간단한 쿼리를 생각해 보세요.  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by listid, eventid
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```
이 쿼리에서 선택 목록은 2개의 집계 표현식으로 구성됩니다. 첫 번째 표현식은 SUM 함수를 사용하고 두 번째 표현식은 COUNT 함수를 사용합니다. 나머지 두 개의 열 LISTID 및 EVENTID를 그룹화 열로 선언해야 합니다.  
GROUP BY 절에서 표현식은 서수를 사용하여 선택 목록을 참조할 수도 있습니다. 예를 들어, 이전 예는 다음과 같이 줄일 수도 있습니다.  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by 1,2
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```

ALL  
ALL은 집계된 열을 제외하고 SELECT 목록에 지정된 모든 열을 기준으로 그룹화함을 나타냅니다. 예를 들어 GROUP BY 절에서 개별적으로 지정할 필요 없이 `col1` 및 `col2`를 기준으로 그룹화하는 다음 쿼리를 생각해 보겠습니다. `col3` 열은 `SUM` 함수의 인수이므로 그룹화되지 않습니다.  

```
SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
```
SELECT 목록에서 열을 제외하면 GROUP BY ALL 절은 해당 특정 열을 기반으로 결과를 그룹화하지 않습니다.  

```
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
```

 * *aggregation\$1extension* *   
집계 확장 GROUPING SETS, ROLLUP 및 CUBE를 사용하여 단일 문에서 여러 GROUP BY 작업을 수행할 수 있습니다. 집계 확장 및 관련 기능에 대한 자세한 내용은 [집계 확장](r_GROUP_BY_aggregation-extensions.md)을 참조하세요.

## 예제
<a name="r_GROUP_BY_clause-examples"></a>

다음 예에서는 salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 열이 포함된 SALES 테이블을 사용합니다. SALES 테이블에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음 예시 쿼리는 GROUP BY 절에서 개별적으로 지정할 필요 없이 `salesid` 및 `listid`를 기준으로 그룹화합니다. `qtysold` 열은 `SUM` 함수의 인수이므로 그룹화되지 않습니다.

```
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;

salesid | listid  | sum
--------+---------+------
33095   | 36572   | 2	
88268   | 100813  | 4	
110917  | 127048  | 1	
...
```

다음 예시 쿼리는 SELECT 목록에서 여러 열을 제외하므로 GROUP BY ALL은 salesid와 listid만 그룹화합니다.

```
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 
FROM sales GROUP BY ALL;

salesid | listid 
--------+---------
33095   | 36572   	
88268   | 100813 	
110917  | 127048 	
...
```

# 집계 확장
<a name="r_GROUP_BY_aggregation-extensions"></a>

Amazon Redshift는 단일 문에서 여러 GROUP BY 작업을 수행하는 집계 확장을 지원합니다.

 집계 확장의 예시에서는 전자 회사의 판매 데이터가 들어 있는`orders` 테이블을 사용합니다. 다음을 사용하여 `orders`를 생성할 수 있습니다.

```
CREATE TABLE ORDERS (
    ID INT,
    PRODUCT CHAR(20),
    CATEGORY CHAR(20),
    PRE_OWNED CHAR(1),
    COST DECIMAL
);

INSERT INTO ORDERS VALUES
    (0, 'laptop',       'computers',    'T', 1000),
    (1, 'smartphone',   'cellphones',   'T', 800),
    (2, 'smartphone',   'cellphones',   'T', 810),
    (3, 'laptop',       'computers',    'F', 1050),
    (4, 'mouse',        'computers',    'F', 50);
```

## *GROUPING SETS*
<a name="r_GROUP_BY_aggregation-extensions-grouping-sets"></a>

 단일 명령문에서 하나 이상의 그룹화 집합을 계산합니다. 그룹화 집합은 쿼리의 결과 집합을 그룹화할 수 있는 0개 이상의 열 집합인 단일 GROUP BY 절의 집합입니다. 집합을 그룹화하여 그룹화하는 것은 서로 다른 열로 그룹화된 하나의 결과 집합에서 UNION ALL 쿼리를 실행하는 것과 같습니다. 예를 들어, GROUP BY GROUPING SETS((a), (b))는 GROUP BY a UNION ALL GROUP BY b와 동일합니다.

 다음 예에서는 제품 카테고리와 판매된 제품 종류에 따라 그룹화된 주문 테이블 제품의 비용을 반환합니다.

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(category, product);

       category       |       product        | total
----------------------+----------------------+-------
 computers            |                      |  2100
 cellphones           |                      |  1610
                      | laptop               |  2050
                      | smartphone           |  1610
                      | mouse                |    50

(5 rows)
```

## *ROLLUP*
<a name="r_GROUP_BY_aggregation-extensions-rollup"></a>

 이전 열이 후속 열의 부모로 간주되는 계층 구조를 가정합니다. ROLLUP은 제공된 열을 기준으로 데이터를 그룹화하여 그룹화된 행 외에 그룹화 열의 모든 수준에서 총계를 나타내는 추가 소계 행을 반환합니다. 예를 들어 GROUP BY ROLLUP ((a), (b) 를 사용하여 b가 a의 하위 섹션이라고 가정하면서 먼저 a로 그룹화된 다음 b로 그룹화된 결과 집합을 반환할 수 있습니다. ROLLUP은 또한 열을 그룹화하지 않고 전체 결과 집합이 있는 행을 반환합니다.

GROUP BY ROLLUP((a), (b))는 GROUP BY GROUPING SETS((a,b), (a), ())와 같습니다.

다음 예는 먼저 범주별로 그룹화된 주문 테이블의 제품 비용을 반환한 다음 제품을 범주의 하위 부문으로 사용하여 반환합니다.

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY ROLLUP(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      |                      |  3710
(6 rows)
```

## *CUBE*
<a name="r_GROUP_BY_aggregation-extensions-cube"></a>

 제공된 열을 기준으로 데이터를 그룹화하여 그룹화된 행 외에 그룹화 열의 모든 수준에서 합계를 나타내는 추가 소계 행을 반환합니다. CUBE는 ROLLUP과 동일한 행을 반환하는 동시에 ROLLUP에서 다루지 않는 그룹화 열의 모든 조합에 대해 소계 행을 추가합니다. 예를 들어 GROUP BY CUBE ((a), (b) 를 사용하여 b가 a의 하위 섹션이고 그 다음 b만으로 그룹화된 결과 집합을 반환할 수 있습니다. CUBE는 또한 열을 그룹화하지 않고 전체 결과 집합이 있는 행을 반환합니다.

GROUP BY CUBE((a), (b))는 GROUP BY GROUPING SETS((a, b), (a), (b), ())와 같습니다.

다음 예는 먼저 범주별로 그룹화된 주문 테이블의 제품 비용을 반환한 다음 제품을 범주의 하위 부문으로 사용하여 반환합니다. ROLLUP에 대한 앞의 예와 달리 문은 그룹화 열의 모든 조합에 대한 결과를 반환합니다.

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      | laptop               |  2050
                      | mouse                |    50
                      | smartphone           |  1610
                      |                      |  3710
(9 rows)
```

## *GROUPING/GROUPING\$1ID 함수*
<a name="r_GROUP_BY_aggregation-extentions-grouping"></a>

 ROLLUP 및 CUBE는 소계 행을 나타내기 위해 결과 집합에 NULL 값을 추가합니다. 예를 들어 GROUP BY ROLLUP((a), (b))는 b 그룹화 열에서 값이 NULL인 하나 이상의 행을 반환하여 그룹화 열에 있는 필드의 소계임을 나타냅니다. 이러한 NULL 값은 반환 튜플의 형식을 충족하는 데만 사용됩니다.

 NULL 값 자체를 저장하는 관계에서 ROLLUP 및 CUBE와 함께 GROUP BY 작업을 실행하면 동일한 그룹화 열이 있는 것으로 보이는 행이 있는 결과 집합이 생성될 수 있습니다. 이전 예제로 돌아가서 b 그룹화 열에 저장된 NULL 값이 포함된 경우 GROUP BY ROLLUP ((a), (b) 은 b 그룹화 열에서 소계가 아닌 값이 NULL인 행을 반환합니다.

 ROLLUP 및 CUBE에 의해 생성된 NULL 값과 테이블 자체에 저장된 NULL 값을 구별하기 위해 GROUPING 함수 또는 별칭 GROUPING\$1ID를 사용할 수 있습니다. GROUPING은 단일 그룹화 집합을 인수로 사용하고 결과 집합의 각 행에 대해 해당 위치의 그룹화 열에 해당하는 0 또는 1비트 값을 반환한 다음 해당 값을 정수로 변환합니다. 해당 위치의 값이 집계 확장에 의해 생성된 NULL 값인 경우 GROUPING은 1을 반환합니다. 이 함수는 저장된 NULL 값을 비롯해 다른 모든 값에 대해 0을 반환합니다.

 예를 들어 GROUPING(category, product)은 해당 행의 그룹화 열 값에 따라 지정된 행에 대해 다음 값을 반환할 수 있습니다. 이 예제의 목적을 위해 테이블의 모든 NULL 값은 집계 확장에 의해 생성된 NULL 값입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_GROUP_BY_aggregation-extensions.html)

GROUPING 함수는 쿼리의 SELECT 목록 부분에 다음 형식으로 나타납니다.

```
SELECT ... [GROUPING( expr )...] ...
  GROUP BY ... {CUBE | ROLLUP| GROUPING SETS} ( expr ) ...
```

다음 예제는 CUBE에 대한 이전 예제와 동일하지만 그룹화 집합에 대한 GROUPING 함수가 추가되었습니

```
SELECT category, product,
       GROUPING(category) as grouping0,
       GROUPING(product) as grouping1,
       GROUPING(category, product) as grouping2,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 3,1,2;

       category       |       product        | grouping0 | grouping1 | grouping2 | total
----------------------+----------------------+-----------+-----------+-----------+-------
 cellphones           | smartphone           |         0 |         0 |         0 |  1610
 cellphones           |                      |         0 |         1 |         1 |  1610
 computers            | laptop               |         0 |         0 |         0 |  2050
 computers            | mouse                |         0 |         0 |         0 |    50
 computers            |                      |         0 |         1 |         1 |  2100
                      | laptop               |         1 |         0 |         2 |  2050
                      | mouse                |         1 |         0 |         2 |    50
                      | smartphone           |         1 |         0 |         2 |  1610
                      |                      |         1 |         1 |         3 |  3710
(9 rows)
```

## *부분 ROLLUP 및 CUBE*
<a name="r_GROUP_BY_aggregation-extentions-partial"></a>

 소계의 일부만으로 ROLLUP 및 CUBE 작업을 실행할 수 있습니다.

 부분 ROLLUP 및 CUBE 작업의 구문은 다음과 같습니다.

```
GROUP BY expr1, { ROLLUP | CUBE }(expr2, [, ...])
```

여기에서 GROUP BY 절은 *expr2* 이후의 수준에서 소계 행만 생성합니다.

다음 예제는 주문 테이블에 대한 부분 ROLLUP 및 CUBE 작업을 보여줍니다. 먼저 제품이 중고인지 여부에 따라 그룹화한 다음 범주 및 제품 열에서 ROLLUP 및 CUBE를 실행합니다.

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, ROLLUP(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(9 rows)

SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, CUBE(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(13 rows)
```

사전 소유 열은 ROLLUP 및 CUBE 작업에 포함되지 않으므로 다른 모든 행을 포함하는 총계 행이 없습니다.

## *연결된 그룹화*
<a name="r_GROUP_BY_aggregation-extentions-concat"></a>

 여러 GROUPING SETS/ROLLUP/CUBE 절을 연결하여 서로 다른 수준의 소계를 계산할 수 있습니다. 연결된 그룹화는 제공된 그룹화 집합의 데카르트 곱을 반환합니다.

 GROUPING SETS/ROLLUP/CUBE 절을 연결하는 구문은 다음과 같습니다.

```
GROUP BY {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...]),
         {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...])[, ...]
```

다음 예제를 통해 서로 연결된 소규모 그룹화가 어떻게 큰 최종 결과 집합을 생성할 수 있는지 확인해 보세요.

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product), GROUPING SETS(pre_owned, ())
ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
           | cellphones           | smartphone           |        1 |  1610
           | computers            | laptop               |        1 |  2050
           | computers            | mouse                |        1 |    50
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
           | cellphones           |                      |        3 |  1610
           | computers            |                      |        3 |  2100
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
           |                      | laptop               |        5 |  2050
           |                      | mouse                |        5 |    50
           |                      | smartphone           |        5 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
           |                      |                      |        7 |  3710
(22 rows)
```

## *중첩된 그룹화*
<a name="r_GROUP_BY_aggregation-extentions-nested"></a>

 GROUPING SETS/ROLLUP/CUBE 작업을 GROUPING SETS *expr*로 사용하여 중첩된 그룹화를 형성할 수 있습니다. 중첩된 GROUPING SETS 내부의 하위 그룹화가 평면화됩니다.

 중첩된 그룹화의 구문은 다음과 같습니다.

```
GROUP BY GROUPING SETS({ROLLUP|CUBE|GROUPING SETS}(expr[, ...])[, ...])
```

다음 예제를 살펴보세요.

```
SELECT category, product, pre_owned,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(ROLLUP(category), CUBE(product, pre_owned))
ORDER BY 4,1,2,3;

       category       |       product        | pre_owned | group_id | total
----------------------+----------------------+-----------+----------+-------
 cellphones           |                      |           |        3 |  1610
 computers            |                      |           |        3 |  2100
                      | laptop               | F         |        4 |  1050
                      | laptop               | T         |        4 |  1000
                      | mouse                | F         |        4 |    50
                      | smartphone           | T         |        4 |  1610
                      | laptop               |           |        5 |  2050
                      | mouse                |           |        5 |    50
                      | smartphone           |           |        5 |  1610
                      |                      | F         |        6 |  1100
                      |                      | T         |        6 |  2610
                      |                      |           |        7 |  3710
                      |                      |           |        7 |  3710
(13 rows)
```

ROLLUP(category) 및 CUBE(product, pre\$1owned) 모두 그룹화 집합()을 포함하므로 총계를 나타내는 행이 중복됩니다.

## *사용 노트*
<a name="r_GROUP_BY_aggregation-extensions-usage-notes"></a>
+ GROUP BY 절은 최대 64개의 그룹화 세트를 지원합니다. ROLLUP 및 CUBE 또는 GROUPING SETS, ROLLUP 및 CUBE의 일부 조합의 경우 이 제한은 포함된 그룹화 집합 수에 적용됩니다. 예를 들어 GROUP BY CUBE((a), (b))는 2가 아닌 4개의 그룹화 집합으로 계산됩니다.
+ 집계 확장을 사용하는 경우 상수를 그룹화 열로 사용할 수 없습니다.
+ 중복된 열이 포함된 그룹화 집합은 만들 수 없습니다.

# HAVING 절
<a name="r_HAVING_clause"></a>

HAVING 절은 쿼리가 반환하는 중간 그룹화 결과 집합에 조건을 적용합니다.

## 구문
<a name="r_HAVING_clause-synopsis"></a>

```
[ HAVING condition ]
```

예를 들어, SUM 함수의 결과를 제한할 수 있습니다.

```
having sum(pricepaid) >10000
```

모든 WHERE 절 조건이 적용되고 GROUP BY 작업이 완료된 후 HAVING 조건이 적용됩니다.

조건 자체는 WHERE 절 조건과 같은 형식을 취합니다.

## 사용 노트
<a name="r_HAVING_clause_usage_notes"></a>
+ HAVING 절 조건에서 참조되는 열은 그룹화 열이거나 집계 함수의 결과를 참조하는 열이어야 합니다.
+ HAVING 절에서 다음을 지정할 수는 없습니다.
  + 선택 목록 항목을 참조하는 서수. GROUP BY 및 ORDER BY 절만이 서수를 허용합니다.

## 예제
<a name="r_HAVING_clause-examples"></a>

다음 쿼리는 이름을 기준으로 모든 이벤트에 대한 총 티켓 판매액을 계산한 다음, 총 판매액이 \$1800,000 미만인 이벤트를 제거합니다. HAVING 조건은 선택 목록에서 집계 함수의 결과에 적용됩니다. `sum(pricepaid)`.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(pricepaid) > 800000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

다음 쿼리는 비슷한 결과 집합을 계산합니다. 하지만 이 경우에는 HAVING 조건이 선택 목록에 지정되지 않은 집계에 적용됩니다(`sum(qtysold)`). 티켓이 2,000장보다 많이 팔리지 않은 이벤트가 최종 결과에서 제거됩니다.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(qtysold) >2000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
Chicago          |  790993.00
Spamalot         |  714307.00
```

다음 쿼리는 이름을 기준으로 모든 이벤트에 대한 총 티켓 판매액을 계산한 다음, 총 판매액이 \$1800,000 미만인 이벤트를 제거합니다. HAVING 조건은 선택 목록에서 `sum(pricepaid)`에 별칭 `pp`를 사용하여 집계 함수의 결과에 적용됩니다.

```
select eventname, sum(pricepaid) as pp
from sales join event on sales.eventid = event.eventid
group by 1
having pp > 800000
order by 2 desc, 1;

eventname        |    pp
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

# QUALIFY 절
<a name="r_QUALIFY_clause"></a>

QUALIFY 절은 사용자가 지정한 검색 조건에 따라 이전에 계산된 윈도우 함수의 결과를 필터링합니다. 이 절을 사용하면 하위 쿼리를 사용하지 않고 윈도우 함수의 결과에 필터링 조건을 적용할 수 있습니다.

이는 조건을 적용하여 WHERE 절의 행을 추가로 필터링하는 [HAVING 절](https://docs.aws.amazon.com/redshift/latest/dg/r_HAVING_clause.html)과 유사합니다. QUALIFY와 HAVING의 차이점은 QUALIFY 절의 필터링된 결과가 데이터에 대해 윈도우 함수를 실행한 결과를 기반으로 할 수 있다는 것입니다. 한 쿼리에서 QUALIFY 절과 HAVING 절을 모두 사용할 수 있습니다.

## 구문
<a name="r_QUALIFY-synopsis"></a>

```
QUALIFY condition
```

**참고**  
FROM 절 바로 뒤에 QUALIFY 절을 사용하는 경우 FROM 관계 이름에는 QUALIFY 절 앞에 별칭이 지정되어 있어야 합니다.

## 예제
<a name="r_QUALIFY-examples"></a>

이 섹션의 예에서는 아래 샘플 데이터를 사용합니다.

```
create table store_sales (ss_sold_date date, ss_sold_time time, 
               ss_item text, ss_sales_price float);
insert into store_sales values ('2022-01-01', '09:00:00', 'Product 1', 100.0),
                               ('2022-01-01', '11:00:00', 'Product 2', 500.0),
                               ('2022-01-01', '15:00:00', 'Product 3', 20.0),
                               ('2022-01-01', '17:00:00', 'Product 4', 1000.0),
                               ('2022-01-01', '18:00:00', 'Product 5', 30.0),
                               ('2022-01-02', '10:00:00', 'Product 6', 5000.0),
                               ('2022-01-02', '16:00:00', 'Product 7', 5.0);
```

다음 예는 매일 12:00 이후에 판매된 가장 비싼 품목 두 개를 찾는 방법을 보여줍니다.

```
SELECT *
FROM store_sales ss
WHERE ss_sold_time > time '12:00:00'
QUALIFY row_number()
OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2
               

 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 17:00:00     | Product 4 |           1000
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

그런 다음 매일 마지막으로 판매된 품목을 찾을 수 있습니다.

```
SELECT *
FROM store_sales ss
QUALIFY last_value(ss_item)
OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = ss_item;
               
ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

다음 예에서는 이전 쿼리와 동일한 레코드, 즉 매일 마지막으로 판매된 품목을 반환하지만 QUALIFY 절을 사용하지 않습니다.

```
SELECT * FROM (
  SELECT *,
  last_value(ss_item)
  OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) ss_last_item
  FROM store_sales ss
)
WHERE ss_last_item = ss_item;
               
 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price | ss_last_item 
--------------+--------------+-----------+----------------+--------------
 2022-01-02   | 16:00:00     | Product 7 |              5 | Product 7
 2022-01-01   | 18:00:00     | Product 5 |             30 | Product 5
```

# UNION, INTERSECT 및 EXCEPT
<a name="r_UNION"></a>

**Topics**
+ [구문](#r_UNION-synopsis)
+ [파라미터](#r_UNION-parameters)
+ [설정 연산자에 대한 평가 순서](#r_UNION-order-of-evaluation-for-set-operators)
+ [사용 노트](#r_UNION-usage-notes)
+ [UNION 쿼리 예](c_example_union_query.md)
+ [UNION ALL 쿼리 예](c_example_unionall_query.md)
+ [INTERSECT 쿼리 예](c_example_intersect_query.md)
+ [EXCEPT 쿼리 예](c_Example_MINUS_query.md)

UNION, INTERSECT 및 EXCEPT *설정 연산자*는 별개의 두 쿼리 표현식의 결과를 비교 및 병합하는 데 사용됩니다. 예를 들어, 웹사이트의 어떤 사용자가 구매자인 동시에 판매자인지 알고 싶지만 이런 사용자들의 사용자 이름이 별개의 열이나 테이블에 저장되어 있는 경우 이러한 두 가지 사용자 유형의 *교집합*을 찾을 수 있습니다. 어떤 웹사이트 사용자가 구매자이고 판매자는 아닌지 알고 싶으면 EXCEPT 연산자를 사용하여 두 사용자 목록 사이의 *차이*를 찾을 수 있습니다. 역할과는 상관없이 모든 사용자의 목록을 빌드하려면 UNION 연산자를 사용할 수 있습니다.

## 구문
<a name="r_UNION-synopsis"></a>

```
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
```

## 파라미터
<a name="r_UNION-parameters"></a>

 *query*()   
UNION, INTERSECT 또는 EXCEPT 연산자 뒤에 쿼리 표현식의 선택 목록 형태로 제2의 쿼리 표현식에 상응하는 쿼리 표현식입니다. 이 두 표현식에는 호환 데이터 형식을 가진 같은 개수의 출력 열이 있어야 합니다. 그렇지 않으면 두 결과 집합을 비교 및 병합할 수 없습니다. 설정 연산은 서로 다른 범주의 데이터 형식 간의 암시적 변환을 허용하지 않습니다. 자세한 내용은 [형식 호환성 및 변환](c_Supported_data_types.md#r_Type_conversion) 섹션을 참조하세요.  
무제한 개수의 쿼리 표현식을 포함하는 쿼리를 빌드하고 임의의 조합으로 UNION, INTERSECT 및 EXCEPT 연산자와 연결할 수 있습니다. 예를 들어, 테이블 T1, T2 및 T3에 호환되는 열 집합이 포함되어 있다고 가정하면 다음 쿼리 구조가 유효합니다.  

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

UNION   
행이 한 표현식이나 두 표현식 모두에서 파생하는지에 상관없이, 두 쿼리 표현식에서 행을 반환하는 작업을 설정합니다.

INTERSECT   
두 쿼리 표현식에서 파생하는 행을 반환하는 작업을 설정합니다. 두 표현식에서 모두 반환되지 않는 행은 삭제됩니다.

EXCEPT \$1 MINUS   
두 쿼리 표현식 중 하나에서 파생하는 행을 반환하는 작업을 설정합니다. 첫 번째 결과 테이블에는 있지만 두 번째 결과 테이블에는 없는 행에 대한 결과가 반환될 수 있다. MINUS 및 EXCEPT는 정확히 동의어입니다.

ALL   
ALL 키워드는 UNION에 의해 생성되는 중복 행을 모두 유지합니다. ALL 키워드가 사용되지 않을 때의 기본 동작은 이러한 중복 항목을 삭제하는 것입니다. INTERSECT ALL, EXCEPT ALL 및 MINUS ALL은 지원되지 않습니다.

## 설정 연산자에 대한 평가 순서
<a name="r_UNION-order-of-evaluation-for-set-operators"></a>

UNION 및 EXCEPT 설정 연산자는 좌우선 결합 연산자입니다. 우선순위에 영향을 주기 위해 괄호가 지정되어 있지 않은 경우 이러한 설정 연산자의 조합은 왼쪽에서 오른쪽으로 계산됩니다. 예를 들어 다음 쿼리에서, T1 및 T2의 UNION이 먼저 계산된 다음 UNION 결과에 대해 EXCEPT 작업이 수행됩니다.

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

동일한 쿼리에 연산자 조합이 사용될 때 INTERSECT 연산자가 UNION 및 EXCEPT 연산자보다 우선합니다. 예를 들어 다음 쿼리는 T2 및 T3의 교집합을 계산한 다음 그 결과와 T1의 합집합을 구합니다.

```
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
```

괄호를 추가하면 다른 계산 순서를 적용할 수 있습니다. 다음 경우에는 T1 및 T2의 합집합 결과가 T3와 교집합을 이루고, 쿼리가 다른 결과를 낳을 가능성이 있습니다.

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
```

## 사용 노트
<a name="r_UNION-usage-notes"></a>
+ 설정 작업 쿼리의 결과에 반환되는 열 이름은 첫 번째 쿼리 표현식의 테이블에서 가져온 열 이름(또는 별칭)입니다. 열의 값이 설정 연산자의 어느 한쪽에 있는 테이블에서 파생한다는 점에서 이런 열 이름은 오해를 불러일으킬 가능성이 있으므로, 결과 집합에 대해 의미 있는 별칭을 부여하고 싶을 수도 있습니다.
+ 설정 연산자에 선행하는 쿼리 표현식에 ORDER BY 절을 포함하면 안 됩니다. ORDER BY 절은 설정 연산자를 포함하는 쿼리의 끝에 사용될 때만 의미 있게 정렬된 결과를 내놓습니다. 이 경우에는 ORDER BY 절이 모든 설정 작업의 최종 결과에 적용됩니다. 가장 바깥쪽 쿼리는 표준 LIMIT 및 OFFSET 절도 포함할 수 있습니다.
+ 설정 연산자 쿼리가 10진수 결과를 반환할 때 그에 상응하는 결과 열은 같은 정밀도와 규모를 반환하도록 승격됩니다. 예를 들어, 다음 쿼리에서 T1.REVENUE가 DECIMAL(10,2) 열이고 T2.REVENUE가 DECIMAL(8,4) 열인 경우 10진수 결과는 DECIMAL(12,4)로 승격됩니다.

  ```
  select t1.revenue union select t2.revenue;
  ```

  규모는 두 열의 최대 규모인 `4`입니다. T1.REVENUE는 소수점 왼쪽에 8자리가 필요하므로(12 - 4 = 8) 정밀도는 `12`입니다. 이러한 유형 승격은 UNION 양쪽 모두의 값이 전부 결과에 부합하도록 합니다. 64비트 값의 경우, 최대 결과 정밀도는 19이고 최대 결과 규모는 18입니다. 128비트 값의 경우, 최대 결과 정밀도는 38이고 최대 결과 규모는 37입니다.

  결과 데이터 형식이 Amazon Redshift 전체 자릿수 및 소수 자릿수 제한을 초과하는 경우 쿼리는 오류를 반환합니다.
+ 설정 작업의 경우, 각각 상응하는 열 쌍에 대해 두 데이터 값이 *equal* 또는 *both NULL*인 경우 두 행이 동일한 것으로 처리됩니다. 예를 들어, 테이블 T1과 T2에 모두 한 열과 한 행이 있고 그 행이 두 테이블에서 모두 NULL인 경우 두 테이블에 대해 INTERSECT 연산을 수행하면 바로 그 행이 반환됩니다.

# UNION 쿼리 예
<a name="c_example_union_query"></a>

다음 UNION 쿼리에서 SALES 테이블의 행은 LISTING 테이블의 행과 병합됩니다. 각각의 테이블에서 호환되는 3개의 열이 선택되며, 이 경우에는 해당하는 열들의 이름과 데이터 형식이 동일합니다.

최종 결과 집합은 LISTING 테이블의 첫 번째 열을 기준으로 정렬되고 LISTID 값이 가장 높은 5개의 행으로 제한됩니다.

```
select listid, sellerid, eventid from listing
union select listid, sellerid, eventid from sales
order by listid, sellerid, eventid desc limit 5;

listid | sellerid | eventid
--------+----------+---------
1 |    36861 |    7872
2 |    16002 |    4806
3 |    21461 |    4256
4 |     8117 |    4337
5 |     1616 |    8647
(5 rows)
```

다음 예는 결과 집합에서 어떤 쿼리 표현식이 각각의 행을 생성했는지 볼 수 있도록 UNION 쿼리의 출력에 리터럴 값을 추가할 수 있는 방법을 보여줍니다. 이 쿼리는 첫 번째 쿼리 표현식의 행을 "B"(buyer)로 식별하고 두 번째 쿼리 표현식의 행을 "S"(seller)로 식별합니다.

이 쿼리는 \$110,000 이상의 티켓 거래에 대해 구매자와 판매자를 식별합니다. UNION 연산자의 어느 한쪽에서 두 쿼리 표현식의 유일한 차이점은 SALES 테이블에 대한 조인 열입니다.

```
select listid, lastname, firstname, username,
pricepaid as price, 'S' as buyorsell
from sales, users
where sales.sellerid=users.userid
and pricepaid >=10000
union
select listid, lastname, firstname, username, pricepaid,
'B' as buyorsell
from sales, users
where sales.buyerid=users.userid
and pricepaid >=10000
order by 1, 2, 3, 4, 5;

listid | lastname | firstname | username |   price   | buyorsell
--------+----------+-----------+----------+-----------+-----------
209658 | Lamb     | Colette   | VOR15LYI |  10000.00 | B
209658 | West     | Kato      | ELU81XAA |  10000.00 | S
212395 | Greer    | Harlan    | GXO71KOC |  12624.00 | S
212395 | Perry    | Cora      | YWR73YNZ |  12624.00 | B
215156 | Banks    | Patrick   | ZNQ69CLT |  10000.00 | S
215156 | Hayden   | Malachi   | BBG56AKU |  10000.00 | B
(6 rows)
```

중복된 행이 발견되는 경우 결과에 이런 행을 유지해야 하므로, 다음 예에서는 UNION ALL 연산자를 사용합니다. 이벤트 ID의 특정 시리즈에 대해, 쿼리는 각 이벤트와 관련된 각각의 판매에 대해 0개 이상의 행을 반환하고 그 이벤트의 각 목록에 대해 0개 또는 1개의 행을 반환합니다. 이벤트 ID는 LISTING 및 EVENT 테이블에서 각각의 행에 고유하지만, SALES 테이블에서 이벤트 및 목록 ID의 동일한 조합에 대해 여러 개의 판매 건이 있을 수 있습니다.

결과 집합의 세 번째 열은 행의 원본을 식별합니다. 행의 출처가 SALES 테이블인 경우 SALESROW 열에 "YES"로 표시됩니다. (SALESROW는 SALES.LISTID의 별칭입니다.) 행의 출처가 LISTING 테이블인 경우 SALESROW 열에 "No"로 표시됩니다.

이 경우, 결과 집합은 목록 500, 이벤트 7787에 대해 3개의 판매 행으로 구성됩니다. 즉, 이 목록 및 이벤트 조합에 대해 3가지 다른 트랜잭션이 발생했습니다. 다른 두 목록 501 및 502에서는 어떤 판매도 생성되지 않았으므로, 쿼리가 이들 목록 ID에 대해 생성하는 유일한 행의 출처는 LISTING 테이블입니다(SALESROW = 'No').

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

ALL 키워드 없이 같은 쿼리를 실행하는 경우 결과에는 판매 거래 중 하나만 유지됩니다.

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# UNION ALL 쿼리 예
<a name="c_example_unionall_query"></a>

중복된 행이 발견되는 경우 결과에 이런 행을 유지해야 하므로, 다음 예에서는 UNION ALL 연산자를 사용합니다. 이벤트 ID의 특정 시리즈에 대해, 쿼리는 각 이벤트와 관련된 각각의 판매에 대해 0개 이상의 행을 반환하고 그 이벤트의 각 목록에 대해 0개 또는 1개의 행을 반환합니다. 이벤트 ID는 LISTING 및 EVENT 테이블에서 각각의 행에 고유하지만, SALES 테이블에서 이벤트 및 목록 ID의 동일한 조합에 대해 여러 개의 판매 건이 있을 수 있습니다.

결과 집합의 세 번째 열은 행의 원본을 식별합니다. 행의 출처가 SALES 테이블인 경우 SALESROW 열에 "YES"로 표시됩니다. (SALESROW는 SALES.LISTID의 별칭입니다.) 행의 출처가 LISTING 테이블인 경우 SALESROW 열에 "No"로 표시됩니다.

이 경우, 결과 집합은 목록 500, 이벤트 7787에 대해 3개의 판매 행으로 구성됩니다. 즉, 이 목록 및 이벤트 조합에 대해 3가지 다른 트랜잭션이 발생했습니다. 다른 두 목록 501 및 502에서는 어떤 판매도 생성되지 않았으므로, 쿼리가 이들 목록 ID에 대해 생성하는 유일한 행의 출처는 LISTING 테이블입니다(SALESROW = 'No').

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

ALL 키워드 없이 같은 쿼리를 실행하는 경우 결과에는 판매 거래 중 하나만 유지됩니다.

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# INTERSECT 쿼리 예
<a name="c_example_intersect_query"></a>

다음 예를 첫 번째 UNION 예와 비교해 보십시오. 두 예에서는 사용되는 설정 연산자만 다를 뿐이지만, 그 결과는 매우 상이합니다. 다음과 같이 행들 중 하나만 같습니다.

```
235494 |    23875 |    8771
```

 이 행이 양쪽 테이블에서 발견된 5개 행의 제한된 결과에 있는 유일한 행입니다.

```
select listid, sellerid, eventid from listing
intersect
select listid, sellerid, eventid from sales
order by listid desc, sellerid, eventid
limit 5;

listid | sellerid | eventid
--------+----------+---------
235494 |    23875 |    8771
235482 |     1067 |    2667
235479 |     1589 |    7303
235476 |    15550 |     793
235475 |    22306 |    7848
(5 rows)
```

다음 쿼리는 3월에 뉴욕과 로스앤젤레스의 두 도시에서 모두 현장에서 이루어진 (티켓이 판매된) 이벤트를 찾습니다. 두 쿼리 표현식의 차이점은 VENUECITY 열에 대한 제약 조건입니다.

```
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='Los Angeles'
intersect
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='New York City'
order by eventname asc;

eventname
----------------------------
A Streetcar Named Desire
Dirty Dancing
Electra
Running with Annalise
Hairspray
Mary Poppins
November
Oliver!
Return To Forever
Rhinoceros
South Pacific
The 39 Steps
The Bacchae
The Caucasian Chalk Circle
The Country Girl
Wicked
Woyzeck
(16 rows)
```

# EXCEPT 쿼리 예
<a name="c_Example_MINUS_query"></a>

TICKIT 데이터베이스의 CATEGORY 테이블은 다음 11개의 행을 포함합니다.

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
   1   | Sports   | MLB       | Major League Baseball
   2   | Sports   | NHL       | National Hockey League
   3   | Sports   | NFL       | National Football League
   4   | Sports   | NBA       | National Basketball Association
   5   | Sports   | MLS       | Major League Soccer
   6   | Shows    | Musicals  | Musical theatre
   7   | Shows    | Plays     | All non-musical theatre
   8   | Shows    | Opera     | All opera and light opera
   9   | Concerts | Pop       | All rock and pop music concerts
  10   | Concerts | Jazz      | All jazz singers and bands
  11   | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

CATEGORY\$1STAGE 테이블(스테이징 테이블)에 추가적인 행이 한 개 있다고 가정합니다.

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
1 | Sports   | MLB       | Major League Baseball
2 | Sports   | NHL       | National Hockey League
3 | Sports   | NFL       | National Football League
4 | Sports   | NBA       | National Basketball Association
5 | Sports   | MLS       | Major League Soccer
6 | Shows    | Musicals  | Musical theatre
7 | Shows    | Plays     | All non-musical theatre
8 | Shows    | Opera     | All opera and light opera
9 | Concerts | Pop       | All rock and pop music concerts
10 | Concerts | Jazz      | All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
12 | Concerts | Comedy    | All stand up comedy performances
(12 rows)
```

두 테이블 사이의 차이점을 반환합니다. 다시 말해, CATEGORY\$1STAGE 테이블에는 있지만 CATEGORY 테이블에는 없는 행을 반환합니다.

```
select * from category_stage
except
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

다음과 같은 동등한 쿼리는 동의어 MINUS를 사용합니다.

```
select * from category_stage
minus
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

SELECT 표현식의 순서를 반대로 하면 쿼리가 아무런 행도 반환하지 않습니다.

# ORDER BY 절
<a name="r_ORDER_BY_clause"></a>

**Topics**
+ [구문](#r_ORDER_BY_clause-synopsis)
+ [파라미터](#r_ORDER_BY_clause-parameters)
+ [사용 노트](#r_ORDER_BY_usage_notes)
+ [ORDER BY 사용 예](r_Examples_with_ORDER_BY.md)

ORDER BY 절은 쿼리의 결과 집합을 정렬합니다.

## 구문
<a name="r_ORDER_BY_clause-synopsis"></a>

```
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
```

## 파라미터
<a name="r_ORDER_BY_clause-parameters"></a>

 * expression*   
일반적으로 선택 목록에 하나 이상의 열을 지정하여 쿼리 결과 집합의 정렬 순서를 정의하는 표현식입니다. 결과는 이진 UTF-8 순서를 기준으로 반환됩니다. 다음을 지정할 수도 있습니다.  
+ 선택 목록에 없는 열
+ 쿼리에서 참조하는 테이블에 존재하는 하나 이상의 열에서 형성되는 표현식
+ 선택 목록 항목의 위치(또는 선택 목록이 없는 경우 테이블에서 열의 위치)를 나타내는 서수
+ 선택 목록 항목을 정의하는 별칭
ORDER BY 절에 여러 개의 표현식이 포함되어 있을 때는 결과 집합이 첫 번째 표현식에 따라 정렬된 다음, 두 번째 표현식이 첫 번째 표현식의 일치하는 값을 가진 행에 적용되는 등의 방식이 적용됩니다.

ASC \$1 DESC   
표현식의 정렬 순서를 정의하는 옵션으로서 각각 다음과 같은 의미를 갖습니다.  
+ ASC: 오름차순(예: 숫자 값의 경우 낮은 값에서 높은 값 순, 문자열의 경우 'A'에서 'Z'의 순. 지정된 옵션이 없는 경우에는 데이터가 기본적으로 오름차순으로 정렬됩니다.
+ DESC: 내림차순(숫자 값의 경우 높은 값에서 낮은 값 순, 문자열의 경우 'Z'에서 'A'의 순).

NULLS FIRST \$1 NULLS LAST  
NULL 값의 순서를 NULL 값 이외의 값 이전에 결정할지, 혹은 이후에 결정할지 지정하는 옵션입니다. 기본적으로 NULL 값은 ASC 순서에서는 마지막에 정렬 후 순위가 결정되며, DESC 순서에서는 처음에 정렬 후 순위가 결정됩니다.

LIMIT *number* \$1 ALL   <a name="order-by-clause-limit"></a>
쿼리가 반환하는 정렬된 행의 수를 제어하는 옵션입니다. LIMIT 수는 양의 정수여야 합니다. 최댓값은 `2147483647`입니다.  
LIMIT 0은 아무런 행도 반환하지 않습니다. 이 구문을 테스트 목적으로 사용할 수 있습니다. 즉, 쿼리가 실행되는지 확인하거나(어떤 행도 표시하지 않음) 테이블에서 열 목록을 반환합니다. LIMIT 0을 사용하여 열 목록을 반환하는 경우 ORDER BY 절은 중복입니다. 기본값은 LIMIT ALL입니다.

OFFSET *start*   <a name="order-by-clause-offset"></a>
행 반환을 위해 시작하기 전에 *start* 앞에 있는 행의 개수를 건너뛰도록 지정하는 옵션입니다. OFFSET 수는 양의 정수여야 합니다. 최댓값은 `2147483647`입니다. LIMIT 옵션과 함께 사용 시, OFFSET개의 행을 건너뛴 후 반환되는 LIMIT 행 수를 카운트하기 시작합니다. LIMIT 옵션이 사용되지 않는 경우 결과 집합의 행 개수는 건너뛰는 행 개수만큼 감소됩니다. OFFSET 절에 의해 건너뛰는 행을 계속 스캔해야 하므로, 큰 OFFSET 값을 사용하기에 부족할 수 있습니다.

## 사용 노트
<a name="r_ORDER_BY_usage_notes"></a>

 ORDER BY 절을 사용할 때 다음과 같이 예상되는 동작에 유의하세요.
+ NULL 값은 다른 모든 값보다 "높은 값"으로 간주됩니다. 기본 오름차순 정렬 순서에 따라 NULL 값은 끝에 정렬됩니다. 이 동작을 변경하려면 NULLS FIRST 옵션을 사용하세요.
+ 쿼리에 ORDER BY 절이 포함되어 있지 않을 때, 시스템에서는 행 순서를 예측할 수 없는 결과 집합을 반환합니다. 같은 쿼리를 두 번 실행할 경우 결과 집합을 다른 순서로 반환할 수도 있습니다.
+ ORDER BY 절 없이 LIMIT 및 OFFSET 옵션을 사용할 수 있지만, 일관성 있는 행 집합을 반환하려면 ORDER BY와 함께 이러한 옵션을 사용하세요.
+ Amazon Redshift와 같은 병렬 시스템에서는 ORDER BY가 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 다시 말해 ORDER BY 표현식에서 중복 값이 산출되면 해당하는 행의 반환 순서가 다른 시스템과는 다르거나 Amazon Redshift를 실행할 때마다 달라질 수 있습니다.
+ Amazon Redshift는 ORDER BY 절에서 문자열 리터럴을 지원하지 않습니다.

# ORDER BY 사용 예
<a name="r_Examples_with_ORDER_BY"></a>

두 번째 열인 CATGROUP 열을 기준으로 정렬된 CATEGORY 테이블에서 11개의 행을 전부 반환합니다. 같은 CATGROUP 값을 가진 결과에 대해서는 문자열의 길이를 기준으로 CATDESC 열 값의 순서를 지정합니다. 그런 다음 열 CATID 및 CATNAME을 기준으로 정렬합니다.

```
select * from category order by 2, length(catdesc), 1, 3;

catid | catgroup |  catname  |                  catdesc
------+----------+-----------+----------------------------------------
10    | Concerts | Jazz      | All jazz singers and bands
9     | Concerts | Pop       | All rock and pop music concerts
11    | Concerts | Classical | All symphony, concerto, and choir conce
6     | Shows    | Musicals  | Musical theatre
7     | Shows    | Plays     | All non-musical theatre
8     | Shows    | Opera     | All opera and light opera
5     | Sports   | MLS       | Major League Soccer
1     | Sports   | MLB       | Major League Baseball
2     | Sports   | NHL       | National Hockey League
3     | Sports   | NFL       | National Football League
4     | Sports   | NBA       | National Basketball Association
(11 rows)
```

가장 높은 QTYSOLD 값을 기준으로 정렬된 SALES 테이블에서 선택한 열을 반환합니다. 결과를 맨 위의 10개 행으로 제한합니다.

```
select salesid, qtysold, pricepaid, commission, saletime from sales
order by qtysold, pricepaid, commission, salesid, saletime desc
limit 10;

salesid | qtysold | pricepaid | commission |      saletime
--------+---------+-----------+------------+---------------------
15401   |       8 |    272.00 |      40.80 | 2008-03-18 06:54:56
61683   |       8 |    296.00 |      44.40 | 2008-11-26 04:00:23
90528   |       8 |    328.00 |      49.20 | 2008-06-11 02:38:09
74549   |       8 |    336.00 |      50.40 | 2008-01-19 12:01:21
130232  |       8 |    352.00 |      52.80 | 2008-05-02 05:52:31
55243   |       8 |    384.00 |      57.60 | 2008-07-12 02:19:53
16004   |       8 |    440.00 |      66.00 | 2008-11-04 07:22:31
489     |       8 |    496.00 |      74.40 | 2008-08-03 05:48:55
4197    |       8 |    512.00 |      76.80 | 2008-03-23 11:35:33
16929   |       8 |    568.00 |      85.20 | 2008-12-19 02:59:33
(10 rows)
```

LIMIT 0 구문을 사용하여 열 목록은 반환하고 행은 반환하지 않습니다.

```
select * from venue limit 0;
venueid | venuename | venuecity | venuestate | venueseats
---------+-----------+-----------+------------+------------
(0 rows)
```

# CONNECT BY 절
<a name="r_CONNECT_BY_clause"></a>

계층 구조에서 행 간의 관계를 지정합니다. CONNECT BY를 사용하여 테이블을 자체에 조인하고 계층적 데이터를 처리하여 계층적 순서로 행을 선택할 수 있습니다. 예를 들어 조직도와 목록 데이터를 반복적으로 반복하는 데 사용할 수 있습니다.

계층적 쿼리는 다음 순서로 처리됩니다.

1. FROM 절에 조인이 있는 경우 조인이 먼저 처리됩니다.

1. CONNECT BY 절이 평가됩니다.

1. WHERE 절이 평가됩니다.

## 구문
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
```

**참고**  
START 및 CONNECT는 예약어가 아니지만, 쿼리에서 START 및 CONNECT를 테이블 별칭으로 사용하는 경우에는 런타임 시 오류가 발생하지 않도록 구분된 식별자(큰따옴표) 또는 AS를 사용하세요.

```
SELECT COUNT(*)
FROM Employee "start"
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

```
SELECT COUNT(*)
FROM Employee AS start
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

## 파라미터
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
계층 구조의 루트 행을 지정하는 조건

 *connect\$1by\$1conditions*   
계층 구조의 상위 행과 하위 행 간의 관계를 지정하는 조건입니다. 하나 이상의 조건이 부모 행을 참조하는 데 사용되는 ` ` 단항 연산자로 한정되어야 합니다.  

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## 연산자
<a name="r_CONNECT_BY_operators"></a>

CONNECT BY 쿼리에서 다음 연산자를 사용할 수 있습니다.

 *LEVEL*   
계층 구조에서 현재 행 수준을 반환하는 의사 열입니다. 루트 행에 대해 1, 루트 행의 자식에 대해 2 등을 반환합니다.

 *PRIOR*   
계층 구조에서 현재 행의 상위 행에 대한 표현식을 평가하는 단항 연산자입니다.

## 예제
<a name="r_CONNECT_BY_example"></a>

다음 예는 John에게 직간접적으로 보고하는 직원 수를 반환하는 CONNECT BY 쿼리입니다(4단계 미만).

```
SELECT id, name, manager_id
FROM employee
WHERE LEVEL < 4
START WITH name = 'John'
CONNECT BY PRIOR id = manager_id;
```

다음은 쿼리 결과입니다.

```
id      name      manager_id
------+----------+--------------
  101     John        100
  102     Jorge       101
  103     Kwaku       101
  110     Liu         101
  201     Sofía       102
  106     Mateo       102
  110     Nikki       103
  104     Paulo       103
  105     Richard     103
  120     Saanvi      104
  200     Shirley     104
  205     Zhang       104
```

 이 예에 대한 테이블 정의는 다음과 같습니다.

```
CREATE TABLE employee (
   id INT,
   name VARCHAR(20),
   manager_id INT
   );
```

 다음은 테이블에 삽입된 행입니다.

```
INSERT INTO employee(id, name, manager_id)  VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
```

다음은 John의 부서의 조직도입니다.

![\[John의 부서의 조직도 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/images/org-chart.png)


# 하위 쿼리 예
<a name="r_Subquery_examples"></a>

다음 예에서는 하위 쿼리가 SELECT 쿼리에 적합한 다른 방법을 보여줍니다. 하위 쿼리의 다른 사용 예는 [JOIN 예](r_Join_examples.md) 섹션을 참조하세요.

## SELECT 목록 하위 쿼리
<a name="r_Subquery_examples-select-list-subquery"></a>

다음 예에서는 SELECT 목록에 하위 쿼리를 포함합니다. 이 하위 쿼리는 *스칼라*이므로 한 개의 열과 한 개의 값만 반환하며, 이는 외부 쿼리에서 반환되는 각 행에 대한 결과에서 반복됩니다. 이 쿼리는 외부 쿼리에 의해 정의된 바와 같이 2008년의 다른 두 분기(2분기 및 3분기)에 대한 판매액 값과 하위 쿼리가 계산하는 Q1SALES 값을 비교합니다.

```
select qtr, sum(pricepaid) as qtrsales,
(select sum(pricepaid)
from sales join date on sales.dateid=date.dateid
where qtr='1' and year=2008) as q1sales
from sales join date on sales.dateid=date.dateid
where qtr in('2','3') and year=2008
group by qtr
order by qtr;

qtr  |  qtrsales   |   q1sales
-------+-------------+-------------
2     | 30560050.00 | 24742065.00
3     | 31170237.00 | 24742065.00
(2 rows)
```

## WHERE 절 하위 쿼리
<a name="r_Subquery_examples-where-clause-subquery"></a>

다음 예에서는 WHERE 절에 테이블 하위 쿼리를 포함합니다. 이 하위 쿼리는 여러 개의 행을 만들어냅니다. 이 경우에는 행에 한 개의 열만 포함되지만, 테이블 하위 쿼리는 다른 테이블과 마찬가지로 여러 개의 열과 행을 포함할 수 있습니다.

이 쿼리는 최대 판매 티켓 수를 기준으로 상위 10개의 판매사를 찾습니다. 톱 10 목록은 티켓 판매소가 있는 도시에 사는 사용자를 제거하는 하위 쿼리에 의해 한정됩니다. 이 쿼리는 다양한 방법으로 작성할 수 있습니다. 예를 들어, 하위 쿼리를 기본 쿼리 내의 조인으로 다시 작성할 수 있습니다.

```
select firstname, lastname, city, max(qtysold) as maxsold
from users join sales on users.userid=sales.sellerid
where users.city not in(select venuecity from venue)
group by firstname, lastname, city
order by maxsold desc, city desc
limit 10;

firstname | lastname  |      city      | maxsold
-----------+-----------+----------------+---------
Noah       | Guerrero | Worcester      |       8
Isadora    | Moss     | Winooski       |       8
Kieran     | Harrison | Westminster    |       8
Heidi      | Davis    | Warwick        |       8
Sara       | Anthony  | Waco           |       8
Bree       | Buck     | Valdez         |       8
Evangeline | Sampson  | Trenton        |       8
Kendall    | Keith    | Stillwater     |       8
Bertha     | Bishop   | Stevens Point  |       8
Patricia   | Anderson | South Portland |       8
(10 rows)
```

## WITH 절 하위 쿼리
<a name="r_Subquery_examples-with-clause-subqueries"></a>

[WITH 절](r_WITH_clause.md)을(를) 참조하세요.

# 상관관계가 있는 하위 쿼리
<a name="r_correlated_subqueries"></a>

다음 예에서는 WHERE 절에 *상관관계가 있는 하위 쿼리*가 포함됩니다. 이런 종류의 하위 쿼리는 자신의 열과 외부 쿼리에 의해 생성되는 열 사이에 하나 이상의 상관관계를 포함합니다. 이 경우 상관관계는 `where s.listid=l.listid`입니다. 외부 쿼리가 생성하는 각각의 행에 자격을 주거나 자격을 취소하는 하위 쿼리가 실행됩니다.

```
select salesid, listid, sum(pricepaid) from sales s
where qtysold=
(select max(numtickets) from listing l
where s.listid=l.listid)
group by 1,2
order by 1,2
limit 5;

salesid | listid |   sum
--------+--------+----------
 27     |     28 | 111.00
 81     |    103 | 181.00
 142    |    149 | 240.00
 146    |    152 | 231.00
 194    |    210 | 144.00
(5 rows)
```

## 지원되지 않는 상관관계를 가진 하위 쿼리 패턴
<a name="r_correlated_subqueries-correlated-subquery-patterns-that-are-not-supported"></a>

쿼리 플래너는 하위 쿼리 상관관계 제거라는 쿼리 재작성 방법을 사용하여 MPP 환경에서 실행하기 위해 상관관계가 있는 하위 쿼리의 여러 패턴을 최적화합니다. 상관관계를 가진 몇 가지 유형의 하위 쿼리는 Amazon Redshift가 상관관계를 제거할 수 없고 지원하지 않는 패턴을 따릅니다. 다음 상관관계 참조를 포함하는 쿼리는 오류를 반환합니다.
+  "건너뛰기 수준의 상관관계 참조"라고도 하는, 쿼리 블록을 건너뛰는 상관관계 참조. 예를 들어, 다음 쿼리에서 상관관계 참조를 포함하는 블록과 건너뛰는 블록은 NOT EXISTS 조건자에 의해 연결됩니다.

  ```
  select event.eventname from event
  where not exists
  (select * from listing
  where not exists
  (select * from sales where event.eventid=sales.eventid));
  ```

  이 경우에 건너뛰는 블록은 LISTING 테이블에 대한 하위 쿼리입니다. 상관관계 참조는 EVENT 테이블과 SALES 테이블의 상관관계를 지정합니다.
+  외부 조인에서 ON 절의 일부인 하위 쿼리에서의 상관관계 참조: 

  ```
  select * from category
  left join event
  on category.catid=event.catid and eventid =
  (select max(eventid) from sales where sales.eventid=event.eventid);
  ```

  ON 절은 외부 쿼리의 EVENT에 대한 하위 쿼리에 있는 SALES에서의 상관관계 참조를 포함합니다.
+ Amazon Redshift 시스템 테이블에 대해 Null에 민감한 상관관계 참조. 예: 

  ```
  select attrelid
  from stv_locks sl, pg_attribute
  where sl.table_id=pg_attribute.attrelid and 1 not in
  (select 1 from pg_opclass where sl.lock_owner = opcowner);
  ```
+ 창 함수를 포함하는 하위 쿼리 내에서의 상관관계 참조.

  ```
  select listid, qtysold
  from sales s
  where qtysold not in
  (select sum(numtickets) over() from listing l where s.listid=l.listid);
  ```
+ GROUP BY 열에서 상관관계를 가진 하위 쿼리의 결과에 대한 참조. 예: 

  ```
  select listing.listid,
  (select count (sales.listid) from sales where sales.listid=listing.listid) as list
  from listing
  group by list, listing.listid;
  ```
+ IN 조건자에 의해 외부 쿼리에 연결된 집계 함수와 GROUP BY 절이 있는 하위 쿼리에서의 상관관계 참조. (이 제한 사항은 MIN 및 MAX 집계 함수에는 적용되지 않습니다.) 예제: 

  ```
  select * from listing where listid in
  (select sum(qtysold)
  from sales
  where numtickets>4
  group by salesid);
  ```

# SELECT INTO
<a name="r_SELECT_INTO"></a>

임의의 쿼리에 의해 정의된 행을 선택하여 새 테이블에 삽입합니다. 임시 테이블을 만들지 영구 테이블을 만들지 여부를 지정할 수 있습니다.

## 구문
<a name="r_SELECT_INTO-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

 이 명령의 파라미터에 대한 자세한 내용은 [SELECT](r_SELECT_synopsis.md) 섹션을 참조하세요.

## 예제
<a name="r_SELECT_INTO-examples"></a>

EVENT 테이블에서 모든 행을 선택하고 NEWEVENT 테이블을 만듭니다.

```
select * into newevent from event;
```

PROFITS라는 임시 테이블에 대한 집계 쿼리의 결과를 선택합니다.

```
select username, lastname, sum(pricepaid-commission) as profit
into temp table profits
from sales, users
where sales.sellerid=users.userid
group by 1, 2
order by 3 desc;
```

# SET
<a name="r_SET"></a>

서버 구성 파라미터의 값을 설정합니다. SET 명령을 사용하여 현재 세션 또는 트랜잭션에 한해 지속 시간 설정을 재정의합니다.

[reset](r_RESET.md) 명령을 사용하여 파라미터를 기본값으로 반환합니다.

여러 가지 방법으로 서버 구성 파라미터를 변경할 수 있습니다. 자세한 내용은 [서버 구성 수정](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) 섹션을 참조하세요.

## 구문
<a name="r_SET-synopsis"></a>

```
SET { [ SESSION | LOCAL ]
{ SEED | parameter_name } { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
```

다음 문은 세션 컨텍스트 변수의 값을 설정합니다.

```
SET { [ SESSION | LOCAL ]
variable_name { TO | = }
{ value | 'value'  }
```

## 파라미터
<a name="r_SET-parameters"></a>

세션   
현재 세션에 대해 설정이 유효함을 지정합니다. 기본값.

*variable\$1name*   
세션에 설정된 컨텍스트 변수의 이름을 지정합니다.  
명명 규칙은 점으로 구분된 두 부분으로 이루어진 이름입니다(예: *identifier.identifier*). 점 구분 기호는 하나만 사용할 수 있습니다. Amazon Redshift의 표준 식별자 규칙을 따르는 *identifier*를 사용합니다. 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요. 구분된 식별자는 허용되지 않습니다.

LOCAL   
현재 트랜잭션에 대해 설정이 유효함을 지정합니다.

SEED TO *value*   
난수 생성을 위한 RANDOM 함수에서 사용할 내부 시드를 설정합니다.  
SET SEED는 0과 1 사이의 숫자 *값*을 취하고 [RANDOM 함수](r_RANDOM.md) 함수과 함께 사용하기 위해 이 숫자에 (231-1)을 곱합니다. 여러 개의 RANDOM 호출을 하기 전에 SET SEED를 사용하면 RANDOM이 예측 가능한 순서대로 숫자를 생성합니다.

 *parameter\$1name*   
설정할 파라미터의 이름. 파라미터에 대한 자세한 내용은 [서버 구성 수정](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) 섹션을 참조하세요.

 * 값*   
새 재료 파라미터 값입니다. 값을 특정 문자열로 설정하려면 작은따옴표를 사용하세요. SET SEED를 사용하는 경우 이 파라미터는 SEED 값을 포함합니다.

DEFAULT   
이 파라미터를 기본값으로 설정합니다.

## 예제
<a name="r_SET-examples"></a>

 **현재 세션을 위한 파라미터 변경** 

다음 예에서는 날짜 스타일을 설정합니다.

```
set datestyle to 'SQL,DMY';
```

 **워크로드 관리를 위한 쿼리 그룹 설정** 

쿼리 그룹이 클러스터의 WLM 구성의 일부로서 대기열 정의에 나열되는 경우 QUERY\$1GROUP 파라미터를 나열된 쿼리 그룹 이름으로 설정할 수 있습니다. 후속 쿼리는 관련 쿼리 대기열에 할당됩니다. QUERY\$1GROUP 설정은 세션 지속 시간 동안 또는 RESET QUERY\$1GROUP 명령이 발생할 때까지 계속 적용됩니다.

이 예에서는 쿼리 그룹 'priority'에 속한 쿼리 2개를 실행한 후 쿼리 그룹을 재설정합니다.

```
set query_group to 'priority';
select tbl, count(*)from stv_blocklist;
select query, elapsed, substring from svl_qlog order by query desc limit 5;
reset query_group;
```

자세한 내용은 [워크로드 관리](cm-c-implementing-workload-management.md) 섹션을 참조하세요.

 **세션의 기본 ID 네임스페이스 변경** 

데이터베이스 사용자가 `default_identity_namespace`를 설정할 수 있습니다. 이 샘플은 `SET SESSION`을 사용하여 현재 세션 기간 동안 설정을 재정의하는 방법과 새 ID 제공업체 값을 보여줍니다. 이는 Redshift 및 IAM Identity Center와 함께 ID 제공업체를 사용할 때 가장 일반적으로 사용됩니다. Redshift에서 ID 제공업체를 사용하는 방법에 대한 자세한 내용은 [Redshift를 IAM Identity Center와 연결하여 사용자에게 Single Sign-On 경험을 제공합니다](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)를 참조하세요.

```
SET SESSION default_identity_namespace = 'MYCO';
         
SHOW default_identity_namespace;
```

이 명령을 실행한 후 다음과 같이 GRANT 문 또는 CREATE 문을 실행할 수 있습니다.

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
         
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

이 경우 기본 ID 네임스페이스를 설정하는 효과는 각 ID 앞에 네임스페이스를 붙이는 것과 같습니다. 이 예제에서는 `alice`가 `MYCO:alice`로 대체됩니다. IAM Identity Center를 사용한 Redshift 구성과 관련된 설정에 대한 자세한 내용은 [ALTER SYSTEM](r_ALTER_SYSTEM.md) 및 [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md) 섹션을 참조하세요.

 **쿼리의 그룹 레이블 설정** 

QUERY\$1GROUP 파라미터는 SET 명령 뒤에 나오는 동일한 세션에서 실행되는 하나 이상의 쿼리에 대한 레이블을 정의합니다. 그러면 쿼리가 실행될 때 이 레이블이 로그에 기록되어 STL\$1QUERY 및 STV\$1INFLIGHT 시스템 테이블과 SVL\$1QLOG 뷰에서 반환되는 결과를 제한하는 데 사용될 수 있습니다.

```
show query_group;
query_group
-------------
unset
(1 row)

set query_group to '6 p.m.';


show query_group;
query_group
-------------
6 p.m.
(1 row)

select * from sales where salesid=500;
salesid | listid | sellerid | buyerid | eventid | dateid | ...
---------+--------+----------+---------+---------+--------+-----
500 |    504 |     3858 |    2123 |    5871 |   2052 | ...
(1 row)

reset query_group;

select query, trim(label) querygroup, pid, trim(querytxt) sql
from stl_query
where label ='6 p.m.';
query | querygroup |  pid  |                  sql
-------+------------+-------+----------------------------------------
57 | 6 p.m.     | 30711 | select * from sales where salesid=500;
(1 row)
```

쿼리 그룹 레이블은 스크립트의 일부로서 실행되는 개별 쿼리 또는 쿼리 집합을 분리하기에 유용한 메커니즘입니다. ID를 기준으로 쿼리를 식별하고 추적할 필요가 없고, 레이블로 추적할 수 있습니다.

 **난수 생성을 위한 시드 값 설정** 

다음 예에서는 SET와 함께 SEED 옵션을 사용하여 RANDOM 함수가 예측 가능한 순서로 숫자를 생성하도록 합니다.

먼저 SEED 값을 설정하지 않고 RANDOM 정수 3개를 반환합니다.

```
select cast (random() * 100 as int);
int4
------
6
(1 row)

select cast (random() * 100 as int);
int4
------
68
(1 row)

select cast (random() * 100 as int);
int4
------
56
(1 row)
```

그런 다음 SEED 값을 `.25`로 설정한 후 RANDOM 숫자를 3개 더 반환합니다.

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

마지막으로 SEED 값을 다시 `.25`로 설정한 후 RANDOM이 이전 세 번의 호출과 동일한 결과를 반환하는지 확인합니다.

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

다음 예에서는 사용자 지정 컨텍스트 변수를 설정합니다.

```
SET app_context.user_id TO 123;
SET app_context.user_id TO 'sample_variable_value';
```

# SET SESSION AUTHORIZATION
<a name="r_SET_SESSION_AUTHORIZATION"></a>

현재 세션의 사용자 이름을 설정합니다.

예를 들어, SET SESSION AUTHORIZATION 명령을 사용하여 어떤 세션이나 트랜잭션을 권한 없는 사용자 자격으로 임시로 실행하여 데이터베이스 액세스를 테스트할 수 있습니다. 이 명령을 실행하려면 데이터베이스 슈퍼 사용자여야 합니다.

## 구문
<a name="r_SET_SESSION_AUTHORIZATION-synopsis"></a>

```
SET [ LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
```

## 파라미터
<a name="r_SET_SESSION_AUTHORIZATION-parameters"></a>

LOCAL  
현재 트랜잭션에 대해 설정이 유효함을 지정합니다. 이 파라미터를 누락하면 현재 세션에 대해 설정이 유효함을 지정합니다.

 *user\$1name*   
설정할 사용자의 이름입니다. 사용자 이름을 식별자 또는 문자열 리터럴로 작성할 수 있습니다.

DEFAULT  
세션 사용자 이름을 기본값으로 설정합니다.

## 예제
<a name="r_SET_SESSION_AUTHORIZATION-examples"></a>

다음 예에서는 현재 세션의 사용자 이름을 `dwuser`:로 설정합니다.

```
SET SESSION AUTHORIZATION 'dwuser';
```

다음 예에서는 현재 트랜잭션의 사용자 이름을 `dwuser`:로 설정합니다.

```
SET LOCAL SESSION AUTHORIZATION 'dwuser';
```

이 예에서는 현재 세션의 사용자 이름을 기본 사용자 이름으로 설정합니다.

```
SET SESSION AUTHORIZATION DEFAULT;
```

# SET SESSION CHARACTERISTICS
<a name="r_SET_SESSION_CHARACTERISTICS"></a>

이 명령은 더 이상 사용되지 않습니다.

# SHOW
<a name="r_SHOW"></a>

서버 구성 파라미터의 현재 값을 표시합니다. SET 명령이 적용되는 경우 이 값은 현재 세션에 특정한 값일 수 있습니다. 구성 파라미터 목록은 [구성 참조](cm_chap_ConfigurationRef.md) 섹션을 참조하세요.

## 구문
<a name="r_SHOW-synopsis"></a>

```
SHOW { parameter_name | ALL }
```

다음 문은 세션 컨텍스트 변수의 현재 값을 표시합니다. 변수가 없으면 Amazon Redshift에서 오류가 발생합니다.

```
SHOW variable_name
```

## 파라미터
<a name="r_SHOW-parameters"></a>

 *parameter\$1name*   
지정된 파라미터의 현재 값을 표시합니다.

ALL   
모든 파라미터의 현재 값을 표시합니다.

*variable\$1name*   
지정된 변수의 현재 값을 표시합니다.

## 예제
<a name="r_SHOW-examples"></a>

다음 예에서는 query\$1group 파라미터의 값을 표시합니다.

```
show query_group;

query_group

unset
(1 row)
```

다음 예에서는 모든 파라미터의 목록과 그 값을 표시합니다.

```
show all;
name        |   setting
--------------------+--------------
datestyle          | ISO, MDY
extra_float_digits | 0
query_group        | unset
search_path        | $user,public
statement_timeout  | 0
```

다음 예에서는 지정된 변수의 현재 값을 표시합니다.

```
SHOW app_context.user_id;
```

# 열 권한 부여 표시
<a name="r_SHOW_COLUMN_GRANTS"></a>

테이블 내의 열에 대한 권한 부여를 표시합니다.

## 필수 권한
<a name="r_SHOW_COLUMN_GRANTS-required-permissions"></a>

대상 객체에 대한 SHOW GRANTS는 현재 사용자에게 표시되는 권한 부여만 표시합니다. 현재 사용자가 다음 기준 중 하나를 충족하는 경우 현재 사용자에게 권한 부여가 표시됩니다.
+ 슈퍼유저
+ 권한이 부여된 사용자
+ 권한 부여된 역할의 소유자 권한 부여
+ 객체 권한 부여의 대상이 되는 역할 권한 부여

## 구문
<a name="r_SHOW_COLUMN_GRANTS-synopsis"></a>

```
SHOW COLUMN GRANTS ON TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

## 파라미터
<a name="r_SHOW_COLUMN_GRANTS-parameters"></a>

database\$1name  
대상 테이블을 포함하는 데이터베이스의 이름

schema\$1name  
대상 테이블을 포함하는 스키마의 이름

table\$1name  
대상 테이블의 이름

사용자 이름  
출력의 사용자 이름에 대한 권한 부여만 포함

role\$1name  
출력의 role\$1name에 대한 권한 부여만 포함

PUBLIC  
출력의 PUBLIC에 대한 권한 부여만 포함

row\$1limit  
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_COLUMN_GRANTS-examples"></a>

다음 예제는 테이블 demo\$1db.demo\$1schema.t100에 대한 열 권한 부여를 보여줍니다.

```
SHOW COLUMN GRANTS ON TABLE demo_db.demo_schema.t100;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         134 | bob           | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | SELECT         |         130 | alice         | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | UPDATE         |         130 | alice         | user          | f            | COLUMN          | dbadmin
```

다음 예제는 테이블 demo\$1schema.t100 for user bob에 대한 열 권한 부여를 보여줍니다.

```
SHOW COLUMN GRANTS ON TABLE demo_schema.t100 for bob;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         135 | bob           | user          | f            | COLUMN          | dbadmin
```

# SHOW COLUMNS
<a name="r_SHOW_COLUMNS"></a>

테이블의 열 목록과 일부 열 속성을 표시합니다.

각 출력 행은 쉼표로 구분된 데이터베이스 이름, 스키마 이름, 테이블 이름, 열 이름, 서수 위치, 열 기본값, null 가능, 데이터 유형, 문자 최대 길이, 숫자 정밀도, 비고, 정렬 키 유형, 정렬 키 순서, 배포 키, 인코딩 및 데이터 정렬의 목록으로 구성됩니다. 이들 속성에 대한 자세한 내용은 [SVV\$1ALL\$1COLUMNS](r_SVV_ALL_COLUMNS.md) 섹션을 참조하세요.

SHOW COLUMNS 명령으로 인해 10,000개 이상의 열이 반환되는 경우 오류가 반환됩니다.

## 필수 권한
<a name="r_SHOW_COLUMNS-privileges"></a>

Amazon Redshift 테이블에서 열을 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 수퍼유저입니다.
+ 테이블의 소유자입니다.
+ 상위 스키마에 USAGE 권한을 부여하고 테이블에 SELECT 권한을 부여하거나 열에 SELECT 권한을 부여했습니다.

## 구문
<a name="r_SHOW_COLUMNS-synopsis"></a>

```
SHOW COLUMNS FROM TABLE database_name.schema_name.table_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## 파라미터
<a name="r_SHOW_COLUMNS-parameters"></a>

 *database\$1name*   
나열할 테이블이 포함된 데이터베이스의 이름입니다.  
AWS Glue Data Catalog에 테이블을 표시하려면 데이터베이스 이름으로 (`awsdatacatalog`)를 지정하고 시스템 구성 `data_catalog_auto_mount`가 `true`로 설정되어 있는지 확인합니다. 자세한 내용은 [ALTER SYSTEM](r_ALTER_SYSTEM.md) 섹션을 참조하세요.

 *schema\$1name*   
나열할 테이블이 포함된 스키마의 이름입니다.  
AWS Glue Data Catalog 테이블을 표시하려면 AWS Glue 데이터베이스 이름을 스키마 이름으로 제공하세요.

 *table\$1name*   
나열할 열이 포함된 테이블의 이름입니다.

 *filter\$1pattern*   
테이블 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_COLUMNS.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.

 *row\$1limit*   
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_COLUMNS-examples"></a>

다음 예제에서는 Amazon Redshift 데이터베이스에서 `sample_data_dev`라는 이름의 열이 `tickit` 스키마 및 `event` 테이블에 있는 경우를 보여 줍니다.

```
SHOW COLUMNS FROM TABLE demo_schema.compound_sort_table;

  database_name | schema_name |     table_name      | column_name | ordinal_position | column_default | is_nullable |     data_type     | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+---------------------+-------------+------------------+----------------+-------------+-------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 demo_db       | demo_schema | compound_sort_table | id          |                1 |                | YES         | integer           |                          |                32 |             0 |         | COMPOUND      |        1 |        1 | delta32k | 
 demo_db       | demo_schema | compound_sort_table | name        |                2 |                | YES         | character varying |                       50 |                   |               |         | COMPOUND      |        2 |          | lzo      | default
 demo_db       | demo_schema | compound_sort_table | date_col    |                3 |                | YES         | date              |                          |                   |               |         |               |        0 |          | delta    | 
 demo_db       | demo_schema | compound_sort_table | amount      |                4 |                | YES         | numeric           |                          |                10 |             2 |         |               |        0 |          | mostly16 |
```

다음 예제에서는 `awsdatacatalog`라는 이름의 AWS Glue Data Catalog 데이터베이스에 있는 `batman` 스키마 및 `nation` 테이블에 있는 테이블을 보여줍니다. 출력은 `2`행으로 제한됩니다.

```
SHOW COLUMNS FROM TABLE second_db.public.t22;

 database_name | schema_name | table_name | column_name | ordinal_position | column_default | is_nullable |          data_type          | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+------------+-------------+------------------+----------------+-------------+-----------------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 second_db     | public      | t22        | col1        |                1 |                | YES         | integer                     |                          |                32 |             0 |         | INTERLEAVED   |       -1 |          | mostly8  | 
 second_db     | public      | t22        | col2        |                2 |                | YES         | character varying           |                      100 |                   |               |         | INTERLEAVED   |        2 |          | text255  | default
 second_db     | public      | t22        | col3        |                3 |                | YES         | timestamp without time zone |                          |                   |               |         |               |        0 |          | raw      | 
 second_db     | public      | t22        | col4        |                4 |                | YES         | numeric                     |                          |                10 |             2 |         |               |        0 |          | az64     |
```

# 제약 조건 표시
<a name="r_SHOW_CONSTRAINTS"></a>

테이블의 프라이머리 키 및 외래 키 제약 조건 목록을 표시합니다.

## 필수 권한
<a name="r_SHOW_CONSTRAINTS-required-permissions"></a>

테이블에서 SHOW CONSTRAINTS를 실행하려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 슈퍼유저
+ 테이블의 소유자
+ 상위 스키마에 대한 USAGE 권한과 테이블에 대한 SELECT 권한 부여됨

## 구문
<a name="r_SHOW_CONSTRAINTS-synopsis"></a>

```
SHOW CONSTRAINTS {PRIMARY KEYS | FOREIGN KEYS [EXPORTED]}
FROM TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[LIMIT row_limit]
```

## 파라미터
<a name="r_SHOW_CONSTRAINTS-parameters"></a>

*database\$1name*  
대상 테이블을 포함하는 데이터베이스의 이름

*schema\$1name*  
대상 테이블을 포함하는 스키마의 이름

*table\$1name*  
대상 테이블의 이름

EXPORTED  
EXPORTED가 지정되면 대상 테이블을 참조하는 다른 테이블의 모든 외래 키를 나열합니다.

*row\$1limit*  
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_CONSTRAINTS-examples"></a>

다음 예제는 테이블 demo\$1db.demo\$1schema.pk1의 프라이머리 키 제약 조건을 보여줍니다.

```
SHOW CONSTRAINTS PRIMARY KEYS FROM TABLE demo_db.demo_schema.pk1;
 database_name | schema_name | table_name | pk_name  | column_name | key_seq 
---------------+-------------+------------+----------+-------------+---------
 demo_db       | demo_schema | pk1        | pk1_pkey | i           |       1
 demo_db       | demo_schema | pk1        | pk1_pkey | j           |       2
 demo_db       | demo_schema | pk1        | pk1_pkey | c           |       3
```

다음 예제는 테이블 demo\$1schema.fk2의 외래 키 제약 조건을 보여줍니다.

```
SHOW CONSTRAINTS FOREIGN KEYS FROM TABLE demo_schema.fk2;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |  fk_name   | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey | pk1_pkey |             |             |
```

다음 예제는 테이블 demo\$1schema.pk1에서 내보낸 외래 키 제약 조건을 보여줍니다.

```
SHOW CONSTRAINTS FOREIGN KEYS EXPORTED FROM TABLE demo_schema.pk1;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |     fk_name     | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+-----------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | other_fk      | i              |       1 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | other_fk      | j              |       2 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | other_fk      | c              |       3 | other_fk_i_fkey | pk1_pkey |             |             |
```

# SHOW EXTERNAL TABLE
<a name="r_SHOW_EXTERNAL_TABLE"></a>

테이블 속성과 열 속성을 포함하여 외부 테이블의 정의를 표시합니다. SHOW EXTERNAL TABLE 문의 출력을 사용하여 테이블을 다시 생성할 수 있습니다.

외부 테이블 생성에 대한 자세한 내용은 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 섹션을 참조하세요.

## 구문
<a name="r_SHOW_EXTERNAL_TABLE-synopsis"></a>

```
SHOW EXTERNAL TABLE [external_database].external_schema.table_name [ PARTITION ]
```

## 파라미터
<a name="r_SHOW_EXTERNAL_TABLE-parameters"></a>

 *external\$1database*   
연결된 외부 데이터베이스의 이름입니다. 이 파라미터는 선택 사항입니다.

 *external\$1schema*   
연결된 외부 스키마의 이름입니다.

 *table\$1name*   
표시할 테이블의 이름입니다.

PARTITION   
테이블 정의에 파티션을 추가하는 ALTER TABLE 문을 표시합니다.

## 예제
<a name="r_SHOW_EXTERNAL_TABLE-examples"></a>

다음 예는 다음과 같이 정의된 외부 테이블을 기반으로 합니다.

```
CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
     csmallint smallint,
     cint int,
     cbigint bigint,
     cfloat float4,
     cdouble float8,
     cchar char(10),
     cvarchar varchar(255),
     cdecimal_small decimal(18,9),
     cdecimal_big decimal(30,15),
     ctimestamp TIMESTAMP,
     cboolean boolean,
     cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime TIMESTAMP)
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';
```

다음은 테이블 `my_schema.alldatatypes_parquet_test_partitioned`에 대한 SHOW EXTERNAL TABLE 명령과 출력의 예입니다.

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
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/alldatatypes_parquet_partitioned';"
```

다음은 동일한 테이블이지만 데이터베이스도 파라미터에 지정되어 있는 SHOW EXTERNAL TABLE 명령 및 출력의 예입니다.

```
SHOW EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
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/alldatatypes_parquet_partitioned';"
```

다음은 `PARTITION` 파라미터 사용 시 SHOW EXTERNAL TABLE 명령과 출력의 예입니다. 테이블 정의에 파티션을 추가하는 ALTER TABLE 문이 출력에 포함됩니다.

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned PARTITION;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date)
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/alldatatypes_parquet_partitioned';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-01') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-01';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-02') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-02';"
```

# SHOW DATABASES
<a name="r_SHOW_DATABASES"></a>

Data Catalog 또는 Amazon Redshift 데이터 웨어하우스의 데이터베이스를 표시합니다. SHOW DATABASES는 데이터 웨어하우스 내의 데이터베이스, AWS Glue Data Catalog 데이터베이스(awsdatacatalog), 데이터 공유 데이터베이스 및 Lake Formation 데이터베이스와 같이 액세스 가능한 모든 데이터베이스를 나열합니다.

## 필수 권한
<a name="r_SHOW_DATABASES-privileges"></a>

다음을 제외한 모든 데이터베이스가 사용자에게 표시됩니다.
+ 볼 수 있는 권한이 있는 데이터 공유에서 생성된 데이터베이스의 경우 현재 사용자에게 데이터베이스에 대한 USAGE 권한을 부여해야 합니다.

## 구문
<a name="r_SHOW_DATABASES-syntax"></a>

Amazon Redshift 데이터 웨어하우스의 데이터베이스를 표시하는 방법:

```
SHOW DATABASES 
[ LIKE '<expression>' ]
[ LIMIT row_limit ]
```

Data Catalog의 데이터베이스를 표시하는 방법:

```
SHOW DATABASES FROM DATA CATALOG 
[ ACCOUNT  '<id1>', '<id2>', ... ]
[ LIKE '<expression>' ]
[ IAM_ROLE default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ]
[ LIMIT row_limit ]
```

## 파라미터
<a name="r_SHOW_DATABASES-parameters"></a>

계정 '<id1>', <id2>',...  
데이터베이스를 나열할 AWS Glue Data Catalog 계정입니다. 이 파라미터를 생략하면 Amazon Redshift에서 클러스터를 소유한 계정의 데이터베이스를 표시한다는 의미입니다.

LIKE '<expression>'  
지정한 표현식과 일치하는 기준으로 데이터베이스 목록을 필터링합니다. 이 파라미터는 와일드카드 문자 %(백분율) 및 \$1(밑줄)를 사용하는 패턴을 지원합니다.

IAM\$1ROLE default \$1 'SESSION' \$1 'arn:aws:iam::<account-id>:role/<role-name>'  
SHOW DATABASES 명령을 실행할 때 클러스터와 연결된 IAM 역할을 지정하면 데이터베이스에서 쿼리를 실행할 때 Amazon Redshift가 해당 역할의 보안 인증 정보를 사용합니다.  
`default` 키워드를 지정한다는 것은 기본값으로 설정되어 클러스터와 연결된 IAM 역할을 사용한다는 의미입니다.  
페더레이션 자격 증명을 사용하여 Amazon Redshift 클러스터에 연결하고 [데이터베이스 생성](r_CREATE_DATABASE.md) 명령을 사용하여 생성된 외부 스키마에서 테이블에 액세스하는 경우에 `'SESSION'`을 사용합니다. 페더레이션 ID 사용의 예를 보려면 페더레이션형 ID 구성 방법이 설명된 [페더레이션형 ID를 사용하여 로컬 리소스 및 Amazon Redshift Spectrum 외부 테이블에 대한 Amazon Redshift 액세스 관리](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html) 섹션을 참조하세요.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. 최소 IAM 역할은 액세스되는 Amazon S3 버킷에서 LIST 작업을 수행하고 버킷에 포함된 Amazon S3 객체에 대한 GET 작업을 수행할 수 있는 권한이 있어야 합니다. 데이터 공유를 위해 AWS Glue Data Catalog를 사용하여 데이터베이스를 생성하고 IAM\$1ROLE을 사용하는 방법에 대해 자세히 알아보려면 [소비자로서 Lake Formation에서 관리하는 데이터 공유 사용](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html)을 참조하세요.  
다음은 단일 ARN에 대한 IAM\$1ROLE 파라미터의 구문을 보여줍니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
역할을 함께 묶어 클러스터가 다른 계정에 속한 다른 IAM 역할을 수임하도록 할 수 있습니다. 최대 10개의 역할을 함께 묶을 수 있습니다. 자세한 내용은 [Amazon Redshift Spectrum에서 IAM 역할 연결](c-spectrum-iam-policies.md#c-spectrum-chaining-roles) 섹션을 참조하세요.  
 이 IAM 역할에 다음과 유사한 IAM 권한 정책을 연결합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
연합 쿼리에 사용할 IAM 역할을 생성하는 단계는 [연합 쿼리 사용을 위해 비밀 및 IAM 역할 생성](federated-create-secret-iam-role.md) 섹션을 참조하세요.  
연결된 역할 목록에 공백을 포함하지 마세요.
다음은 세 역할을 함께 묶기 위한 구문을 나타낸 것입니다.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

LIMIT *row\$1limit*  
반환되는 행의 수를 제한하는 절입니다. 여기서 *row\$1limit*은 반환할 최대 행 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_DATABASES-examples"></a>

다음 예는 계정 ID 123456789012의 모든 데이터 카탈로그 데이터베이스를 표시합니다.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012'

  catalog_id  | database_name |                        database_arn                    |     type     |                                             target_database                                      | location | parameters
--------------+---------------+--------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------+----------+------------
 123456789012 |   database1   | arn:aws:glue:us-east-1:123456789012:database/database1 | Data Catalog |                                                                                                  |          |
 123456789012 |   database2   | arn:aws:glue:us-east-1:123456789012:database/database2 | Data Catalog | arn:aws:redshift:us-east-1:123456789012:datashare:035c45ea-61ce-86f0-8b75-19ac6102c3b7/database2 |          |
```

다음 예는 IAM 역할의 보안 인증 정보를 사용하여 계정 ID 123456789012의 모든 데이터 카탈로그 데이터베이스를 표시하는 방법을 보여줍니다.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE default;
```

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE <iam-role-arn>;
```

다음 예시에서는 연결된 Amazon Redshift 데이터 웨어하우스의 모든 데이터베이스를 표시합니다.

```
SHOW DATABASES

database_name  | database_owner | database_type        | database_acl | parameters | database_isolation_level
---------------+----------------+----------------------+--------------+------------+--------------------
awsdatacatalog | 1              | auto mounted catalog | NULL         | UNKNOWN    | UNKNOWN
dev            | 1              | local                | NULL         | NULL       | Snapshot Isolation
```

# SHOW FUNCTIONS
<a name="r_SHOW_FUNCTIONS"></a>

나열된 객체에 대한 정보와 함께 스키마의 함수 목록을 표시합니다.

각 출력 행에는 database\$1name, schema\$1name, function\$1name, number\$1of\$1arguments, argument\$1list, return\$1type, 비고 열이 있습니다.

SHOW FUNCTIONS에서 10,000개 이상의 행이 발생하는 경우 명령에서 오류가 발생합니다.

## 필수 권한
<a name="r_SHOW_FUNCTIONS-required-permissions"></a>

Redshift 스키마의 함수를 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 슈퍼유저
+ 함수의 소유자
+ 상위 스키마에 USAGE 권한을 부여하고 함수에 EXECUTE를 부여함

## 구문
<a name="r_SHOW_FUNCTIONS-synopsis"></a>

```
SHOW FUNCTIONS FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## 파라미터
<a name="r_SHOW_FUNCTIONS-parameters"></a>

*database\$1name*  
나열할 함수가 포함된 데이터베이스의 이름입니다.

*schema\$1name*  
나열할 함수가 포함된 스키마의 이름입니다.

*filter\$1pattern*  
함수 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_FUNCTIONS.html)
filter\$1pattern은 함수 이름하고만 일치합니다.

*row\$1limit*  
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_FUNCTIONS-examples"></a>

다음 예제에서는 스키마 demo\$1db.demo\$1schema의 함수를 보여줍니다.

```
SHOW FUNCTIONS FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |    function_name     | number_of_arguments |                                  argument_list                                  |    return_type    | remarks 
---------------+-------------+----------------------+---------------------+---------------------------------------------------------------------------------+-------------------+---------
 demo_db       | demo_schema | f2                   |                   6 | integer, character varying, numeric, date, timestamp without time zone, boolean | character varying | 
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer                                                                | numeric           | 
 demo_db       | demo_schema | f_days_between       |                   2 | date, date                                                                      | integer           |
```

다음 예제에서는 이름이 'discount'로 끝나는 스키마 demo\$1schema의 함수를 보여줍니다.

```
SHOW FUNCTIONS FROM SCHEMA demo_schema like '%discount';
 database_name | schema_name |    function_name     | number_of_arguments |  argument_list   | return_type | remarks 
---------------+-------------+----------------------+---------------------+------------------+-------------+---------
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer | numeric     |
```

# SHOW GRANTS
<a name="r_SHOW_GRANTS"></a>

사용자, 역할 또는 객체에 대한 권한을 표시합니다. 객체는 데이터베이스, 스키마, 테이블, 함수 또는 템플릿일 수 있습니다. 테이블 또는 함수와 같은 객체를 지정할 때는 2부 또는 3부 표기법을 사용하여 객체를 한정해야 합니다. 예: `schema_name.table_name` 또는 `database_name.schema_name.table_name`.

SHOW GRANTS에서 10,000개 이상의 행이 발생하는 경우 명령에서 오류가 발생합니다.

## 필수 권한
<a name="r_SHOW_GRANTS-permissions"></a>

대상 사용자 또는 역할에 대해 SHOW GRANTS를 실행하려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 슈퍼유저
+ 대상 사용자
+ 대상 역할의 소유자
+ 역할이 부여됨

대상 객체에 대한 SHOW GRANTS는 현재 사용자에게 표시되는 권한 부여만 표시합니다. 현재 사용자가 다음 기준 중 하나를 충족하는 경우 현재 사용자에게 권한 부여가 표시됩니다.
+ 슈퍼유저
+ 대상 사용자
+ 권한 부여된 역할의 소유자 권한 부여
+ 객체 권한 부여의 대상이 되는 역할 권한 부여

## 구문
<a name="r_SHOW_GRANTS-syntax"></a>

다음은 객체에 대한 권한 부여를 표시하는 구문입니다. 함수를 지정하는 두 번째 방법은 데이터 공유에서 생성된 외부 스키마 및 데이터베이스에만 유효합니다.

```
SHOW GRANTS ON
{
 DATABASE database_name |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } ( [ [ argname ] argtype [, ...] ] ) |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } |
 SCHEMA {database_name.schema_name | schema_name} | 
 { TABLE {database_name.schema_name.table_name | schema_name.table_name} | table_name }
 TEMPLATE {database_name.schema_name.template_name | template_name}
}
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

다음은 사용자 또는 역할에 대한 권한 부여를 표시하는 구문입니다.

```
SHOW GRANTS FOR
{username | ROLE role_name}
[FROM DATABASE database_name]
[LIMIT row_limit]
```

## 파라미터
<a name="r_SHOW_GRANTS-parameters"></a>

 *database\$1name*   
권한 부여를 표시할 데이터베이스의 이름입니다.

 *function\$1name*   
권한 부여를 표시할 함수의 이름입니다.

template\$1name  
권한 부여를 표시할 템플릿의 이름입니다.

 *schema\$1name*   
권한 부여를 표시할 스키마의 이름입니다.

 *table\$1name*   
권한 부여를 표시할 테이블의 이름입니다.

FOR *username*   
사용자에 대한 권한 부여를 표시함을 나타냅니다.

ROLE *role\$1name*   
역할에 대한 권한 부여를 표시함을 나타냅니다.

FOR PUBLIC  
PUBLIC에 대한 권한 부여를 표시함을 나타냅니다.

 *row\$1limit*   
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_GRANTS-examples"></a>

다음 예시에서는 이름이 `dev`인 데이터베이스의 모든 권한을 표시합니다.

```
SHOW GRANTS on database demo_db;

  database_name | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | ALTER          |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TRUNCATE       |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DROP           |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | INSERT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TEMP           |           0 | public        | public        | f            | DATABASE        | dbadmin
 demo_db       | SELECT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | UPDATE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DELETE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | REFERENCES     |         112 | alice         | user          | f            | TABLES          | dbadmin
```

다음 명령은 이름이 `demo`인 스키마에 대한 모든 권한을 보여줍니다.

```
SHOW GRANTS ON SCHEMA demo_schema;

 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | demo_schema | SCHEMA      | ALTER          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | DROP           |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | USAGE          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | CREATE         |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
```

다음 명령은 이름이 `alice`인 사용자에 대한 모든 권한을 보여줍니다.

```
SHOW GRANTS FOR alice;

 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 demo_db       |             |             | DATABASE    | INSERT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | SELECT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | UPDATE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DELETE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | REFERENCES     |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DROP           |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | TRUNCATE       |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | ALTER          |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | USAGE          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | CREATE         |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | DROP           |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | ALTER          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | INSERT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | SELECT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | UPDATE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DELETE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | RULE           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | REFERENCES     |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRIGGER        |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DROP           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRUNCATE       |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | ALTER          |         124 | alice         | user          | TABLE           | dbadmin
```

```
SHOW GRANTS FOR alice FROM DATABASE second_db;
 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 second_db     | public      | t22         | TABLE       | SELECT         |         101 | alice         | user          | TABLE           | dbadmin
```

다음 명령은 테이블 `t3`에 대한 사용자 `alice`의 모든 권한 부여를 보여줍니다. 2부 또는 3부 표기법을 사용하여 테이블 이름을 지정할 수 있습니다.

```
SHOW GRANTS ON TABLE demo_db.demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin


SHOW GRANTS ON TABLE demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

다음 예시에서는 이름이 `t4`인 테이블에 대한 모든 권한 부여를 표시합니다. 테이블 이름을 지정하는 다양한 방법에 주목하세요.

```
SHOW GRANTS ON t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 
SHOW GRANTS ON TABLE public.t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

# SHOW MODEL
<a name="r_SHOW_MODEL"></a>

상태, 모델을 생성하는 데 사용된 파라미터 및 입력 인수 형식이 있는 예측 함수를 포함하여 기계 학습 모델에 대한 유용한 정보를 표시합니다. SHOW MODEL의 정보를 사용하여 모델을 재생성할 수 있습니다. 기본 테이블이 변경된 경우 동일한 SQL 문으로 CREATE MODEL을 실행하면 다른 모델이 생성됩니다. SHOW MODEL이 반환하는 정보는 모델 소유자와 EXECUTE 권한을 가진 사용자에 따라 다릅니다. SHOW MODEL은 모델이 Amazon Redshift에서 훈련된 경우 또는 BYOM 모델인 경우 다른 출력을 표시합니다.

## 구문
<a name="r_SHOW_MODEL-synopsis"></a>

```
SHOW MODEL ( ALL | model_name )
```

## 파라미터
<a name="r_SHOW_MODEL-parameters"></a>

ALL   
사용자가 사용할 수 있는 모든 모델과 해당 스키마를 반환합니다.

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

## 사용 노트
<a name="r_SHOW_MODEL_usage_notes"></a>

SHOW MODEL 명령은 다음을 반환합니다.
+ 모델 이름입니다.
+ 모델이 생성된 스키마입니다.
+ 모델의 소유자입니다.
+ 모델 생성 시간입니다.
+ READY, TRAINING 또는 FAILED와 같은 모델 상태입니다.
+ 실패한 모델에 대한 이유 메시지입니다.
+ 모델이 훈련을 마친 경우 검증 오류입니다.
+ 비 BYOM 접근 방식에 대한 모델을 도출하는 데 필요한 예상 비용입니다. 모델 소유자만 이 정보를 볼 수 있습니다.
+ 사용자 지정 파라미터와 해당 값의 목록입니다. 특히 다음 항목을 포함합니다.
  + 지정된 TARGET 열.
  + 모델 유형, AUTO 또는 XGBoost.
  + REGRESSION, BINARY\$1CLASSIFICATION, MULTICLASS\$1CLASSIFICATION 등의 문제 유형. 이 파라미터는 AUTO에만 해당됩니다.
  + 모델을 생성한 Amazon SageMaker AI 훈련 작업 또는 Amazon SageMaker AI Autopilot 작업의 이름입니다. 이 작업 이름을 사용하여 Amazon SageMaker AI에서 모델에 대한 자세한 정보를 찾을 수 있습니다.
  + MSE, F1, 정확도와 같은 목표. 이 파라미터는 AUTO에만 해당됩니다.
  + 생성된 함수의 이름.
  + 추론 유형, 로컬 또는 원격.
  + 예측 함수 입력 인수.
  + 기존 보유 모델 사용(BYOM)이 아닌 모델에 대한 예측 함수 입력 인수 형식.
  + 예측 함수의 반환 유형. 이 파라미터는 BYOM에만 해당됩니다.
  + 원격 추론이 포함된 BYOM 모델에 대한 Amazon SageMaker AI 엔드포인트의 이름입니다.
  + IAM 역할. 모델 소유자만 이를 볼 수 있습니다.
  + 사용되는 S3 버킷. 모델 소유자만 이를 볼 수 있습니다.
  + AWS KMS 키(제공된 경우). 모델 소유자만 이를 볼 수 있습니다.
  + 모델을 실행할 수 있는 최대 시간입니다.
+ 모델 유형이 AUTO가 아닌 경우 Amazon Redshift는 제공된 하이퍼파라미터와 해당 값 목록도 표시합니다.

또한 pg\$1proc 등의 다른 카탈로그 테이블에서 SHOW MODEL이 제공하는 일부 정보를 볼 수 있습니다. Amazon Redshift는 pg\$1proc 카탈로그 테이블에 등록된 예측 함수에 대한 정보를 반환합니다. 이 정보에는 예측 함수에 대한 입력 인수 이름과 해당 유형이 포함됩니다. Amazon Redshift는 SHOW MODEL 명령에서 동일한 정보를 반환합니다.

```
SELECT * FROM pg_proc WHERE proname ILIKE '%<function_name>%';
```

## 예제
<a name="r_SHOW_MODEL-examples"></a>

다음은 모델 출력을 보여주는 예입니다.

```
SHOW MODEL ALL;

Schema Name |  Model Name
------------+---------------
 public     | customer_churn
```

customer\$1churn의 소유자는 다음과 같은 출력을 볼 수 있습니다. EXECUTE 권한만 있는 사용자는 IAM 역할, Amazon S3 버킷 및 모드의 예상 비용을 볼 수 없습니다.

```
SHOW MODEL customer_churn;

       Key                 |           Value
---------------------------+-----------------------------------
 Model Name                | customer_churn
 Schema Name               | public
 Owner                     | 'owner'
 Creation Time             | Sat, 15.01.2000 14:45:20
 Model State               | READY
 validation:F1             | 0.855
 Estimated Cost            | 5.7
                           |
 TRAINING DATA:            |
 Table                     | customer_data
 Target Column             | CHURN
                           |
 PARAMETERS:               |
 Model Type                | auto
 Problem Type              | binary_classification
 Objective                 | f1
 Function Name             | predict_churn
 Function Parameters       | age zip average_daily_spend average_daily_cases
 Function Parameter Types  | int int float float
 IAM Role                  | 'iam_role'
 KMS Key                   | 'kms_key'
 Max Runtime               | 36000
```

# SHOW DATASHARES
<a name="r_SHOW_DATASHARES"></a>

동일한 계정 또는 여러 계정에서 클러스터의 인바운드 및 아웃바운드 공유를 표시합니다. datashare 이름을 지정하지 않으면 Amazon Redshift는 클러스터의 모든 데이터베이스에 있는 모든 datashare를 표시합니다. ALTER 및 SHARE 권한이 있는 사용자는 권한을 갖고 있는 공유를 볼 수 있습니다.

## 구문
<a name="r_SHOW_DATASHARES-synopsis"></a>

```
SHOW DATASHARES [ LIKE 'namepattern' ] 
```

## 파라미터
<a name="r_SHOW_DATASHARES-parameters"></a>

LIKE  
지정된 이름 패턴을 datashare에 대한 설명과 비교하는 선택적 절입니다. 이 절을 사용하면 Amazon Redshift는 지정된 이름 패턴과 이름이 일치하는 datashare만 표시합니다.

*namepattern*  
요청된 datashare의 이름 또는 와일드카드 문자를 사용하여 일치시킬 이름의 일부입니다.

## 예제
<a name="r_SHOW_DATASHARES-examples"></a>

다음 예에서는 클러스터의 인바운드 공유와 아웃바운드 공유를 표시합니다.

```
SHOW DATASHARES;
SHOW DATASHARES LIKE 'sales%';

share_name   | share_owner | source_database | consumer_database | share_type | createdate          | is_publicaccessible | share_acl | producer_account |           producer_namespace
-------------+-------------+-----------------+-------------------+------------+---------------------+---------------------+-----------+------------------+---------------------------------------
'salesshare' | 100         | dev             |                   | outbound   | 2020-12-09 01:22:54.| False               |           |   123456789012   | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d
```

# SHOW PARAMETERS
<a name="r_SHOW_PARAMETERS"></a>

함수/프로시저에 대한 파라미터 목록과 파라미터에 대한 일부 정보를 표시합니다.

각 출력 행에는 database\$1name, schema\$1name, procedure\$1name 또는 function\$1name, parameter\$1name, ordinal\$1position, parameter\$1type (IN/OUT), data\$1type, character\$1maximum\$1length, numeric\$1precision, numeric\$1scale 및 비고 열이 있습니다.

## 필수 권한
<a name="r_SHOW_PARAMETERS-required-permissions"></a>

Redshift 스키마의 함수/프로시저를 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 슈퍼유저
+ 함수의 소유자
+ 상위 스키마에 USAGE 권한을 부여하고 함수에 EXECUTE를 부여함

## 구문
<a name="r_SHOW_PARAMETERS-synopsis"></a>

```
SHOW PARAMETERS OF {FUNCTION| PROCEDURE}
[database_name.]schema_name.function_name(argtype [, ...] )
[LIKE 'filter_pattern'];
```

## 파라미터
<a name="r_SHOW_PARAMETERS-parameters"></a>

*database\$1name*  
나열할 함수가 포함된 데이터베이스의 이름입니다.

*schema\$1name*  
나열할 함수가 포함된 스키마의 이름입니다.

*filter\$1pattern*  
테이블 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_PARAMETERS.html)

## 예제
<a name="r_SHOW_PARAMETERS-examples"></a>

다음 예제에서는 프로시저 demo\$1db.demo\$1schema.f1의 파라미터를 보여줍니다.

```
SHOW PARAMETERS OF PROCEDURE demo_db.demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL);
 database_name | schema_name | procedure_name |  parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+------------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | operation        |                1 | IN             | character varying           |                       10 |                   |              
 demo_db       | demo_schema | f1             | value1           |                2 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2           |                3 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | result           |                4 | INOUT          | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | operation_status |                5 | OUT            | character varying           |                       50 |                   |              
 demo_db       | demo_schema | f1             | calculation_time |                6 | OUT            | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f1             | is_successful    |                7 | OUT            | boolean                     |                          |                   |
```

다음 예제에서는 이름이 'val'로 시작하는 프로시저 demo\$1schema.f1의 파라미터를 보여줍니다.

```
SHOW PARAMETERS OF PROCEDURE demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL) like 'val%';
 database_name | schema_name | procedure_name | parameter_name | ordinal_position | parameter_type | data_type | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+----------------+------------------+----------------+-----------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | value1         |                2 | IN             | numeric   |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2         |                3 | IN             | numeric   |                          |                18 |             0
```

다음 예제에서는 함수 demo\$1schema.f2의 파라미터를 보여줍니다.

```
SHOW PARAMETERS OF FUNCTION demo_schema.f2(INT, VARCHAR, DECIMAL, DATE, TIMESTAMP, BOOLEAN);
 database_name | schema_name | function_name | parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+---------------+-----------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f2            |                 |                0 | RETURN         | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | int_param       |                1 | IN             | integer                     |                          |                32 |             0
 demo_db       | demo_schema | f2            | varchar_param   |                2 | IN             | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | decimal_param   |                3 | IN             | numeric                     |                          |                   |              
 demo_db       | demo_schema | f2            | date_param      |                4 | IN             | date                        |                          |                   |              
 demo_db       | demo_schema | f2            | timestamp_param |                5 | IN             | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f2            | boolean_param   |                6 | IN             | boolean                     |                          |                   |
```

# SHOW POLICIES
<a name="r_SHOW_POLICIES"></a>

데이터베이스에 정의된 행 수준 보안(RLS) 및 동적 데이터 마스킹(DDM) 정책과 특정 관계에 적용된 RLS 및 DDM 정책을 표시합니다. 데이터베이스에서 `sys:secadmin` 역할을 가진 슈퍼유저 또는 사용자만 이러한 정책의 결과를 볼 수 있습니다.

## 구문
<a name="r_SHOW_POLICIES-synopsis"></a>

```
SHOW { RLS | MASKING } POLICIES
[
    ON { database_name.schema_name.relation_name
       | schema_name.relation_name
       }
    [ FOR { user_name | ROLE role_name | PUBLIC } ]
  |
    FROM DATABASE database_name
]
[ LIMIT row_limit ];
```

## 파라미터
<a name="r_SHOW_POLICIES-parameters"></a>

*database\$1name*  
정책을 표시할 데이터베이스의 이름입니다.

*schema\$1name*  
연결된 정책을 표시할 관계의 스키마 이름입니다.

*relation\$1name*  
연결된 정책을 표시할 관계의 이름입니다.

*user\$1name*  
관계에 정책이 연결된 사용자의 이름입니다.

*role\$1name*  
관계에 정책이 연결된 역할의 이름입니다.

*row\$1limit*  
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

**참고**  
연결된 데이터베이스와 다른 데이터베이스의 정책 표시는 Amazon Redshift 페더레이션 권한 카탈로그에서 지원됩니다. SHOW POLICIES 명령은 Amazon Redshift 페더레이션 권한이 있는 웨어하우스의 모든 데이터베이스에 대한 데이터베이스 간 쿼리를 지원합니다.

## 예제
<a name="r_SHOW_POLICIES-examples"></a>

다음 명령은 연결된 데이터베이스의 RLS 정책을 보여줍니다.

```
SHOW RLS POLICIES;

  policy_name   | policy_alias |                           policy_atts                            |                                                                  policy_qual                                                                         | policy_enabled | policy_modified_by |    policy_modified_time    
----------------+--------------+------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+--------------------+----------------------------
 policy_america | rls_table    | [{"colname":"region","type":"character varying(10)"}]            | (("rls_table"."region" = CAST('USA' AS TEXT)) OR ("rls_table"."region" = CAST('CANADA' AS TEXT)) OR ("rls_table"."region" = CAST('Mexico' AS TEXT))) | t              | admin              | 2025-11-07 14:57:27
```

다음 명령은 데이터베이스 ‘sales\$1db.finance-catalog’의 마스킹 정책을 보여줍니다.

```
SHOW MASKING POLICIES FROM DATABASE "sales_db@finance-catalog";

  policy_name  |                          input_columns                           |                                                  policy_expression                                                  | policy_modified_by |    policy_modified_time    
---------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+----------------------------
 hash_credit   | [{"colname":"credit_card","type":"character varying(256)"}]      | [{"expr":"SHA2((\"masked_table\".\"credit_card\" + CAST('testSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}]   | admin              | 2025-11-07 16:05:54
 hash_username | [{"colname":"username","type":"character varying(256)"}]         | [{"expr":"SHA2((\"masked_table\".\"username\" + CAST('otherTestSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}] | admin              | 2025-11-07 16:07:08
(2 rows)
```

다음 명령은 관계형 sales\$1table;에 연결된 RLS 정책을 보여줍니다.

```
SHOW RLS POLICIES ON sales_schema.sales_table;

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |          grantee          | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+---------------------------+--------------+--------------+-----------+----------------------
 policy_global  | sales_schema | sales_table   | table         | admin    | sales_analyst_role_global | role         | t            | t         | and
 policy_america | sales_schema | sales_table   | table         | admin    | sales_analyst_usa         | user         | t            | t         | and
```

다음 명령은 데이터베이스 ‘sales\$1db.finance-catalog’의 관계 transaction\$1table에 연결된 마스킹 정책을 보여줍니다.

```
SHOW MASKING POLICIES ON "sales_db@finance-catalog".sales_schema.transaction_table LIMIT 1;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority |   input_columns   |   output_columns   
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+-------------------+-------------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"]     | ["user_name"]
```

다음 명령은 사용자 ‘IAMR:sales\$1analyst\$1usa’에 대한 데이터베이스 ‘sales\$1db.finance-catalog’의 관계 sales\$1table에 연결된 RLS 정책을 보여줍니다.

```
SHOW RLS POLICIES ON "sales_db@finance-catalog".sales_schema.sales_table FOR "IAMR:sales_analyst_usa";

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |      grantee           | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+------------------------+--------------+--------------+-----------+----------------------
 policy_america | sales_schema | sales_table   | table         | admin    | IAMR:sales_analyst_usa | user         | t            | t         | and
```

다음 명령은 역할 transaction\$1analyst\$1role에 대한 데이터베이스 ‘sales\$1db.finance-catalog’의 관계 transaction\$1table에 연결된 RLS 정책을 보여줍니다.

```
SHOW MASKING POLICIES ON sales_schema.transaction_table FOR ROLE transaction_analyst_role;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority | input_columns | output_columns 
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+---------------+----------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"] | ["user_name"]
```

# SHOW PROCEDURE
<a name="r_SHOW_PROCEDURE"></a>

서명을 포함하여 제공된 저장 프로시저의 정의를 보여 줍니다. SHOW PROCEDURE의 출력을 사용하여 저장 프로시저를 다시 생성할 수 있습니다.

## 구문
<a name="r_SHOW_PROCEDURE-synopsis"></a>

```
SHOW PROCEDURE sp_name [( [ [ argname ] [ argmode ] argtype [, ...] ] )]
```

## 파라미터
<a name="r_SHOW_PROCEDURE-parameters"></a>

 *sp\$1name*   
표시할 프로시저의 이름입니다.

*[argname] [ argmode] argtype*   
저장 프로시저를 식별할 입력 인수 형식입니다. OUT 인수를 포함하여 전체 인수 데이터 형식을 포함시킬 수도 있습니다. 저장 프로시저의 이름이 고유한 경우(즉, 오버로드되지 않은 경우) 이 부분은 선택 사항입니다.

## 예제
<a name="r_SHOW_PROCEDURE-examples"></a>

다음 예제에서는 `test_spl2` 프로시저의 정의를 보여 줍니다.

```
show procedure test_sp2(int, varchar);
                                        Stored Procedure Definition
------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE public.test_sp2(f1 integer, INOUT f2 character varying, OUT character varying)
LANGUAGE plpgsql
AS $_$
DECLARE
out_var alias for $3;
loop_var int;
BEGIN
IF f1 is null OR f2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
CREATE TEMP TABLE etl(a int, b varchar);
FOR loop_var IN 1..f1 LOOP
insert into etl values (loop_var, f2);
f2 := f2 || '+' || f2;
END LOOP;
SELECT INTO out_var count(*) from etl;
END;
$_$

(1 row)
```

# SHOW PROCEDURES
<a name="r_SHOW_PROCEDURES"></a>

나열된 객체에 대한 정보와 함께 스키마의 프로시저 목록을 표시합니다.

각 출력 행에는 열 `database_name`, `schema_name`, `procedure_name`, `number_of_arguments`, `argument_list`, `return_type`, 비고가 있습니다.

SHOW PROCEDURES에서 10,000개 이상의 행이 발생하는 경우 명령에서 오류가 발생합니다.

## 필수 권한
<a name="r_SHOW_PROCEDURES-required-permissions"></a>

Redshift 스키마의 프로시저를 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 슈퍼유저
+ 프로시저의 소유자
+ 상위 스키마에 USAGE 권한을 부여하고 프로시저에 EXECUTE를 부여함

## 구문
<a name="r_SHOW_PROCEDURES-synopsis"></a>

```
SHOW PROCEDURES FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## 파라미터
<a name="r_SHOW_PROCEDURES-parameters"></a>

database\$1name  
나열할 프로시저가 포함된 데이터베이스의 이름입니다.

schema\$1name  
나열할 프로시저가 포함된 스키마의 이름입니다.

filter\$1pattern  
프로시저 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_PROCEDURES.html)
filter\$1pattern은 프로시저 이름하고만 일치합니다.

row\$1limit  
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_PROCEDURES-examples"></a>

다음 예제에서는 스키마 demo\$1db.demo\$1schema의 프로시저를 보여줍니다.

```
SHOW PROCEDURES FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |  procedure_name   | number_of_arguments |                argument_list                 |                           return_type                            | remarks 
---------------+-------------+-------------------+---------------------+----------------------------------------------+------------------------------------------------------------------+---------
 demo_db       | demo_schema | f1                |                   4 | character varying, numeric, numeric, numeric | numeric, character varying, timestamp without time zone, boolean | 
 demo_db       | demo_schema | sp_get_result_set |                   2 | integer, refcursor                           | refcursor                                                        | 
 demo_db       | demo_schema | sp_process_data   |                   2 | numeric, numeric                             | numeric, character varying                                       |
```

다음 예제에서는 이름이 'data'로 끝나는 스키마 demo\$1schema의 프로시저를 보여줍니다.

```
SHOW PROCEDURES FROM SCHEMA demo_schema like '%data';
 database_name | schema_name | procedure_name  | number_of_arguments |  argument_list   |        return_type         | remarks 
---------------+-------------+-----------------+---------------------+------------------+----------------------------+---------
 demo_db       | demo_schema | sp_process_data |                   2 | numeric, numeric | numeric, character varying |
```

# SHOW SCHEMAS
<a name="r_SHOW_SCHEMAS"></a>

데이터베이스의 스키마 목록과 일부 스키마 속성을 표시합니다.

각 출력 행은 데이터베이스 이름, 스키마 이름, 스키마 소유자, 스키마 유형, 스키마 ACL, 소스 데이터베이스 및 스키마 옵션으로 구성됩니다. 이들 속성에 대한 자세한 내용은 [SVV\$1ALL\$1SCHEMAS](r_SVV_ALL_SCHEMAS.md) 섹션을 참조하세요.

SHOW SCHEMAS 명령으로 인해 10,000개 이상의 스키마가 표시될 수 있는 경우 오류가 반환됩니다.

## 필수 권한
<a name="r_SHOW_SCHEMAS-privileges"></a>

Amazon Redshift 테이블에서 스키마를 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 수퍼유저입니다.
+ 스키마의 소유자입니다.
+ 스키마에 USAGE 권한을 부여했습니다.

## 구문
<a name="r_SHOW_SCHEMAS-synopsis"></a>

```
SHOW SCHEMAS FROM DATABASE database_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## 파라미터
<a name="r_SHOW_SCHEMAS-parameters"></a>

 *database\$1name*   
나열할 테이블이 포함된 데이터베이스의 이름입니다.  
AWS Glue Data Catalog에 테이블을 표시하려면 데이터베이스 이름으로 (`awsdatacatalog`)를 지정하고 시스템 구성 `data_catalog_auto_mount`가 `true`로 설정되어 있는지 확인합니다. 자세한 내용은 [ALTER SYSTEM](r_ALTER_SYSTEM.md) 섹션을 참조하세요.

 *filter\$1pattern*   
스키마 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_SCHEMAS.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.

 *row\$1limit*   
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_SCHEMAS-examples"></a>

다음 예제에서는 `dev`라는 Amazon Redshift 데이터베이스의 스키마를 보여줍니다.

```
SHOW SCHEMAS FROM DATABASE dev;

 database_name |     schema_name      | schema_owner | schema_type |         schema_acl          | source_database | schema_option 
---------------+----------------------+--------------+-------------+-----------------------------+-----------------+---------------
 dev           | pg_automv            |            1 | local       |                             |                 | 
 dev           | pg_catalog           |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | public               |            1 | local       | jpuser=UC/jpuser~=UC/jpuser |                 | 
 dev           | information_schema   |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | schemad79cd6d93bf043 |            1 | local       |                             |                 |
```

다음 예제에서는 `awsdatacatalog`라는 AWS Glue Data Catalog 데이터베이스의 스키마를 보여줍니다. 최대 출력 행 수는 `5`입니다.

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog LIMIT 5;

 database_name  |     schema_name      | schema_owner | schema_type | schema_acl | source_database | schema_option 
----------------+----------------------+--------------+-------------+------------+-----------------+---------------
 awsdatacatalog | 000_too_many_glue_db |              | EXTERNAL    |            |                 | 
 awsdatacatalog | 123_default          |              | EXTERNAL    |            |                 | 
 awsdatacatalog | adhoc                |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_10mb      |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_1g        |              | EXTERNAL    |            |                 |
```

# SHOW TABLE
<a name="r_SHOW_TABLE"></a>

테이블 속성, 테이블 제약 조건, 열 속성, 열 데이터 정렬 및 열 제약 조건을 포함하여 테이블의 정의를 표시합니다. SHOW TABLE 문의 출력을 사용하여 테이블을 다시 생성할 수 있습니다.

테이블 생성에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

## 구문
<a name="r_SHOW_TABLE-synopsis"></a>

```
SHOW TABLE [schema_name.]table_name 
```

## 파라미터
<a name="r_SHOW_TABLE-parameters"></a>

 *schema\$1name*   
(옵션) 관련 스키마의 이름입니다.

 *table\$1name*   
표시할 테이블의 이름입니다.

## 예제
<a name="r_SHOW_TABLE-examples"></a>

다음은 `sales` 테이블에 대한 SHOW TABLE 출력의 예입니다.

```
show table sales;
```

```
CREATE TABLE public.sales (
salesid integer NOT NULL ENCODE az64,
listid integer NOT NULL ENCODE az64 distkey,
sellerid integer NOT NULL ENCODE az64,
buyerid integer NOT NULL ENCODE az64,
eventid integer NOT NULL ENCODE az64,
dateid smallint NOT NULL,
qtysold smallint NOT NULL ENCODE az64,
pricepaid numeric(8,2) ENCODE az64,
commission numeric(8,2) ENCODE az64,
saletime timestamp without time zone ENCODE az64
)
DISTSTYLE KEY SORTKEY ( dateid );
```

다음은 스키마 `public`의 테이블 `category`에 대한 SHOW TABLE 출력의 예입니다. 데이터베이스의 데이터 정렬은 CASE\$1SENSITIVE입니다.

```
show table public.category;
```

```
CREATE TABLE public.category (
catid smallint NOT NULL distkey,
catgroup character varying(10) ENCODE lzo COLLATE case_sensitive,
catname character varying(10) ENCODE lzo COLLATE case_sensitive,
catdesc character varying(50) ENCODE lzo COLLATE case_sensitive
) 
DISTSTYLE KEY SORTKEY ( catid );
```

다음 예에서는 기본 키가 있는 테이블 `foo`를 생성합니다.

```
create table foo(a int PRIMARY KEY, b int);
```

SHOW TABLE 결과는 `foo` 테이블의 모든 속성과 함께 create 문을 표시합니다.

```
show table foo;
```

```
CREATE TABLE public.foo ( 
a integer NOT NULL ENCODE az64, 
b integer ENCODE az64, PRIMARY KEY (a) 
) 
DISTSTYLE AUTO;
```

이 예제에서는 열 `a`가 데이터베이스의 기본 CASE\$1SENSITIVE 데이터 정렬을 상속하고 `b` 및 `c`가 CASE\$1INSENSITIVE 데이터 정렬로 명시적으로 설정된 테이블을 생성합니다.

```
CREATE TABLE public.foo (
a CHAR, 
b VARCHAR(10) COLLATE CASE_INSENSITIVE, 
c SUPER COLLATE CASE_INSENSITIVE
);
```

SHOW TABLE 결과는 `foo` 테이블의 모든 속성과 함께 create 문을 표시합니다.

```
show table public.foo;
```

```
CREATE TABLE public.foo (
a character(1) ENCODE lzo COLLATE case_sensitive,
b character varying(10) ENCODE lzo COLLATE case_insensitive,
c super COLLATE case_insensitive
)
DISTSTYLE AUTO;
```

# SHOW TABLES
<a name="r_SHOW_TABLES"></a>

스키마의 테이블 목록과 일부 테이블 속성을 표시합니다.

각 출력 행은 데이터베이스 이름, 스키마 이름, 테이블 이름, 테이블 유형, 테이블 ACL, 비고, 테이블 소유자, 마지막으로 변경된 시간, 마지막으로 수정된 시간, dist\$1style 및 테이블 하위 유형으로 구성됩니다. 이들 속성에 대한 자세한 내용은 [SVV\$1ALL\$1TABLES](r_SVV_ALL_TABLES.md) 섹션을 참조하세요.

수정 및 변경 타임스탬프는 테이블 업데이트보다 약 20분 지연될 수 있습니다.

SHOW TABLES 명령으로 인해 10,000개 이상의 테이블이 반환되는 경우 오류가 반환됩니다.

## 필수 권한
<a name="r_SHOW_TABLES-privileges"></a>

Amazon Redshift 스키마에서 테이블을 보려면 현재 사용자가 다음 기준 중 하나를 충족해야 합니다.
+ 수퍼유저입니다.
+ 테이블의 소유자입니다.
+ 상위 스키마에 USAGE 권한을 부여하고 테이블에 SELECT 권한을 부여하거나 테이블의 모든 열에 SELECT 권한을 부여했습니다.

## 구문
<a name="r_SHOW_TABLES-synopsis"></a>

```
SHOW TABLES FROM SCHEMA database_name.schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## 파라미터
<a name="r_SHOW_TABLES-parameters"></a>

 *database\$1name*   
나열할 테이블이 포함된 데이터베이스의 이름입니다.  
AWS Glue Data Catalog에 테이블을 표시하려면 데이터베이스 이름으로 (`awsdatacatalog`)를 지정하고 시스템 구성 `data_catalog_auto_mount`가 `true`로 설정되어 있는지 확인합니다. 자세한 내용은 [ALTER SYSTEM](r_ALTER_SYSTEM.md) 섹션을 참조하세요.

 *schema\$1name*   
나열할 테이블이 포함된 스키마의 이름입니다.  
AWS Glue Data Catalog 테이블을 표시하려면 AWS Glue 데이터베이스 이름을 스키마 이름으로 제공하세요.

 *filter\$1pattern*   
테이블 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_TABLES.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.

 *row\$1limit*   
반환할 최대 열 수입니다. **row\$1limit는 0\$110,000일 수 있습니다.

## 예제
<a name="r_SHOW_TABLES-examples"></a>

```
SHOW TABLES FROM SCHEMA s1;

 database_name | schema_name |    table_name     | table_type |              table_acl              | remarks | owner |     last_altered_time      |     last_modified_time     | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+-------------------------------------+---------+-------+----------------------------+----------------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | alice=arwdRxtDPA/alice~bob=d/alice  |         | alice |                            |                            |            | LATE BINDING VIEW
 dev           | s1          | manual_mv         | VIEW       | alice=arwdRxtDPA/alice~bob=P/alice  |         | alice |                            |                            |            | MATERIALIZED VIEW
 dev           | s1          | regular_view      | VIEW       | alice=arwdRxtDPA/alice~bob=r/alice  |         | alice |                            |                            |            | REGULAR VIEW
 dev           | s1          | test_table        | TABLE      | alice=arwdRxtDPA/alice~bob=rw/alice |         | alice | 2025-11-18 15:52:00.010452 | 2025-11-18 15:44:34.856073 | AUTO (ALL) | REGULAR TABLE
```

```
SHOW TABLES FROM SCHEMA dev.s1 LIKE '%view' LIMIT 1;

 database_name | schema_name |    table_name     | table_type |              table_acl               | remarks | owner | last_altered_time | last_modified_time | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+--------------------------------------+---------+-------+-------------------+--------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | {alice=arwdRxtDPA/alice,bob=d/alice} |         | alice |                   |                    |            | LATE BINDING VIEW
```

# SHOW TEMPLATE
<a name="r_SHOW_TEMPLATE"></a>

정규화된 이름(데이터베이스, 스키마 및 템플릿 이름)과 모든 파라미터를 포함하여 템플릿의 전체 정의를 표시합니다. 출력은 템플릿을 다시 생성하거나 수정된 유사한 템플릿을 생성하는 데 사용할 수 있는 유효한 CREATE TEMPLATE 문입니다.

템플릿 생성에 대한 자세한 정보는 [CREATE TEMPLATE](r_CREATE_TEMPLATE.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_SHOW_TEMPLATE-privileges"></a>

템플릿 정의를 보려면 다음 중 하나가 있어야 합니다.
+ 수퍼유저 권한
+ 템플릿에 대한 USAGE 권한 및 템플릿이 포함된 스키마에 대한 USAGE 권한

## 구문
<a name="r_SHOW_TEMPLATE-synopsis"></a>

```
SHOW TEMPLATE [database_name.][schema_name.]template_name;
```

## 파라미터
<a name="r_SHOW_TEMPLATE-parameters"></a>

 *database\$1name*   
(선택 사항) 템플릿이 생성되는 데이터베이스의 이름입니다. 지정하지 않으면 현재 데이터베이스가 사용됩니다.

 *schema\$1name*   
(선택 사항) 템플릿이 생성되는 스키마의 이름입니다. 지정하지 않으면 현재 검색 경로에서 템플릿이 검색됩니다.

 *template\$1name*   
템플릿의 이름입니다.

## 예제
<a name="r_SHOW_TEMPLATE-examples"></a>

다음은 `test_template` 템플릿에 대한 SHOW TEMPLATE 출력의 예입니다.

```
CREATE TEMPLATE test_template FOR COPY AS NOLOAD DELIMITER ',' ENCODING UTF16 ENCRYPTED;
```

```
SHOW TEMPLATE test_template;

CREATE OR REPLACE TEMPLATE dev.public.test_template FOR COPY AS ENCRYPTED NOLOAD ENCODING UTF16 DELIMITER ',';
```

다음 예제에서는 `demo_schema` 스키마에 `demo_template` 템플릿을 생성합니다.

```
CREATE OR REPLACE TEMPLATE demo_schema.demo_template FOR COPY AS
ACCEPTANYDATE ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY' EXPLICIT_IDS ROUNDEC
TIMEFORMAT  AS 'DD.MM.YYYY HH:MI:SS' TRUNCATECOLUMNS NULL  AS 'null_string';
```

```
SHOW TEMPLATE demo_schema.demo_template;

CREATE OR REPLACE TEMPLATE dev.demo_schema.demo_template FOR COPY AS TRUNCATECOLUMNS NULL 'null_string' EXPLICIT_IDS TIMEFORMAT 'DD.MM.YYYY HH:MI:SS' ACCEPTANYDATE ROUNDEC ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY';
```

# SHOW TEMPLATES
<a name="r_SHOW_TEMPLATES"></a>

스키마의 템플릿 목록과 해당 속성을 표시합니다.

각 출력 행은 템플릿 이름, 템플릿 ID, 템플릿 유형, 템플릿 소유자, 데이터베이스 이름, 스키마 이름, 생성 시간, 마지막으로 수정된 시간 및 마지막으로 수정된 기준으로 구성됩니다.

템플릿 파라미터를 포함한 전체 템플릿 세부 정보는 [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_SHOW_TEMPLATES-privileges"></a>

Amazon Redshift 스키마에서 템플릿을 보려면 다음 중 하나가 있어야 합니다.
+ 수퍼유저 권한
+ 템플릿이 포함된 스키마에 대한 USAGE 권한

## 구문
<a name="r_SHOW_TEMPLATES-synopsis"></a>

```
SHOW TEMPLATES FROM SCHEMA [database_name.]schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ];
```

## 파라미터
<a name="r_SHOW_TEMPLATES-parameters"></a>

 *database\$1name*   
(선택 사항) 나열할 템플릿이 포함된 데이터베이스의 이름입니다. 제공되지 않은 경우는 현재 데이터베이스를 사용합니다.

 *schema\$1name*   
나열할 테이블이 포함된 템플릿의 이름입니다.

 *filter\$1pattern*   
(선택 사항) 템플릿 이름과 일치하는 패턴이 있는 유효한 UTF-8 문자 표현식입니다. LIKE' 옵션은 다음과 같은 패턴 일치 메타문자를 지원하는 대/소문자 구분 일치를 수행합니다:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_SHOW_TEMPLATES.html)
**filter\$1pattern에 메타 문자가 포함되어 있지 않으면 패턴이 문자열 자체만 의미합니다. 이런 경우에는 LIKE가 등호 연산자와 동일한 역할을 합니다.

 *row\$1limit*   
반환할 최대 열 수입니다. 유효한 범위는 클러스터의 템플릿 한도까지 0입니다(기본값은 1,000).

## 예제
<a name="r_SHOW_TEMPLATES-examples"></a>

```
SHOW TEMPLATES FROM SCHEMA s1;

 template_name          | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by
------------------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 template_maxerror      |      107685 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:10.514076 | 2025-12-16 19:31:10.514076 |              100
 json_template          |      107687 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:33.229566 | 2025-12-16 19:31:33.229567 |              100
 noload_template        |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
 csv_delimiter_template |      107688 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:42.354044 | 2025-12-16 19:31:42.354045 |              100
```

```
SHOW TEMPLATES FROM SCHEMA dev.s1 LIKE '%template' LIMIT 1;

 template_name  | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by 
-----------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 noload_template |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
```

# SHOW VIEW
<a name="r_SHOW_VIEW"></a>

구체화된 뷰와 후기 바인딩 뷰를 포함하여 뷰의 정의를 표시합니다. SHOW VIEW 문의 출력을 사용하여 뷰를 다시 생성할 수 있습니다.

## 구문
<a name="r_SHOW_VIEW-synopsis"></a>

```
SHOW VIEW [schema_name.]view_name 
```

## 파라미터
<a name="r_SHOW_VIEW-parameters"></a>

 *schema\$1name*   
(옵션) 관련 스키마의 이름입니다.

 *view\$1name*   
표시할 뷰의 이름입니다.

## 예제
<a name="r_SHOW_VIEW-examples"></a>

 다음은 뷰 `LA_Venues_v`에 대한 뷰 정의입니다.

```
create view LA_Venues_v as select * from venue where venuecity='Los Angeles';
```

다음은 앞에서 정의한 뷰에 대한 SHOW VIEW 명령 및 출력의 예입니다.

```
show view LA_Venues_v;
```

```
SELECT venue.venueid,
venue.venuename,
venue.venuecity,
venue.venuestate,
venue.venueseats
FROM venue WHERE ((venue.venuecity)::text = 'Los Angeles'::text);
```

다음은 스키마 `public`에서 뷰 `public.Sports_v`에 대한 뷰 정의입니다.

```
create view public.Sports_v as select * from category where catgroup='Sports';
```

다음은 앞에서 정의한 뷰에 대한 SHOW VIEW 명령 및 출력의 예입니다.

```
show view public.Sports_v;
```

```
SELECT category.catid,
category.catgroup,
category.catname,
category.catdesc
FROM category WHERE ((category.catgroup)::text = 'Sports'::text);
```

# START TRANSACTION
<a name="r_START_TRANSACTION"></a>

BEGIN 함수의 동의어입니다.

[BEGIN](r_BEGIN.md)을(를) 참조하세요.

# TRUNCATE
<a name="r_TRUNCATE"></a>

테이블 스캔을 수행하지 않고 테이블에서 모든 행을 삭제합니다. 이 작업은 정규화되지 않은 DELETE 작업을 대신하여 더 빠르게 수행할 수 있는 수단입니다. TRUNCATE 명령을 실행하려면 테이블의 소유자 또는 수퍼유저이거나 테이블에 대한 TRUNCATE 권한이 부여되어야 합니다. 테이블을 잘라낼 수 있는 권한을 부여하려면 [GRANT](r_GRANT.md) 명령을 사용합니다.

TRUNCATE는 DELETE보다 훨씬 더 효율적이며 VACUUM 및 ANALYZE가 필요하지 않습니다. 하지만 TRUNCATE는 이 명령이 실행되는 트랜잭션을 커밋합니다.

## 구문
<a name="r_TRUNCATE-synopsis"></a>

```
TRUNCATE [ TABLE ] table_name
```

이 명령은 구체화된 뷰에서도 작동합니다.

```
TRUNCATE materialized_view_name
```

## 파라미터
<a name="r_TRUNCATE-parameters"></a>

TABLE   
선택적 키워드입니다.

 *table\$1name*   
임시 또는 영구 테이블입니다. 테이블 소유자 또는 수퍼유저만이 테이블을 잘라낼 수 있습니다.  
외래 키 제약 조건에서 참조되는 테이블을 포함한 어떤 테이블이든 잘라낼 수 있습니다.  
잘라낸 후 테이블을 vacuum할 필요가 없습니다.

 *materialized\$1view\$1name*   
구체화된 뷰  
[구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md)에 사용되는 구체화된 뷰를 잘라낼 수 있습니다.

## 사용 노트
<a name="r_TRUNCATE_usage_notes"></a>
+  TRUNCATE 명령은 명령이 실행되는 트랜잭션을 커밋하므로 TRUNCATE 작업을 롤백할 수 없고, TRUNCATE 명령은 스스로를 커밋할 때 다른 작업을 커밋할 수 있습니다.
+ TRUNCATE 작업은 다음 중 하나에 연결된 Amazon Redshift 스트리밍 구체화된 뷰에서 실행될 때 배타적 잠금을 유지합니다.
  +  Amazon Kinesis 데이터 스트림 
  +  Amazon Managed Streaming for Apache Kafka 주제 
  +  Confluent Cloud Kafka 주제와 같은 지원되는 외부 스트림 

  자세한 내용은 [구체화된 뷰로 스트리밍 모으기](materialized-view-streaming-ingestion.md) 섹션을 참조하세요.

## 예제
<a name="r_TRUNCATE-examples"></a>

CATEGORY 테이블에서 모든 행을 삭제하려면 TRUNCATE 명령을 사용하세요.

```
truncate category;
```

TRUNCATE 작업 롤백을 시도합니다.

```
begin;

truncate date;

rollback;

select count(*) from date;
count
-------
0
(1 row)
```

TRUNCATE 명령이 자동으로 커밋되었으므로 ROLLBACK 명령 후 DATE 테이블이 빈 상태로 남습니다.

다음 예제에서는 TRUNCATE 명령을 사용하여 구체화된 뷰에서 모든 행을 삭제합니다.

```
truncate my_materialized_view;
```

구체화된 뷰의 모든 레코드를 삭제하고 구체화된 뷰와 해당 스키마를 그대로 유지합니다. 쿼리에서 구체화된 뷰 이름은 샘플입니다.

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


|  | 
| --- |
| 2025년 4월 30일부터 신규 고객에게 COPY 및 UNLOAD 명령에 대한 클라이언트 측 암호화가 더 이상 제공되지 않습니다. 2025년 4월 30일 이전 12개월 동안 COPY 및 UNLOAD 명령에 클라이언트 측 암호화를 사용한 경우, 2026년 4월 30일까지 COPY 또는 UNLOAD 명령에 클라이언트 측 암호화를 계속 사용할 수 있습니다. 2026년 4월 30일 이후에는 COPY 및 UNLOAD에 클라이언트 측 암호화를 사용할 수 없습니다. 가능한 한 빨리 COPY 및 UNLOAD에 서버 측 암호화를 사용하도록 전환하는 것이 좋습니다. 이미 COPY 및 UNLOAD에 서버 측 암호화를 사용하고 있는 경우 변경 사항이 없으며 쿼리를 변경하지 않고도 계속 사용할 수 있습니다. COPY 및 UNLOAD 암호화에 대한 자세한 내용은 아래 ENCRYPTED 파라미터를 참조하세요.   | 

Amazon S3 서버 측 암호화(SSE-S3)를 사용하여 Amazon S3에서 하나 이상의 텍스트, JSON 또는 Apache Parquet 파일로 쿼리의 결과를 언로드합니다. AWS Key Management Service 키(SSE-KMS)를 사용하여 서버 측 암호화를 지정할 수도 있습니다.

기본적으로 언로드된 파일의 형식은 파이프로 구분된(`|`) 텍스트입니다.

MAXFILESIZE 파라미터를 설정하면 Amazon S3의 파일 크기를 비롯해 파일 수까지도 관리할 수 있습니다. S3 IP 범위가 허용 목록에 추가되었는지 확인합니다. 필요한 S3 IP 범위에 대한 자세한 내용은 [네트워크 격리](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)를 참조하세요.

이제 Amazon Redshift 쿼리 결과를 분석을 위한 효율적인 개방형 열 기반 스토리지 형식인 Apache Parquet의 Amazon S3 데이터 레이크에 언로드할 수 있습니다. Parquet 형식은 텍스트 형식에 비해 언로드 속도가 최대 2배 빠르고 Amazon S3에서 스토리지 사용량이 최대 6배 적습니다. 따라서 Amazon S3에서 Amazon S3 데이터 레이크로 데이터 변환 및 보강 작업의 결과물을 오픈 형식으로 저장할 수 있습니다. 그런 다음 Redshift Spectrum과 Amazon Athena, Amazon EMR, Amazon SageMaker AI 등의 기타 AWS 서비스를 사용하여 데이터를 분석할 수 있습니다.

UNLOAD 명령 사용에 대한 자세한 내용과 예제 시나리오는 [Amazon Redshift에서 데이터 언로드](c_unloading_data.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_UNLOAD-permissions"></a>

UNLOAD 명령이 성공하려면 Amazon S3 위치에 쓸 수 있는 권한과 함께 데이터베이스의 데이터에 대해 최소 SELECT 권한이 필요합니다. UNLOAD 명령의 AWS 리소스에 액세스할 수 있는 권한에 대한 자세한 내용은 [다른 AWS 리소스에 대한 액세스 권한](copy-usage_notes-access-permissions.md) 섹션을 참조하세요.

최소 권한 권한을 적용하려면 다음 권장 사항에 따라 명령을 실행하는 사용자에게 필요한 권한만 부여합니다.
+ 사용자는 데이터에 대한 SELECT 권한이 있어야 합니다. 데이터베이스 권한을 제한하는 방법에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.
+ 사용자는 AWS 계정의 Amazon S3 버킷에 쓸 IAM 역할을 수임할 권한이 필요합니다. 데이터베이스 사용자가 역할을 수임하도록 액세스를 제한하려면 *Amazon Redshift 관리 안내서*의 [IAM 역할에 대한 액세스 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service-database-users.html)을 참조하세요.
+ 사용자는 Amazon S3 버킷에 대한 액세스 권한이 필요합니다. Amazon S3 버킷 정책을 사용하여 권한을 제한하려면 *Amazon Simple Storage Service 사용 설명서*의 [ Amazon S3의 버킷 정책](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)을 참조하세요.

## 구문
<a name="r_UNLOAD-synopsis"></a>

```
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option, ...] 

where authorization is
IAM_ROLE { default | 'arn:aws:iam::<AWS 계정-id-1>:role/<role-name>[,arn:aws:iam::<AWS 계정-id-2>:role/<role-name>][,...]' }
            
where option is
| [ FORMAT [ AS ] ] CSV | PARQUET | JSON
| PARTITION BY ( column_name [, ... ] ) [ INCLUDE ]
| MANIFEST [ VERBOSE ]
| HEADER
| DELIMITER [ AS ] 'delimiter-char'
| FIXEDWIDTH [ AS ] 'fixedwidth-spec'
| ENCRYPTED [ AUTO ]
| BZIP2
| GZIP
| ZSTD
| ADDQUOTES
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| CLEANPATH
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ]
| ROWGROUPSIZE [AS] size [ MB | GB ]
| REGION [AS] 'aws-region' }
| EXTENSION 'extension-name'
```

## 파라미터
<a name="unload-parameters"></a>

('*select-statement*')   
SELECT 쿼리입니다. 쿼리의 결과가 언로드됩니다. 대부분의 경우 쿼리에 ORDER BY 절을 지정하여 정렬된 순서대로 데이터를 언로드할 만한 가치가 있습니다. 이런 접근 방식을 취하면 데이터를 다시 로드할 때 데이터 정렬 소요 시간이 단축됩니다.  
다음에 표시된 것처럼 쿼리를 작은따옴표로 묶어야 합니다.  

```
('select * from venue order by venueid')
```
쿼리에 따옴표가 포함된 경우(예: 리터럴 값을 묶기 위해) 리터럴을 2개의 작은따옴표 집합 사이에 넣습니다. 쿼리도 작은따옴표로 묶어야 합니다.  

```
('select * from venue where venuestate=''NV''')
```

TO 's3://*object-path/name-prefix*'  
Amazon S3에서 Amazon Redshift가 출력 파일 객체(MANIFEST가 지정되어 있는 경우 매니페스트 파일 포함)를 작성할 위치의 전체 경로(버킷 이름 포함)입니다. 객체 이름에는 *name-prefix*가 접두사로 붙습니다. `PARTITION BY`를 사용하면 필요에 따라 슬래시(/)가 *name-prefix* 값의 끝에 자동으로 추가됩니다. 추가적인 보안을 위해, UNLOAD는 HTTPS 연결을 사용하여 Amazon S3에 연결합니다. 기본적으로, UNLOAD는 조각당 하나 이상의 파일을 작성합니다. UNLOAD는 다음과 같이 조각 번호와 부품 번호를 지정된 이름 접두사에 추가합니다.  
`<object-path>/<name-prefix><slice-number>_part_<part-number>`.   
MANIFEST가 지정되어 있는 경우 다음과 같이 매니페스트 파일이 작성됩니다.  
`<object_path>/<name_prefix>manifest`.   
PARALLEL을 OFF로 지정하면 데이터 파일은 다음과 같이 기록됩니다.  
`<object_path>/<name_prefix><part-number>`.   
UNLOAD는 Amazon S3 서버 측 암호화(SSE)를 사용하여 암호화된 파일을 자동 생성합니다(MANIFEST가 사용되는 경우 매니페스트 파일 포함). COPY 명령은 로드 작업 중에 서버 측 암호화 파일을 자동으로 읽습니다. Amazon S3 콘솔 또는 API를 사용하여 버킷에서 서버 측 암호화 파일을 투명하게 다운로드할 수 있습니다. 자세한 내용은 [서버 측 암호화를 사용하여 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) 섹션을 참조하세요.  
Amazon S3 버킷이 Amazon Redshift 데이터베이스와 같은 AWS 리전에 있지 않을 때는 REGION이 필요합니다.

*권한 부여*  
UNLOAD 명령으로 Amazon S3에 데이터를 쓰려면 권한 부여가 필요합니다. UNLOAD 명령은 COPY 명령이 권한 부여를 위해 사용하는 것과 동일한 파라미터를 사용합니다. 자세한 내용은 COPY 명령 구문 참조 설명서에서 [권한 부여 파라미터](copy-parameters-authorization.md) 섹션을 참조하세요.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::*<AWS 계정-id-1>*:role/*<role-name>*'  <a name="unload-iam"></a>
기본 키워드를 사용하여 UNLOAD 명령이 실행될 때 Amazon Redshift에서 기본값으로 설정되고 클러스터와 연결된 IAM 역할을 사용하도록 합니다.  
클러스터가 인증 및 권한 부여에 사용하는 IAM 역할의 Amazon 리소스 이름(ARN)을 사용합니다. IAM\$1ROLE을 지정하면 ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN 또는 CREDENTIALS는 사용할 수 없습니다. IAM\$1ROLE을 연결할 수 있습니다. 자세한 내용은 *Amazon Redshift 관리 가이드*의 [IAM 역할 연결](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles)을 참조하세요.

[ FORMAT [AS] ] CSV \$1 PARQUET \$1 JSON  <a name="unload-csv"></a>
기본 형식을 재정의하는 언로드 형식을 지정하는 키워드입니다.  
CSV의 경우 쉼표(,) 문자를 기본 구분 기호로 사용하여 텍스트 파일을 CSV 형식으로 언로드합니다. 필드에 구분 기호, 큰따옴표, 줄 바꿈 또는 캐리지 리턴이 포함된 경우 언로드된 파일의 필드가 큰따옴표로 묶입니다. 데이터 필드 내의 큰따옴표는 추가 큰따옴표로 이스케이프됩니다. 행 0개가 언로드되면 Amazon Redshift는 빈 Amazon S3 객체를 기록할 수 있습니다.  
PARQUET의 경우 Apache Parquet 버전 1.0 형식으로 파일에 언로드합니다. 기본적으로 각 행 그룹은 SNAPPY 압축을 사용하여 압축됩니다. Apache Parquet 형식에 대한 자세한 내용은 [Parquet](https://parquet.apache.org/)을 참조하세요.  
JSON을 사용하는 경우 쿼리 결과의 전체 레코드를 나타내는 JSON 객체가 각 행에 포함된 JSON 파일로 언로드합니다. Amazon Redshift는 쿼리 결과에 SUPER 열이 포함된 경우 중첩된 JSON 작성을 지원합니다. 유효한 JSON 객체를 만들려면 쿼리의 각 열 이름이 고유해야 합니다. JSON 파일에서 부울 값은 `t` 또는 `f`로 언로드되고 NULL 값은 `null`로 언로드됩니다. 행 0개가 언로드되면 Amazon Redshift는 Amazon S3 객체를 기록하지 않습니다.  
FORMAT 및 AS 키워드는 선택 사항입니다. CSV는 ESCAPE, FIXEDWIDTH 또는 ADDQUOTES와 함께 사용할 수 없습니다. PARQUET은 DELIMITER, FIXEDWIDTH, ADDQUOTES, ESCAPE, NULL AS, HEADER, GZIP, BZIP2 또는 ZSTD와 함께 사용할 수 없습니다. PARQUET with ENCRYPTED는 AWS Key Management Service 키(SSE-KMS)를 사용하는 서버측 암호화에서만 지원됩니다. JSON은 DELIMITER, HEADER, FIXEDWIDTH, ADDQUOTES, ESCAPE 또는 NULL AS와 함께 사용할 수 없습니다.

PARTITION BY ( *column\$1name* [, ... ] ) [INCLUDE]  <a name="unload-partitionby"></a>
언로드 작업을 위한 파티션 키를 지정합니다. UNLOAD는 Apache Hive 규칙에 따라 파티션 키 값을 기반으로 출력 파일을 파티션 폴더로 자동 분할합니다. 예를 들어 파티션 연도가 2019년이고 월이 9월인 Parquet 파일의 접두사는 다음과 같습니다. `s3://amzn-s3-demo-bucket/my_prefix/year=2019/month=September/000.parquet`.  
*column\$1name*의 값은 언로드 중인 쿼리 결과의 열이어야 합니다.  
INCLUDE 옵션을 사용하여 PARTITION BY를 지정하면 파티션 열이 언로드된 파일에서 제거되지 않습니다.  
Amazon Redshift는 PARTITION BY 절에서 문자열 리터럴을 지원하지 않습니다.

MANIFEST [ VERBOSE ]  
UNLOAD 프로세스에 의해 생성되는 데이터 파일의 세부 정보를 명시적으로 나열하는 매니페스트 파일을 생성합니다. 매니페스트란 Amazon S3에 작성한 개별 파일의 URL을 나열한 JSON 형식의 텍스트 파일을 말합니다.  
MANIFEST가 VERBOSE 옵션을 사용해 지정된 경우 매니페스트에는 다음 세부 정보가 포함됩니다.  
+ 열 이름 및 데이터 형식 그리고 CHAR, VARCHAR 또는 NUMERIC 데이터 형식의 경우 각 열에 대한 차원. CHAR 및 VARCHAR 데이터 형식의 경우 차원은 길이입니다. DECIMAL 또는 NUMERIC 데이터 형식의 경우 차원은 정밀도 및 배율입니다.
+ 각 파일로 언로드되는 행 수. HEADER 옵션이 지정되면 행 수에는 헤더 행이 포함됩니다.
+ 언로드되는 모든 파일의 총 파일 크기 및 모든 파일로 언로드되는 총 행 수. HEADER 옵션이 지정되면 행 수에는 헤더 행이 포함됩니다.
+ 작성자. 작성자는 항상 "Amazon Redshift"입니다.
VERBOSE는 MANIFEST 다음에만 지정할 수 있습니다.  
매니페스트 파일은 같은 Amazon S3 경로 접두사에 `<object_path_prefix>manifest` 형식의 언로드 파일로 작성됩니다. 예를 들어 UNLOAD가 Amazon S3 경로 접두사 '`s3://amzn-s3-demo-bucket/venue_`'를 지정하는 경우 매니페스트 파일 위치는 '`s3://amzn-s3-demo-bucket/venue_manifest`'가 됩니다.

HEADER  
각 출력 파일의 맨 위에 열 이름을 포함하는 헤더 줄을 추가합니다. 또한 CSV, DELIMITER, ADDQUOTES, ESCAPE와 같은 텍스트 변환 옵션이 헤더 줄에 적용됩니다. HEADER는 FIXEDWIDTH와 함께 사용할 수 없습니다.

DELIMITER AS '*delimiter\$1character*'  
파이프 문자(\$1), 쉼표(,) 또는 탭(\$1t) 같이 출력 파일에서 필드를 구분할 때 사용할 단일 ASCII 문자를 지정합니다. 텍스트 파일의 기본 구분 기호는 파이프 문자입니다. CSV 파일의 기본 구분 기호는 쉼표 문자입니다. AS 키워드는 옵션입니다. DELIMITER는 FIXEDWIDTH와 함께 사용할 수 없습니다. 데이터에 구분 기호 문자가 포함되는 경우 ESCAPE 옵션을 지정하여 구분 기호를 이스케이프하거나 ADDQUOTES를 사용하여 데이터를 큰따옴표로 묶어야 합니다. 또는 데이터에 포함되지 않은 구분 기호를 지정합니다.

FIXEDWIDTH '*fixedwidth\$1spec*'  
각각의 열 너비가 구분 기호로 구분되지 않고 고정된 길이인 파일로 데이터를 언로드합니다. *fixedwidth\$1spec*은 열 개수와 열의 너비를 지정하는 문자열입니다. AS 키워드는 옵션입니다. FIXEDWIDTH는 데이터를 자르지 않으므로 UNLOAD 문에서 각 열에 대한 사양은 최소한 그 열에 대해 가장 긴 항목의 길이만큼은 되어야 합니다. *fixedwidth\$1spec*의 형식이 아래에 표시되어 있습니다.  

```
'colID1:colWidth1,colID2:colWidth2, ...'
```
FIXEDWIDTH는 DELIMITER 또는 HEADER와 함께 사용할 수 없습니다.

ENCRYPTED [AUTO]  <a name="unload-parameters-encrypted"></a>
Amazon S3의 출력 파일은 Amazon S3 서버 측 암호화를 사용하여 암호화될 것임을 지정하는 절입니다. MANIFEST가 지정되어 있는 경우 매니페스트 파일도 암호화됩니다. 자세한 내용은 [암호화된 데이터 파일 언로드](t_unloading_encrypted_files.md) 섹션을 참조하세요. ENCRYPTED 파라미터를 지정하지 않는 경우 UNLOAD는 AWS 관리형 암호화 키를 사용하는 Amazon S3 서버 측 암호화(SSE-S3)를 사용하여 암호화된 파일을 자동 생성합니다.  
ENCRYPTED의 경우 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS)를 사용하여 Amazon S3에 언로드할 수 있습니다. 이 경우 [KMS_KEY_ID](#unload-parameters-kms-key-id) 파라미터를 사용하여 키 ID를 제공합니다. KMS\$1KEY\$1ID 파라미터와 함께 [CREDENTIALS 파라미터 사용](copy-parameters-authorization.md#copy-credentials) 파라미터를 사용할 수 없습니다. KMS\$1KEY\$1ID를 사용하여 데이터에 대해 UNLOAD 명령을 실행하면 키를 지정하지 않고 동일한 데이터에 대해 COPY 작업을 수행할 수 있습니다.  
ENCRYPTED AUTO를 사용하는 경우 UNLOAD 명령은 대상 Amazon S3 버킷 속성에서 기본 AWS KMS 암호화 키를 가져와서 AWS KMS 키로 Amazon S3에 기록된 파일을 암호화합니다. 버킷에 기본 AWS KMS 암호화 키가 없는 경우 UNLOAD는 AWS에서 관리하는 암호화 키(SSE-S3)를 사용한 Amazon Redshift 서버 측 암호화를 사용하여 암호화된 파일을 자동으로 생성합니다. 이 옵션은 KMS\$1KEY\$1ID, MASTER\$1SYMMETRIC\$1KEY, 또는 master\$1symmetric\$1key가 포함된 CREDENTIALS와 함께 사용할 수 없습니다.

KMS\$1KEY\$1ID '*key-id*'  <a name="unload-parameters-kms-key-id"></a>
Amazon S3에서 데이터 파일 암호화에 사용할 AWS Key Management Service(AWS KMS) 키의 키 ID를 지정합니다. 자세한 내용은 [AWS Key Management Service란 무엇입니까?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 참조하세요. KMS\$1KEY\$1ID를 지정하는 경우 [ENCRYPTED](#unload-parameters-encrypted) 파라미터도 지정해야 합니다. KMS\$1KEY\$1ID를 지정하는 경우 CREDENTIALS 파라미터를 사용하여 인증할 수 없습니다. 대신에 [IAM\$1ROLE 파라미터 사용](copy-parameters-authorization.md#copy-iam-role) 또는 [ACCESS\$1KEY\$1ID 및 SECRET\$1ACCESS\$1KEY 파라미터 사용](copy-parameters-authorization.md#copy-access-key-id)를 사용하세요.

bzip2   
조각당 하나 이상의 bzip2 압축 파일로 데이터를 언로드합니다. 각각의 결과 파일에는 `.bz2` 확장명이 추가됩니다.

GZIP   
조각당 하나 이상의 gzip 압축 파일로 데이터를 언로드합니다. 각각의 결과 파일에는 `.gz` 확장명이 추가됩니다.

ZSTD   
조각당 하나 이상의 Zstandard 압축 파일로 데이터를 언로드합니다. 각각의 결과 파일에는 `.zst` 확장명이 추가됩니다.

ADDQUOTES   
Amazon Redshift가 구분 기호 자체를 포함하는 데이터 값을 언로드할 수 있도록 언로드되는 각각의 데이터 필드 주변에 따옴표를 배치합니다. 예를 들어, 구분 기호가 쉼표인 경우 다음 데이터를 성공적으로 언로드하고 다시 로드할 수 있습니다.  

```
 "1","Hello, World" 
```
따옴표를 추가하지 않을 경우 문자열 `Hello, World`는 두 개의 개별 필드로 구문 분석됩니다.  
일부 출력 형식은 ADDQUOTES를 지원하지 않습니다.  
ADDQUOTES를 사용하는 경우 데이터를 다시 로드하면 COPY에 REMOVEQUOTES를 지정해야 합니다.

NULL AS '*null-string*'  
언로드 파일에서 null 값을 나타내는 문자열을 지정합니다. 이 옵션이 사용되는 경우 모든 출력 파일에는 선택한 데이터에서 발견되는 null 값의 자리에 지정된 문자열이 있습니다. 이 옵션을 지정하지 않으면 null 값이 다음으로 언로드됩니다.  
+ 구분 기호로 분리된 출력에 대해 제로 길이의 문자열 
+ 고정 너비 출력을 위한 공백 문자열
Null 문자열이 고정 폭의 언로드에 대해 지정되어 있고 출력 열의 폭이 null 문자열의 폭보다 작은 경우 다음 동작이 이루어집니다.  
+ 비문자 열의 경우 빈 필드가 출력됨 
+ 문자 열의 경우 오류가 보고됨 
사용자 정의 문자열이 null 값을 나타내는 다른 데이터 형식과 달리 Amazon Redshift는 JSON 형식을 사용하여 SUPER 데이터 열을 내보내고 JSON 형식에 따라 null로 나타냅니다. 결과적으로 SUPER 데이터 열은 UNLOAD 명령에 사용된 NULL [AS] 옵션을 무시합니다.

ESCAPE   
구분 기호로 분리된 언로드 파일에 있는 CHAR 및 VARCHAR 열의 경우, 다음 문자가 나올 때마다 그 앞에 이스케이프 문자(`\`)가 배치됩니다.  
+ 라인 피드: `\n`
+ 캐리지 리턴: `\r`
+ 언로드된 데이터에 대해 지정되는 구분 기호 문자.
+ 이스케이프 문자: `\`
+ 따옴표: `"` 또는 `'`(UNLOAD 명령에 ESCAPE와 ADDQUOTES가 모두 지정된 경우).
COPY 문에 ESCAPE 옵션을 사용해 데이터를 로드한 경우에는 UNLOAD 명령에서도 ESCAPE 옵션을 지정하여 역수 출력 파일을 생성해야 합니다. 마찬가지로 ESCAPE 옵션을 사용해 UNLOAD 작업을 하는 경우에도 동일한 데이터에 대해 COPY 작업을 하면서 ESCAPE 파라미터를 사용해야 합니다.

ALLOWOVERWRITE   <a name="allowoverwrite"></a>
기본적으로, UNLOAD는 덮어쓸 가능성이 있는 파일을 찾을 경우에 실패합니다. ALLOWOVERWRITE가 지정된 경우 UNLOAD는 매니페스트 파일을 포함한 기존 파일을 덮어씁니다.

CLEANPATH  <a name="cleanpath"></a>
CLEANPATH 옵션은 지정된 위치로 파일을 언로드하기 전에 TO 절에 지정된 Amazon S3 경로에 있는 기존 파일을 제거합니다.  
PARTITION BY 절을 포함하면 UNLOAD 작업으로 생성된 새 파일을 수신하기 위해 파티션 폴더에서만 기존 파일이 제거됩니다.  
Amazon S3 버킷에 대해 `s3:DeleteObject` 권한이 있어야 합니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3의 정책 및 권한](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html)을 참조하세요. CLEANPATH 옵션을 사용하여 제거한 파일은 영구적으로 삭제되며 복구할 수 없습니다. 대상 Amazon S3 버킷에 버전 관리가 활성화되어 있는 경우 CLEANPATH 옵션을 사용하여 UNLOAD 작업을 수행해도 파일의 이전 버전은 제거되지 않습니다.  
ALLOWOVERWRITE 옵션을 지정하면 CLEANPATH 옵션을 지정할 수 없습니다.

PARALLEL   <a name="unload-parallel"></a>
기본적으로 UNLOAD는 클러스터의 조각 수에 따라 다수의 파일에 병렬 방식으로 데이터를 작성합니다. 기본 옵션은 ON 또는 TRUE입니다. PARALLEL이 OFF 또는 FALSE인 경우 UNLOAD는 하나 이상의 데이터 파일에 직렬 방식으로 작성하여 절대적으로 ORDER BY 절(사용하는 경우)에 따라 정렬됩니다. 데이터 파일의 최대 크기는 6.2GB입니다. 예를 들어, 13.4GB의 데이터를 언로드하는 경우 UNLOAD는 다음 3개의 파일을 생성합니다.  

```
s3://amzn-s3-demo-bucket/key000    6.2 GB
s3://amzn-s3-demo-bucket/key001    6.2 GB
s3://amzn-s3-demo-bucket/key002    1.0 GB
```
UNLOAD 명령은 병렬 처리를 사용하도록 설계되었습니다. 따라서 대부분의 경우 특히, COPY 명령을 사용하여 테이블을 로드하는 데 파일이 사용되는 경우 PARALLEL을 활성화하는 것이 좋습니다.

MAXFILESIZE [AS] max-size [ MB \$1 GB ]   <a name="unload-maxfilesize"></a>
UNLOAD가 Amazon S3에서 생성하는 파일의 최대 크기를 지정합니다. 5MB와 6.2GB 사이에서 소수 값을 지정하세요. AS 키워드는 옵션입니다. 기본 단위는 MB입니다. MAXFILESIZE를 지정하지 않을 경우 최대 파일 크기의 기본값은 6.2GB입니다. 이 값을 지정하더라도 매니페스트 파일의 크기는 MAXFILESIZE의 영향을 받지 않습니다.

ROWGROUPSIZE [AS] size [ MB \$1 GB ]   <a name="unload-rowgroupsize"></a>
행 그룹의 크기를 지정합니다. 더 큰 크기를 선택하면 행 그룹 수를 줄여 네트워크 통신량을 줄일 수 있습니다. 32\$1128MB의 정수 값을 지정합니다. AS 키워드는 옵션입니다. 기본 단위는 MB입니다.  
ROWGROUPSIZE가 지정되지 않은 경우 기본 크기는 32MB입니다. 이 파라미터를 사용하려면 스토리지 형식이 Parquet이어야 하고 노드 유형은 ra3.4xlarge, ra3.16xlarge 또는 dc2.8xlarge여야 합니다.

REGION [AS] '*aws-region*'  <a name="unload-region"></a>
대상 Amazon S3 버킷이 위치한 AWS 리전을 지정합니다. Amazon Redshift 데이터베이스와 동일한 AWS 리전에 있지 않은 Amazon S3 버킷에 대한 UNLOAD의 경우 REGION이 필요합니다.  
*aws\$1region*의 값은 *AWS 일반 참조*의 [Amazon Redshift 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) 표에 나와 있는 AWS 리전과 일치해야 합니다.  
기본적으로 UNLOAD는 대상 Amazon S3 버킷이 Amazon Redshift 데이터베이스와 동일한 AWS 리전에 있다고 가정합니다.

EXTENSION '*extension-name*'  <a name="unload-extension"></a>
언로드된 파일의 이름에 추가할 파일 확장자를 지정합니다. Amazon Redshift는 검증을 실행하지 않으므로, 지정된 파일 확장자가 올바른지 직접 확인해야 합니다. 확장자를 제공하지 않고 압축 방법을 지정하면 Amazon Redshift는 파일 이름에 압축 방법의 확장자만 추가합니다. 확장자를 제공하지 않고 압축 방법을 지정하지 않으면 Amazon Redshift는 파일 이름에 아무 것도 추가하지 않습니다.

## 사용 노트
<a name="unload-usage-notes"></a>

### 구분 기호로 분리된 모든 텍스트 UNLOAD 작업을 위해 ESCAPE 사용
<a name="unload-usage-escape"></a>

구분 기호를 사용하여 UNLOAD하는 경우 데이터에는 ESCAPE 옵션 설명에 나와 있는 모든 문자 또는 구분 기호가 포함될 수 있습니다. 이 경우 UNLOAD 문과 함께 ESCAPE 옵션을 사용해야 합니다. UNLOAD와 함께 ESCAPE 옵션을 사용하지 않을 경우 언로드된 데이터를 사용하는 이후의 COPY 작업이 실패할 수 있습니다.

**중요**  
ESCAPE는 UNLOAD 및 COPY 문 둘 다와 함께 사용하는 것이 좋습니다. 데이터가 구분 기호 또는 이스케이프될 필요가 있을 수 있는 다른 문자를 포함하고 있지 않은 경우는 예외입니다.

### 부동 소수점 정밀도의 상실
<a name="unload-usage-floating-point-precision"></a>

연속으로 언로드되었다가 다시 로드되는 부동 소수점 데이터의 정밀도가 상실되는 경우가 발생할 수 있습니다.

### Limit 절
<a name="unload-usage-limit-clause"></a>

SELECT 쿼리는 외부 SELECT에 LIMIT 절을 사용할 수 없습니다. 예를 들어, 다음 UNLOAD 문은 실패합니다.

```
unload ('select * from venue limit 10')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

대신, 다음 예와 같이 중첩된 LIMIT 절을 사용하세요.

```
unload ('select * from venue where venueid in
(select venueid from venue order by venueid desc limit 10)')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

또는 LIMIT 절을 사용하는 SELECT…INTO 또는 CREATE TABLE AS를 사용하여 테이블을 채운 다음 그 테이블에서 언로드할 수 있습니다.

### GEOMETRY 데이터 형식의 열 언로드
<a name="unload-usage-geometry"></a>

GEOMETRY 열은 텍스트 또는 CSV 형식으로만 언로드할 수 있습니다. `FIXEDWIDTH` 옵션을 사용하여 GEOMETRY 데이터를 언로드할 수는 없습니다. 데이터는 EWKB(Extended Well-Known Binary) 형식의 16진수로 언로드됩니다. EWKB 데이터의 크기가 4MB를 초과하면 나중에 데이터를 테이블에 로드할 수 없으므로 경고가 발생합니다.

### HLLSKETCH 데이터 형식 언로드
<a name="unload-usage-hll"></a>

HLLSKETCH 열을 텍스트 또는 CSV 형식으로만 온로드할 수 있습니다. `FIXEDWIDTH` 옵션을 사용하여 HLLSKETCH 데이터를 언로드할 수는 없습니다. 데이터는 고밀도 HyperLogLog 스케치의 경우 Base64 형식으로, 희소 HyperLogLog 스케치의 경우 JSON 형식으로 언로드됩니다. 자세한 내용은 [HyperLogLog 함수](hyperloglog-functions.md) 섹션을 참조하세요.

다음 예에서는 HLLSKETCH 열이 포함된 테이블을 파일로 내보냅니다.

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

UNLOAD ('select * from hll_table') TO 's3://amzn-s3-demo-bucket/unload/'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' ALLOWOVERWRITE CSV;
```

### VARBYTE 데이터 유형의 열 언로드
<a name="unload-usage-varbyte"></a>

VARBYTE 열은 텍스트 또는 CSV 형식으로만 언로드할 수 있습니다. 데이터는 16진수 형식으로 언로드됩니다. `FIXEDWIDTH` 옵션을 사용하여 VARBYTE 데이터를 언로드할 수는 없습니다. CSV로 UNLOAD의 `ADDQUOTES` 옵션은 지원되지 않습니다. VARBYTE 열은 PARTITIONED BY 열이 될 수 없습니다.

### FORMAT AS PARQUET 절
<a name="unload-parquet-usage"></a>

FORMAT AS PARQUET을 사용할 경우 다음을 고려하세요.
+ Parquet에 언로드할 때 파일 수준 압축을 사용하지 않습니다. 각 행 그룹이 SNAPPY로 압축됩니다.
+ MAXFILESIZE를 지정하지 않을 경우 최대 파일 크기의 기본값은 6.2GB입니다. MAXFILESIZE를 사용하여 파일 크기를 5MB–6.2GB로 지정할 수 있습니다. 파일을 쓸 때 실제 파일 크기는 근사값이므로 지정한 숫자와 정확히 같지 않을 수 있습니다.

  스캔 성능을 최대화하기 위해에서 Amazon Redshift는 크기가 32MB로 동일한 행 그룹을 포함하는 Parquet 파일을 생성하려고 합니다. 지정한 MAXFLESZEE 값은 32MB의 가장 가까운 배수로 자동으로 내림됩니다. 예를 들어 MAXFILESIZE 200 MB를 지정한 경우 언로드되는 각 Parquet 파일은 약 192MB(32MB 행 그룹 x 6 = 192MB)입니다.
+ 열에서 TIMESTAMPTZ 데이터 형식을 사용하는 경우 타임스탬프 값만 언로드됩니다. 시간대 정보는 언로드되지 않습니다.
+ 밑줄(\$1) 또는 마침표(.) 문자로 시작하는 파일 이름 접두사를 지정하지 마세요. Redshift Spectrum에서는 이러한 문자로 시작하는 파일을 숨김 파일로 간주하고 무시합니다.

### PARTITION BY 절
<a name="unload-partitionby-usage"></a>

PARTITION BY를 사용할 경우 다음을 고려하세요.
+ 파티션 열은 출력 파일에 포함되지 않습니다.
+ UNLOAD 문에 사용되는 SELECT 쿼리에 파티션 열을 포함해야 합니다. UNLOAD 명령에서 원하는 수의 파티션 열을 지정할 수 있습니다. 하지만 파일의 일부가 될 파티션이 아닌 열이 하나 이상 있어야 한다는 제한이 있습니다.
+ 파티션 키 값이 null이면 Amazon Redshift에서 해당 데이터를 `partition_column=__HIVE_DEFAULT_PARTITION__`이라는 기본 파티션으로 자동으로 언로드합니다.
+ UNLOAD 명령은 외부 카탈로그를 호출하지 않습니다. 새 파티션을 기존 외부 테이블의 일부로 등록하려면 별도의 ALTER TABLE ... ADD PARTITION ... 명령을 사용합니다. 또는 CREATE EXTERNAL TABLE 명령을 실행하여 언로드된 데이터를 새 외부 테이블로 등록할 수 있습니다. AWS Glue 크롤러를 사용하여 Data Catalog를 채울 수도 있습니다. 자세한 내용은 *AWS Glue Developer Guide*의 [Defining Crawlers](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) 섹션을 참조하세요.
+ MANIFEST 옵션을 사용하는 경우 Amazon Redshift는 루트 Amazon S3 폴더에 매니페스트 파일을 하나만 생성합니다.
+ 파티션 키로 사용할 수 있는 열 데이터 형식은 SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, BOOLEAN, CHAR, VARCHAR, DATE 및 TIMESTAMP입니다.

### ASSUMEROLE 권한을 사용하여 UNLOAD 작업에 대한 IAM 역할에 대한 액세스 권한 부여
<a name="unload-assumerole-privilege-usage"></a>

UNLOAD 작업을 위해 IAM 역할에 대한 액세스 권한을 특정 사용자 및 그룹에 제공하려면 슈퍼 사용자는 IAM 역할에 대한 ASSUMEROLE 권한을 사용자 및 그룹에 부여할 수 있습니다. 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

### UNLOAD는 Amazon S3 액세스 포인트 별칭을 지원하지 않습니다.
<a name="unload-usage-s3-access-point-alias"></a>

UNLOAD 명령에는 Amazon S3 액세스 포인트 별칭을 사용할 수 없습니다.

## 예제
<a name="r_UNLOAD-examples"></a>

UNLOAD 명령을 사용하는 방법을 보여주는 예제는 [UNLOAD 예](r_UNLOAD_command_examples.md) 섹션을 참조하세요.

# UNLOAD 예
<a name="r_UNLOAD_command_examples"></a>

이 예제에서는 UNLOAD 명령의 다양한 파라미터를 보여줍니다. 많은 예제에서 TICKIT 샘플 데이터가 사용됩니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

**참고**  
여기에서 설명하는 예는 가독성을 위해 줄 바꿈이 포함되었습니다. 실제 *credentials-args* 문자열에서는 줄 바꿈이나 공백을 입력하지 마세요.

## 파이프(기본 구분 기호)로 구분된 파일로 VENUE 언로드
<a name="unload-examples-venue"></a>

다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/`에 데이터를 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

기본적으로, UNLOAD는 조각당 하나 이상의 파일을 작성합니다. 노드당 2개의 조각이 있는 2노드 클러스터를 가정할 때, 이전의 예에서는 다음 파일이 `amzn-s3-demo-bucket`에 생성됩니다.

```
unload/0000_part_00
unload/0001_part_00
unload/0002_part_00
unload/0003_part_00
```

출력 파일을 더 효과적으로 구분하려면 해당 위치에 접두사를 포함하면 됩니다. 다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/venue_pipe_`에 데이터를 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

그 결과, `unload` 폴더에 다음 4개의 파일이 있으며, 이때도 4개의 조각이 있는 것으로 가정합니다.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## 분할된 Parquet 파일에 LINEITE 테이블 언로드
<a name="unload-examples-partitioned-parquet"></a>

다음 예에서는 LINEITEM 테이블을 `l_shipdate` 열로 분할하여 Parquet 형식으로 언로드합니다.

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate);
```

네 개의 조각을 가정할 때 결과 Parquet 파일은 다양한 폴더에 동적으로 분할됩니다.

```
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-02/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-03/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-04/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
...
```

**참고**  
경우에 따라 UNLOAD 명령에서 다음 SQL 문과 같이 INCLUDE 옵션을 사용했습니다.  

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate) INCLUDE;
```
이러한 경우 `l_shipdate` 열은 Parquet 파일의 데이터에도 있습니다. 그렇지 않은 경우 `l_shipdate` 열 데이터가 Parquet 파일에 없습니다.

## JSON 파일로 VENUE 테이블 언로드
<a name="unload-examples-json"></a>

다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/`에 JSON 형식의 데이터를 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON;
```

다음은 VENUE 테이블의 샘플 행입니다.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

JSON으로 언로드한 후 파일의 형식은 다음과 유사합니다.

```
{"venueid":1,"venuename":"Pinewood Racetrack","venuecity":"Akron","venuestate":"OH","venueseats":0}
{"venueid":2,"venuename":"Columbus \"Crew\" Stadium ","venuecity":"Columbus","venuestate":"OH","venueseats":0}
{"venueid":4,"venuename":"Community, Ballpark, Arena","venuecity":"Kansas City","venuestate":"KS","venueseats":0}
```

## CSV 파일로 VENUE 언로드
<a name="unload-examples-csv"></a>

다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/`에 CSV 형식의 데이터를 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV;
```

VENUE 테이블에 다음 행이 포함되어 있다고 가정합니다.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

언로드 파일은 다음과 유사합니다.

```
1,Pinewood Racetrack,Akron,OH,0
2,"Columbus ""Crew"" Stadium",Columbus,OH,0
4,"Community, Ballpark, Arena",Kansas City,KS,0
```

## 구분 기호를 사용하여 CSV 파일로 VENUE 언로드
<a name="unload-examples-csv-delimiter"></a>

다음 예제에서는 VENUE 테이블을 언로드하고 파이프 문자(\$1)를 구분 기호로 사용하여 데이터를 CSV 형식으로 씁니다. 언로드된 파일이 `s3://amzn-s3-demo-bucket/unload/`에 기록됩니다. 이 예제의 VENUE 테이블에는 첫 번째 행의 값에 파이프 문자가 포함되어 있습니다(`Pinewood Race|track`). 이는 결과의 값이 큰따옴표로 묶여 있음을 보여 줍니다. 큰따옴표는 큰따옴표로 이스케이프되고 전체 필드는 큰따옴표로 묶여 있습니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV DELIMITER AS '|';
```

VENUE 테이블에 다음 행이 포함되어 있다고 가정합니다.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-------------
      1 | Pinewood Race|track        | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

언로드 파일은 다음과 유사합니다.

```
1|"Pinewood Race|track"|Akron|OH|0
2|"Columbus ""Crew"" Stadium"|Columbus|OH|0
4|Community, Ballpark, Arena|Kansas City|KS|0
```

## 매니페스트 파일로 VENUE 언로드
<a name="unload-examples-manifest"></a>

매니페스트 파일을 생성하려면 MANIFEST 옵션을 포함하세요. 다음 예에서는 VENUE 테이블을 언로드하고 데이터 파일과 함께 매니페스트 파일을 s3://amzn-s3-demo-bucket/venue\$1pipe\$1에 씁니다.

**중요**  
MANIFEST 옵션으로 파일을 언로드하는 경우 파일을 로드할 때 COPY 명령과 함께 MANIFEST 옵션을 사용해야 합니다. 같은 접두사를 사용하여 파일을 로드하고 MANIFEST 옵션을 지정하지 않는 경우 COPY 작업에서는 매니페스트 파일이 데이터 파일이라 가정하므로 COPY가 실패하게 됩니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

그 결과는 다음과 같은 5개의 파일입니다.

```
s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00
s3://amzn-s3-demo-bucket/venue_pipe_manifest
```

다음은 매니페스트 파일 내용을 나타낸 것입니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"}
  ]
}
```

## MANIFEST VERBOSE를 사용해 VENUE 언로드
<a name="unload-examples-manifest-verbose"></a>

MANIFEST VERBOSE 옵션을 지정하면 매니페스트 파일에는 다음 섹션이 포함됩니다.
+ `entries` 섹션에는 Amazon S3 경로, 파일 크기 및 각 파일에 대한 행 수가 나열됩니다.
+ `schema` 섹션에는 열 이름, 데이터 유형, 및 각 열에 대한 차원이 나열됩니다.
+ `meta` 섹션에는 총 파일 크기 및 모든 파일의 행 수가 표시됩니다.

다음 예에서는 MANIFEST VERBOSE 옵션을 사용하여 VENUE 테이블을 언로드합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload_venue_folder/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest verbose;
```

다음은 매니페스트 파일 내용을 나타낸 것입니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00", "meta": { "content_length": 32295, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00", "meta": { "content_length": 32771, "record_count": 20 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00", "meta": { "content_length": 32302, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00", "meta": { "content_length": 31810, "record_count": 15 }}
  ],
  "schema": {
    "elements": [
      {"name": "venueid", "type": { "base": "integer" }},
      {"name": "venuename", "type": { "base": "character varying", 25 }},
      {"name": "venuecity", "type": { "base": "character varying", 25 }},
      {"name": "venuestate", "type": { "base": "character varying", 25 }},
      {"name": "venueseats", "type": { "base": "character varying", 25 }}
    ]
  },
  "meta": {
    "content_length": 129178,
    "record_count": 55
  },
  "author": {
    "name": "Amazon Redshift",
    "version": "1.0.0"
  }
}
```

## 헤더로 VENUE 언로드
<a name="unload-examples-header"></a>

다음 예에서는 헤더 행으로 VENUE를 언로드합니다.

```
unload ('select * from venue where venueseats > 75000')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;
```

다음은 헤더 행을 포함하는 출력 파일 내용을 보여 줍니다.

```
venueid|venuename|venuecity|venuestate|venueseats
6|New York Giants Stadium|East Rutherford|NJ|80242
78|INVESCO Field|Denver|CO|76125
83|FedExField|Landover|MD|91704
79|Arrowhead Stadium|Kansas City|MO|79451
```

## 더 작은 크기의 파일로 VENUE 언로드
<a name="unload-examples-maxfilesize"></a>

최대 파일 크기의 기본값은 6.2GB입니다. 언로드 데이터가 6.2GB보다 큰 경우 UNLOAD는 각각의 6.2GB 데이터 세그먼트에 대한 새 파일을 생성합니다. 더 작은 크기의 파일을 생성하려면 MAXFILESIZE 파라미터를 추가하세요. 이전 예에서 데이터 크기가 20GB라고 가정했을 때 다음 UNLOAD 명령은 각각 1GB씩 20개의 파일을 생성합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
maxfilesize 1 gb;
```

## VENUE의 연속 언로드
<a name="unload-examples-serial"></a>

연속으로 언로드하려면 PARALLEL OFF를 지정하세요. 그러면 UNLOAD가 한 번에 한 개의 파일을 쓰는데, 파일당 최대 6.2GB의 데이터를 씁니다.

다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/`에 데이터를 연속으로 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off;
```

그 결과 venue\$1serial\$1000이라는 파일이 한 개 생성됩니다.

언로드 데이터가 6.2GB보다 큰 경우 UNLOAD는 각각의 6.2GB 데이터 세그먼트에 대한 새 파일을 생성합니다. 다음 예에서는 LINEORDER 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/unload/`에 데이터를 연속으로 씁니다.

```
unload ('select * from lineorder')
to 's3://amzn-s3-demo-bucket/unload/lineorder_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off gzip;
```

그 결과는 다음과 같은 일련의 파일입니다.

```
lineorder_serial_0000.gz
lineorder_serial_0001.gz
lineorder_serial_0002.gz
lineorder_serial_0003.gz
```

출력 파일을 더 효과적으로 구분하려면 해당 위치에 접두사를 포함하면 됩니다. 다음 예에서는 VENUE 테이블을 언로드하고 `s3://amzn-s3-demo-bucket/venue_pipe_`에 데이터를 씁니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

그 결과, `unload` 폴더에 다음 4개의 파일이 있으며, 이때도 4개의 조각이 있는 것으로 가정합니다.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## 언로드 파일에서 VENUE 로드
<a name="unload-examples-load"></a>

언로드 파일 집합에서 테이블을 로드하려면 COPY 명령을 사용하여 단순히 절차를 거꾸로 진행하세요. 다음 예에서는 새 테이블인 LOADVENUE를 생성하고 이전 예에서 생성된 데이터 파일에서 테이블을 로드합니다.

```
create table loadvenue (like venue);

copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

MANIFEST 옵션을 사용하여 언로드 파일로 매니페스트 파일을 생성한 경우 동일한 매니페스트 파일을 사용하여 데이터를 로드할 수 있습니다. MANIFEST 옵션과 함께 COPY 명령을 사용하면 이렇게 할 수 있습니다. 다음 예에서는 매니페스트 파일을 사용하여 데이터를 로드합니다.

```
copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

## 암호화된 파일로 VENUE 언로드
<a name="unload-examples-unload-encrypted"></a>

다음 예에서는 AWS KMS 키를 사용하여 암호화된 파일 집합으로 VENUE 테이블을 언로드합니다. ENCRYPTED 옵션으로 매니페스트 파일을 지정하는 경우 매니페스트 파일도 암호화됩니다. 자세한 내용은 [암호화된 데이터 파일 언로드](t_unloading_encrypted_files.md) 섹션을 참조하세요.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_kms'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
kms_key_id '1234abcd-12ab-34cd-56ef-1234567890ab'
manifest
encrypted;
```

다음 예에서는 루트 대칭 키를 사용하여 암호화된 파일 집합으로 VENUE 테이블을 언로드합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_cmk'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
encrypted;
```

## 암호화된 파일에서 VENUE 로드
<a name="unload-examples-load-encrypted"></a>

ENCRYPT 옵션과 함께 UNLOAD를 사용해 생성한 파일 집합에서 테이블을 로드하려면 COPY 명령을 사용해 이 프로세스를 거꾸로 수행하세요. 이 명령과 함께 ENCRYPTED 옵션을 사용하고 UNLOAD 명령에 사용한 것과 동일한 루트 대치 키를 지정합니다. 다음 예에서는 이전 예에서 생성된 암호화된 데이터 파일에서 LOADVENUE 테이블을 로드합니다.

```
create table loadvenue (like venue);

copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_encrypt_manifest'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
manifest
encrypted;
```

## VENUE 데이터를 탭으로 구분된 파일로 언로드
<a name="unload-examples-venue-tab"></a>

```
unload ('select venueid, venuename, venueseats from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t';
```

출력 데이터 파일의 모습은 다음과 같습니다.

```
1	Toyota Park	Bridgeview	IL	0
2	Columbus Crew Stadium	Columbus	OH	0
3	RFK Stadium	Washington	DC	0
4	CommunityAmerica Ballpark	Kansas City	KS	0
5	Gillette Stadium	Foxborough	MA	68756
...
```

## 고정 폭 데이터 파일로 VENUE 언로드
<a name="unload-venue-fixed-width"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_fw_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth as 'venueid:3,venuename:39,venuecity:16,venuestate:2,venueseats:6';
```

출력 데이터 파일은 다음과 같을 것입니다.

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
...
```

## 탭으로 구분된 GZIP 압축 파일 집합으로 VENUE 언로드
<a name="unload-examples-venue-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t'
gzip;
```

## VENUE를 GZIP 압축 텍스트 파일로 언로드
<a name="unload-examples-venue-extension-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
extension 'txt.gz'
gzip;
```

## 구분 기호를 포함한 데이터 언로드
<a name="unload-examples-delimiter"></a>

다음 예에서는 ADDQUOTES 옵션을 사용하여 실제 데이터 필드 중 일부에 쉼표가 있는, 쉼표로 구분된 데이터를 언로드합니다.

먼저, 따옴표가 포함되어 있는 테이블을 만듭니다.

```
create table location (id int, location char(64));

insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
```

그런 다음, ADDQUOTES 옵션을 사용하여 데이터를 언로드합니다.

```
unload ('select id, location from location')
to 's3://amzn-s3-demo-bucket/location_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',' addquotes;
```

언로드된 데이터 파일의 모습은 다음과 같습니다.

```
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
```

## 조인 쿼리의 결과 언로드
<a name="unload-examples-join"></a>

다음 예에서는 창 함수를 포함하는 조인 쿼리의 결과를 언로드합니다.

```
unload ('select venuecity, venuestate, caldate, pricepaid,
sum(pricepaid) over(partition by venuecity, venuestate
order by caldate rows between 3 preceding and 3 following) as winsum
from sales join date on sales.dateid=date.dateid
join event on event.eventid=sales.eventid
join venue on event.venueid=venue.venueid
order by 1,2')
to 's3://amzn-s3-demo-bucket/tickit/winsum'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

출력 파일의 모습은 다음과 같습니다.

```
Atlanta|GA|2008-01-04|363.00|1362.00
Atlanta|GA|2008-01-05|233.00|2030.00
Atlanta|GA|2008-01-06|310.00|3135.00
Atlanta|GA|2008-01-08|166.00|8338.00
Atlanta|GA|2008-01-11|268.00|7630.00
...
```

## NULL AS를 사용한 언로드
<a name="unload-examples-null-as"></a>

UNLOAD는 기본적으로 null 값을 빈 문자열로 출력합니다. 다음 예에서는 NULL AS를 사용하여 null에 대한 텍스트 문자열을 대체하는 방법을 보여 줍니다.

이들 예에서는 VENUE 테이블에 null 값을 추가할 것입니다.

```
update venue set venuestate = NULL
where venuecity = 'Cleveland';
```

열에 NULL이 포함되어 있음을 확인하기 위해 VENUESTATE가 null인 VENUE에서 선택합니다.

```
select * from venue where venuestate is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
```

이제, NULL AS 옵션을 사용해 VENUE 테이블을 UNLOAD하여 null 값을 문자열 '`fred`'로 바꿉니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

언로드 파일에서 다음 샘플은 null 값이 `fred`로 바뀌었음을 보여줍니다. VENUESEATS의 일부 값 역시 null이고 `fred`로 바뀐 것으로 나타납니다. VENUESEATS의 데이터 형식이 정수형이지만 UNLOAD가 언로드 파일에서 값을 텍스트로 변환한 다음, COPY가 이를 다시 정수로 변환합니다. 고정 폭 파일로 언로드하는 경우 NULL AS 문자열이 필드 폭보다 크면 안 됩니다.

```
248|Charles Playhouse|Boston|MA|0
251|Paris Hotel|Las Vegas|NV|fred
258|Tropicana Hotel|Las Vegas|NV|fred
300|Kennedy Center Opera House|Washington|DC|0
306|Lyric Opera House|Baltimore|MD|0
308|Metropolitan Opera|New York City|NY|0
  5|Gillette Stadium|Foxborough|MA|5
 22|Quicken Loans Arena|Cleveland|fred|0
101|Progressive Field|Cleveland|fred|43345
...
```

언로드 파일에서 테이블을 로드하려면 동일한 NULL AS 옵션과 함께 COPY 명령을 사용하세요.

**참고**  
NULL을 NOT NULL로 정의된 열에 로드하려고 하면 COPY 명령이 실패합니다.

```
create table loadvenuenulls (like venue);

copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

열에 빈 문자열뿐 아니라 null이 포함되어 있는지 확인하려면 LOADVENUENULLS에서 선택하고 null이 있는지 필터링하세요.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |

...
```

기본 NULL AS 동작을 사용하여 null이 포함된 테이블을 UNLOAD한 다음 기본 NULL AS 동작을 사용하여 데이터를 테이블로 다시 COPY할 수 있습니다. 하지만 대상 테이블에서 숫자가 아닌 필드는 전부 null이 아니라 빈 문자열을 포함하게 됩니다. 기본적으로 UNLOAD는 null을 빈 문자열(공백 또는 제로 길이)로 변환합니다. COPY는 숫자 열에 대해 빈 문자열을 NULL로 변환하지만, 빈 문자열을 숫자가 아닌 열에 삽입합니다. 다음 예에서는 기본 NULL AS 동작을 사용하여 UNLOAD와 COPY를 차례대로 수행하는 방법을 보여줍니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

이 경우에는 null을 필터링할 때 VENUESEATS가 null을 포함했던 행만 선택됩니다. 테이블(VENUE)에서 VENUESTATE가 null을 포함한 경우 대상 테이블(LOADVENUENULLS)의 VENUESTATE는 빈 문자열을 포함합니다.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
     251 | Paris Hotel              | Las Vegas | NV         |
...
```

빈 문자열을 NULL로서 숫자가 아닌 열에 로드하려면 EMPTYASNULL 또는 BLANKSASNULL 옵션을 포함하세요. 둘 다 사용해도 괜찮습니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' EMPTYASNULL;
```

열에 공백이나 빈 문자열뿐 아니라 NULL이 포함되어 있는지 확인하려면 LOADVENUENULLS에서 선택하고 null이 있는지 필터링합니다.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |
     ...
```

## ALLOWOVERWRITE 파라미터를 사용한 언로드
<a name="unload-examples-allowoverwrite"></a>

기본적으로 UNLOAD는 대상 버킷의 기존 파일을 덮어쓰지 않습니다. 예를 들어 대상 버킷에서 파일을 수정하지 않고 같은 UNLOAD 문을 두 번 실행하는 경우 두 번째 UNLOAD는 실패하게 됩니다. 매니페스트 파일을 포함하여 기존 파일을 덮어쓰려면 ALLOWOVERWRITE 옵션을 지정합니다.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest allowoverwrite;
```

## PARALLEL 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
<a name="unload-examples-manifest-parallel"></a>

테이블을 병렬로 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 `0000_part_00` 패턴이 접미사로 붙습니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 `manifest` 텍스트가 접미사로 붙습니다. 다음 SQL은 EVENT 테이블을 언로드하고 기본 이름 `parallel`로 파일을 생성합니다.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/parallel'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel on
manifest;
```

Amazon S3 파일 목록은 다음과 유사합니다.

```
 Name                       Last modified                        Size                  
 parallel0000_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB  
 parallel0001_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0002_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB
 parallel0003_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 51.1 KB
 parallel0004_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.6 KB
 parallel0005_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0006_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.1 KB
 parallel0007_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 55.9 KB
 parallelmanifest       -   August 2, 2023, 14:54:39 (UTC-07:00) 886.0 B
```

`parallelmanifest` 파일 콘텐츠는 다음과 유사합니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/parallel0000_part_00", "meta": { "content_length": 53316 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0001_part_00", "meta": { "content_length": 54704 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0002_part_00", "meta": { "content_length": 53326 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0003_part_00", "meta": { "content_length": 52356 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0004_part_00", "meta": { "content_length": 55933 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0005_part_00", "meta": { "content_length": 54648 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0006_part_00", "meta": { "content_length": 55436 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0007_part_00", "meta": { "content_length": 57272 }}
  ]
}
```

## PARALLEL OFF 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
<a name="unload-examples-manifest-serial"></a>

테이블을 연속적으로 언로드하고(PARALLEL OFF) 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 `0000` 패턴이 접미사로 붙습니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 `manifest` 텍스트가 접미사로 붙습니다.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/serial'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel off
manifest;
```

Amazon S3 파일 목록은 다음과 유사합니다.

```
 Name                       Last modified                        Size                  
 serial0000             -   August 2, 2023, 15:54:39 (UTC-07:00) 426.7 KB  
 serialmanifest         -   August 2, 2023, 15:54:39 (UTC-07:00) 120.0 B
```

`serialmanifest` 파일 콘텐츠는 다음과 유사합니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
  ]
}
```

## PARTITION BY 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
<a name="unload-examples-manifest-partition"></a>

파티션별로 테이블을 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3에 하위 파티션 폴더가 있는 새 폴더가 생성되고 하위 폴더의 데이터 파일은 `0000_par_00`과 유사한 이름 패턴을 갖습니다. 매니페스트 파일은 하위 폴더와 동일한 폴더 레벨에 있으며 이름은 `manifest`입니다.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/partition'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
partition by (eventname)
manifest;
```

Amazon S3 파일 목록은 다음과 유사합니다.

```
 Name                   Type     Last modified                        Size                  
 partition           	Folder
```

`partition` 폴더에는 파티션 이름을 가진 하위 폴더와 매니페스트 파일이 있습니다. `partition` 폴더의 폴더 목록 하단 부분은 다음과 유사합니다.

```
 Name                   Type      Last modified                        Size                  
 ...
 eventname=Zucchero/    Folder 
 eventname=Zumanity/    Folder 
 eventname=ZZ Top/      Folder  
 manifest          	    -	    August 2, 2023, 15:54:39 (UTC-07:00) 467.6 KB
```

`eventname=Zucchero/` 폴더에는 다음과 유사한 데이터 파일이 있습니다.

```
 Name               Last modified                        Size                  
 0000_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 70.0 B
 0001_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 106.0 B
 0002_part_00	-   August 2, 2023, 15:59:15 (UTC-07:00) 70.0 B
 0004_part_00	-   August 2, 2023, 15:59:17 (UTC-07:00) 141.0 B
 0006_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 35.0 B
 0007_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 108.0 B
```

`manifest` 파일 콘텐츠의 하단은 다음과 유사합니다.

```
{
  "entries": [
    ...
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zucchero/007_part_00", "meta": { "content_length": 108 }},
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zumanity/007_part_00", "meta": { "content_length": 72 }}
  ]
}
```

## MAXFILESIZE, ROWGROUPSIZE 및 MANIFEST 파라미터를 사용하여 EVENT 테이블 언로드
<a name="unload-examples-manifest-maxsize"></a>

테이블을 병렬로 언로드하고 매니페스트 파일을 생성할 수 있습니다. Amazon S3 데이터 파일은 모두 동일한 수준에서 생성되며 이름에 `0000_part_00` 패턴이 접미사로 붙습니다. 생성된 Parquet 데이터 파일은 256MB, 행 그룹 크기는 128MB로 제한됩니다. 매니페스트 파일은 데이터 파일과 동일한 폴더 수준에 있으며 `manifest`가 접미사로 붙습니다.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/eventsize'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
maxfilesize 256 MB
rowgroupsize 128 MB
parallel on
parquet
manifest;
```

Amazon S3 파일 목록은 다음과 유사합니다.

```
 Name                            Type      Last modified                        Size 
 eventsize0000_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.5 KB
 eventsize0001_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0002_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.4 KB
 eventsize0003_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.0 KB
 eventsize0004_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.3 KB
 eventsize0005_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0006_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.0 KB
 eventsize0007_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.6 KB
 eventsizemanifest                 -       August 2, 2023, 17:35:21 (UTC-07:00) 958.0 B
```

`eventsizemanifest` 파일 콘텐츠는 다음과 유사합니다.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/eventsize0000_part_00.parquet", "meta": { "content_length": 25130 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0001_part_00.parquet", "meta": { "content_length": 25428 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0002_part_00.parquet", "meta": { "content_length": 25025 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0003_part_00.parquet", "meta": { "content_length": 24554 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0004_part_00.parquet", "meta": { "content_length": 25918 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0005_part_00.parquet", "meta": { "content_length": 25362 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0006_part_00.parquet", "meta": { "content_length": 25647 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0007_part_00.parquet", "meta": { "content_length": 26256 }}
  ]
}
```

# UPDATE
<a name="r_UPDATE"></a>

**Topics**
+ [구문](#r_UPDATE-synopsis)
+ [파라미터](#r_UPDATE-parameters)
+ [사용 노트](#r_UPDATE_usage_notes)
+ [UPDATE 문 예](c_Examples_of_UPDATE_statements.md)

조건 충족 시 하나 이상의 테이블 열에서 값을 업데이트합니다.

**참고**  
단일 SQL 문의 최대 크기는 16MB입니다.

## 구문
<a name="r_UPDATE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
```

## 파라미터
<a name="r_UPDATE-parameters"></a>

WITH 절  
하나 이상의 *common-table-expressions*를 지정하는 절(옵션)입니다. [WITH 절](r_WITH_clause.md)을(를) 참조하세요.

 *table\$1name*   
임시 또는 영구 테이블입니다. 테이블의 소유자 또는 테이블에 대한 UPDATE 권한을 가진 사용자만이 행을 업데이트할 수 있습니다. FROM 절을 사용하거나 표현식이나 조건에 있는 테이블에서 선택하는 경우 해당 테이블에 대한 SELECT 권한이 있어야 합니다. 여기서 테이블에 별칭을 지정할 수 없지만, FROM 절에서 별칭을 지정할 수 있습니다.  
Amazon Redshift Spectrum 외부 테이블은 읽기 전용입니다. 외부 테이블을 업데이트할 수 없습니다.

별칭  
대상 테이블의 임시 대체 이름입니다. 별칭은 옵션입니다. AS 키워드는 항상 옵션입니다.

SET *column* =   
수정하려는 하나 이상의 열입니다. 나열되지 않는 열은 현재 값을 유지합니다. 대상 열을 지정할 때 테이블 이름을 포함하지 마세요. 예를 들어, `UPDATE tab SET tab.col = 1`은 유효하지 않습니다.

 * expression*   
지정된 열에 대한 새 값을 정의하는 표현식입니다.

DEFAULT   
CREATE TABLE 문의 열에 할당된 기본값으로 열을 업데이트합니다.

FROM *tablelist*   
다른 테이블에 있는 정보를 참조하여 테이블을 업데이트할 수 있습니다. FROM 절에 다른 테이블을 나열하거나 WHERE 조건의 일부로서 하위 쿼리를 사용합니다. FROM 절에 나열된 테이블은 별칭을 가질 수 있습니다. 목록에 UPDATE 문의 대상 테이블을 포함할 필요가 있는 경우에는 별칭을 사용하세요.

WHERE *condition*   
조건과 일치하는 행으로 업데이트를 제한하는 선택적인 절입니다. 이 조건이 `true`를 반환할 때, 지정된 SET 열이 업데이트됩니다. 조건은 열에 대한 간단한 조건자 또는 하위 쿼리의 결과를 바탕으로 하는 조건일 수 있습니다.  
UPDATE를 위한 대상 테이블을 포함하여, 하위 쿼리의 어떤 테이블이든 이름을 지정할 수 있습니다.

## 사용 노트
<a name="r_UPDATE_usage_notes"></a>

테이블에서 많은 수의 행을 업데이트한 후 
+ 테이블을 완전히 비워 스토리지 스페이스를 회수하고 행을 다시 정렬합니다.
+ 테이블을 분석하여 쿼리 플래너에 대한 통계를 업데이트합니다.

왼쪽, 오른쪽 및 전체 외부 조인은 UPDATE 문의 FROM 절에서 지원되지 않고 다음 오류를 반환합니다.

```
ERROR: Target table must be part of an equijoin predicate
```

 외부 조인을 지정해야 할 경우 UPDATE 문의 WHERE 절에 하위 쿼리를 사용하세요.

UPDATE 문이 대상 테이블에 대한 자체 조인을 요구할 경우 조인 조건뿐 아니라 업데이트 작업을 위한 행을 정규화하는 WHERE 절 기준을 지정해야 합니다. 일반적으로, 대상 테이블이 그 자신이나 다른 테이블에 조인될 때의 모범 사례는 업데이트를 위해 행을 정규화하는 기준에서 조인 조건을 분명히 분리하는 하위 쿼리를 사용하는 것입니다.

구성 파라미터 `error_on_nondeterministic_update`가 *true*로 설정된 경우 행당 여러 개의 일치 항목이 있는 UPDATE 쿼리에서 오류가 발생합니다. 자세한 내용은 [error\$1on\$1nondeterministic\$1update](r_error_on_nondeterministic_update.md) 섹션을 참조하세요.

GENERATED BY DEFAULT AS IDENTITY 열을 업데이트할 수 있습니다. GENERATED BY DEFAULT AS IDENTITY로 정의된 열을 직접 입력하는 값으로 업데이트할 수 있습니다. 자세한 내용은 [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause) 섹션을 참조하세요.

# UPDATE 문 예
<a name="c_Examples_of_UPDATE_statements"></a>

다음 예에 사용된 테이블에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

TICKIT 데이터베이스의 CATEGORY 테이블은 다음 행을 포함합니다.

```
+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 5     | Sports   | MLS       | Major League Soccer                        |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 1     | Sports   | MLB       | Major League Baseball                      |
| 6     | Shows    | Musicals  | Musical theatre                            |
| 3     | Sports   | NFL       | National Football League                   |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 2     | Sports   | NHL       | National Hockey League                     |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 4     | Sports   | NBA       | National Basketball Association            |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
+-------+----------+-----------+--------------------------------------------+
```

 **값의 범위를 기반으로 테이블 업데이트** 

CATID 열에 있는 값의 범위를 기반으로 CATGROUP 열을 업데이트합니다.

```
UPDATE category
SET catgroup='Theatre'
WHERE catid BETWEEN 6 AND 8;

SELECT * FROM category
WHERE catid BETWEEN 6 AND 8;

+-------+----------+----------+---------------------------+
| catid | catgroup | catname  |          catdesc          |
+-------+----------+----------+---------------------------+
| 6     | Theatre  | Musicals | Musical theatre           |
| 7     | Theatre  | Plays    | All non-musical theatre   |
| 8     | Theatre  | Opera    | All opera and light opera |
+-------+----------+----------+---------------------------+
```

 **현재 값을 기반으로 테이블 업데이트** 

현재 CATGROUP 값을 기반으로 CATNAME 및 CATDESC 열을 업데이트합니다.

```
UPDATE category
SET catdesc=default, catname='Shows'
WHERE catgroup='Theatre';

SELECT * FROM category
WHERE catname='Shows';

+-------+----------+---------+---------+
| catid | catgroup | catname | catdesc |
+-------+----------+---------+---------+
| 6     | Theatre  | Shows   | NULL    |
| 7     | Theatre  | Shows   | NULL    |
| 8     | Theatre  | Shows   | NULL    |
+-------+----------+---------+---------+)
```

이 경우에는 테이블 생성 시 아무런 기본값도 정의되지 않았으므로 CATDESC 열이 null로 설정되었습니다.

다음 명령을 실행하여 CATEGORY 테이블 데이터를 다시 원래 값으로 설정합니다.

```
TRUNCATE category;

COPY category
FROM 's3://redshift-downloads/tickit/category_pipe.txt' 
DELIMITER '|' 
IGNOREHEADER 1 
REGION 'us-east-1'
IAM_ROLE default;
```

 **WHERE 절 하위 쿼리의 결과를 기반으로 테이블 업데이트** 

WHERE 절에 있는 하위 쿼리의 결과를 기반으로 CATEGORY 테이블을 업데이트합니다.

```
UPDATE category
SET catdesc='Broadway Musical'
WHERE category.catid IN
(SELECT category.catid FROM category
JOIN event ON category.catid = event.catid
JOIN venue ON venue.venueid = event.venueid
JOIN sales ON sales.eventid = event.eventid
WHERE venuecity='New York City' AND catname='Musicals');
```

업데이트되는 테이블을 확인합니다.

```
SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 6     | Shows    | Musicals  | Broadway Musical                           |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
+-------+----------+-----------+--------------------------------------------+
```

 **WITH 절 하위 쿼리의 결과를 기반으로 테이블 업데이트** 

WITH 절을 사용하여 하위 쿼리의 결과를 기반으로 CATEGORY 테이블을 업데이트하려면 다음 예를 사용하세요.

```
WITH u1 as (SELECT catid FROM event ORDER BY catid DESC LIMIT 1) 
UPDATE category SET catid='200' FROM u1 WHERE u1.catid=category.catid;

SELECT * FROM category ORDER BY catid DESC LIMIT 1;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 200   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

## 조인 조건의 결과를 기반으로 테이블 업데이트
<a name="c_Examples_of_UPDATE_statements-updating-a-table-based-on-the-result-of-a-join-condition"></a>

EVENT 테이블에서 일치하는 CATID 행을 기반으로 CATEGORY 테이블에서 원래의 행 11개를 업데이트합니다.

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid;

SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 100   | Concerts | Pop       | All rock and pop music concerts            |
| 100   | Shows    | Plays     | All non-musical theatre                    |
| 100   | Shows    | Opera     | All opera and light opera                  |
| 100   | Shows    | Musicals  | Broadway Musical                           |
+-------+----------+-----------+--------------------------------------------+
```

 EVENT 테이블이 FROM 절에 나열되어 있고 대상 테이블에 대한 조인 조건이 WHERE 절에 정의되어 있습니다. 업데이트 자격이 있는 행은 4개뿐입니다. 이들 4개의 행은 CATID 값이 원래 6, 7, 8 및 9였던 행으로, 해당되는 4개의 범주만 EVENT 테이블에 표시됩니다.

```
SELECT DISTINCT catid FROM event;

+-------+
| catid |
+-------+
| 6     |
| 7     |
| 8     |
| 9     |
+-------+
```

이전 예를 확장하고 WHERE 절에 다른 조건을 추가하여 CATEGORY 테이블에 있는 원래의 행 11개를 업데이트합니다. CATGROUP 열에 대한 제한 때문에, (4개의 행이 조인 자격이 있지만) 업데이트 자격이 있는 행은 1개뿐입니다.

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid
AND catgroup='Concerts';

SELECT * FROM category WHERE catid=100;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 100   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

이 예를 작성하는 또 다른 방법은 다음과 같습니다.

```
UPDATE category SET catid=100
FROM event JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
```

이 접근 방식의 이점은 조인 기준이 행의 업데이트 자격을 부여하는 다른 기준과는 분명히 구분된다는 점입니다. FROM 절에서 CATEGORY 테이블에 CAT라는 별칭을 사용한다는 점에 유의하세요.

## FROM 절에서 외부 조인으로 업데이트
<a name="c_Examples_of_UPDATE_statements-updates-with-outer-joins-in-the-from-clause"></a>

이전 예에서는 UPDATE 문의 FROM 절에 지정된 내부 조인을 보여주었습니다. 다음 예에서는 FROM 절이 대상 테이블에 대한 외부 조인을 지원하지 않으므로 오류를 반환합니다.

```
UPDATE category SET catid=100
FROM event LEFT JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
ERROR:  Target table must be part of an equijoin predicate
```

외부 조인이 UPDATE 문에 필요한 경우 외부 조인 구문을 하위 쿼리로 이동할 수 있습니다.

```
UPDATE category SET catid=100
FROM
(SELECT event.catid FROM event LEFT JOIN category cat ON event.catid=cat.catid) eventcat
WHERE category.catid=eventcat.catid
AND catgroup='Concerts';
```

## SET 절에 있는 다른 테이블의 열로 업데이트
<a name="c_Examples_of_UPDATE_statements-set-with-column-from-another-table"></a>

TICKIT 샘플 데이터베이스의 listing 테이블을 sales 테이블에 있는 값으로 업데이트하려면 다음 예시를 사용합니다.

```
SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 4          |
| 108334 | 24         |
| 117150 | 4          |
| 135915 | 20         |
| 205927 | 6          |
+--------+------------+

UPDATE listing
SET numtickets = sales.sellerid
FROM sales
WHERE sales.sellerid = 1 AND listing.sellerid = sales.sellerid;

SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 1          |
| 108334 | 1          |
| 117150 | 1          |
| 135915 | 1          |
| 205927 | 1          |
+--------+------------+
```

# USE
<a name="r_USE_command"></a>

쿼리가 실행되는 데이터베이스를 변경합니다. SHOW USE는 최근에 USE 명령과 함께 사용된 데이터베이스를 가리킵니다. RESET USE는 사용된 데이터베이스를 재설정합니다. 즉, SQL에서 데이터베이스를 지정하지 않으면 현재 데이터베이스에서 객체가 검색됩니다.

## 구문
<a name="r_USE-synopsis"></a>

```
USE database
```

## 예제
<a name="r_USE_command-examples"></a>

`dev`, `pdb`, `pdb2`라는 세 개의 데이터베이스가 있다고 가정해 보겠습니다. 각 데이터베이스의 퍼블릭 스키마에 두 개의 테이블 `t`가 있습니다. 먼저 다양한 데이터베이스의 테이블에 데이터를 삽입합니다.

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

데이터베이스를 명시적으로 설정하지 않으면 시스템이 연결된 데이터베이스를 사용합니다. 현재 데이터베이스 컨텍스트를 확인합니다.

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

데이터베이스를 지정하지 않고 테이블 `t`를 쿼리하면 시스템이 현재 데이터베이스의 테이블을 사용합니다.

```
dev=# select * from t;
c
----
1
(1 row)
```

`use` 명령을 사용하여 연결을 변경하지 않고 데이터베이스를 전환합니다.

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

스키마를 명시적으로 지정할 수도 있습니다.

```
dev=# select * from public.t;
id
----
2
(1 row)
```

이제 현재 데이터베이스 내에서 다양한 스키마에 테이블을 생성할 수 있습니다.

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

검색 경로는 스키마를 지정하지 않을 때 어떤 스키마의 객체에 액세스하는지를 결정합니다.

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

다양한 테이블에 액세스하도록 스키마 순서를 변경합니다.

```
dev=# set search_path to s1, public;
SET
dev=# show search_path;
 search_path
-------------
 s1, public
(1 row)
dev=# select * from t;
 id
----
  3
(1 row)
```

원래 연결을 유지하면서 다른 데이터베이스로 전환합니다.

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

데이터베이스를 전환하면 검색 경로가 기본값으로 재설정됩니다.

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

테이블을 생성하고 현재 데이터베이스에 데이터를 삽입합니다.

```
dev=# create table pdb2.public.t(id int);
CREATE TABLE
dev=# insert into pdb2.public.t values (4);
INSERT 0 1
dev=# select * from t;
 id
----
  4
(1 row)
```

트랜잭션에서 현재 데이터베이스에 쓰고 3부분 표기법을 사용하여 원하는 데이터베이스에서 읽을 수 있습니다. 여기에는 연결된 데이터베이스도 포함됩니다.

```
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)

dev=# BEGIN;
BEGIN
dev=# select * from t;
 id
----
  4
(1 row)

dev=# insert into t values (5);
INSERT 0 1
dev=# select * from t;
 id
----
  4
  5
(2 rows)

dev=# select * from pdb.public.t;
 id
----
  2
(1 row)

dev=# select * from dev.public.t;
 id
----
  1
(1 row)
```

연결된 데이터베이스로 재설정합니다. 이렇게 하면 이전에 사용한 데이터베이스 `pdb`로 되돌려질 뿐만 아니라 연결된 데이터베이스로 재설정됩니다. 검색 경로도 기본 경로로 변경됩니다.

```
dev=# RESET USE;
RESET
dev=# select * from t;
c
----
1
(1 row)
dev=# show use;
 Use Database
--------------

(1 row)

dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

트랜잭션 시작 시 데이터베이스를 변경할 수 있지만 쿼리를 실행한 후에는 변경할 수 없습니다.

```
dev=# BEGIN;
BEGIN
dev=# use pdb;
USE
dev=# use pdb2;
USE
dev=# use pdb;
USE
dev=# select * from t;
 id
----
  2
(1 row)
dev=# use pdb2;
ERROR:  USEd Database cannot be set or reset inside a transaction after another command.
dev=# rollback;
ROLLBACK
(1 row)
```

### 데이터 카탈로그 예제
<a name="use-redlake-example"></a>

먼저 교차 카탈로그 쿼리를 시연하기 위해 여러 스키마와 카탈로그에 테이블을 생성합니다. 연결된 데이터베이스에서 테이블 만들기로 시작합니다.

```
dev=# CREATE TABLE dev.public.t (col INT);
dev=# INSERT INTO dev.public.t VALUES (1);
dev=# CREATE SCHEMA write_schema;
dev=# CREATE TABLE dev.write_schema.t (state char (2));
dev=# INSERT INTO dev.write_schema.t VALUES ('WA');
```

이제 다른 카탈로그에 유사한 테이블을 생성합니다. 이는 교차 카탈로그 데이터베이스로 작업하는 방법을 보여줍니다.

```
dev=# CREATE TABLE my_db@my_catalog.public.t (col INT);
dev=# INSERT INTO my_db@my_catalog.public.t VALUES (100);
dev=# CREATE SCHEMA my_db@my_catalog.write_schema;
dev=# CREATE TABLE my_db@my_catalog.write_schema.t (state char (2));
dev=# INSERT INTO my_db@my_catalog.write_schema.t VALUES ('CA');
```

현재 데이터베이스 컨텍스트를 확인합니다. 데이터베이스를 명시적으로 설정하지 않으면 시스템이 연결된 데이터베이스를 사용합니다.

```
dev=# SHOW USE;
 Use Database
--------------

(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)

dev=# SELECT * FROM t;
 col
-----
   1
(1 row)
```

다른 카탈로그의 테이블을 쿼리하도록 USEd 데이터베이스를 설정합니다.

```
dev=# USE my_db@my_catalog;

dev=# SHOW USE;
            Use Database
-------------------------------------
 my_db@my_catalog
(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

테이블 t를 쿼리하면 결과가 교차 카탈로그 데이터베이스에서 나옵니다.

```
dev=# SELECT * FROM t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM my_db@my_catalog.public.t;
 col
-----
 100
(1 row)
```

검색 경로를 변경하여 USEd 데이터베이스 내의 다른 스키마에 있는 테이블에 액세스합니다.

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM my_db@my_catalog.write_schema.t;
 state
-------
 CA
(1 row)
```

USE가 교차 카탈로그 데이터베이스로 설정되어 있더라도 원래 데이터베이스를 명시적으로 쿼리할 수 있습니다.

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

연결된 데이터베이스의 객체를 다시 참조하도록 USEd 데이터베이스를 재설정합니다.

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

USE가 재설정되면 search\$1path가 재설정된다는 점에 유의하세요.

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

재설정 후 이제 쿼리는 원래 연결된 데이터베이스를 참조합니다.

```
dev=# SELECT * FROM t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM dev.public.t;
 col
-----
   1
(1 row)
```

원래 데이터베이스의 검색 경로를 수정하여 다른 스키마에 액세스할 수 있습니다.

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

# VACUUM
<a name="r_VACUUM_command"></a>

현재 데이터베이스에서 지정된 테이블이나 모든 테이블의 스페이스를 회수하고 행을 다시 정렬합니다.

**참고**  
필요한 테이블 권한이 있는 사용자만 테이블을 유효하게 정리(vacuum)할 수 있습니다. 필요한 테이블 권한 없이 VACUUM을 실행할 경우 작업은 성공적으로 완료되지만 아무런 효과도 없습니다. VACUUM을 유요하게 실행하기 위한 유효한 테이블 권한 목록은 다음 필수 권한 섹션을 참조하세요.

Amazon Redshift는 백그라운드에서 자동으로 데이터를 정렬하고 VACUUM DELETE를 실행합니다. 이렇게 하면 VACUUM 명령을 실행할 필요성이 줄어듭니다. 자세한 내용은 [테이블 Vacuum](t_Reclaiming_storage_space202.md) 섹션을 참조하세요.

기본적으로 VACUUM은 테이블 행의 95% 이상이 이미 정렬된 테이블에 대해서는 정렬 단계를 건너뜁니다. 정렬 단계를 건너뛰면 VACUUM 성능을 상당히 개선할 수 있습니다. 단일 테이블의 기본 정렬 또는 삭제 임계값을 변경하려면 VACUUM을 실행할 때 테이블 이름과 TO *threshold* PERCENT 파라미터를 포함시킵니다.

테이블이 vacuum되는 동안 사용자는 테이블에 액세스할 수 있습니다. 테이블이 vacuum되는 중에도 쿼리 및 쓰기 작업을 수행할 수 있지만 DML(Data Manipulation Language)과 vacuum이 동시에 실행될 경우 두 작업 모두 시간이 더 걸릴 수 있습니다. vacuum 도중에 UPDATE 및 DELETE 문을 실행하는 경우 시스템 성능이 저하될 수 있습니다. VACUUM DELETE는 업데이트 작업과 삭제 작업을 임시로 차단합니다.

Amazon Redshift는 DELETE ONLY vacuum을 백그라운드로 수행합니다. 사용자가 ALTER TABLE 같은 DDL(Data Definition Language) 작업을 실행할 경우 자동 vacuum 작업은 일시 중지됩니다.

**참고**  
Amazon Redshift VACUUM 명령 구문과 동작은 PostgreSQL VACUUM 작업과는 크게 다릅니다. 예를 들어 Amazon Redshift의 기본 VACUUM 작업은 VACUUM FULL로서, 디스크 스페이스를 회수하고 모든 열을 다시 정렬합니다. 이와는 달리, PostgreSQL에서 기본 VACUUM 작업은 단순히 스페이스를 회수하여 재사용할 수 있게 만듭니다.

자세한 내용은 [테이블 Vacuum](t_Reclaiming_storage_space202.md) 섹션을 참조하세요.

## 필수 권한
<a name="r_VACUUM_command-privileges"></a>

VACUUM에 필요한 권한은 다음과 같습니다.
+ 수퍼유저
+ VACUUM 권한이 있는 사용자
+ 테이블 소유자
+ 테이블이 공유되는 데이터베이스 소유자

## 구문
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## 파라미터
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
지정된 테이블(또는 현재 데이터베이스의 모든 테이블)을 정렬하고 이전 UPDATE 및 DELETE 작업에서 삭제 표시가 된 행이 점유한 디스크 스페이스를 회수합니다. VACUUM FULL이 기본값입니다.  
전체를 비우는(full vacuum) 작업에서는 인터리브된 테이블에 대해 인덱스 재지정을 수행하지 않습니다. 인터리브된 테이블의 인덱스 재지정을 수행한 후 전체를 비우려면 [VACUUM REINDEX](#vacuum-reindex) 옵션을 사용하세요.  
기본적으로 VACUUM FULL은 95% 이상이 이미 정렬된 테이블에 대해서는 정렬 단계를 건너뜁니다. VACUUM이 정렬 단계를 건너뛸 수 있는 경우에는 DELETE ONLY를 수행하고 삭제 단계에서 남아 있는 행의 95% 이상이 삭제 대기 상태가 되지 않도록 스페이스를 회수합니다.   
정렬 임계값이 충족되지 않고(예: 행의 90%가 정렬되는 경우) VACUUM이 전체 정렬을 수행하는 경우에는 완전 삭제 작업도 수행하여 100%의 삭제된 행으로부터 스페이스를 회수합니다.  
단일 테이블에 대해서만 기본 vaccum 임계값을 변경할 수 있습니다. 단일 테이블의 기본 vacuum 임계값을 변경하려면 테이블 이름과 TO *threshold* PERCENT 파라미터를 포함시킵니다.

정렬 전용   <a name="vacuum-sort-only"></a>
행을 삭제하여 생긴 빈 스페이스를 회수하지 않고 지정된 테이블(또는 현재 데이터베이스의 모든 테이블)을 정렬합니다. 이 옵션은 디스크 공간 회수는 중요하지 않지만 새 행을 다시 정렬하는 것이 중요할 때 유용합니다. SORT ONLY vacuum은 정렬되지 않은 리전이 많은 수의 삭제된 행을 포함하지 않고 정렬된 리전 전체에 미치지 못할 때 vacuum 작업의 경과 시간을 줄여줍니다. 디스크 공간 제약 조건은 없지만 정렬된 테이블 행의 유지와 관련된 쿼리 최적화에 의존하는 애플리케이션은 이런 종류의 vacuum의 도움을 받을 수 있습니다.  
기본적으로 VACUUM SORT ONLY는 이미 95% 이상 정렬되어 있는 테이블은 전부 건너뜁니다. 단일 테이블의 기본 정렬 임계값을 변경하려면 VACUUM을 실행할 때 테이블 이름과 TO *threshold* PERCENT 파라미터를 포함시킵니다.

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift는 백그라운드에서 DELETE ONLY vacuum을 자동으로 수행하기 때문에 DELETE ONLY vacuum을 실행해야 하는 경우는 거의 없습니다.  
VACUUM DELETE는 이전 UPDATE 및 DELETE 작업에서 삭제 표시가 된 행이 점유한 디스크 스페이스를 회수하고 테이블을 압축하여 사용된 스페이스를 확보합니다. DELETE ONLY vacuum 작업에서는 테이블 데이터를 정렬하지 않습니다.  
디스크 공간 회수는 중요하지만 새 행을 다시 정렬하는 것이 중요하지 않을 때 이 옵션을 사용하면 VACUUM 작업의 경과 시간이 단축됩니다. 쿼리 성능이 이미 최적일 때도 이 옵션이 유용할 수 있으며, 쿼리 성능 최적화를 위해 행을 다시 정렬할 필요는 없습니다.  
기본적으로, VACUUM DELETE ONLY는 나머지 행의 95% 이상이 삭제 표시되지 않도록 스페이스를 회수합니다. 단일 테이블의 기본 삭제 임계값을 변경하려면 VACUUM을 실행할 때 테이블 이름과 TO *threshold* PERCENT 파라미터를 포함시킵니다.    
`ALTER TABLE APPEND` 같은 일부 작업은 테이블을 분할시킬 수 있습니다. `DELETE ONLY` 절을 사용하면, vacuum 작업이 분할된 테이블에서 스페이스를 회수합니다. 조각 모음 작업에 동일한 기준 값인 95%가 적용됩니다.

REINDEX  <a name="vacuum-reindex"></a>
인터리브된 정렬 키 열의 값 분산을 분석한 다음 전체 VACUUM 작업을 수행합니다. REINDEX가 사용되는 경우 테이블 이름이 필요합니다.  
VACUUM REINDEX는 인터리브된 정렬 키를 분석하기 위한 추가적인 패스를 만들기 때문에 VACUUM FULL보다 상당히 더 많은 시간이 소요됩니다. 인터리브된 정렬은 복합 정렬보다 많은 행을 다시 배열해야 하므로 정렬 및 병합 작업이 인터리브된 테이블에 대해 더 오래 걸릴 수 있습니다.  
VACUUM REINDEX 작업이 완료되기 전에 종료되면 다음 번 VACUUM은 완전 vacuum 작업을 수행하기 전에 reindex 작업을 재개합니다.  
VACUUM REINDEX는 TO *threshold* PERCENT와 함께 지원되지 않습니다.  

RECLUSTER  <a name="vacuum-recluster"></a>
정렬되지 않은 테이블 부분을 정렬합니다. 자동 테이블 정렬로 이미 정렬된 테이블 부분은 그대로 유지됩니다. 이 명령은 새로 정렬된 데이터를 정렬된 영역과 병합하지 않습니다. 또한 삭제 표시된 모든 스페이스를 회수하지 않습니다. 이 명령이 완료되면 SVV\$1TABLE\$1INFO의 `unsorted` 필드에 표시된 대로 테이블이 완전히 정렬되어 표시되지 않을 수 있습니다.  
 수집이 잦은 큰 테이블과 가장 최근 데이터에만 액세스하는 쿼리에는 VACUUM RECLUSTER를 사용하는 것이 좋습니다.  
 VACUUM RECLUSTER는 TO threshold PERCENT와 함께 지원되지 않습니다. RECLUSTER가 사용되는 경우 테이블 이름이 필요합니다.  
VACUUM RECLUSTER는 인터리브 정렬 키가 있는 테이블 및 ALL 배포 스타일의 테이블에서 지원되지 않습니다.

 *table\$1name*   
Vacuum을 수행할 테이블의 이름입니다. 테이블 이름을 지정하지 않을 경우 vacuum 작업은 현재 데이터베이스의 모든 테이블에 적용됩니다. 사용자가 만든 영구 또는 임시 테이블을 지정할 수 있습니다. 이 명령은 뷰 및 시스템 테이블과 같은 다른 객체에는 의미가 없습니다.  
 TO *threshold* PERCENT 파라미터를 포함하는 경우 테이블 이름은 필수입니다.

 TO *threshold* PERCENT   
VACUUM이 그 이상이 되면 정렬 단계를 건너뛰는 임계값과 삭제 단계에서 스페이스를 회수하기 위한 목표 임계값을 지정하는 절입니다. *정렬 임계값*은 vacuum을 실행하기 전에 지정된 테이블에 대한 정렬 순서가 이미 지정되어 있는 전체 행의 비율입니다.  *삭제 임계값*은 vacuum 실행 후에 삭제 표시되지 않은 전체 행의 최소 비율입니다.  
VACUUM은 테이블에서 정렬된 행의 비율이 정렬 임계값보다 낮을 때만 행을 다시 정렬하므로, Amazon Redshift는 종종 VACUUM 횟수를 상당히 줄일 수 있습니다. 마찬가지로, VACUUM이 삭제 표시된 행의 100%에서 스페이스를 회수하도록 제한되어 있지 않을 때는 몇 개의 삭제된 행만 포함한 블록 다시 쓰기를 건너뛸 수 있는 경우가 많습니다.  
예를 들어, *임계값*에 대해 75를 지정한 경우 VACUUM은 테이블 행의 75% 이상이 이미 정렬되어 있는 경우에 정렬 단계를 건너뜁니다. 삭제 단계의 경우, VACUUMS는 테이블 행의 75% 이상이 vacuum 후에 삭제 표시되지 않도록 디스크 공간 회수 목표를 설정합니다. *임계*값은 0 \$1 100 사이의 정수여야 합니다. 기본값은 95입니다. 100의 값을 지정하는 경우 VACUUM은 이미 완전히 정렬되어 있지 않는 한 항상 테이블을 정렬하고 삭제 표시된 모든 행에서 스페이스를 회수합니다. 0의 값을 지정하는 경우 VACUUM은 테이블을 절대 정렬하지 않고 공간을 절대 회수하지 않습니다.  
TO *threshold* PERCENT 파라미터를 포함하는 경우 테이블 이름도 지정해야 합니다. 테이블 이름이 생략된 경우 VACUUM은 실패합니다.  
TO *임계값* PERCENT 파라미터를 REINDEX와 함께 사용할 수 없습니다.

BOOST  
사용 가능한 메모리 및 디스크 공간과 같은 추가 리소스로 VACUUM 명령을 실행합니다. BOOST 옵션을 사용하면 VACUUM은 하나의 창에서 작동하며 VACUUM 작업 기간 동안 동시 삭제 및 업데이트를 차단합니다. BOOST 옵션을 사용하여 실행하면 시스템 리소스 경합이 발생하여 쿼리 성능에 영향을 줄 수 있습니다. 유지 보수 작업 등 시스템 부하가 적을 때 VACUUM BOOST를 실행하세요.  
BOOST 옵션을 사용할 때는 다음을 고려하세요.  
+ BOOST가 지정되면 *table\$1name* 값이 필요합니다.
+ BOOST는 REINDEX와 함께 사용할 수 없습니다.
+ DELETE ONLY를 사용할 경우 BOOST가 무시됩니다.

## 사용 노트
<a name="r_VACUUM_usage_notes"></a>

대부분의 Amazon Redshift 애플리케이션의 경우 완전 vacuum이 권장됩니다. 자세한 내용은 [테이블 Vacuum](t_Reclaiming_storage_space202.md) 섹션을 참조하세요.

Vacuum 작업 실행 전, 다음 동작에 유의하세요.
+ 트랜잭션 블록(BEGIN ... END) 내에서 VACUUM을 실행할 수 없습니다. 버전 관리에 대한 자세한 내용은 [Amazon Redshift의 격리 수준](c_serial_isolation.md) 섹션을 참조하세요.
+ 테이블이 vacuum될 때 테이블 크기가 어느 정도 증가할 수도 있습니다. 이는 회수할 삭제된 행이 없거나 테이블의 새 정렬 순서로 인해 데이터 압축률이 낮아질 때 예상되는 동작입니다.
+ Vacuum 작업 중에는 쿼리 성능이 어느 정도 저하될 것으로 예상됩니다. Vacuum 작업이 완료되는 즉시 성능은 정상적인 수준으로 회복됩니다.
+ Vacuum 작업 중에 동시 쓰기 작업이 진행되지만 vacuum 중에는 쓰기 작업을 수행하지 않는 것이 좋습니다. Vacuum 실행 전에 쓰기 작업을 완료하는 것이 더 효율적입니다. 또한 vacuum 작업이 시작된 후에 기록된 데이터는 해당 작업으로 vacuum을 수행할 수 없습니다. 이 경우 두 번째 vacuum 작업이 필요합니다.
+ 로드 또는 삽입 작업이 이미 진행 중인 경우 vacuum 작업을 시작하지 못할 수도 있습니다. Vacuum 작업을 시작하려면 일시적으로 테이블에 배타적으로 액세스해야 합니다. 이런 배타적 액세스는 잠깐 필요할 뿐이므로, vacuum 작업이 상당한 시간 동안 동시 로드 및 삽입을 막는 것은 아닙니다.
+ 특정 테이블에 대해 수행할 작업이 없을 때는 vacuum 작업을 건너뛰지만, 작업을 건너뛸 수 있음을 발견하는 것과 관련된 오버헤드가 있습니다. 테이블이 초기 상태이거나 vacuum 임계값을 충족하지 못한다는 점을 알고 있다면 이 테이블에 대한 vacuum 작업을 실행하지 마세요.
+ 작은 테이블에서의 DELETE ONLY vacuum 작업은 특히 테이블에 다수의 열이 있거나 클러스터가 노드당 많은 수의 조각을 사용할 때 데이터 저장에 사용되는 블록의 수를 줄이지 못할 수 있습니다. 이러한 vacuum 작업은 테이블로의 동시 삽입 수를 설명하기 위해 조각당 각 열에 한 개씩의 블록을 추가하고, 이 오버헤드가 회수된 디스크 공간에서 블록 수의 감소보다 많아질 가능성이 있습니다. 예를 들어 8개의 노드로 구성된 클러스터에 10개의 열이 있는 테이블이 vacuum 이전에 1,000개의 블록을 차지하고 있는 경우 삭제된 행 때문에 80개를 초과하는 블록의 디스크 공간이 회수되지 않을 경우 vacuum이 실제 블록 수를 줄여주지는 않습니다. (각 데이터 블록이 1MB씩 사용합니다.)

다음 중 어떤 조건이라도 충족이 될 경우 자동 vaccum 작업은 일시 중지됩니다.
+ 사용자가 ALTER TABLE 같이 현재 자동 vaccum이 작동 중인 테이블에 대해 단독 잠금이 필요한 데이터 정의 언어(DDL) 작업을 실행합니다.
+ 클러스터 로드가 많은 기간입니다.

### 동시 VACUUM 지원
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift는 클러스터 또는 작업 그룹의 여러 세션에서 여러 vacuum 트랜잭션을 동시에 실행할 수 있도록 지원합니다. 즉, 각 vacuum 트랜잭션을 고유한 테이블에 배치하여 모든 vacuum 모드의 서로 다른 여러 인스턴스를 한 번에 발행할 수 있습니다. 한 테이블에서 두 개의 vacuum 작업을 동시에 수행할 수 없습니다.

**동시 vacuum 실행 지침**
+ 여러 세션에서 동시 vacuum 트랜잭션을 실행할 때는 시스템 리소스를 모니터링하고 너무 많은 vacuum 작업을 동시에 실행하지 않아야 합니다.
+ 권장 동시성 수준은 회수할 공간의 양, 정렬할 행의 수와 너비, 웨어하우스의 크기, VACUUM 작업과 함께 실행되는 워크로드의 크기에 따라 달라집니다.
+ vacuum 트랜잭션의 모드에 따라 두 개의 동시 vacuum 작업으로 시작하고 런타임 및 시스템 로드에 따라 더 추가합니다. 사용자가 발행한 다른 부하가 큰 쿼리와 마찬가지로 Amazon Redshift가 시스템 리소스 제한에 도달할 때 너무 많은 작업을 동시에 실행하면 vacuum 작업이 대기열에 추가되기 시작할 수 있습니다.
+ 여러 Vacuum BOOST 작업을 신중하게 실행합니다. BOOST 옵션을 사용하여 Vacuum을 실행하면 시스템 리소스 경합이 발생하여 쿼리 성능에 영향을 줄 수 있습니다. 유지 보수 작업 등 시스템 부하가 적을 때 VACUUM BOOST를 실행하세요.
+ 테이블 이름을 지정하지 않을 경우 vacuum 작업은 현재 데이터베이스의 모든 테이블에 적용됩니다. 이러한 vacuum 작업은 여전히 순차적으로 실행됩니다.

## 예제
<a name="r_VACUUM_command-examples"></a>

기본값인 95%의 VACUUM 임계값을 기준으로 모든 테이블에서 공간과 데이터베이스를 회수하고 행을 다시 정렬합니다.

```
vacuum;
```

기본값인 95%의 임계값을 기준으로 SALES 테이블에서 스페이스를 회수하고 행을 다시 정렬합니다.

```
vacuum sales;
```

항상 SALES 테이블에서 스페이스를 회수하고 행을 다시 정렬합니다.

```
vacuum sales to 100 percent;
```

이미 정렬된 행 비율이 75% 미만인 경우에만 SALES 테이블의 행을 다시 정렬합니다.

```
 vacuum sort only sales to 75 percent;
```

Vacuum 후에 남아 있는 행의 75% 이상이 삭제 표시되지 않도록 SALES 테이블에서 스페이스를 회수합니다.

```
vacuum delete only sales to 75 percent;
```

LISTING 테이블을 reindex한 다음 vacuum합니다.

```
vacuum reindex listing;
```

다음 명령은 오류를 반환합니다.

```
vacuum reindex listing to 75 percent;
```

LISTING 테이블을 다시 클러스터링한 다음 정리(vacuum)합니다.

```
vacuum recluster listing;
```

BOOST 옵션으로 LISTING 테이블을 다시 클러스터링한 다음 정리(vacuum)합니다.

```
vacuum recluster listing boost;
```

# SQL 함수 참조
<a name="c_SQL_functions"></a>

**Topics**
+ [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md)
+ [집계 함수](c_Aggregate_Functions.md)
+ [배열 함수](c_Array_Functions.md)
+ [비트 단위 집계 함수](c_bitwise_aggregate_functions.md)
+ [조건 표현식](c_conditional_expressions.md)
+ [데이터 형식 지정 함수](r_Data_type_formatting.md)
+ [날짜 및 시간 함수](Date_functions_header.md)
+ [해시 함수](hash-functions.md)
+ [HyperLogLog 함수](hyperloglog-functions.md)
+ [JSON 함수](json-functions.md)
+ [기계 학습 함수](ml-function.md)
+ [수학 함수](Math_functions.md)
+ [객체 함수](Object_Functions.md)
+ [공간 함수](geospatial-functions.md)
+ [문자열 함수](String_functions_header.md)
+ [SUPER 형식 정보 함수](c_Type_Info_Functions.md)
+ [VARBYTE 함수 및 연산자](varbyte-functions.md)
+ [윈도우 함수](c_Window_functions.md)
+ [시스템 관리 함수](r_System_administration_functions.md)
+ [시스템 정보 함수](r_System_information_functions.md)

Amazon Redshift는 SQL 표준을 확장한 다양한 함수를 비롯해 표준 집계 함수, 스칼라 함수, 윈도 함수 등을 지원합니다.

**참고**  
Amazon Redshift는 PostgreSQL을 기반으로 합니다. Amazon Redshift와 PostgreSQL은 데이터웨어 하우스 애플리케이션을 설계하고 개발할 때 숙지해야 할 몇 가지 매우 중요한 차이점이 있습니다. Amazon Redshift SQL이 PostgreSQL과 어떻게 다른지 자세히 알아보려면 [Amazon Redshift 및 PostgreSQL](c_redshift-and-postgres-sql.md) 섹션을 참조하세요.

# 리더 노드 전용 함수
<a name="c_SQL_functions_leader_node_only"></a>

일부 Amazon Redshift 쿼리는 컴퓨팅 노드에서 분산되고 실행됩니다. 다른 쿼리는 리더 노드에서만 실행됩니다.

리더 노드는 쿼리가 사용자 생성 테이블 또는 시스템 테이블(STL 또는 STV 접두사가 첨부된 테이블과 SVL 또는 SVV 접두사가 첨부된 시스템 뷰)을 참조할 때 SQL을 컴퓨팅 노드로 분산시킵니다. CATALOG 테이블(PG\$1TABLE\$1DEF처럼 PG 접두사가 첨부된 테이블)만 참조하거나 어떤 테이블도 참조하지 않는 쿼리는 리더 노드에서만 실행됩니다.

일부 Amazon Redshift SQL 함수는 리더 노드에서만 지원되고, 컴퓨팅 노드에서는 지원되지 않습니다. 따라서 리더 노드 함수를 사용하는 쿼리는 컴퓨팅 노드가 아닌 리더 노드에서만 실행해야 합니다. 그렇지 않으면 오류를 반환합니다.

각 리더 노드 전용 함수에 대한 문서에는 이 함수가 사용자 정의 테이블이나 Amazon Redshift 시스템 테이블을 참조할 경우 오류를 반환한다는 설명이 포함되어 있습니다.

자세한 내용은 [리더 노드에서 지원되는 SQL 함수](c_sql-functions-leader-node.md) 섹션을 참조하세요.

다음 SQL 함수는 리더 노드 전용 함수이며, 컴퓨팅 노드에서는 지원되지 않습니다.

시스템 정보 함수
+ CURRENT\$1SCHEMA
+ CURRENT\$1SCHEMAS
+ HAS\$1DATABASE\$1PRIVILEGE
+ HAS\$1SCHEMA\$1PRIVILEGE
+ HAS\$1TABLE\$1PRIVILEGE

문자열 함수
+ SUBSTR

수학 함수
+ FACTORIAL
+  WARNING 

다음 리더 노드 전용 함수는 여기에서 다루지 않으며 더 이상 지원되지 않습니다.

날짜 함수
+ AGE
+ CURRENT\$1TIME
+ CURRENT\$1TIMESTAMP
+ LOCALTIME
+ ISFINITE
+ NOW

문자열 함수
+ GETBIT
+ GET\$1BYTE
+ SET\$1BIT
+ SET\$1BYTE
+ TO\$1ASCII

# 집계 함수
<a name="c_Aggregate_Functions"></a>

**Topics**
+ [ANY\$1VALUE 함수](r_ANY_VALUE.md)
+ [APPROXIMATE PERCENTILE\$1DISC 함수](r_APPROXIMATE_PERCENTILE_DISC.md)
+ [AVG 함수](r_AVG.md)
+ [COUNT 함수](r_COUNT.md)
+ [LISTAGG 함수](r_LISTAGG.md)
+ [MAX 함수](r_MAX.md)
+ [MEDIAN 함수](r_MEDIAN.md)
+ [MIN 함수](r_MIN.md)
+ [PERCENTILE\$1CONT 함수](r_PERCENTILE_CONT.md)
+ [STDDEV\$1SAMP 및 STDDEV\$1POP 함수](r_STDDEV_functions.md)
+ [SUM 함수](r_SUM.md)
+ [VAR\$1SAMP 및 VAR\$1POP 함수](r_VARIANCE_functions.md)

집계 함수는 입력 값 집합에서 단일 결과 값을 계산합니다.

집계 함수를 사용하는 SELECT 문에는 옵션이지만 GROUP BY와 HAVING, 2가지 절이 포함될 수 있습니다. 이 2가지 절의 구문은 다음과 같습니다(예에서는 COUNT 함수 사용).

```
SELECT count (*) expression FROM table_reference
WHERE condition [GROUP BY expression ] [ HAVING condition]
```

GROUP BY 절은 집계 후 특정 열의 고유 값을 기준으로 결과를 그룹화합니다. HAVING 절은 반환되는 결과를 수량(\$1) > 1처럼 특정 집계 조건이 true인 행으로 제한합니다. 또한 WHERE와 동일한 방식으로 사용되어 열의 값에 따라 행을 제한합니다. 이러한 추가 절의 예는 [COUNT](r_COUNT.md) 섹션을 참조하세요.

집계 함수는 중첩 집계 함수나 창 함수를 인수로 사용하지 않습니다.

# ANY\$1VALUE 함수
<a name="r_ANY_VALUE"></a>

ANY\$1VALUE 함수는 입력 표현식 값에서 비결정적으로 값을 반환합니다. 이 함수는 입력 식으로 반환되는 행이 없는 경우 `NULL`을 반환합니다. 입력 식에 `NULL` 값이 있는 경우 함수가 `NULL`을 반환할 수도 있습니다. 입력에 `NULL` 값과 `NULL`이 아닌 값이 혼합된 경우 `NULL`이 반환될 수 있습니다. 모든 값이 `NULL`이면 `NULL`이 반환됩니다. 조건과 일치하는 행이 없으면 `NULL`이 반환됩니다.

## 구문
<a name="r_ANY_VALUE-synopsis"></a>

```
ANY_VALUE( [ DISTINCT | ALL ] expression )
```

## 인수
<a name="r_ANY_VALUE-arguments"></a>

DISTINCT \$1 ALL  
입력 표현식 값에서 값을 반환하려면 DISTINCT 또는 ALL을 지정합니다. DISTINCT 인수는 효과가 없으며 무시됩니다.

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. *표현식*은 다음 데이터 유형 중 하나입니다.  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISON
+ BOOLEAN
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ INTERVAL YEAR TO MONTH
+ INTERVAL DAY TO SECOND
+ VARBYTE
+ SUPER
+ HLLSKETCH
+ GEOMETRY
+ GEOGRAPHY

## 반환 형식
<a name="r_ANY_VALUE-returns"></a>

*expression*과 동일한 데이터 형식을 반환합니다.

## 사용 노트
<a name="r_ANY_VALUE-usage-notes"></a>

열에 대한 ANY\$1VALUE 함수를 지정하는 문이 두 번째 열 참조도 포함하는 경우 두 번째 열은 GROUP BY 절에 나타나거나 집계 함수에 포함되어야 합니다.

## 예제
<a name="r_ANY_VALUE-examples"></a>

이 예에서는 [Amazon Redshift 시작 안내서](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)의 *4단계: Amazon S3에서 샘플 데이터 로드*에서 생성된 이벤트 테이블을 사용합니다. 다음 예는 eventname이 Eagles인 모든 dateid의 인스턴스를 반환합니다.

```
select any_value(dateid) as dateid, eventname from event where eventname ='Eagles' group by eventname;
```

다음은 결과입니다.

```
dateid | eventname
-------+---------------
 1878  | Eagles
```

다음 예는 eventname이 Eagles 또는 Cold War Kids인 모든 dateid의 인스턴스를 반환합니다.

```
select any_value(dateid) as dateid, eventname from event where eventname in('Eagles', 'Cold War Kids') group by eventname;
```

다음은 결과입니다.

```
dateid | eventname
-------+---------------
 1922  | Cold War Kids
 1878  | Eagles
```

# APPROXIMATE PERCENTILE\$1DISC 함수
<a name="r_APPROXIMATE_PERCENTILE_DISC"></a>

APPROXIMATE PERCENTILE\$1DISC는 이산 분포 모델을 가정하는 역분포 함수로서 백분위 값과 정렬 명세를 가지며, 지정된 집합에서 요소를 반환합니다. 이 함수는 근사치를 사용하기 때문에 실행 속도가 더욱 빠르며 상대 오차도 약 0.5%로 낮습니다.

APPROXIMATE PERCENTILE\$1DISC는 임의의 *percentile* 값에 대해 사분위 요약 알고리즘을 사용하여 ORDER BY 절에서 표현식의 이산 백분위에 대한 근사치를 구합니다. 또한 동일한 정렬 명세와 관련하여 가장 작지만 *percentile*보다는 크거나 같은 누적 분포 값을 반환합니다.

## 구문
<a name="r_APPROXIMATE_PERCENTILE_DISC-synopsis"></a>

```
APPROXIMATE  PERCENTILE_DISC ( percentile )
WITHIN GROUP (ORDER BY expr)
```

## 인수
<a name="r_APPROXIMATE_PERCENTILE_DISC-arguments"></a>

 *(백분위수*)   
0과 1 사이의 숫자 상수입니다. 이 계산에서 Null 값은 무시됩니다.

WITHIN GROUP (ORDER BY *expr*)   
숫자 또는 날짜/시간 값을 지정하여 백분위를 정렬 및 계산하는 절입니다.

## 반환 형식
<a name="r_APPROXIMATE_PERCENTILE_DISC-returns"></a>

WITHIN GROUP 절의 ORDER BY 표현식과 동일한 데이터 형식

## 사용 노트
<a name="r_APPROXIMATE_PERCENTILE_DISC-usage-notes"></a>

APPROXIMATE PERCENTILE\$1DISC 문에 GROUP BY 절이 포함된 경우에는 결과 집합이 제한적입니다. 이러한 제한은 노드 유형과 노드 수에 따라 달라집니다. 제한을 초과하면 함수가 중단되고 다음과 같은 오류를 반환합니다.

```
GROUP BY limit for approximate percentile_disc exceeded.
```

제한을 초과하여 더 많은 그룹을 평가해야 하는 경우에는 [PERCENTILE\$1CONT 함수](r_PERCENTILE_CONT.md)를 사용하는 것이 좋습니다.

## 예제
<a name="r_APPROXIMATE_PERCENTILE_DISC-examples"></a>

다음은 상위 10개 날짜일 때 판매 수량과 총 판매액, 그리고 50번째 백분위 값을 반환하는 예입니다.

```
select top 10 date.caldate,
count(totalprice), sum(totalprice),
approximate percentile_disc(0.5) 
within group (order by totalprice)
from listing
join date on listing.dateid = date.dateid
group by date.caldate
order by 3 desc;

caldate    | count | sum        | percentile_disc
-----------+-------+------------+----------------
2008-01-07 |   658 | 2081400.00 |         2020.00
2008-01-02 |   614 | 2064840.00 |         2178.00
2008-07-22 |   593 | 1994256.00 |         2214.00
2008-01-26 |   595 | 1993188.00 |         2272.00
2008-02-24 |   655 | 1975345.00 |         2070.00
2008-02-04 |   616 | 1972491.00 |         1995.00
2008-02-14 |   628 | 1971759.00 |         2184.00
2008-09-01 |   600 | 1944976.00 |         2100.00
2008-07-29 |   597 | 1944488.00 |         2106.00
2008-07-23 |   592 | 1943265.00 |         1974.00
```

# AVG 함수
<a name="r_AVG"></a>

 AVG 함수는 입력 표현식 값의 평균(산술 평균)을 반환합니다. AVG 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_AVG-synopsis"></a>

```
AVG ( [ DISTINCT | ALL ] expression )
```

## 인수
<a name="r_AVG-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. *표현식*은 다음 데이터 유형 중 하나입니다.  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISON
+ SUPER

DISTINCT \$1 ALL   
인수가 DISTINCT일 때는 함수가 평균을 계산하기 전에 지정한 표현식에서 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 평균을 계산합니다. ALL이 기본값입니다.

## 데이터 타입
<a name="r_AVG-data-types"></a>

 AVG 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, SUPER입니다.

AVG 함수에서 지원되는 반환 형식은 다음과 같습니다.
+ 모든 정수형 인수일 때 BIGINT
+ 부동 소수점 인수일 때 DOUBLE PRECISION
+ 다른 인수 형식의 표현과 동일한 데이터 형식을 반환합니다.

NUMERIC 또는 DECIMAL 인수가 포함된 AVG 함수 결과의 기본 정밀도는 38입니다. 함수 결과의 비율은 인수 비율과 동일합니다. 예를 들어 DEC(5,2) 열의 AVG는 DEC(38,2) 데이터 형식을 반환합니다.

## 예제
<a name="r_AVG-examples"></a>

SALES 테이블에서 트랜잭션 1회당 판매된 평균 수량을 구합니다.

```
select avg(qtysold)from sales;

avg
-----
2
(1 row)
```

모든 목록에 나열된 평균 총 가격을 구합니다.

```
select avg(numtickets*priceperticket) as avg_total_price from listing;

avg_total_price
-----------------
3034.41
(1 row)
```

매월 내림차순으로 분류된 평균 지불 가격을 구합니다.

```
select avg(pricepaid) as avg_price, month 
from sales, date
where sales.dateid = date.dateid
group by month
order by avg_price desc;

avg_price | month
-----------+-------
659.34 | MAR
655.06 | APR
645.82 | JAN
643.10 | MAY
642.72 | JUN
642.37 | SEP
640.72 | OCT
640.57 | DEC
635.34 | JUL
635.24 | FEB
634.24 | NOV
632.78 | AUG
(12 rows)
```

# COUNT 함수
<a name="r_COUNT"></a>

 COUNT 함수는 표현식에서 정의하는 행의 수를 계산합니다.

COUNT 함수는 다음과 같은 변형이 있습니다.
+ COUNT ( \$1 )는 NULL 값의 유무에 상관없이 대상 테이블에서 모든 행의 수를 계산합니다.
+ COUNT ( *expression* )는 특정 열 또는 표현식에서 NULL을 제외한 값이 포함된 행의 수를 계산합니다.
+ COUNT ( DISTINCT *expression* )는 임의의 열 또는 표현식에서 NULL을 제외한 고유 값의 수를 계산합니다.
+ APPROXIMATE COUNT DISTINCT는 임의의 열 또는 표현식에서 NULL을 제외한 고유 값의 수를 대략적으로 구합니다.

## 구문
<a name="r_COUNT-synopsis"></a>

```
COUNT( * | expression )
```

```
COUNT ( [ DISTINCT | ALL ] expression )
```

```
APPROXIMATE COUNT ( DISTINCT expression )
```

## 인수
<a name="r_COUNT-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. COUNT 함수는 모든 인수 데이터 형식을 지원합니다.

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 행의 수를 계산하기 전에 지정한 표현식에서 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 행의 수를 계산합니다. ALL이 기본값입니다.

APPROXIMATE  
APPROXIMATE와 함께 사용할 때는 COUNT DISTINCT 함수가 HyperLogLog 알고리즘을 사용하여 임의의 열 또는 표현식에서 NULL을 제외한 고유 값의 수를 대략적으로 구합니다. 쿼리에 APPROXIMATE 키워드를 사용하면 실행 속도가 빨라질 뿐만 아니라 상대 오차도 약 2%로 낮습니다. 쿼리마다, 혹은 GROUP BY 절이 있는 경우 그룹마다 수백만 개가 넘는 고유 값을 반환하는 쿼리일 때는 근사치가 타당한 것으로 간주됩니다. 하지만 고유 값이 수천 개로 적을 경우에는 근사치일 때 속도가 정확한 행의 수일 때 보다 느려질 수 있습니다. APPROXIMATE는 COUNT DISTINCT와만 사용할 수 있습니다.

## 반환 타입
<a name="c_Supported_data_types_count"></a>

COUNT 함수는 BIGINT를 반환합니다.

## 예제
<a name="r_COUNT-examples"></a>

Florida 주의 모든 사용자 수를 계산합니다.

```
select count(*) from users where state='FL';

count
-------
510
```

EVENT 테이블에서 모든 이벤트 이름의 수를 계산합니다.

```
select count(eventname) from event;

count
-------
8798
```

EVENT 테이블에서 모든 이벤트 이름의 수를 계산합니다.

```
select count(all eventname) from event;

count
-------
8798
```

EVENT 테이블에서 고유한 장소 ID의 수를 모두 계산합니다.

```
select count(distinct venueid) as venues from event;

venues
--------
204
```

개별 판매자가 4장 이상의 티켓을 한 묶음으로 판매한 횟수를 계산합니다. 결과는 판매자 ID로 구분합니다.

```
select count(*), sellerid from listing 
where numtickets > 4
group by sellerid
order by 1 desc, 2;

count | sellerid
------+----------
12    |    6386
11    |    17304
11    |    20123
11    |    25428
...
```

다음은 COUNT와 APPROXIMATE COUNT의 반환 값 및 실행 시간을 서로 비교한 예입니다.

```
select  count(distinct pricepaid) from sales;
              
count
-------
  4528


Time: 48.048 ms

               
select approximate count(distinct pricepaid) from sales;

count
-------
  4553


Time: 21.728 ms
```

# LISTAGG 함수
<a name="r_LISTAGG"></a>

LISTAGG 집계 함수는 ORDER BY 표현식에 따라 쿼리 내 각 그룹의 행 순서를 지정한 다음, 값을 연결하여 문자열 하나를 만듭니다.

## 구문
<a name="r_LISTAGG-synopsis"></a>

```
LISTAGG( [DISTINCT] aggregate_expression [, 'delimiter' ] ) 
[ WITHIN GROUP (ORDER BY order_list) ]
```

## 인수
<a name="r_LISTAGG-arguments"></a>

DISTINCT  
연결하기 전에 지정된 표현식에서 중복 값을 없애는 절입니다. 후행 공백은 무시됩니다. 예를 들어, 문자열 `'a'` 및 `'a '`는 중복으로 처리됩니다. LISTAGG는 발생한 첫 번째 값을 사용합니다. 자세한 내용은 [후행 공백의 중요성](r_Character_types.md#r_Character_types-significance-of-trailing-blanks) 섹션을 참조하세요.

 *aggregate\$1expression*   
 집계할 값을 제공하는 모든 유효 표현식(열 이름 등)입니다. NULL 값과 빈 문자열은 무시됩니다.

 *delimiter*   
연결된 값을 구분하는 문자열 상수입니다. 기본값은 NULL입니다.

 *WITHIN GROUP (ORDER BY order\$1list)*   
집계된 값의 정렬 순서를 지정하는 절입니다.

## 반환 형식
<a name="r_LISTAGG-data-types"></a>

VARCHAR(최대). 결과 집합이 최대 VARCHAR 크기보다 클 경우에는 LISTAGG가 다음과 같은 오류를 반환합니다.

```
Invalid operation: Result size exceeds LISTAGG limit
```

## 사용 노트
<a name="r_LISTAGG-usage-notes"></a>
+ 문에 WITHIN GROUP 절을 사용하는 LISTAGG 함수가 다수 포함된 경우에는 WITHIN GROUP 절마다 동일한 ORDER BY 값을 사용해야 합니다.

  예를 들어 다음과 같은 문은 오류를 반환합니다.

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY sellerid) AS dates
  FROM sales;
  ```

  다음 문은 성공적으로 실행됩니다.

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY dateid) AS dates
  FROM sales;
  
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) AS dates
  FROM sales;
  ```
+ LISTAGG, PERCENTILE\$1CONT 및 MEDIAN 집계 함수는 다른 고유한 집계 함수와 함께 사용할 수 없습니다.

## 예제
<a name="r_LISTAGG-examples"></a>

다음은 판매자 ID에 따라 순서를 지정하여 판매자 ID를 집계하는 예입니다.

```
SELECT LISTAGG(sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                                                                 
----------------------------------------------------------------------------------------------------------------------------------------
380, 380, 1178, 1178, 1178, 2731, 8117, 12905, 32043, 32043, 32043, 32432, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 47188, 48294
```

다음 예에서는 DISTINCT를 사용하여 고유한 판매자 ID 목록을 반환합니다.

```
SELECT LISTAGG(DISTINCT sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                    
-------------------------------------------------------------------------------------------
380, 1178, 2731, 8117, 12905, 32043, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 48294
```

다음은 날짜 순으로 판매자 ID를 집계하는 예입니다.

```
SELECT LISTAGG(sellerid, ', ')  
WITHIN GROUP (ORDER BY dateid) 
FROM sales
WHERE eventid = 4337;

   listagg
-----------------------------------------------------------------------------------------------------------------------------------------
 41498, 47188, 47188, 1178, 1178, 1178, 380, 45676, 46324, 48294, 32043, 32043, 32432, 12905, 8117, 38750, 2731, 32432, 32043, 380, 38669
```

다음은 ID가 660인 구매자의 판매 날짜 목록을 파이프로 구분하여 반환하는 예입니다.

```
SELECT LISTAGG(
    (SELECT caldate FROM date WHERE date.dateid=sales.dateid), ' | '    
)
WITHIN GROUP (ORDER BY sellerid DESC, salesid ASC)
FROM sales
WHERE buyerid = 660;

             listagg
-------------------------------------------------
2008-07-16 | 2008-07-09 | 2008-01-01 | 2008-10-26
```

다음은 각 구매자 ID 660, 661, 662의 판매 ID 목록을 쉼표로 구분하여 반환하는 예입니다.

```
SELECT buyerid, 
LISTAGG(salesid,', ')
WITHIN GROUP (ORDER BY salesid) AS sales_id
FROM sales
WHERE buyerid BETWEEN 660 AND 662
GROUP BY buyerid
ORDER BY buyerid;
            
buyerid |                sales_id
--------+-----------------------------------------------------
660     | 32872, 33095, 33514, 34548
661     | 19951, 20517, 21695, 21931
662     | 3318, 3823, 4215, 51980, 53202, 55908, 57832, 171603
```

# MAX 함수
<a name="r_MAX"></a>

 MAX 함수는 행 집합에서 최댓값을 반환합니다. DISTINCT 또는 ALL은 사용할 수 있지만 결과에 아무런 영향도 끼치지 않습니다.

## 구문
<a name="r_MAX-synopsis"></a>

```
MAX ( [ DISTINCT | ALL ] expression )
```

## 인수
<a name="r_MAX-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. *표현식*은 다음 데이터 유형 중 하나입니다.  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISON
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL   
인수가 DISTINCT일 때는 함수가 최댓값을 계산하기 전에 지정한 표현식에서 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 최댓값을 계산합니다. ALL이 기본값입니다.

## 데이터 타입
<a name="c_Supported_data_types_max"></a>

*expression*과 동일한 데이터 형식을 반환합니다. MIN 함수일 때 부울 등가는 [BOOL\$1AND 함수](r_BOOL_AND.md)이고, MAX 함수일 때 부울 등가는 [BOOL\$1OR 함수](r_BOOL_OR.md)입니다.

## 예제
<a name="r_MAX-examples"></a>

모든 판매에서 지불된 최고 가격을 구합니다.

```
select max(pricepaid) from sales;

max
----------
12624.00
(1 row)
```

모든 판매에서 티켓 1장당 지불된 최고 가격을 구합니다.

```
select max(pricepaid/qtysold) as max_ticket_price
from sales;

max_ticket_price
-----------------
2500.00000000
(1 row)
```

# MEDIAN 함수
<a name="r_MEDIAN"></a>

값 범위의 중앙값을 계산합니다. 범위의 `NULL` 값은 무시됩니다.

MEDIAN은 연속 분포 모델을 가정하는 역분포 함수입니다.

MEDIAN은 [PERCENTILE\$1CONT](r_PERCENTILE_CONT.md)의 특별 사례입니다.

## 구문
<a name="r_MEDIAN-synopsis"></a>

```
MEDIAN(median_expression)
```

## 인수
<a name="r_MEDIAN-arguments"></a>

 *median\$1expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

## 데이터 타입
<a name="r_MEDIAN-data-types"></a>

반환 형식은 *median\$1expression*의 형식에 따라 결정됩니다. 다음 표는 각 *median\$1expression* 데이터 형식에 따른 반환 형식을 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_MEDIAN.html)

## 사용 노트
<a name="r_MEDIAN-data-type-usage-notes"></a>

**median\$1expression 인수가 최대 정밀도가 38자리로 정의된 `DECIMAL` 데이터 형식인 경우에는 MEDIAN이 부정확한 결과 또는 오류를 반환합니다. MEDIAN 함수의 반환 값이 38자리를 초과하면 정밀도가 손실될 수도 있기 때문에 알맞은 자리 수로 결과가 잘립니다. 보간 도중 중간 결과가 최대 정밀도를 초과하면 수치 오버플로우가 발생하고 함수는 오류를 반환합니다. 이러한 상황을 방지하려면 정밀도가 낮은 데이터 형식을 사용하거나, 혹은 *median\$1expression* 인수를 낮은 정밀도로 변환합니다.

하나의 문에서 정렬 기반 집계 함수(LISTAGG, PERCENTILE\$1CONT, MEDIAN)를 여러 차례 호출하는 경우에는 모두 동일한 ORDER BY 값을 사용해야 합니다. 단, MEDIAN은 표현식 값에서 묵시적인 ORDER BY를 적용합니다.

예를 들어 다음과 같은 문은 오류를 반환합니다.

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

다음 문은 성공적으로 실행됩니다.

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 예제
<a name="r_MEDIAN-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 MEDIAN이 PERCENTILE\$1CONT(0.5)와 동일한 결과를 산출하는 예입니다.

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

다음 예제에서는 각 sellerid의 판매 수량 중간값을 찾습니다.

```
SELECT sellerid, 
MEDIAN(qtysold)
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+
| sellerid | median |
+----------+--------+
|        1 |    1.5 |
|        2 |      2 |
|        3 |      2 |
|        4 |      2 |
|        5 |      1 |
|        6 |      1 |
|        7 |    1.5 |
|        8 |      1 |
|        9 |      4 |
|       12 |      2 |
+----------+--------+
```

첫 번째 sellerid에 대한 이전 쿼리 결과를 확인하려면 다음 예제를 사용합니다.

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# MIN 함수
<a name="r_MIN"></a>

 MIN 함수는 행 집합에서 최솟값을 반환합니다. DISTINCT 또는 ALL은 사용할 수 있지만 결과에 아무런 영향도 끼치지 않습니다.

## 구문
<a name="r_MIN-synopsis"></a>

```
MIN ( [ DISTINCT | ALL ] expression )
```

## 인수
<a name="r_MIN-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. *표현식*은 다음 데이터 유형 중 하나입니다.  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISON
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 함수가 최솟값을 계산하기 전에 지정한 표현식에서 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 최솟값을 계산합니다. ALL이 기본값입니다.

## 데이터 타입
<a name="c_Supported_data_types_min"></a>

 *expression*과 동일한 데이터 형식을 반환합니다. MIN 함수일 때 부울 등가는 [BOOL\$1AND 함수](r_BOOL_AND.md)이고, MAX 함수일 때 부울 등가는 [BOOL\$1OR 함수](r_BOOL_OR.md)입니다.

## 예제
<a name="r_MIN-examples"></a>

모든 판매에서 지불된 최저 가격을 구합니다.

```
select min(pricepaid) from sales;

min
-------
20.00
(1 row)
```

모든 판매에서 티켓 1장당 지불된 최저 가격을 구합니다.

```
select min(pricepaid/qtysold)as min_ticket_price
from sales;

min_ticket_price
------------------
20.00000000
(1 row)
```

# PERCENTILE\$1CONT 함수
<a name="r_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT는 연속 분포 모델을 가정하는 역분포 함수입니다. 백분위 값과 정렬 명세를 가지며, 정렬 명세와 관련하여 지정된 백분위 값에 해당하는 보간 값을 반환합니다.

PERCENTILE\$1CONT는 순서가 지정된 값 사이의 선형 보간을 계산합니다. 이 함수는 집계 그룹에서 백분위 값`(P)`과 NULL을 제외한 행들의 번호`(N)`를 사용하여 정렬 명세에 따라 행의 순서를 지정한 후 행 번호를 계산합니다. 행 번호`(RN)`를 계산하는 공식은 `RN = (1+ (P*(N-1))`입니다. 이 집계 함수의 최종 결과는 행 번호가 `CRN = CEILING(RN)`과 `FRN = FLOOR(RN)`인 행의 값 사이 선형 보간을 통해 계산됩니다.

최종 결과는 다음과 같습니다.

`(CRN = FRN = RN)`일 때 결과는 `(value of expression from row at RN)`입니다.

그렇지 않다면 다음 결과가 표시됩니다.

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

## 구문
<a name="r_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT(percentile)
WITHIN GROUP(ORDER BY expr)
```

## 인수
<a name="r_PERCENTILE_CONT-arguments"></a>

 *(백분위수*)   
0에서 1 사이의 숫자 상수입니다. 계산에서 `NULL` 값은 무시됩니다.

*\$1 expr*  
숫자 또는 날짜/시간 값을 지정하여 백분위를 정렬 및 계산합니다.

## 반환 형식
<a name="r_PERCENTILE_CONT-returns"></a>

반환 형식은 WITHIN GROUP 절에서 ORDER BY 표현식의 데이터 형식에 따라 결정됩니다. 다음 표는 ORDER BY 표현식의 데이터 형식에 따른 반환 형식을 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_PERCENTILE_CONT.html)

## 사용 노트
<a name="r_PERCENTILE_CONT-usage-notes"></a>

ORDER BY 표현식이 최대 정밀도가 38자리로 정의된 DECIMAL 데이터 형식인 경우에는 PERCENTILE\$1CONT가 부정확한 결과 또는 오류를 반환합니다. PERCENTILE\$1CONT 함수의 반환 값이 38자리를 초과하면 정밀도가 손실될 수도 있기 때문에 알맞은 자리 수로 결과가 잘립니다. 보간 도중 중간 결과가 최대 정밀도를 초과하면 수치 오버플로우가 발생하고 함수는 오류를 반환합니다. 이러한 상황을 방지하려면 정밀도가 낮은 데이터 형식을 사용하거나, 혹은 ORDER BY 표현식을 낮은 정밀도로 변환합니다.

하나의 문에서 정렬 기반 집계 함수(LISTAGG, PERCENTILE\$1CONT, MEDIAN)를 여러 차례 호출하는 경우에는 모두 동일한 ORDER BY 값을 사용해야 합니다. 단, MEDIAN은 표현식 값에서 묵시적인 ORDER BY를 적용합니다.

예를 들어 다음과 같은 문은 오류를 반환합니다.

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

다음 문은 성공적으로 실행됩니다.

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 예제
<a name="r_PERCENTILE_CONT-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 PERCENTILE\$1CONT(0.5)이 MEDIAN과 동일한 결과를 산출하는 예입니다.

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

다음 예제에서는 SALES 테이블의 각 sellerid별로 판매된 수량에 대한 PERCENTILE\$1CONT(0.5) 및 PERCENTILE\$1CONT(0.75)를 찾습니다.

```
SELECT sellerid, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold) as pct_50,
PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY qtysold) as pct_75
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+---------+
| sellerid | pct_50 | pct_75 |
+----------+--------+---------+
|        1 |    1.5 |    1.75 |
|        2 |      2 |    2.25 |
|        3 |      2 |       3 |
|        4 |      2 |       2 |
|        5 |      1 |     1.5 |
|        6 |      1 |       1 |
|        7 |    1.5 |    1.75 |
|        8 |      1 |       1 |
|        9 |      4 |       4 |
|       12 |      2 |    3.25 |
+----------+--------+---------+
```

첫 번째 sellerid에 대한 이전 쿼리 결과를 확인하려면 다음 예제를 사용합니다.

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# STDDEV\$1SAMP 및 STDDEV\$1POP 함수
<a name="r_STDDEV_functions"></a>

 STDDEV\$1SAMP 및 STDDEV\$1POP 함수는 숫자 값(정수, 소수 또는 부동 소수점) 집합의 표본 표준 편차와 모 표준 편차를 반환합니다. STDDEV\$1SAMP 함수의 결과는 동일한 값 집합의 표본 분산 제곱근과 동일합니다.

STDDEV\$1SAMP와 STDDEV는 동일한 함수이기 때문에 동의어나 마찬가지입니다.

## 구문
<a name="r_STDDEV_functions-syntax"></a>

```
STDDEV_SAMP | STDDEV ( [ DISTINCT | ALL ] expression)
STDDEV_POP ( [ DISTINCT | ALL ] expression)
```

표현식의 데이터 형식은 정수, 소수 또는 부동 소수점이 되어야 합니다. 표현식의 데이터 형식과 상관없이 이 함수의 반환 형식은 배정밀도 숫자입니다.

**참고**  
표준 편차는 부동 소수점 연산을 통해 계산하지만 약간 부정확할 수 있습니다.

## 사용 노트
<a name="r_STDDEV_usage_notes"></a>

단일 값으로 구성된 표현식에 대해 표본 표준 편차(STDDEV 또는 STDDEV\$1SAMP)를 계산할 경우 함수 결과는 0이 아닌 NULL이 됩니다.

## 예제
<a name="r_STDDEV_functions-examples"></a>

다음 쿼리는 VENUE 테이블에서 VENUESEATS 열의 값 평균과 그 뒤를 이어 동일한 값 집합의 표본 표준 편차 및 모 표준 편차를 반환합니다. VENUESEATS는 INTEGER 열입니다. 결과의 크기는 2자리로 줄어듭니다.

```
select avg(venueseats),
cast(stddev_samp(venueseats) as dec(14,2)) stddevsamp,
cast(stddev_pop(venueseats) as dec(14,2)) stddevpop
from venue;

avg  | stddevsamp | stddevpop
-------+------------+-----------
17503 |   27847.76 |  27773.20
(1 row)
```

다음 쿼리는 SALES 테이블에서 COMMISSION 열의 표본 표준 편차를 반환합니다. COMMISSION은 DECIMAL 열입니다. 결과의 크기는 10자리로 줄어듭니다.

```
select cast(stddev(commission) as dec(18,10))
from sales;

stddev
----------------
130.3912659086
(1 row)
```

다음 쿼리는 COMMISSION 열의 표본 표준 편차를 정수로 변환합니다.

```
select cast(stddev(commission) as integer)
from sales;

stddev
--------
130
(1 row)
```

다음 쿼리는 COMMISSION 열의 표본 표준 편차와 표본 분산 제곱근을 모두 반환합니다. 이 두 가지의 계산 결과는 동일합니다.

```
select
cast(stddev_samp(commission) as dec(18,10)) stddevsamp,
cast(sqrt(var_samp(commission)) as dec(18,10)) sqrtvarsamp
from sales;

stddevsamp   |  sqrtvarsamp
----------------+----------------
130.3912659086 | 130.3912659086
(1 row)
```

# SUM 함수
<a name="r_SUM"></a>

 SUM 함수는 입력 열 또는 표현식 값의 합을 반환합니다. SUM 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_SUM-synopsis"></a>

```
SUM ( [ DISTINCT | ALL ] expression )
```

## 인수
<a name="r_SUM-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. *표현식*은 다음 데이터 유형 중 하나입니다.  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISON
+ SUPER

DISTINCT \$1 ALL   
인수가 DISTINCT일 때는 함수가 합을 계산하기 전에 지정한 표현식에서 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 합을 계산합니다. ALL이 기본값입니다.

## 데이터 타입
<a name="c_Supported_data_types_sum"></a>

SUM 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, SUPER입니다.

SUM 함수에서 지원되는 반환 형식은 다음과 같습니다.
+ BIGINT, SMALLINT 및 INTEGER 인수일 때 BIGINT
+ NUMERIC 인수일 때 NUMERIC
+ 부동 소수점 인수일 때 DOUBLE PRECISION
+ 다른 인수 형식의 표현과 동일한 데이터 형식을 반환합니다.

NUMERIC 또는 DECIMAL 인수가 포함된 SUM 함수 결과의 기본 정밀도는 38입니다. 함수 결과의 비율은 인수 비율과 동일합니다. 예를 들어 DEC(5,2) 열의 SUM은 DEC(38,2) 데이터 형식을 반환합니다.

## 예제
<a name="r_SUM-examples"></a>

 SALES 테이블에서 지불된 모든 수수료의 합을 구합니다.

```
select sum(commission) from sales;

sum
-------------
16614814.65
(1 row)
```

Florida 주에 위치한 모든 장소의 좌석 수를 구합니다.

```
select sum(venueseats) from venue
where venuestate = 'FL';

sum
--------
250411
(1 row)
```

5월에 판매된 좌석 수를 구합니다.

```
select sum(qtysold) from sales, date
where sales.dateid = date.dateid and date.month = 'MAY';

sum
-------
32291
(1 row)
```

# VAR\$1SAMP 및 VAR\$1POP 함수
<a name="r_VARIANCE_functions"></a>

 VAR\$1SAMP 및 VAR\$1POP 함수는 숫자 값(정수, 소수 또는 부동 소수점) 집합의 표본 분산과 모 분산을 반환합니다. VAR\$1SAMP 함수의 결과는 동일한 값 집합의 표본 표준 편차를 제곱한 것과 동일합니다.

VAR\$1SAMP 및 VARIANCE는 동일한 함수이기 때문에 동의어나 마찬가지입니다.

## 구문
<a name="r_VARIANCE_functions-syntax"></a>

```
VAR_SAMP | VARIANCE ( [ DISTINCT | ALL ] expression)
VAR_POP ( [ DISTINCT | ALL ] expression)
```

표현식의 데이터 형식은 정수, 소수 또는 부동 소수점이 되어야 합니다. 표현식의 데이터 형식과 상관없이 이 함수의 반환 형식은 배정밀도 숫자입니다.

**참고**  
두 함수의 결과는 데이터 웨어하우스 클러스터에서 각각 클러스터 구성에 따라 다를 수 있습니다.

## 사용 노트
<a name="r_VARIANCE_usage_notes"></a>

단일 값으로 구성된 표현식에 대해 표본 분산(VARIANCE 또는 VAR\$1SAMP)을 계산할 경우 함수 결과는 0이 아닌 NULL이 됩니다.

## 예제
<a name="r_VARIANCE_functions-examples"></a>

다음 쿼리는 LISTING 테이블에서 NUMTICKETS 열의 표본 및 모 분산을 반올림하여 반환합니다.

```
select avg(numtickets),
round(var_samp(numtickets)) varsamp,
round(var_pop(numtickets)) varpop
from listing;

avg | varsamp | varpop
-----+---------+--------
10 |      54 |     54
(1 row)
```

다음 쿼리는 동일한 계산을 실행하지만 결과를 소수 값으로 변환합니다.

```
select avg(numtickets),
cast(var_samp(numtickets) as dec(10,4)) varsamp,
cast(var_pop(numtickets) as dec(10,4)) varpop
from listing;

avg | varsamp | varpop
-----+---------+---------
10 | 53.6291 | 53.6288
(1 row)
```

# 배열 함수
<a name="c_Array_Functions"></a>

다음에서 Amazon Redshift가 배열 액세스 및 조작을 지원하는 SQL용 배열 함수에 대한 설명을 찾을 수 있습니다.

**Topics**
+ [ARRAY 함수](r_array.md)
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)
+ [ARRAY\$1CONTAINS 함수](array_contains.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)
+ [ARRAY\$1EXCEPT 함수](array_except.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)
+ [ARRAY\$1INTERSECTION 함수](array_intersection.md)
+ [ARRAY\$1POSITION 함수](array_position.md)
+ [ARRAY\$1POSITIONS 함수](array_positions.md)
+ [ARRAY\$1SORT 함수](array_sort.md)
+ [ARRAY\$1UNION 함수](array_union.md)
+ [ARRAYS\$1OVERLAP 함수](arrays_overlap.md)
+ [GET\$1ARRAY\$1LENGTH 함수](get_array_length.md)
+ [GET\$1ARRAY\$1LENGTH 함수](split_to_array.md)
+ [SUBARRAY 함수](r_subarray.md)

# ARRAY 함수
<a name="r_array"></a>

SUPER 데이터 형식의 배열을 만듭니다.

## 구문
<a name="r_array-synopsis"></a>

```
ARRAY( [ expr1 ] [, expr2 [, ... ]] )
```

## 인수
<a name="r_array-argument"></a>

 *expr1, expr2*   
Amazon Redshift는 날짜 및 시간 형식을 SUPER 데이터 형식으로 캐스팅하지 않으므로 날짜 및 시간 형식을 제외한 모든 Amazon Redshift 데이터 형식의 표현식입니다. 인수는 동일한 데이터 형식일 필요는 없습니다.

## 반환 타입
<a name="r_array-return-type"></a>

ARRAY 함수는 SUPER 데이터 형식을 반환합니다.

## 예제
<a name="r_array-example"></a>

다음 예에서는 숫자 값의 배열과 다양한 데이터 형식의 배열을 보여줍니다.

```
--an array of numeric values
select ARRAY(1,50,null,100);
      array
------------------
 [1,50,null,100]
(1 row)

--an array of different data types
select ARRAY(1,'abc',true,3.14);
        array
-----------------------
 [1,"abc",true,3.14]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="r_array-see-also"></a>
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)
+ [GET\$1ARRAY\$1LENGTH 함수](split_to_array.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)

# ARRAY\$1CONCAT 함수
<a name="r_array_concat"></a>

두 배열을 연결하여 첫 번째 배열의 모든 요소와 두 번째 배열의 모든 요소를 차례로 포함하는 배열을 생성합니다. 두 인수는 유효한 SUPER 배열이어야 합니다.

## 구문
<a name="r_array_concat-synopsis"></a>

```
ARRAY_CONCAT( array1, array2 )
```

## 인수
<a name="r_array_concat-argument-arguments"></a>

 *array1*  
연결할 두 배열 중 첫 번째를 지정하는 값입니다.

 *array2*  
연결할 두 배열 중 두 번째를 지정하는 값입니다.

## 반환 타입
<a name="r_array_concat-return-type"></a>

ARRAY\$1CONCAT 함수는 SUPER 데이터 값을 반환합니다.

## 예제
<a name="r_array_concat-example"></a>

다음 예에서는 형식이 같은 두 배열의 연결과 형식이 다른 두 배열의 연결을 보여줍니다.

```
-- concatenating two arrays 
SELECT ARRAY_CONCAT(ARRAY(10001,10002),ARRAY(10003,10004));
              array_concat
------------------------------------
 [10001,10002,10003,10004]
(1 row)

-- concatenating two arrays of different types 
SELECT ARRAY_CONCAT(ARRAY(10001,10002),ARRAY('ab','cd'));
          array_concat
------------------------------
 [10001,10002,"ab","cd"]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="r_array_concat-see-also"></a>
+ [ARRAY\$1UNION 함수](array_union.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)
+ [GET\$1ARRAY\$1LENGTH 함수](split_to_array.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)

# ARRAY\$1CONTAINS 함수
<a name="array_contains"></a>

배열에 지정된 값이 포함되어 있는지 확인하고 발견된 경우 TRUE를 반환합니다.

## 구문
<a name="array_contains-syntax"></a>

```
ARRAY_CONTAINS( array, value [, null_match] )
```

## 인수
<a name="array_contains-arguments"></a>

 *배열*   
검색할 배열을 지정하는 SUPER 표현식입니다.

 * 값*   
검색할 요소를 지정하는 값입니다.

 *null\$1match*   
Null 값을 처리하는 방법을 지정하는 부울 값입니다.  
+ *null\$1match* = FALSE: NULL을 검색하면 NULL이 반환됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 NULL을 반환합니다.
+ *null\$1match* = TRUE: NULL이 유효하고 검색 가능한 요소로 처리됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 FALSE를 반환합니다.
기본값은 TRUE입니다.  
기본 Null 처리는 구성 옵션에서도 지정할 수 있습니다.  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 반환 타입
<a name="array_contains-return-type"></a>

ARRAY\$1CONTAINS 함수는 BOOLEAN 유형을 반환합니다.

## 예제
<a name="array_contains-example"></a>

다음 예제에서는 ARRAY\$1CONTAINS 함수를 보여 줍니다.

```
SELECT ARRAY_CONTAINS(ARRAY('red', 'green'), 'red');
array_contains
----------------
 t
(1 row)
```

다음 예제에서는 *null\$1match*가 TRUE로 설정된 함수 동작을 보여 줍니다.

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), NULL);
array_contains
----------------
 t
(1 row)

-- The array can contain NULLs
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'blue', TRUE);
array_contains
----------------
 f
(1 row)
```

다음 예제에서는 *null\$1match*가 FALSE로 설정된 함수 동작을 보여 줍니다. 함수에서 *null\$1match* 동작을 지정하면 기본 구성 설정이 재정의됩니다.

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_CONTAINS(ARRAY('red', 'green'), NULL, FALSE);
array_contains
----------------
 
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'green');
array_contains
----------------
 t
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'blue');
array_contains
----------------
 
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_contains-see-also"></a>
+ [ARRAY\$1POSITION 함수](array_position.md)
+ [ARRAY\$1POSITIONS 함수](array_positions.md)
+ [ARRAYS\$1OVERLAP 함수](arrays_overlap.md)

# ARRAY\$1DISTINCT 함수
<a name="array_distinct"></a>

입력 배열에서 고유한 요소만 포함하는 새 배열을 생성하여 모든 중복을 제거합니다. 출력 배열의 요소 순서는 입력 순서와 일치하지 않습니다. Null 값은 유효한 요소로 처리됩니다. 입력 배열에 여러 Null이 있는 경우 출력에 Null이 하나만 나타납니다.

## 구문
<a name="array_distinct-syntax"></a>

```
ARRAY_DISTINCT( array )
```

## 인수
<a name="array_distinct-arguments"></a>

 *배열*   
배열을 지정하는 SUPER 표현식입니다.

## 반환 타입
<a name="array_distinct-return-type"></a>

ARRAY\$1DISTINCT 함수는 SUPER 형식을 반환합니다.

## 예제
<a name="array_distinct-example"></a>

다음 예제에서는 ARRAY\$1DISTINCT 함수를 보여 줍니다.

```
SELECT ARRAY_DISTINCT(ARRAY(1, 1, 'a', 'a', NULL, NULL));
 array_distinct 
----------------
 [1,"a",null]
(1 row)

SELECT ARRAY_DISTINCT(ARRAY_CONCAT(ARRAY(1,2,3,3),ARRAY(2,3,4,4)));
 array_distinct 
----------------
 [1,2,3,4]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_distinct-see-also"></a>
+ [ARRAY\$1UNION 함수](array_union.md)
+ [ARRAY\$1SORT 함수](array_sort.md)
+ [ARRAY\$1EXCEPT 함수](array_except.md)
+ [ARRAY\$1INTERSECTION 함수](array_intersection.md)

# ARRAY\$1EXCEPT 함수
<a name="array_except"></a>

두 번째 배열에 없는 첫 번째 배열의 요소를 유지하여 두 배열 간의 차이를 반환합니다. 함수는 Null 안전이므로 Null이 알려진 객체로 취급됩니다.

## 구문
<a name="array_except-syntax"></a>

```
ARRAY_EXCEPT( array1, array2 [, distinct] )
```

## 인수
<a name="array_except-arguments"></a>

 *array1*   
첫 번째 배열을 지정하는 SUPER 표현식입니다.

 *array2*   
두 번째 배열을 지정하는 SUPER 표현식입니다.

 *distinct*   
고유 요소만 반환할지 여부를 지정하는 부울 값입니다.  
+ *distinct* = FALSE: 다중 세트 의미 체계가 적용됩니다. 첫 번째 배열의 각 요소 발생은 두 번째 배열의 발생과 일치합니다. 첫 번째 배열이 두 번째 배열보다 요소 발생 횟수가 많으면 추가 발생 횟수가 결과에 보존됩니다.
+ *distinct* = TRUE: 의미 체계 설정이 적용됩니다. 두 배열 모두 중복 요소를 무시하고 세트로 처리됩니다. 첫 번째 배열의 요소는 발생 횟수에 관계없이 두 번째 배열의 모든 위치에 있는 경우 제거됩니다.
기본값은 FALSE입니다.

## 반환 타입
<a name="array_except-return-type"></a>

ARRAY\$1EXCEPT 함수는 SUPER 형식을 반환합니다.

## 예제
<a name="array_except-example"></a>

다음 예제에서는 ARRAY\$1EXCEPT 함수를 보여 줍니다.

```
SELECT ARRAY_EXCEPT(ARRAY('a','b','c'), ARRAY('b','c','d'));
 array_except
--------------
 ["a"]
(1 row)
```

다중 세트 의미 체계:

```
SELECT ARRAY_EXCEPT(ARRAY('b','b','b','b'), ARRAY('b','b'));
 array_except
--------------
 ["b","b"]
(1 row)
```

의미 체계 설정:

```
SELECT ARRAY_EXCEPT(ARRAY('a','b','b'), ARRAY('b'), TRUE);
 array_except
--------------
 ["a"]
(1 row)
```

Null이 알려진 객체로 처리됩니다.

```
SELECT ARRAY_EXCEPT(ARRAY('a',NULL), ARRAY(NULL));
 array_except
--------------
 ["a"]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_except-see-also"></a>
+ [ARRAY\$1INTERSECTION 함수](array_intersection.md)
+ [ARRAY\$1UNION 함수](array_union.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)
+ [ARRAYS\$1OVERLAP 함수](arrays_overlap.md)

# ARRAY\$1FLATTEN 함수
<a name="array_flatten"></a>

여러 배열을 SUPER 형식의 단일 배열로 병합합니다. 첫 번째 내부 배열의 요소가 먼저 나타난 다음 후속 내부 배열의 요소가 나타납니다. Null이 알려진 객체로 처리됩니다.

## 구문
<a name="array_flatten-syntax"></a>

```
ARRAY_FLATTEN( array )
```

## 인수
<a name="array_flatten-arguments"></a>

 *배열*   
배열 형식의 SUPER 표현식입니다.

## 반환 타입
<a name="array_flatten-returm-type"></a>

ARRAY\$1FLATTEN 함수는 SUPER 형식을 반환합니다.

## 예제
<a name="array_flatten-example"></a>

다음 예에서는 ARRAY\$1FLATTEN 함수를 보여 줍니다.

```
SELECT ARRAY_FLATTEN(ARRAY(ARRAY(1,2,3,4),ARRAY(5,6,7,8),ARRAY(9,10)));
     array_flatten
------------------------
 [1,2,3,4,5,6,7,8,9,10]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_flatten-see-also"></a>
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)
+ [SUBARRAY 함수](r_subarray.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)

# ARRAY\$1INTERSECTION 함수
<a name="array_intersection"></a>

두 입력 배열 모두에 존재하는 요소만 포함하는 새 배열을 반환합니다. 함수는 Null 안전이므로 Null이 알려진 객체로 취급됩니다. 결과에 포함된 요소의 순서는 보장되지 않습니다.

## 구문
<a name="array_intersection-syntax"></a>

```
ARRAY_INTERSECTION( array1, array2 [, distinct] )
```

## 인수
<a name="array_intersection-arguments"></a>

 *array1*   
배열을 지정하는 SUPER 표현식입니다.

 *array2*   
배열을 지정하는 SUPER 표현식입니다.

 *distinct*   
고유 요소만 반환할지 여부를 지정하는 부울 값입니다.  
+ *distinct* = FALSE: 다중 세트 의미 체계가 적용됩니다. 중복 요소는 보존되며 결과에 있는 각 요소의 빈도는 두 입력 배열의 최소 빈도와 같습니다.
+ *distinct* = TRUE: 의미 체계 설정이 적용됩니다. 두 배열에 공통적인 고유한 요소만 중복 없이 반환됩니다.
기본값은 FALSE입니다.

## 반환 타입
<a name="array_intersection-return-type"></a>

ARRAY\$1INTERSECTION 함수는 SUPER 유형을 반환합니다.

## 예제
<a name="array_intersection-example"></a>

다음 예제에서는 ARRAY\$1INTERSECTION 함수를 보여 줍니다.

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','c'), ARRAY('b','c','d'));
 array_intersection 
--------------------
 ["b","c"]
(1 row)
```

다중 세트 의미 체계:

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','b'), ARRAY('b','b','b'));
 array_intersection 
--------------------
 ["b","b"]
(1 row)
```

의미 체계 설정:

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','b'), ARRAY('b','b','b'), TRUE);
 array_intersection 
--------------------
 ["b"]
(1 row)
```

Null이 알려진 객체로 처리됩니다.

```
SELECT ARRAY_INTERSECTION(ARRAY('a',NULL), ARRAY('b',NULL));
 array_intersection 
--------------------
 [null]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_intersection-see-also"></a>
+ [ARRAY\$1EXCEPT 함수](array_except.md)
+ [ARRAYS\$1OVERLAP 함수](arrays_overlap.md)
+ [ARRAY\$1UNION 함수](array_union.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)

# ARRAY\$1POSITION 함수
<a name="array_position"></a>

배열에서 지정된 요소의 첫 번째 발생 위치(인덱스)를 반환합니다. 인덱스는 0 기반입니다. 여기서 0은 첫 번째 요소를 나타내고 1은 두 번째 요소를 나타냅니다. 배열에서 요소를 찾을 수 없는 경우 -1을 반환합니다.

함수는 첫 번째 발생 위치만 반환합니다. 모든 발생 항목을 찾으려면 [ARRAY\$1POSITIONS 함수](array_positions.md) 함수 사용을 고려하세요.

## 구문
<a name="array_position-syntax"></a>

```
ARRAY_POSITION( array, value [, null_match] )
```

## 인수
<a name="array_position-arguments"></a>

 *배열*   
검색할 배열을 지정하는 SUPER 표현식입니다.

 * 값*   
검색할 요소를 지정하는 값입니다.

 *null\$1match*   
Null 값을 처리하는 방법을 지정하는 부울 값입니다.  
+ *null\$1match* = FALSE: NULL을 검색하면 NULL이 반환됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 NULL을 반환합니다.
+ *null\$1match* = TRUE: NULL이 유효하고 검색 가능한 요소로 처리됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 -1을 반환합니다.
기본값은 TRUE입니다.  
기본 Null 처리는 구성 옵션에서도 지정할 수 있습니다.  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 반환 타입
<a name="array_position-return-type"></a>

ARRAY\$1POSITION 함수는 INT 유형을 반환합니다.

## 예제
<a name="array_position-example"></a>

다음 예제에서는 ARRAY\$1POSITION 함수를 보여 줍니다.

```
SELECT ARRAY_POSITION(ARRAY('red', 'green'), 'red');
 array_position 
----------------
              0
(1 row)

SELECT ARRAY_POSITION(ARRAY(1, 2, 3), 4);
 array_position 
----------------
             -1
(1 row)

-- only the position of the first occurrence is returned
SELECT ARRAY_POSITION(ARRAY('red', 'green', 'red'), 'red');
 array_position 
----------------
              0
(1 row)
```

다음 예제에서는 *null\$1match*가 TRUE로 설정된 함수 동작을 보여 줍니다.

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), NULL);
 array_position 
----------------
              1
(1 row)

-- The array can contain NULLs
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'blue', TRUE);
 array_position 
----------------
             -1
(1 row)
```

다음 예제에서는 *null\$1match*가 FALSE로 설정된 함수 동작을 보여 줍니다. 함수에서 *null\$1match* 동작을 지정하면 기본 구성 설정이 재정의됩니다.

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_POSITION(ARRAY('red', 'green'), NULL, FALSE);
 array_position 
----------------
               
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'green');
 array_position 
----------------
              2
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'blue');
 array_position 
----------------
               
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_position-see-also"></a>
+ [ARRAY\$1POSITIONS 함수](array_positions.md)
+ [ARRAY\$1CONTAINS 함수](array_contains.md)
+ [SUBARRAY 함수](r_subarray.md)

# ARRAY\$1POSITIONS 함수
<a name="array_positions"></a>

지정된 요소가 입력 배열에 나타나는 위치 배열(인덱스)을 반환합니다. 인덱스는 0 기반입니다. 여기서 0은 첫 번째 요소를 나타내고 1은 두 번째 요소를 나타냅니다. 요소를 찾을 수 없는 경우 빈 배열을 반환합니다.

## 구문
<a name="array_positions-syntax"></a>

```
ARRAY_POSITIONS( array, value [, null_match] )
```

## 인수
<a name="array_positions-arguments"></a>

 *배열*   
검색할 배열을 지정하는 SUPER 표현식입니다.

 * 값*   
검색할 요소를 지정하는 값입니다.

 *null\$1match*   
Null 값을 처리하는 방법을 지정하는 부울 값입니다.  
+ *null\$1match* = FALSE: NULL을 검색하면 NULL이 반환됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 NULL을 반환합니다.
+ *null\$1match* = TRUE: NULL이 유효하고 검색 가능한 요소로 처리됩니다. 배열에 NULL 값이 포함되어 있고 NULL이 아닌 검색 값에 대해 일치하는 항목이 없는 경우에는 빈 배열을 반환합니다.
기본값은 TRUE입니다.  
기본 Null 처리는 구성 옵션에서도 지정할 수 있습니다.  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 반환 타입
<a name="array_positions-return-type"></a>

ARRAY\$1POSITIONS 함수는 SUPER 형식을 반환합니다.

## 예제
<a name="array_positions-example"></a>

다음 예제에서는 ARRAY\$1POSITIONS 함수를 보여 줍니다.

```
SELECT ARRAY_POSITIONS(ARRAY('red', 'green', 'red'), 'red');
 array_positions 
-----------------
 [0,2]
(1 row)

SELECT ARRAY_POSITIONS(ARRAY(1, 2, 3), 4);
 array_positions 
-----------------
 []
(1 row)
```

다음 예제에서는 *null\$1match*가 TRUE로 설정된 함수 동작을 보여 줍니다.

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green', NULL), NULL);
 array_positions 
-----------------
 [1,3]
(1 row)

-- The array can contain NULLs
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'blue', TRUE);
 array_positions 
-----------------
 []
(1 row)
```

다음 예제에서는 *null\$1match*가 FALSE로 설정된 함수 동작을 보여 줍니다. 함수에서 *null\$1match* 동작을 지정하면 기본 구성 설정이 재정의됩니다.

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_POSITIONS(ARRAY('red', 'green'), NULL, FALSE);
 array_positions 
-----------------
 
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'green');
 array_positions 
-----------------
 [2]
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'blue');
 array_positions 
-----------------
 
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_positions-see-also"></a>
+ [ARRAY\$1POSITION 함수](array_position.md)
+ [ARRAY\$1CONTAINS 함수](array_contains.md)
+ [SUBARRAY 함수](r_subarray.md)

# ARRAY\$1SORT 함수
<a name="array_sort"></a>

입력 배열의 정렬된 버전을 오름차순 또는 내림차순으로 생성합니다. 결과에 Null 값이 나타날 위치를 지정할 수 있습니다. 함수는 Null 안전이므로 Null이 알려진 객체로 취급됩니다.

## 구문
<a name="array_sort-syntax"></a>

```
ARRAY_SORT( array [, sort_ascending [, nulls_first]] )
```

## 인수
<a name="array_sort-arguments"></a>

 *배열*   
정렬할 배열을 지정하는 SUPER 표현식입니다.

 *sort\$1ascending*   
배열을 오름차순 또는 내림차순으로 정렬할지 여부를 지정하는 부울 값입니다.  
+ 요소를 오름차순으로 정렬하려면 TRUE를 지정합니다.
+ 요소를 내림차순으로 정렬하려면 FALSE를 지정합니다.
기본값은 TRUE입니다.

 *nulls\$1first*   
Null 위치를 지정하는 부울 값입니다.  
+ 정렬된 배열의 시작 부분에 NULL을 배치하려면 TRUE를 지정합니다.
+ 정렬된 배열의 끝 부분에 NULL을 배치하려면 FALSE를 지정합니다.

## 반환 타입
<a name="array_sort-return-type"></a>

ARRAY\$1SORT 함수는 SUPER 형식을 반환합니다.

## Note
<a name="array_sort-note"></a>

혼합 데이터 형식이 포함된 배열을 정렬할 때 요소는 다음 형식 우선 순위에 따라 정렬됩니다.
+ 부울 값
+ 숫자 값
+ 문자열 값
+ 배열
+ 객체/딕셔너리

각 유형 범주 내에서 요소는 자연 순서에 따라 정렬됩니다(예: 숫자는 숫자로 정렬되고 문자열은 알파벳순으로 정렬됨).

## 예제
<a name="array_sort-example"></a>

다음 예제에서는 ARRAY\$1SORT 함수를 보여 줍니다.

```
-- Ascending order (default)
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false));
        array_sort        
--------------------------
 [false,0,1,"a","b",null]
(1 row)

-- Descending order
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false), False);
        array_sort        
--------------------------
 [null,"b","a",1,0,false]
(1 row)

-- Descending order with NULLs at the end of the sorted array
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false), False, False);
        array_sort        
--------------------------
 ["b","a",1,0,false,null]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_sort-see-also"></a>
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)
+ [SUBARRAY 함수](r_subarray.md)

# ARRAY\$1UNION 함수
<a name="array_union"></a>

두 배열을 결합하고 모든 고유 값을 포함하는 단일 배열을 반환하여 중복을 제거합니다. 함수는 Null 안전이므로 Null이 알려진 객체로 취급됩니다. 결과에 포함된 요소의 순서는 보장되지 않습니다.

## 구문
<a name="array_union-syntax"></a>

```
ARRAY_UNION( array1, array2 )
```

## 인수
<a name="array_union-arguments"></a>

 *array1*   
첫 번째 배열을 지정하는 SUPER 표현식입니다.

 *array2*   
두 번째 배열을 지정하는 SUPER 표현식입니다.

## 반환 타입
<a name="array_union-return-type"></a>

ARRAY\$1UNION 함수는 SUPER 유형을 반환합니다.

## 예제
<a name="array_union-example"></a>

다음 예제에서는 ARRAY\$1UNION 함수를 보여 줍니다.

```
SELECT ARRAY_UNION(ARRAY('a','b','b'), ARRAY('b','c','c'));
  array_union  
---------------
 ["a","b","c"]
(1 row)
```

요소의 순서는 보장되지 않습니다.

```
SELECT ARRAY_UNION(ARRAY('b','a','b'), ARRAY(NULL,'b',NULL));
  array_union   
----------------
 ["b","a",null]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="array_union-see-also"></a>
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)
+ [ARRAY\$1DISTINCT 함수](array_distinct.md)
+ [ARRAY\$1INTERSECTION 함수](array_intersection.md)
+ [ARRAY\$1EXCEPT 함수](array_except.md)

# ARRAYS\$1OVERLAP 함수
<a name="arrays_overlap"></a>

두 배열에 공통 요소가 있는지 확인합니다. 배열이 하나 이상의 요소를 공유하는 경우 TRUE를 반환하고 공통 요소가 없는 경우 FALSE를 반환합니다. 함수는 Null 안전이므로 Null이 알려진 객체로 취급됩니다.

## 구문
<a name="arrays_overlap-syntax"></a>

```
ARRAYS_OVERLAP( array1, array2 )
```

## 인수
<a name="arrays_overlap-arguments"></a>

 *array1*   
배열을 지정하는 SUPER 표현식입니다.

 *array2*   
배열을 지정하는 SUPER 표현식입니다.

## 반환 타입
<a name="arrays_overlap-return-type"></a>

ARRAYS\$1OVERLAP 함수는 부울 유형을 반환합니다.

## 예제
<a name="arrays_overlap-example"></a>

다음 예제에서는 ARRAYS\$1OVERLAP 함수를 보여 줍니다.

```
SELECT ARRAYS_OVERLAP(ARRAY('blue', 'green'), ARRAY('red', 'green'));
 arrays_overlap 
----------------
 t
(1 row)
```

다음 예제에서는 Null 유효한 요소로 처리됨을 보여 줍니다.

```
SELECT ARRAYS_OVERLAP(ARRAY('red', NULL, 'blue'), ARRAY('green', NULL));
 arrays_overlap 
----------------
 t
(1 row)

SELECT ARRAYS_OVERLAP(ARRAY('red', NULL, 'blue'), ARRAY('green'));
 arrays_overlap 
----------------
 f
(1 row)

SELECT ARRAYS_OVERLAP(JSON_PARSE('[null]'), ARRAY(NULL));
 arrays_overlap 
----------------
 t
(1 row)
```

## 다음 사항도 참조하세요.
<a name="arrays_overlap-see-also"></a>
+ [ARRAY\$1INTERSECTION 함수](array_intersection.md)
+ [ARRAY\$1CONTAINS 함수](array_contains.md)
+ [ARRAY\$1EXCEPT 함수](array_except.md)

# GET\$1ARRAY\$1LENGTH 함수
<a name="get_array_length"></a>

객체 또는 배열 경로가 지정된 SUPER 배열의 길이를 반환합니다.

## 구문
<a name="get_array_length-syntax"></a>

```
GET_ARRAY_LENGTH( super_expr )
```

## 인수
<a name="get_array_length-arguments"></a>

 *super\$1expr*   
배열 형식의 유효한 SUPER 표현식입니다.

## 반환 타입
<a name="get_array_length-returm-type"></a>

GET\$1ARRAY\$1LENGTH 함수는 INT를 반환합니다.

## 예제
<a name="get_array_length-example"></a>

다음 예에서는 GET\$1ARRAY\$1LENGTH 함수를 보여 줍니다.

```
SELECT GET_ARRAY_LENGTH(ARRAY(1,2,3,4,5,6,7,8,9,10));
 get_array_length
----------------------
            10
(1 row)
```

# GET\$1ARRAY\$1LENGTH 함수
<a name="split_to_array"></a>

구분 기호를 옵션 파라미터로 사용합니다. 구분 기호가 없는 경우 기본값은 쉼표입니다.

## 구문
<a name="split_to_array-syntax"></a>

```
SPLIT_TO_ARRAY( string, delimiter )
```

## 인수
<a name="split_to_array-arguments"></a>

 **문자열**   
분할할 입력 문자열입니다.

 **delimiter**   
입력 문자열이 분할될 옵션 값입니다. 기본값은 쉼표입니다.

## 반환 타입
<a name="split_to_array-return-type"></a>

GET\$1ARRAY\$1LENGTH 함수는 SUPER 데이터 값을 반환합니다.

## 예제
<a name="split_to_array-example"></a>

다음 예에서는 SPLIT\$1TO\$1ARRAY 함수를 보여 줍니다.

```
SELECT SPLIT_TO_ARRAY('12|345|6789', '|');
     split_to_array
-------------------------
 ["12","345","6789"]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="split_to_array-see-also"></a>
+ [ARRAY 함수](r_array.md)
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)
+ [SUBARRAY 함수](r_subarray.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)

# SUBARRAY 함수
<a name="r_subarray"></a>

지정된 위치에서 시작하는 배열의 일부를 추출합니다. 입력 배열에서 지정된 수의 요소가 포함된 새 배열을 반환합니다.

## 구문
<a name="r_subarray-syntax"></a>

```
SUBARRAY( super_expr, start_position, length )
```

## 인수
<a name="r_subarray-arguments"></a>

*super\$1expr*  
배열 형식의 유효한 SUPER 표현식입니다.

*start\$1position*  
추출을 위한 시작 위치를 지정하는 정수입니다. 인덱스는 0 기반이며, 여기서 0은 첫 번째 요소를 나타냅니다. start\$1position이 배열 길이를 초과하면 빈 배열이 반환됩니다.

*length*  
추출할 요소 수를 지정하는 선택적 정수입니다. 생략하면 시작 위치에서 배열 끝까지 모든 요소가 반환됩니다.

## 반환 타입
<a name="r_subarray-return-type"></a>

SUBARRAY 함수는 SUPER 데이터 값을 반환합니다.

## 예제
<a name="r_subarray-examples"></a>

다음은 SUBARRAY 함수 예제입니다.

```
 SELECT SUBARRAY(ARRAY('a', 'b', 'c', 'd', 'e', 'f'), 2, 3);
   subarray
---------------
 ["c","d","e"]
(1 row)
```

## 다음 사항도 참조하세요.
<a name="r_subarray-see-also"></a>
+ [ARRAY\$1POSITION 함수](array_position.md)
+ [ARRAY\$1POSITIONS 함수](array_positions.md)
+ [ARRAY\$1FLATTEN 함수](array_flatten.md)
+ [ARRAY\$1CONCAT 함수](r_array_concat.md)

# 비트 단위 집계 함수
<a name="c_bitwise_aggregate_functions"></a>

비트 단위 집계 함수는 정수 값으로 변환하거나 반올림할 수 있는 정수 열과 열의 집계를 수행하기 위해 비트 연산을 계산합니다.

**Topics**
+ [비트 단위 집계 시 NULL 사용](#c_bitwise_aggregate_functions-nulls-in-bit-wise-aggregations)
+ [비트 단위 집계를 위한 DISTINCT 지원](#distinct-support-for-bit-wise-aggregations)
+ [비트 단위 함수의 개요 예](#r_bitwise_example)
+ [BIT\$1AND 함수](r_BIT_AND.md)
+ [BIT\$1OR 함수](r_BIT_OR.md)
+ [BOOL\$1AND 함수](r_BOOL_AND.md)
+ [BOOL\$1OR 함수](r_BOOL_OR.md)

## 비트 단위 집계 시 NULL 사용
<a name="c_bitwise_aggregate_functions-nulls-in-bit-wise-aggregations"></a>

NULL 값을 허용하는 열에 비트 단위 함수를 적용하면 함수 결과를 계산하기 전에 모든 NULL 값이 제거됩니다. 집계가 가능한 행이 없을 경우에는 비트 단위 함수가 NULL을 반환합니다. 정규 집계 함수에도 동일한 방식이 적용됩니다. 다음은 한 예입니다.

```
select sum(venueseats), bit_and(venueseats) from venue
where venueseats is null;

sum  | bit_and
------+---------
null |    null
(1 row)
```

## 비트 단위 집계를 위한 DISTINCT 지원
<a name="distinct-support-for-bit-wise-aggregations"></a>

다른 집계 함수와 마찬가지로 비트 단위 함수도 DISTINCT 키워드를 지원합니다.

하지만 이 함수에 DISTINCT를 사용하더라도 결과에는 아무런 영향도 미치지 않습니다. 값의 첫 번째 인스턴스는 비트 단위 AND 또는 OR 연산을 충족하기에 충분합니다. 평가 중인 표현식에 중복 값이 있는 경우에는 차이가 없습니다.

오히려 DISTINCT 처리 시 쿼리 실행에 따른 일부 오버헤드가 발생할 가능성이 많기 때문에 비트 단위 함수에서는 DISTINCT를 사용하지 않는 것이 좋습니다.

## 비트 단위 함수의 개요 예
<a name="r_bitwise_example"></a>

다음에서 비트 단위 함수로 작업하는 방법을 보여주는 몇 가지 개요 예를 찾을 수 있습니다. 각 함수 설명과 함께 특정 코드 예제를 찾을 수도 있습니다.

비트 단위 함수의 예는 TICKIT 샘플 데이터베이스를 기반으로 합니다. TICKIT 샘플 데이터베이스의 USERS 테이블에는 스포츠, 영화, 오페라 등 다양한 이벤트 유형에 대한 각 사용자의 호불호를 나타내는 몇 가지 부울 열이 포함되어 있습니다. 예를 들면 다음과 같습니다.

```
select userid, username, lastname, city, state, 
likesports, liketheatre
from users limit 10;

userid | username | lastname  |     city     | state | likesports | liketheatre
-------+----------+-----------+--------------+-------+------------+-------------
1 | JSG99FHE | Taylor    | Kent         | WA    | t          | t
9 | MSD36KVR | Watkins   | Port Orford  | MD    | t          | f
```

USERS 테이블의 새 버전이 다른 방식으로 빌드되었다고 가정합니다. 이 새 버전에서는 각 사용자가 좋아하거나 좋아하지 않는 8가지 유형의 이벤트를 이진 형식으로 정의하는 단일 정수 열입니다. 이 설계에서 각 비트 위치는 이벤트 유형을 나타냅니다. 8가지 유형을 모두 좋아하는 사용자는 다음 표의 첫 번째 행과 같이 8개 비트 모두 1로 설정합니다. 반대로 이벤트를 모두 좋아하지 않는 사용자는 두 번째 행과 같이 8개 비트가 모두 0으로 설정됩니다. 그리고 스포츠와 재즈만 좋아하는 사용자는 세 번째 행과 같이 표현됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_bitwise_aggregate_functions.html)

데이터베이스 테이블에서는 이러한 이진 값들 모두 다음과 같이 LIKES 열 하나에 정수로 저장됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_bitwise_aggregate_functions.html)

# BIT\$1AND 함수
<a name="r_BIT_AND"></a>

BIT\$1AND 함수는 단일 정수 열 또는 표현식의 모든 값에 대해 비트 단위 AND 연산을 실행합니다. 이 함수는 표현식에서 각 정수 값에 해당하는 각 이진 값의 개별 비트를 집계합니다.

모든 값에서 1로 설정된 비트가 없는 경우에는 BIT\$1AND 함수가 결과로 `0`을 반환합니다. 모든 값에서 1로 설정된 비트가 1개 이상인 경우에는 함수가 정수 값을 반환합니다. 이 정수는 1로 설정된 비트의 이진 값에 해당하는 수입니다.

예를 들어 한 테이블의 열에 정수 값으로 3, 7, 10 및 22가 포함되어 있다고 가정할 때 이 정수의 이진 값은 다음과 같이 표현됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_BIT_AND.html)

이 데이터 세트에서 BIT\$1AND 연산을 실행하면 두 번째부터 마지막 자리까지만 모든 비트가 `1`로 설정되는 것을 알 수 있습니다. 결과는 정수 값 `2`를 나타내는 `00000010`의 이진 값입니다. 따라서 BIT\$1AND 함수는 `2`를 반환합니다.

## 구문
<a name="r_BIT_AND-synopsis"></a>

```
BIT_AND ( [DISTINCT | ALL] expression )
```

## 인수
<a name="r_BIT_AND-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. 이 표현식의 데이터 형식은 INT, INT2 또는 INT8이 되어야 합니다. 함수도 동일한 INT, INT2 또는 INT8 데이터 형식을 반환합니다.

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 함수가 결과를 계산하기 전에 지정한 표현식의 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. 자세한 내용은 [비트 단위 집계를 위한 DISTINCT 지원](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations) 섹션을 참조하세요.

## 예제
<a name="r_bit_end_example"></a>

유의적인 비즈니스 정보가 정수 열에 저장된다는 점을 고려했을 때 비트 단위 함수를 사용하여 해당 정보를 추출하거나 집계할 수 있습니다. 다음은 BIT\$1AND 함수를 USERLIKES라는 테이블의 LIKES 열에 적용한 후 CITY 열을 기준으로 그 결과를 그룹화한 쿼리입니다.

```
select city, bit_and(likes) from userlikes group by city 
order by city;
city          | bit_and
--------------+---------
Los Angeles   |       0
Sacramento    |       0
San Francisco |       0
San Jose      |      64
Santa Barbara |     192
(5 rows)
```

이 결과를 다음과 같이 해석할 수 있습니다.
+ Santa Barbara 시의 정수 값 `192`을 이진 값으로 변환하면 `11000000`이 됩니다. 다시 말해서 이 도시의 사용자들은 모두 스포츠와 영화는 좋아하지만 다른 유형의 이벤트는 좋아하지 않습니다.
+ 정수 `64`는 `01000000`으로 변환됩니다. 따라서 San Jose의 사용자가 모두 좋아하는 유일한 이벤트 유형은 theatre입니다.
+ 나머지 3개 도시는 정수 값이 `0`이므로 이 도시의 사용자들은 모두 좋아하는 이벤트 유형이 없는 것을 의미합니다.

# BIT\$1OR 함수
<a name="r_BIT_OR"></a>

BIT\$1OR 함수는 단일 정수 열 또는 표현식의 모든 값에 대해 비트 단위 OR 연산을 실행합니다. 이 함수는 표현식에서 각 정수 값에 해당하는 각 이진 값의 개별 비트를 집계합니다.

예를 들어 한 테이블의 열에 정수 값으로 3, 7, 10 및 22가 포함되어 있다고 가정합니다. 이 정수의 이진 값은 다음과 같이 표현됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_BIT_OR.html)

BIT\$1OR 함수를 정수 값 집합에 적용하면 연산은 각 위치에서 `1`이 있는 값을 찾습니다. 이때 `1`은 최소 1개 이상의 값에서 마지막 5자리에 존재하기 때문에 이진 값으로 `00011111`이 산출되고, 이에 따라 함수는 `31`(`16 + 8 + 4 + 2 + 1`)을 반환합니다.

## 구문
<a name="r_BIT_OR-synopsis"></a>

```
BIT_OR ( [DISTINCT | ALL] expression )
```

## 인수
<a name="r_BIT_OR-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. 이 표현식의 데이터 형식은 INT, INT2 또는 INT8이 되어야 합니다. 함수도 동일한 INT, INT2 또는 INT8 데이터 형식을 반환합니다.

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 함수가 결과를 계산하기 전에 지정한 표현식의 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. 자세한 내용은 [비트 단위 집계를 위한 DISTINCT 지원](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations) 섹션을 참조하세요.

## 예제
<a name="r_bit_or_example"></a>

다음은 BIT\$1OR 함수를 USERLIKES라는 테이블의 LIKES 열에 적용한 후 CITY 열을 기준으로 그 결과를 그룹화한 쿼리입니다.

```
select city, bit_or(likes) from userlikes group by city
order by city;
city          | bit_or
--------------+--------
Los Angeles   |    127
Sacramento    |    255
San Francisco |    255
San Jose      |    255
Santa Barbara |    255
(5 rows)
```

위의 4개 도시에서는 모든 이벤트 유형을 좋아하는 사용자가 1명 이상입니다(`255=11111111`). 하지만 Los Angeles에서는 스포츠를 제외한 모든 이벤트 유형을 좋아하는 사용자가 1명 이상입니다(`127=01111111`).

# BOOL\$1AND 함수
<a name="r_BOOL_AND"></a>

BOOL\$1AND 함수는 단일 부울 또는 정수 열이나 표현식에서 실행됩니다. 이 함수는 BIT\$1AND 및 BIT\$1OR 함수와 비슷한 로직을 적용합니다. 이 함수의 반환 형식은 부울 값(`true` 또는 `false`)입니다.

집합의 모든 값이 true이면 BOOL\$1AND 함수가 `true`(`t`)를 반환합니다. 하나라도 값이 false이면 함수가 `false`(`f`)를 반환합니다.

## 구문
<a name="r_BOOL_AND-synopsis"></a>

```
BOOL_AND ( [DISTINCT | ALL] expression )
```

## 인수
<a name="r_BOOL_AND-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. 이 표현식의 데이터 형식은 부울 또는 정수가 되어야 합니다. 함수의 반환 형식은 부울입니다.

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 함수가 결과를 계산하기 전에 지정한 표현식의 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. 자세한 내용은 [비트 단위 집계를 위한 DISTINCT 지원](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations) 섹션을 참조하세요.

## 예제
<a name="r_bool_and_example"></a>

부울 함수는 부울 표현식이나 정수 표현식에 대해 사용할 수 있습니다. 예를 들어 다음 쿼리는 TICKIT 데이터베이스에서 부울 열이 일부 포함되어 있는 표준 USERS 테이블을 통해 결과를 반환합니다.

BOOL\$1AND 함수는 5개 행 모두에서 `false`를 반환합니다. 해당 주마다 모든 사용자가 스포츠를 좋아하는 것은 아닙니다.

```
select state, bool_and(likesports) from users 
group by state order by state limit 5;

state | bool_and
------+---------
AB    | f
AK    | f
AL    | f
AZ    | f
BC    | f
(5 rows)
```

# BOOL\$1OR 함수
<a name="r_BOOL_OR"></a>

BOOL\$1OR 함수는 단일 부울 또는 정수 열이나 표현식에서 실행됩니다. 이 함수는 BIT\$1AND 및 BIT\$1OR 함수와 비슷한 로직을 적용합니다. 이 함수의 반환 형식은 부울 값(`true`, `false` 또는 `NULL`)입니다.

집합에서 하나 이상의 값이 `true`이면 BOOL\$1OR 함수가 `true`(`t`)를 반환합니다. 집합의 모든 값이 `false`이면 함수가 `false`(`f`)를 반환합니다. 값을 알 수 없는 경우 NULL을 반환할 수 있습니다.

## 구문
<a name="r_BOOL_OR-synopsis"></a>

```
BOOL_OR ( [DISTINCT | ALL] expression )
```

## 인수
<a name="r_BOOL_OR-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다. 이 표현식의 데이터 형식은 부울 또는 정수가 되어야 합니다. 함수의 반환 형식은 부울입니다.

DISTINCT \$1 ALL  
인수가 DISTINCT일 때는 함수가 결과를 계산하기 전에 지정한 표현식의 중복 값을 모두 제거합니다. 인수가 ALL일 때는 함수가 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. [비트 단위 집계를 위한 DISTINCT 지원](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations)을(를) 참조하세요.

## 예제
<a name="r_bool_or_example"></a>

부울 함수는 부울 표현식이나 정수 표현식에 사용할 수 있습니다. 예를 들어 다음 쿼리는 TICKIT 데이터베이스에서 부울 열이 일부 포함되어 있는 표준 USERS 테이블을 통해 결과를 반환합니다.

BOOL\$1OR 함수는 5개 행 모두에서 `true`를 반환합니다. 즉, 해당 주마다 1명 이상의 사용자가 스포츠를 좋아합니다.

```
select state, bool_or(likesports) from users 
group by state order by state limit 5;

state | bool_or 
------+--------
AB    | t      
AK    | t      
AL    | t       
AZ    | t       
BC    | t       
(5 rows)
```

다음 예는 NULL을 반환합니다.

```
SELECT BOOL_OR(NULL = '123')
               bool_or
------                  
NULL
```

# 조건 표현식
<a name="c_conditional_expressions"></a>

**Topics**
+ [CASE 조건식](r_CASE_function.md)
+ [DECODE 함수](r_DECODE_expression.md)
+ [GREATEST 및 LEAST 함수](r_GREATEST_LEAST.md)
+ [NVL 및 COALESCE 함수](r_NVL_function.md)
+ [NVL2 함수](r_NVL2.md)
+ [NULLIF 함수](r_NULLIF_function.md)

Amazon Redshift는 SQL 표준의 확장인 조건 표현식을 몇 가지 지원합니다.

# CASE 조건식
<a name="r_CASE_function"></a>

CASE 표현식은 다른 언어에서 발견되는 if/then/else 문과 비슷한 조건 표현식입니다. CASE는 다수의 조건이 있을 때 결과를 지정하는 데 사용됩니다. SELECT 명령과 같이 SQL 표현식이 유효한 경우 CASE를 사용합니다.

CASE 표현식은 단순(simple)과 검색(searched), 두 가지 유형이 있습니다.
+ 단순 CASE 표현식에서는 표현식과 값을 비교합니다. 이때 일치하는 부분이 발견되면 THEN 절에서 지정된 작업이 적용됩니다. 일치하는 부분이 발견되지 않으면 ELSE 절에서 지정된 작업이 적용됩니다.
+ 검색 CASE 표현식에서는 각 CASE가 부울 표현식에 따라 평가되고, CASE 문이 처음 일치하는 CASE를 반환합니다. WHEN 절 사이에서 일치하는 부분이 발견되지 않으면 ELSE 절의 작업이 반환됩니다.

## 구문
<a name="r_CASE_function-syntax"></a>

다음은 조건을 일치시키는 데 사용되는 단순 CASE 문입니다.

```
CASE expression
  WHEN value THEN result
  [WHEN...]
  [ELSE result]
END
```

다음은 각 조건을 평가하는 데 사용되는 검색 CASE 문입니다.

```
CASE
  WHEN condition THEN result
  [WHEN ...]
  [ELSE result]
END
```

## 인수
<a name="r_CASE_function-arguments"></a>

 * expression*   
열 이름 또는 유효한 표현식입니다.

 * 값*   
숫자 상수나 문자열 같이 표현식과 함께 비교하는 값입니다.

 * - 결과*   
표현식 또는 부울 조건을 평가할 때 반환되는 대상 값 또는 표현식입니다. 모든 결과 표현식의 데이터 형식은 단일 출력 형식으로 변환할 수 있어야 합니다.

 * 조건*   
true 또는 false로 평가되는 부울 표현식 *condition*이 true이면 CASE 표현식의 값은 조건 다음에 오는 결과이며 나머지 CASE 표현식은 처리되지 않습니다. *condition*이 false이면 이후의 모든 WHEN 절이 평가됩니다. WHEN condition 결과가 true가 아닌 경우 CASE 표현식의 값은 ELSE 절의 결과입니다. ELSE 절을 생략한 상태에서 condition이 true가 아닌 경우 NULL 값이 결과로 반환됩니다.

## 예제
<a name="r_CASE_function-examples"></a>

다음 예시에서는 샘플 TICKIT 데이터의 VENUE 테이블과 SALES 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

VENUE 테이블에 대한 쿼리에서 단순 CASE 표현식을 사용하여 `New York City`를 `Big Apple`로 변경합니다. 그 밖의 도시 이름은 모두 `other`로 변경합니다.

```
select venuecity,
  case venuecity
    when 'New York City'
    then 'Big Apple' else 'other'
  end 
from venue
order by venueid desc;

venuecity        |   case
-----------------+-----------
Los Angeles      | other
New York City    | Big Apple
San Francisco    | other
Baltimore        | other
...
```

검색 CASE 표현식을 사용하여 개별 티켓 판매에 대한 PRICEPAID 값을 기준으로 그룹 번호를 할당합니다.

```
select pricepaid,
  case when pricepaid <10000 then 'group 1'
    when pricepaid >10000 then 'group 2'
    else 'group 3'
  end 
from sales
order by 1 desc;

pricepaid |  case
----------+---------
12624     | group 2
10000     | group 3
10000     | group 3
9996      | group 1
9988      | group 1
...
```

# DECODE 함수
<a name="r_DECODE_expression"></a>

DECODE 표현식은 등식 조건의 결과에 따라 특정 값을 다른 특정 값이나 기본값으로 변경합니다. 이 연산은 단순 CASE 표현식이나 IF-THEN-ELSE 문의 연산과 동일합니다.

## 구문
<a name="r_DECODE_expression-synopsis"></a>

```
DECODE ( expression, search, result [, search, result ]... [ ,default ] )
```

이러한 유형의 표현식은 테이블에 저장된 축약어나 코드를 보고서에 필요한 유의적인 비즈니스 값으로 변경하는 데 유용합니다.

## 파라미터
<a name="r_DECODE_expression-parameters"></a>

 * expression*   
테이블 열과 같이 비교하고자 하는 값의 소스입니다.

 *검색*   
숫자 값이나 문자열 같이 소스 표현식과 비교할 대상 값입니다. 검색 표현식은 단일 고정 값으로 평가되어야 합니다. `age between 20 and 29` 같이 범위 값으로 평가되는 표현식은 지정할 수 없습니다. 이런 경우에는 변경할 값마다 검색/결과 페어를 별도로 지정해야 합니다.  
모든 검색 표현식 인스턴스의 데이터 형식은 동일하거나 호환 가능해야 합니다. *expression*과 *search* 파라미터 역시 호환 가능해야 합니다.

 * - 결과*   
표현식이 검색 값과 일치할 때 쿼리가 반환하는 변경 값입니다. DECODE 표현식에는 검색/결과 페어가 하나 이상 포함되어야 합니다.  
모든 결과 표현식 인스턴스의 데이터 형식은 동일하거나 호환 가능해야 합니다. *result*와 *default* 파라미터 역시 호환 가능해야 합니다.

 *기본값*   
검색 조건이 맞지 않는 경우 사용하는 기본값(옵션)입니다. 기본값을 지정하지 않으면 DECODE 표현식은 NULL을 반환합니다.

## 사용 노트
<a name="decode-expression-usage-notes"></a>

*expression* 값과 *search* 값이 모두 NULL이면 DECODE 결과는 해당하는 *result* 값이 됩니다. 이러한 함수 사용에 대한 설명은 예 섹션을 참조하세요.

이러한 방식으로 사용할 때는 DECODE가 [NVL2 함수](r_NVL2.md)과 비슷하지만 몇 가지 차이점도 있습니다. 차이점에 대한 자세한 내용은 NVL2 사용 시 주의 사항을 참조하세요.

## 예제
<a name="r_DECODE_expression-examples"></a>

다음은 datetable의 caldate 열에 `2008-06-01` 값이 존재할 때 이 값을 `June 1st, 2008`로 변경하는 예입니다. 그 밖에 모든 caldate 값은 NULL로 바뀝니다.

```
select decode(caldate, '2008-06-01', 'June 1st, 2008')
from datetable where month='JUN' order by caldate;

case
----------------
June 1st, 2008

...
(30 rows)
```

다음은 DECODE 예를 사용하여 CATEGORY 테이블에서 축약된 CATNAME 열 5개를 전체 이름으로 변경하고 해당 열의 나머지 값은 `Unknown`으로 변경하는 예입니다.

```
select catid, decode(catname,
'NHL', 'National Hockey League',
'MLB', 'Major League Baseball',
'MLS', 'Major League Soccer',
'NFL', 'National Football League',
'NBA', 'National Basketball Association',
'Unknown')
from category
order by catid;

catid  |	case
-------+---------------------------------
1      | Major League Baseball
2      | National Hockey League
3      | National Football League
4      | National Basketball Association
5      | Major League Soccer
6      | Unknown
7      | Unknown
8      | Unknown
9      | Unknown
10     | Unknown
11     | Unknown
(11 rows)
```

다음은 DECODE 표현식을 사용하여 Colorado와 Nevada에서 VENUESEATS 열에 NULL 값을 가진 장소를 찾아 NULL 값을 0으로 변경하는 예입니다. VENUESEATS 열에 NULL 값이 없으면 결과로 1을 반환합니다.

```
select venuename, venuestate, decode(venueseats,null,0,1)
from venue
where venuestate in('NV','CO')
order by 2,3,1;

venuename	              | venuestate     | case
------------------------------+----------------+-----------
Coors Field                   |	CO	       |   1
Dick's Sporting Goods Park    |	CO	       |   1
Ellie Caulkins Opera House    |	CO	       |   1
INVESCO Field		      |	CO	       |   1
Pepsi Center		      |	CO	       |   1
Ballys Hotel		      |	NV	       |   0
Bellagio Hotel                |	NV	       |   0
Caesars Palace                |	NV	       |   0
Harrahs Hotel                 |	NV	       |   0
Hilton Hotel                  |	NV	       |   0
...						
(20 rows)
```

# GREATEST 및 LEAST 함수
<a name="r_GREATEST_LEAST"></a>

다수의 표현식 목록에서 가장 크거나 가장 작은 값을 반환합니다.

## 구문
<a name="r_GREATEST_LEAST-synopsis"></a>

```
GREATEST (value [, ...])
LEAST (value [, ...])
```

## 파라미터
<a name="r_GREATEST_LEAST-arguments"></a>

*expression\$1list*  
열 이름과 같이 쉼표로 구분된 표현식 목록입니다. 표현식은 모두 공통 데이터 형식으로 변환 가능해야 합니다. 목록에서 NULL 값은 무시됩니다. 표현식이 모두 NULL로 평가되면 결과로 NULL이 반환됩니다.

## 반환 형식
<a name="r_GREATEST_LEAST-returns"></a>

제공된 표현식 목록에서 가장 큰 값(GREATEST) 또는 가장 작은 값(LEAST)을 반환합니다.

## 예제
<a name="r_GREATEST_LEAST-examples"></a>

다음은 `firstname` 또는 `lastname`에서 알파벳 순으로 가장 높은 값을 반환하는 예입니다.

```
select firstname, lastname, greatest(firstname,lastname) from users
where userid < 10
order by 3;

 firstname | lastname  | greatest
-----------+-----------+-----------
 Lars      | Ratliff   | Ratliff
 Reagan    | Hodge     | Reagan
 Colton    | Roy       | Roy
 Barry     | Roy       | Roy
 Tamekah   | Juarez    | Tamekah
 Rafael    | Taylor    | Taylor
 Victor    | Hernandez | Victor
 Vladimir  | Humphrey  | Vladimir
 Mufutau   | Watkins   | Watkins
(9 rows)
```

# NVL 및 COALESCE 함수
<a name="r_NVL_function"></a>

일련의 표현식에서 NULL이 아닌 첫 번째 표현식의 값을 반환합니다. NULL이 아닌 값이 발견되면 목록의 나머지 표현식은 평가되지 않습니다.

NVL은 COALESCE와 동일합니다. 이 둘은 동의어입니다. 이 항목에서는 구문을 설명하고 두 가지에 대한 예제를 모두 제공합니다.

## 구문
<a name="r_NVL_function-synopsis"></a>

```
NVL( expression, expression, ... )
```

COALESCE의 구문은 동일합니다.

```
COALESCE( expression, expression, ... )
```

모든 표현식이 NULL이면 결과는 NULL입니다.

이러한 함수는 기본 값이 없거나 NULL일 때 보조 값을 반환하려는 경우에 유용합니다. 예를 들어 쿼리는 사용 가능한 세 가지 전화번호(휴대폰, 집 또는 회사) 중 첫 번째 전화번호를 반환할 수 있습니다. 함수의 표현식 순서에 따라 평가 순서가 결정됩니다.

## 인수
<a name="r_NVL_function-arguments"></a>

 * expression*   
NULL 상태로 평가되는 표현식(열 이름 등)입니다.

## 반환 타입
<a name="r_NVL_function-returntype"></a>

Amazon Redshift는 입력 식을 기반으로 반환된 값의 데이터 유형을 결정합니다. 입력 표현식의 데이터 유형에 공통 유형이 없는 경우 오류가 반환됩니다.

## 예제
<a name="r_NVL_function-examples"></a>

목록에 정수 표현식이 포함된 경우 함수는 정수를 반환합니다.

```
SELECT COALESCE(NULL, 12, NULL);

coalesce
--------------
12
```

이 예는 NVL을 사용한다는 점을 제외하면 이전 예와 동일하며 동일한 결과를 반환합니다.

```
SELECT NVL(NULL, 12, NULL);

coalesce
--------------
12
```

다음은 문자열 유형을 반환하는 예입니다.

```
SELECT COALESCE(NULL, 'Amazon Redshift', NULL);

coalesce
--------------
Amazon Redshift
```

다음 예에서는 표현식 목록에서 데이터 유형이 다양하기 때문에 오류가 발생합니다. 이 경우 목록에 문자열 유형과 숫자 유형이 모두 있습니다.

```
SELECT COALESCE(NULL, 'Amazon Redshift', 12);
ERROR: invalid input syntax for integer: "Amazon Redshift"
```

이 예에서는 START\$1DATE 및 END\$1DATE 열과 함께 테이블을 생성한 후 NULL 값이 포함된 행을 삽입합니다. 그런 다음 NVL 표현식을 두 열에 적용합니다.

```
create table datetable (start_date date, end_date date);           
insert into datetable values ('2008-06-01','2008-12-31');
insert into datetable values (null,'2008-12-31');
insert into datetable values ('2008-12-31',null);
```

```
select nvl(start_date, end_date)
from datetable
order by 1;
               
coalesce
------------
2008-06-01
2008-12-31
2008-12-31
```

NVL 표현식의 기본 열 이름이 COALESCE입니다. 다음 쿼리에서도 동일한 결과가 반환됩니다.

```
select coalesce(start_date, end_date)
from datetable
order by 1;
```

다음 예제 쿼리에서는 샘플 호텔 예약 정보가 포함된 테이블을 만들고 여러 행을 삽입합니다. 일부 레코드에는 NULL 값이 포함되어 있습니다.

```
create table booking_info (booking_id int, booking_code character(8), check_in date, check_out date, funds_collected numeric(12,2));
```

다음 샘플 데이터를 삽입합니다. 일부 레코드에는 `check_out` 날짜 또는 `funds_collected` 금액이 없습니다.

```
insert into booking_info values (1, 'OCEAN_WV', '2023-02-01','2023-02-03',100.00);
insert into booking_info values (2, 'OCEAN_WV', '2023-04-22','2023-04-26',120.00);
insert into booking_info values (3, 'DSRT_SUN', '2023-03-13','2023-03-16',125.00);
insert into booking_info values (4, 'DSRT_SUN', '2023-06-01','2023-06-03',140.00);
insert into booking_info values (5, 'DSRT_SUN', '2023-07-10',null,null);
insert into booking_info values (6, 'OCEAN_WV', '2023-08-15',null,null);
```

다음 쿼리는 날짜 목록을 반환합니다. `check_out` 날짜가 없는 경우 `check_in` 날짜가 표시됩니다.

```
select coalesce(check_out, check_in)
from booking_info
order by booking_id;
```

결과는 다음과 같습니다. 마지막 두 레코드에는 `check_in` 날짜가 표시된다는 점에 유의하세요.

```
coalesce
------------
2023-02-03
2023-04-26	
2023-03-16	
2023-06-03	
2023-07-10	
2023-08-15
```

쿼리가 일부 함수 또는 열에서 NULL 값을 반환할 가능성이 있다면 NVL 표현식을 사용하여 NULL 값을 다른 값으로 변경할 수 있습니다. 예를 들어 SUM 같은 집계 함수는 평가할 행이 없으면 0이 아닌 NULL 값을 반환합니다. 이때는 NVL 표현식을 사용하여 NULL 값을 `700.0`으로 변경할 수 있습니다. `funds_collected`를 합산한 결과는 `485`가 아닌 `1885`입니다. NULL 값을 갖는 두 행이 `700`으로 대체되기 때문입니다.

```
select sum(nvl(funds_collected, 700.0)) as sumresult from booking_info;
               
sumresult
------
 1885
```

# NVL2 함수
<a name="r_NVL2"></a>

지정하는 표현식의 평가 결과가 NULL 또는 NOT NULL인지 여부에 따라 두 값 중 하나를 반환합니다.

## 구문
<a name="r_NVL2-synopsis"></a>

```
NVL2 ( expression, not_null_return_value, null_return_value )
```

## 인수
<a name="r_NVL2-arguments"></a>

 * expression*   
NULL 상태로 평가되는 표현식(열 이름 등)입니다.

 *not\$1null\$1return\$1value*   
*expression*이 NOT NULL로 평가되면 반환되는 값입니다. *not\$1null\$1return\$1value* 값은 *expression*과 동일한 데이터 형식이거나, 혹은 묵시적으로 이 데이터 형식으로 변환 가능해야 합니다.

 *null\$1return\$1value*   
*expression*이 NULL로 평가되면 반환되는 값입니다. *null\$1return\$1value* 값은 *expression*과 동일한 데이터 형식이거나, 혹은 묵시적으로 이 데이터 형식으로 변환 가능해야 합니다.

## 반환 타입
<a name="r_NVL2-return-type"></a>

NVL2 반환 형식은 다음과 같이 결정됩니다.
+ *not\$1null\$1return\$1value* 또는 *null\$1return\$1value*이 NULL이면 not null 표현식의 데이터 형식이 반환됩니다.

*not\$1null\$1return\$1value*와 *null\$1return\$1value* 모두 NULL이 아닌 경우에는 다음과 같습니다.
+ *not\$1null\$1return\$1value*와 *null\$1return\$1value*의 데이터 형식이 동일하면 해당 데이터 형식이 반환됩니다.
+ *not\$1null\$1return\$1value*와 *null\$1return\$1value*의 숫자 데이터 형식이 다르면 가장 작으면서 호환도 가능한 숫자 데이터 형식이 반환됩니다.
+ *not\$1null\$1return\$1value*와 *null\$1return\$1value*의 날짜/시간 데이터 형식이 다르면 타임스탬프 데이터 형식이 반환됩니다.
+ *not\$1null\$1return\$1value*와 *null\$1return\$1value*의 문자 데이터 형식이 다르면 *not\$1null\$1return\$1value*의 데이터 형식이 반환됩니다.
+ *not\$1null\$1return\$1value*와 *null\$1return\$1value*의 데이터 형식이 숫자와 비숫자로 섞여 있으면 *not\$1null\$1return\$1value*의 데이터 형식이 반환됩니다.

**중요**  
*not\$1null\$1return\$1value*의 데이터 형식이 반환되는 마지막 두 경우에서는 *null\$1return\$1value*가 묵시적으로 해당 데이터 형식으로 변환됩니다. 이때 데이터 형식이 서로 호환되지 않으면 함수가 중단됩니다.

## 사용 노트
<a name="nvl2-usage-notes"></a>

*expression* 및 *search* 파라미터가 모두 null인 경우 NVL2와 유사한 방식으로 [DECODE 함수](r_DECODE_expression.md)을 사용할 수 있습니다. 차이점은, DECODE일 때는 *result* 파라미터의 값과 데이터 형식이 모두 반환되는 데 있습니다. 이와는 반대로 NVL2일 때는 *not\$1null\$1return\$1value* 또는 *null\$1return\$1value* 파라미터의 값 중에서 함수에서 선택하는 값과 함께 *not\$1null\$1return\$1value*의 데이터 형식이 반환됩니다.

예를 들어 column1이 NULL이라고 가정하면 다음 두 쿼리에서 동일한 값이 반환됩니다. 하지만 DECODE의 반환 값 데이터 형식은 INTEGER인 반면 NVL2의 반환 값 데이터 형식은 VARCHAR입니다.

```
select decode(column1, null, 1234, '2345');
select nvl2(column1, '2345', 1234);
```

## 예제
<a name="r_NVL2-examples"></a>

다음은 일부 샘플 데이터를 수정한 후 두 필드를 평가하여 적합한 사용자 연락처를 제공하는 예입니다.

```
update users set email = null where firstname = 'Aphrodite' and lastname = 'Acevedo';

select (firstname + ' ' + lastname) as name, 
nvl2(email, email, phone) AS contact_info
from users 
where state = 'WA'
and lastname  like 'A%'
order by lastname, firstname;

name			     contact_info	
--------------------+-------------------------------------------
Aphrodite Acevedo	(906) 632-4407
Caldwell Acevedo 	Nunc.sollicitudin@Duisac.ca
Quinn Adams		  vel@adipiscingligulaAenean.com
Kamal Aguilar		quis@vulputaterisusa.com
Samson Alexander	 hendrerit.neque@indolorFusce.ca
Hall Alford		  ac.mattis@vitaediamProin.edu
Lane Allen		   et.netus@risusDonec.org
Xander Allison	   ac.facilisis.facilisis@Infaucibus.com
Amaya Alvarado	   dui.nec.tempus@eudui.edu
Vera Alvarez		 at.arcu.Vestibulum@pellentesque.edu
Yetta Anthony		enim.sit@risus.org
Violet Arnold		ad.litora@at.com
August Ashley		consectetuer.euismod@Phasellus.com
Karyn Austin		 ipsum.primis.in@Maurisblanditenim.org
Lucas Ayers		  at@elitpretiumet.com
```

# NULLIF 함수
<a name="r_NULLIF_function"></a>

## 구문
<a name="r_NULLIF_function-synopsis"></a>

NULLIF 표현식은 두 인수를 비교하여 동일한 경우에는 NULL을 반환합니다. 동일하지 않으면 첫 번째 인수가 반환됩니다. 이 표현식은 NVL 또는 COALESCE 표현식의 정반대입니다.

```
NULLIF ( expression1, expression2 )
```

## 인수
<a name="r_NULLIF_function-arguments"></a>

 *expression1, expression2*   
비교 대상인 열 또는 표현식입니다. 반환 형식은 첫 번째 표현식의 형식과 동일합니다. NULLIF 결과의 기본 열 이름은 첫 번째 표현식의 열 이름과 일치합니다.

## 예제
<a name="r_NULLIF_function-examples"></a>

다음 예에서는 인수가 같지 않기 때문에 쿼리가 문자열 `first`를 반환합니다.

```
SELECT NULLIF('first', 'second');

case
-------
first
```

다음 예에서는 리터럴 인수가 같기 때문에 쿼리가 `NULL`을 반환합니다.

```
SELECT NULLIF('first', 'first');

case
-------
NULL
```

다음 예에서는 정수 인수가 같지 않기 때문에 쿼리가 `1`을 반환합니다.

```
SELECT NULLIF(1, 2);

case
-------
1
```

다음 예에서는 정수 인수가 같기 때문에 쿼리가 `NULL`을 반환합니다.

```
SELECT NULLIF(1, 1);

case
-------
NULL
```

다음은 LISTID와 SALESID 값이 일치할 때 쿼리가 NULL을 반환하는 예입니다.

```
select nullif(listid,salesid), salesid
from sales where salesid<10 order by 1, 2 desc;

listid  | salesid
--------+---------
     4  |       2
     5  |       4
     5  |       3
     6  |       5
     10 |       9
     10 |       8
     10 |       7
     10 |       6
        |       1
(9 rows)
```

NULLIF를 사용하여 빈 문자열은 항상 NULL로 반환되도록 할 수 있습니다. 다음은 NULLIF 표현식이 NULL 값을, 혹은 문자가 1개 이상 포함된 문자열을 반환하는 예입니다.

```
insert into category
values(0,'','Special','Special');

select nullif(catgroup,'') from category
where catdesc='Special';

catgroup
----------
null
(1 row)
```

NULLIF는 후행 공백을 무시합니다. 빈 문자열이 아니더라도 공백이 포함되어 있으면 NULLIF가 NULL을 반환합니다.

```
create table nulliftest(c1 char(2), c2 char(2));

insert into nulliftest values ('a','a ');

insert into nulliftest values ('b','b');


select nullif(c1,c2) from nulliftest;
c1
------
null
null
(2 rows)
```

# 데이터 형식 지정 함수
<a name="r_Data_type_formatting"></a>

**Topics**
+ [CAST 함수](r_CAST_function.md)
+ [CONVERT 함수](r_CONVERT_function.md)
+ [TEXT\$1TO\$1INT\$1ALT](r_TEXT_TO_INT_ALT.md)
+ [TEXT\$1TO\$1NUMERIC\$1ALT](r_TEXT_TO_NUMERIC_ALT.md)
+ [TO\$1CHAR](r_TO_CHAR.md)
+ [TO\$1DATE 함수](r_TO_DATE_function.md)
+ [TO\$1NUMBER](r_TO_NUMBER.md)
+ [TRY\$1CAST 함수](r_TRY_CAST.md)
+ [날짜/시간 형식 문자열](r_FORMAT_strings.md)
+ [숫자 형식 문자열](r_Numeric_formating.md)
+ [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md)

데이터 형식 지정 함수는 데이터 형식의 값을 다른 데이터 형식의 값으로 쉽게 변환할 수 있습니다. 이러한 함수에서는 모두 첫 번째 인수가 형식을 지정할 대상이 되는 값이고, 두 번째 인수에는 새로운 형식을 위한 템플릿이 포함되어 있습니다. Amazon Redshift는 여러 데이터 형식 서식 지정 기능을 지원합니다. Amazon Redshift는 여러 데이터 형식 지정 함수를 지원합니다.

# CAST 함수
<a name="r_CAST_function"></a>

CAST 함수는 한 데이터 유형을 다른 호환 가능한 데이터 유형으로 변환합니다. 예를 들어 문자열을 날짜로 변환하거나 숫자 형식을 문자열로 변환할 수 있습니다. CAST는 런타임 변환을 수행합니다. 즉, 변환을 수행해도 원본 테이블의 값 데이터 형식은 변경되지 않습니다. 쿼리의 컨텍스트에서만 변경됩니다.

CAST 함수는 한 데이터 유형을 다른 데이터 유형으로 변환한다는 점에서 [CONVERT 함수](r_CONVERT_function.md)와 매우 유사하지만 호출되는 방식이 다릅니다.

CAST 또는 CONVERT 함수를 사용하여 다른 데이터 형식으로 명시적인 변환이 필요한 데이터 형식이 몇 가지 있습니다. 그 밖에 CAST 또는 CONVERT를 사용하지 않고 다른 명령의 일부로서 묵시적으로 변환할 수 있는 데이터 형식들도 있습니다. [형식 호환성 및 변환](c_Supported_data_types.md#r_Type_conversion)을(를) 참조하세요.

## 구문
<a name="r_CAST_function-syntax"></a>

한 가지 데이터 형식에서 다른 데이터 형식으로 표현식을 변환할 때는 다음과 같이 두 가지 동등한 구문 형식을 사용할 수 있습니다.

```
CAST ( expression AS type )
expression :: type
```

## 인수
<a name="r_CAST_function-arguments"></a>

 * expression*   
열 이름이나 리터럴 같이 하나 이상의 값으로 평가되는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 또한 표현식에는 공백이나 빈 문자열이 포함되어서도 안 됩니다.

 *\$1type*   
지원되는 [데이터 타입](c_Supported_data_types.md) 중 한 가지입니다.

## 반환 타입
<a name="r_CAST_function-return-type"></a>

CAST는 *type* 인수에서 지정하는 데이터 형식을 반환합니다.

**참고**  
다음과 같이 문제가 발생할 수 있는 변환을 실행하면 Amazon Redshift가 오류를 반환합니다. 첫째, 정밀도를 떨어뜨리는 DECIMAL 변환입니다.  

```
select 123.456::decimal(2,1);
```
둘째, 오버플로우를 야기하는 INTEGER 변환입니다.  

```
select 12345678::smallint;
```

## 예제
<a name="r_CAST_function-examples"></a>

이 안내서에 나오는 예는 대부분 샘플 [TICKIT 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)를 사용합니다. 샘플 데이터 설정에 관한 자세한 내용은 [데이터 로드](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html) 섹션을 참조하세요.

다음에 동등한 2개의 쿼리입니다. 두 쿼리 모두 소수 값을 정수로 변환합니다.

```
select cast(pricepaid as integer)
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

```
select pricepaid::integer
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

다음과 같은 결과가 나옵니다. 실행하는 데 샘플 데이터가 필요하지 않습니다.

```
select cast(162.00 as integer) as pricepaid;

pricepaid
-----------
162
(1 row)
```

이 예에서는 각 결과에서 시간이 제거되고 타임스탬프 열의 값이 날짜로 변환됩니다.

```
select cast(saletime as date), salesid
from sales order by salesid limit 10;

 saletime  | salesid
-----------+---------
2008-02-18 |       1
2008-06-06 |       2
2008-06-06 |       3
2008-06-09 |       4
2008-08-31 |       5
2008-07-16 |       6
2008-06-26 |       7
2008-07-10 |       8
2008-07-22 |       9
2008-08-06 |      10
(10 rows)
```

이전 예에서 설명한 대로 CAST를 사용하지 않은 경우 결과에 *2008-02-18 02:36:48*처럼 시간이 포함됩니다.

다음 쿼리는 가변 문자 데이터를 날짜로 캐스팅합니다. 실행하는 데 샘플 데이터가 필요하지 않습니다.

```
select cast('2008-02-18 02:36:48' as date) as mysaletime;

mysaletime    
--------------------
2008-02-18  
(1 row)
```

다음은 날짜 열의 값이 타임스탬프로 변환된 예입니다.

```
select cast(caldate as timestamp), dateid
from date order by dateid limit 10;

      caldate       | dateid
--------------------+--------
2008-01-01 00:00:00 |   1827
2008-01-02 00:00:00 |   1828
2008-01-03 00:00:00 |   1829
2008-01-04 00:00:00 |   1830
2008-01-05 00:00:00 |   1831
2008-01-06 00:00:00 |   1832
2008-01-07 00:00:00 |   1833
2008-01-08 00:00:00 |   1834
2008-01-09 00:00:00 |   1835
2008-01-10 00:00:00 |   1836
(10 rows)
```

이전 예와 같은 경우에는 [TO\$1CHAR](https://docs.aws.amazon.com/redshift/latest/dg/r_TO_CHAR.html)를 사용하여 출력 형식을 추가로 제어할 수 있습니다.

다음은 정수가 문자열로 변환된 예입니다.

```
select cast(2008 as char(4));

bpchar
--------
2008
```

다음은 DECIMAL(6,3) 값이 DECIMAL(4,1) 값으로 변환된 예입니다.

```
select cast(109.652 as decimal(4,1));

numeric
---------
109.7
```

이 예에서는 좀 더 복잡한 표현식을 보여줍니다. 다음은 SALES 테이블의 PRICEPAID 열(DECIMAL(8,2) 열)을 DECIMAL(38,2) 열로 변환하고, 값을 100000000000000000000과 곱합니다.

```
select salesid, pricepaid::decimal(38,2)*100000000000000000000
as value from sales where salesid<10 order by salesid;


 salesid |           value
---------+----------------------------
       1 | 72800000000000000000000.00
       2 |  7600000000000000000000.00
       3 | 35000000000000000000000.00
       4 | 17500000000000000000000.00
       5 | 15400000000000000000000.00
       6 | 39400000000000000000000.00
       7 | 78800000000000000000000.00
       8 | 19700000000000000000000.00
       9 | 59100000000000000000000.00
(9 rows)
```

**참고**  
`GEOMETRY` 데이터 형식에 대해 CAST 또는 CONVERT 작업을 수행하여 다른 데이터 형식으로 변경할 수 없습니다. 그러나 `GEOMETRY` 인수를 허용하는 함수에 대한 입력으로 EWKB(Extended Well-Known Binary) 형식으로 문자열 리터럴의 16진수 표현을 제공할 수 있습니다. 예를 들어, `ST_AsText` 함수는 `GEOMETRY` 데이터 형식을 사용합니다.  

```
SELECT ST_AsText('01010000000000000000001C400000000000002040');
```

```
st_astext  
------------
 POINT(7 8)
```
`GEOMETRY` 데이터 형식을 명시적으로 지정할 수도 있습니다.  

```
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
```

```
st_astext  
------------
 POINT(5 6)
```

# CONVERT 함수
<a name="r_CONVERT_function"></a>

[CAST 함수](https://docs.aws.amazon.com/redshift/latest/dg/r_CAST_function.html)와 마찬가지로 CONVERT 함수는 한 데이터 유형을 호환되는 다른 데이터 유형으로 변환합니다. 예를 들어 문자열을 날짜로 변환하거나 숫자 형식을 문자열로 변환할 수 있습니다. CONVERT는 런타임 변환을 수행합니다. 즉, 변환을 수행해도 원본 테이블의 값 데이터 유형은 변경되지 않습니다. 쿼리의 컨텍스트에서만 변경됩니다.

CONVERT 함수를 사용하여 다른 데이터 유형으로 명시적인 변환이 필요한 데이터 유형이 몇 가지 있습니다. 그 밖에 CAST 또는 CONVERT를 사용하지 않고 다른 명령의 일부로서 묵시적으로 변환할 수 있는 데이터 형식들도 있습니다. [형식 호환성 및 변환](c_Supported_data_types.md#r_Type_conversion)을(를) 참조하세요.

## 구문
<a name="r_CONVERT-syntax"></a>

```
CONVERT ( type, expression )
```

## 인수
<a name="r_CONVERT-arguments"></a>

 *\$1type*   
지원되는 [데이터 타입](c_Supported_data_types.md) 중 한 가지입니다.

 * expression*   
열 이름이나 리터럴 같이 하나 이상의 값으로 평가되는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 또한 표현식에는 공백이나 빈 문자열이 포함되어서도 안 됩니다.

## 반환 타입
<a name="r_CONVERT-return-type"></a>

CONVERT는 *type* 인수에서 지정하는 데이터 형식을 반환합니다.

**참고**  
다음과 같이 문제가 발생할 수 있는 변환을 실행하면 Amazon Redshift가 오류를 반환합니다. 첫째, 정밀도를 떨어뜨리는 DECIMAL 변환입니다.  

```
SELECT CONVERT(decimal(2,1), 123.456);
```
둘째, 오버플로우를 야기하는 INTEGER 변환입니다.  

```
SELECT CONVERT(smallint, 12345678);
```

## 예제
<a name="r_CONVERT-examples"></a>

이 안내서에 나오는 예는 대부분 샘플 [TICKIT 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)를 사용합니다. 샘플 데이터 설정에 관한 자세한 내용은 [데이터 로드](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html) 섹션을 참조하세요.

다음 쿼리는 CONVERT 함수를 사용하여 십진수 열을 정수로 변환합니다.

```
SELECT CONVERT(integer, pricepaid)
FROM sales WHERE salesid=100;
```

이 예제에서는 정수를 문자열로 변환합니다.

```
SELECT CONVERT(char(4), 2008);
```

이 예에서는 현재 날짜 및 시간이 가변 문자 데이터 유형으로 변환됩니다.

```
SELECT CONVERT(VARCHAR(30), GETDATE());

getdate
---------
2023-02-02 04:31:16
```

이 예제에서는 saletime 열을 시간만 있는 값으로 변환하고 각 행에서 날짜를 제거합니다.

```
SELECT CONVERT(time, saletime), salesid
FROM sales order by salesid limit 10;
```

한 시간대에서 다른 시간대로 타임스탬프를 변환하는 방법에 대한 자세한 내용은 [CONVERT\$1TIMEZONE 함수](CONVERT_TIMEZONE.md) 섹션을 참조하세요. 추가 날짜 및 시간 함수는 [날짜 및 시간 함수](Date_functions_header.md) 섹션을 참조하세요.

다음 예제에서는 가변 문자 데이터를 datetime 객체로 변환합니다.

```
SELECT CONVERT(datetime, '2008-02-18 02:36:48') as mysaletime;
```

**참고**  
`GEOMETRY` 데이터 형식에 대해 CAST 또는 CONVERT 작업을 수행하여 다른 데이터 형식으로 변경할 수 없습니다. 그러나 `GEOMETRY` 인수를 허용하는 함수에 대한 입력으로 EWKB(Extended Well-Known Binary) 형식으로 문자열 리터럴의 16진수 표현을 제공할 수 있습니다. 예를 들어, `ST_AsText` 함수는 `GEOMETRY` 데이터 형식을 사용합니다.  

```
SELECT ST_AsText('01010000000000000000001C400000000000002040');
```

```
st_astext  
------------
 POINT(7 8)
```
`GEOMETRY` 데이터 형식을 명시적으로 지정할 수도 있습니다.  

```
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
```

```
st_astext  
------------
 POINT(5 6)
```

# TEXT\$1TO\$1INT\$1ALT
<a name="r_TEXT_TO_INT_ALT"></a>

TEXT\$1TO\$1INT\$1ALT는 Teradata 스타일 형식을 사용하여 문자열을 정수로 변환합니다. 결과의 소수 자릿수가 잘립니다.

## 구문
<a name="r_TEXT_TO_INT_ALT-synopsis"></a>

```
TEXT_TO_INT_ALT (expression [ , 'format'])
```

## 인수
<a name="r_TEXT_TO_INT_ALT-arguments"></a>

 * expression*   
열 이름이나 리터럴 문자열과 같이 하나 이상의 CHAR 또는 VARCHAR 값을 생성하는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 이 함수는 빈 문자열을 0으로 변환합니다.

 *형식*   
입력 표현식의 형식을 정의하는 문자열 리터럴입니다. 지정할 수 있는 형식 지정 문자에 대한 자세한 내용은 [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md) 섹션을 참조하세요.

## 반환 타입
<a name="r_TEXT_TO_INT_ALT-return-type"></a>

TEXT\$1TO\$1INT\$1ALT는 INTEGER 값을 반환합니다.

캐스트 결과의 소수 부분이 잘립니다.

Amazon Redshift는 지정한 *format* 구문으로의 변환이 성공하지 못한 경우 오류를 반환합니다.

## 예제
<a name="r_TEXT_TO_INT_ALT-examples"></a>

다음 예에서는 입력 *expression* 문자열 '123-'를 정수 -123으로 변환합니다.

```
select text_to_int_alt('123-');
```

```
text_to_int_alt
----------
      -123
```

다음 예에서는 입력 *expression* 문자열 '2147483647\$1'를 정수 2147483647로 변환합니다.

```
select text_to_int_alt('2147483647+');
```

```
text_to_int_alt
----------
2147483647
```

다음 예에서는 입력 *expression* 문자열 '-123E-2'를 정수 -1로 변환합니다.

```
select text_to_int_alt('-123E-2');
```

```
text_to_int_alt
----------
        -1
```

다음 예에서는 입력 *expression* 문자열 '2147483647\$1'를 정수 2147483647로 변환합니다.

```
select text_to_int_alt('2147483647+');
```

```
text_to_int_alt
----------
2147483647
```

다음 예에서는 *format* 구문이 '999S'인 입력 *expression* 문자열 '123\$1'를 정수 1230으로 변환합니다. S 문자는 Signed Zoned Decimal을 나타냅니다. 자세한 내용은 [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md) 섹션을 참조하세요.

```
select text_to_int_alt('123{', '999S');
```

```
text_to_int_alt
----------
      1230
```

다음 예에서는 *format* 구문이 'C9(I)'인 입력 *expression* 문자열 'USD123'을 정수 123으로 변환합니다. [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md) 섹션을 참조하세요.

```
select text_to_int_alt('USD123', 'C9(I)');
```

```
text_to_int_alt
----------
       123
```

다음 예에서는 테이블 열을 입력 *expression*으로 지정합니다.

```
select text_to_int_alt(a), text_to_int_alt(b) from t_text2int order by 1;
```

```
 text_to_int_alt | text_to_int_alt
-----------------+-----------------
            -123 |            -123
            -123 |            -123
             123 |             123
             123 |             123
```

다음은 이 예에 대한 테이블 정의 및 삽입 문입니다.

```
create table t_text2int (a varchar(200), b char(200));
```

```
insert into t_text2int VALUES('123', '123'),('123.123', '123.123'), ('-123', '-123'), ('123-', '123-');
```

# TEXT\$1TO\$1NUMERIC\$1ALT
<a name="r_TEXT_TO_NUMERIC_ALT"></a>

TEXT\$1TO\$1NUMERIC\$1ALT는 Teradata 스타일 캐스트 작업을 수행하여 문자열을 숫자 데이터 형식으로 변환합니다.

## 구문
<a name="r_TEXT_TO_NUMERIC_ALT-synopsis"></a>

```
TEXT_TO_NUMERIC_ALT (expression [, 'format'] [, precision, scale])
```

## 인수
<a name="r_TEXT_TO_NUMERIC_ALT-arguments"></a>

 * expression*   
열 이름이나 리터럴 같이 하나 이상의 CHAR 또는 VARCHAR 값으로 평가되는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 빈 문자열은 0으로 변환됩니다.

 *형식*   
입력 표현식의 형식을 정의하는 문자열 리터럴입니다. 자세한 내용은 [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md) 섹션을 참조하세요.

 *precision*   
숫자 결과의 자릿수입니다. 기본값은 38입니다.

 *\$1/scale*   
숫자 결과에서 소수점 오른쪽의 자릿수입니다. 기본값은 0입니다.

## 반환 타입
<a name="r_TEXT_TO_NUMERIC_ALT-return-type"></a>

TEXT\$1TO\$1NUMERIC\$1ALT는 DECIMAL 숫자를 반환합니다.

Amazon Redshift는 지정한 *format* 구문으로의 변환이 성공하지 못한 경우 오류를 반환합니다.

Amazon Redshift는 사용자가 *precision* 옵션에서 해당 형식에 대해 지정한 가장 높은 정밀도를 가진 숫자 형식으로 입력 *expression* 문자열을 캐스팅합니다. 숫자 값의 길이가 *precision*에 대해 지정한 값을 초과하는 경우 Amazon Redshift는 다음 규칙에 따라 숫자 값을 반올림합니다.
+ 캐스트 결과의 길이가 *format* 구문에 지정한 길이를 초과하는 경우 Amazon Redshift는 오류를 반환합니다.
+ 결과가 숫자 값으로 캐스트되면 결과는 가장 가까운 값으로 반올림됩니다. 분수 부분이 상단 및 하단 캐스트 결과의 정확히 중간인 경우 결과는 가장 가까운 짝수 값으로 반올림됩니다.

## 예제
<a name="r_TEXT_TO_NUMERIC_ALT-examples"></a>

다음 예에서는 입력 *expression* 문자열 '1.5'를 정수 값 '2'로 변환합니다. 문이 *scale*을 지정하지 않기 때문에 *scale*의 기본값은 0이고 캐스트 결과에는 분수 결과가 포함되지 않습니다. .5는 1과 2의 중간이므로 캐스트 결과는 짝수 값인 2로 반올림됩니다.

```
select text_to_numeric_alt('1.5');
```

```
 text_to_numeric_alt
---------------------
                   2
```

다음 예에서는 입력 *expression* 문자열 '2.51'을 정수 값 3으로 변환합니다. 문이 *scale* 값을 지정하지 않기 때문에 *scale*의 기본값은 0이고 캐스트 결과에는 분수 결과가 포함되지 않습니다. .51은 2보다 3에 더 가깝기 때문에 캐스트 결과는 3 값으로 반올림됩니다.

```
select text_to_numeric_alt('2.51');
```

```
 text_to_numeric_alt
---------------------
                   3
```

다음 예에서는 *precision*이 10이고 *scale*이 2인 입력 *expression* 문자열 123.52501을 숫자 값 123.53으로 변환합니다.

```
select text_to_numeric_alt('123.52501', 10, 2);
```

```
 text_to_numeric_alt
---------------------
               123.53
```

다음 예에서는 *format* 구문이 '999S'인 입력 *expression* 문자열 '123\$1'를 숫자 1230으로 변환합니다. S 문자는 Signed Zoned Decimal을 나타냅니다. 자세한 내용은 [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md) 섹션을 참조하세요.

```
select text_to_numeric_alt('123{', '999S');
```

```
text_to_int_alt
----------
      1230
```

다음 예에서는 *format* 구문이 'C9(I)'인 입력 *expression* 문자열 'USD123'을 숫자 124로 변환합니다. [숫자 데이터에 대한 Teradata 스타일 형식 지정 문자](r_Numeric-format-teradata.md)을(를) 참조하세요.

```
select text_to_numeric_alt('USD123.9', 'C9(I)');
```

```
text_to_numeric_alt
----------
       124
```

다음 예에서는 테이블 열을 입력 *expression*으로 지정합니다.

```
select text_to_numeric_alt(a), text_to_numeric_alt(b) from t_text2numeric order by 1;
```

```
           text_to_numeric_alt           |           text_to_numeric_alt
-----------------------------------------+-----------------------------------------
 -99999999999999999999999999999999999999 | -99999999999999999999999999999999999999
                                  -12300 |                                  -12300
                                     123 |                                     123
                                     123 |                                     123
  99999999999999999999999999999999999999 |  99999999999999999999999999999999999999
```

다음은 이 예에 대한 테이블 정의 및 삽입 문입니다.

```
create table  t_text2numeric (a varchar(200), b char(200));
```

```
insert into  t_text2numeric values
('123', '123'),
('+123.456', '+123.456'),
('-' || repeat('9', 38), '-' || repeat('9', 38)),
(repeat('9', 38) || '+', repeat('9', 38) || '+'),
('-123E2', '-123E2');
```

# TO\$1CHAR
<a name="r_TO_CHAR"></a>

TO\$1CHAR는 타임스탬프 또는 숫자 표현식을 문자열 데이터 형식으로 변환합니다.

## 구문
<a name="r_TO_CHAR-synopsis"></a>

```
TO_CHAR (timestamp_expression | numeric_expression , 'format')
```

## 인수
<a name="r_TO_CHAR-arguments"></a>

 *timestamp\$1expression*   
TIMESTAMP 또는 TIMESTAMPTZ 형식 값이나, 혹은 묵시적으로 타임스탬프로 강제 변환할 수 있는 값으로 평가되는 표현식입니다.

 *numeric\$1expression*   
숫자 데이터 형식 값이나, 혹은 묵시적으로 숫자 형식으로 강제 변환할 수 있는 값으로 평가되는 표현식입니다. 자세한 내용은 [숫자형](r_Numeric_types201.md) 섹션을 참조하세요. TO\$1CHAR는 숫자 문자열의 왼쪽에 공백을 삽입합니다.  
TO\$1CHAR는 128비트 DECIMAL 값을 지원하지 않습니다.

 *형식*   
새로운 값의 형식입니다. 유효한 형식은 [날짜/시간 형식 문자열](r_FORMAT_strings.md) 및 [숫자 형식 문자열](r_Numeric_formating.md) 섹션을 참조하세요.

## 반환 타입
<a name="r_TO_CHAR-return-type"></a>

VARCHAR

## 예제
<a name="r_TO_CHAR-examples"></a>

다음 예는 타임스탬프를 9자에 덧붙인 월 이름, 요일 이름, 날짜를 포함한 형식의 날짜 및 시간 값으로 변환합니다.

```
select to_char(timestamp '2009-12-31 23:15:59', 'MONTH-DY-DD-YYYY HH12:MIPM');

to_char
-------------------------
DECEMBER -THU-31-2009 11:15PM
```

다음 예는 타임스탬프를 연중 일 번호 값으로 변환합니다.

```
select to_char(timestamp '2009-12-31 23:15:59', 'DDD');

to_char
-------------------------
365
```

다음 예는 타임스탬프를 ISO 요일 번호로 변환합니다.

```
select to_char(timestamp '2022-05-16 23:15:59', 'ID');

to_char
-------------------------
1
```

다음 예는 날짜에서 월 이름을 추출합니다.

```
select to_char(date '2009-12-31', 'MONTH');

to_char
-------------------------
DECEMBER
```

다음은 EVENT 테이블의 STARTTIME 값을 각각 시간, 분 및 초로 구성된 문자열로 변환하는 예입니다.

```
select to_char(starttime, 'HH12:MI:SS')
from event where eventid between 1 and 5
order by eventid;

to_char
----------
02:30:00
08:00:00
02:30:00
02:30:00
07:00:00
```

다음은 전체 타임스탬프 값을 다른 형식으로 변환하는 예입니다.

```
select starttime, to_char(starttime, 'MON-DD-YYYY HH12:MIPM')
from event where eventid=1;

      starttime      |       to_char
---------------------+---------------------
 2008-01-25 14:30:00 | JAN-25-2008 02:30PM
```

다음은 타임스탬프 리터럴을 문자열로 변환하는 예입니다.

```
select to_char(timestamp '2009-12-31 23:15:59','HH24:MI:SS');

to_char
----------
23:15:59
```

다음은 10진수를 문자열로 변환하는 예입니다.

```
select to_char(125.8, '999.99');

to_char
---------
125.80
```

다음은 10진수를 문자열로 변환하는 예입니다.

```
select to_char(125.8, '999D99');

to_char
---------
125.80
```

다음은 앞에 0이 붙는 문자열로 숫자를 변환하는 예입니다.

```
select to_char(125.8, '0999D99');

to_char
---------
0125.80
```

다음은 숫자를 끝에 음의 부호가 있는 문자열로 변환하는 예입니다.

```
select to_char(-125.8, '999D99S');

to_char
---------
125.80-
```

다음은 지정된 위치에 양수 또는 음수 부호가 있는 문자열로 숫자를 반환하는 예입니다.

```
select to_char(125.8, '999D99SG');

to_char
---------
125.80+
```

다음은 지정된 위치에 양수 부호가 있는 문자열로 숫자를 반환하는 예입니다.

```
select to_char(125.8, 'PL999D99');

to_char
---------
+ 125.80
```

다음은 숫자를 통화 기호가 있는 문자열로 변환하는 예입니다.

```
select to_char(-125.88, '$S999D99');

to_char
---------
$-125.88
```

다음은 지정된 위치에 통화 기호가 있는 문자열로 숫자를 변환하는 예입니다.

```
select to_char(-125.88, 'S999D99L');

to_char
---------
-125.88$
```

다음은 천 단위(쉼표) 구분 기호를 사용하여 문자열로 숫자를 변환하는 예입니다.

```
select to_char(1125.8, '9,999.99');

to_char
---------
1,125.80
```

다음은 음수에 꺾쇠 괄호를 사용하여 숫자를 문자열로 변환하는 예입니다.

```
select to_char(-125.88, '$999D99PR');

to_char
---------
$<125.88>
```

다음은 숫자를 로마 숫자 문자열로 변환하는 예입니다.

```
select to_char(125, 'RN');

to_char
---------
   CXXV
```

다음 예에서는 날짜를 세기 코드로 변환합니다.

```
select to_char(date '2020-12-31', 'CC');

to_char
---------
21
```

다음 예에서는 요일을 표시합니다.

```
SELECT to_char(current_timestamp, 'FMDay, FMDD HH12:MI:SS');

to_char
-----------------------
Wednesday, 31 09:34:26
```

다음 예에서는 숫자의 서수 접미사를 표시합니다.

```
SELECT to_char(482, '999th');

to_char
-----------------------
 482nd
```

다음은 SALES 테이블의 지불 가격에서 수수료를 빼는 예입니다. 그런 다음 차액을 반올림하여 to\$1char 열과 같이 로마 숫자로 변환합니다.

```
select salesid, pricepaid, commission, (pricepaid - commission)
as difference, to_char(pricepaid - commission, 'rn') from sales
group by sales.pricepaid, sales.commission, salesid
order by salesid limit 10;

 salesid | pricepaid | commission | difference |     to_char
---------+-----------+------------+------------+-----------------
       1 |    728.00 |     109.20 |     618.80 |           dcxix
       2 |     76.00 |      11.40 |      64.60 |             lxv
       3 |    350.00 |      52.50 |     297.50 |        ccxcviii
       4 |    175.00 |      26.25 |     148.75 |           cxlix
       5 |    154.00 |      23.10 |     130.90 |           cxxxi
       6 |    394.00 |      59.10 |     334.90 |         cccxxxv
       7 |    788.00 |     118.20 |     669.80 |           dclxx
       8 |    197.00 |      29.55 |     167.45 |          clxvii
       9 |    591.00 |      88.65 |     502.35 |             dii
      10 |     65.00 |       9.75 |      55.25 |              lv
```

다음은 to\$1char 열과 같이 통화 기호를 차액 값에 추가하는 예입니다.

```
select salesid, pricepaid, commission, (pricepaid - commission)
as difference, to_char(pricepaid - commission, 'l99999D99') from sales
group by sales.pricepaid, sales.commission, salesid
order by salesid limit 10;

salesid | pricepaid | commission | difference |  to_char
--------+-----------+------------+------------+------------
      1 |    728.00 |     109.20 |     618.80 | $   618.80
      2 |     76.00 |      11.40 |      64.60 | $    64.60
      3 |    350.00 |      52.50 |     297.50 | $   297.50
      4 |    175.00 |      26.25 |     148.75 | $   148.75
      5 |    154.00 |      23.10 |     130.90 | $   130.90
      6 |    394.00 |      59.10 |     334.90 | $   334.90
      7 |    788.00 |     118.20 |     669.80 | $   669.80
      8 |    197.00 |      29.55 |     167.45 | $   167.45
      9 |    591.00 |      88.65 |     502.35 | $   502.35
     10 |     65.00 |       9.75 |      55.25 | $    55.25
```

다음은 각 판매가 이루어진 세기를 나열하는 예입니다.

```
select salesid, saletime, to_char(saletime, 'cc') from sales
order by salesid limit 10;

 salesid |      saletime       | to_char
---------+---------------------+---------
       1 | 2008-02-18 02:36:48 | 21
       2 | 2008-06-06 05:00:16 | 21
       3 | 2008-06-06 08:26:17 | 21
       4 | 2008-06-09 08:38:52 | 21
       5 | 2008-08-31 09:17:02 | 21
       6 | 2008-07-16 11:59:24 | 21
       7 | 2008-06-26 12:56:06 | 21
       8 | 2008-07-10 02:12:36 | 21
       9 | 2008-07-22 02:23:17 | 21
      10 | 2008-08-06 02:51:55 | 21
```

다음은 EVENT 테이블의 STARTTIME 값을 각각 시간, 분, 초 및 시간대로 구성된 문자열로 변환하는 예입니다.

```
select to_char(starttime, 'HH12:MI:SS TZ')
from event where eventid between 1 and 5
order by eventid;

to_char
----------
02:30:00 UTC
08:00:00 UTC
02:30:00 UTC
02:30:00 UTC
07:00:00 UTC
```

다음은 초, 밀리초, 마이크로초에 따라 형식을 지정하는 예입니다.

```
select sysdate,
to_char(sysdate, 'HH24:MI:SS') as seconds,
to_char(sysdate, 'HH24:MI:SS.MS') as milliseconds,
to_char(sysdate, 'HH24:MI:SS:US') as microseconds;

timestamp           | seconds  | milliseconds | microseconds   
--------------------+----------+--------------+----------------
2015-04-10 18:45:09 | 18:45:09 | 18:45:09.325 | 18:45:09:325143
```

# TO\$1DATE 함수
<a name="r_TO_DATE_function"></a>

TO\$1DATE는 문자열로 표현된 날짜를 DATE 데이터 형식으로 변환합니다.

**참고**  
TO\$1DATE는 Q(분기 번호)가 있는 형식 문자열을 지원하지 않습니다.

## 구문
<a name="r_TO_DATE_function-synopsis"></a>

```
TO_DATE(string, format)
```

```
TO_DATE(string, format, is_strict)
```

## 인수
<a name="r_TO_DATE_function-arguments"></a>

 *문자열*()   
변활할 문자열입니다.

 *형식*   
입력 *문자열*의 형식을 날짜 부분과 관련하여 정의하는 문자열 리터럴입니다. 유효한 일, 월 및 연도 형식 목록은 [날짜/시간 형식 문자열](r_FORMAT_strings.md) 섹션을 참조하세요.

 *is\$1strict*   
입력 날짜 값이 범위를 벗어날 경우 오류가 반환되는지 여부를 지정하는 옵션 부울 값입니다. *is\$1strict*가 `TRUE`로 설정되면 범위를 벗어난 값이 있는 경우 오류가 반환됩니다. *is\$1strict*가 기본값인 `FALSE`로 설정되면 오버플로 값이 허용됩니다.

## 반환 타입
<a name="r_TO_DATE_function-return-type"></a>

TO\$1DATE는 *format* 값에 따라 DATE를 반환합니다.

*format*으로의 변환이 실패하면 오류가 반환됩니다.

## 예제
<a name="r_TO_DATE_function-example"></a>

 다음 SQL 문은 날짜 `02 Oct 2001`을 날짜 데이터 형식으로 변환합니다.

```
select to_date('02 Oct 2001', 'DD Mon YYYY');

to_date
------------
2001-10-02
(1 row)
```

 다음 SQL 문은 문자열 `20010631`을 날짜로 변환합니다.

```
select to_date('20010631', 'YYYYMMDD', FALSE);
```

결과는 2001년 7월 1일입니다. 6월은 30일만 있기 때문입니다.

```
to_date
------------
2001-07-01
```

 다음 SQL 문은 문자열 `20010631`을 날짜로 변환합니다.

```
to_date('20010631', 'YYYYMMDD', TRUE);
```

결과는 오류입니다. 6월은 30일만 있기 때문입니다.

```
ERROR:  date/time field date value out of range: 2001-6-31
```

# TO\$1NUMBER
<a name="r_TO_NUMBER"></a>

TO\$1NUMBER는 문자열을 숫자(소수) 값으로 변환합니다.

**참고**  
패딩 공백과 0을 억제하기 위해 형식 문자열에 `FM`을 사용하는 것이 좋습니다. 유효한 형식 목록은 [숫자 형식 문자열](r_Numeric_formating.md) 섹션을 참조하세요.

## 구문
<a name="r_TO_NUMBER-synopsis"></a>

```
to_number(string, format)
```

## 인수
<a name="r_TO_NUMBER-arguments"></a>

 *문자열*()   
실행할 문자열입니다. 형식은 리터럴 값이 되어야 합니다.

 *형식*   
두 번째 인수는 숫자 값 생성을 위한 문자열의 구문 분석 방식을 나타내는 형식 문자열입니다. 예를 들어 format이 `'FM99D999'`이면 변환 대상인 문자열이 5자리로 구성되어 있으며 세 번째 자리에 소수점이 있는 것을 의미합니다. 따라서 `to_number('12.345','FM99D999')`는 숫자 값으로 `12.345`를 반환합니다. 유효한 형식 목록은 [숫자 형식 문자열](r_Numeric_formating.md) 섹션을 참조하세요.

## 반환 타입
<a name="r_TO_NUMBER-return-type"></a>

TO\$1NUMBER는 DECIMAL 숫자를 반환합니다.

*format*으로의 변환이 실패하면 오류가 반환됩니다.

## 예제
<a name="r_TO_NUMBER-examples"></a>

다음은 문자열 `12,454.8-`을 숫자로 변환하는 예입니다.

```
select to_number('12,454.8-', 'FM99G999D9S');

to_number
-----------
-12454.8
```

다음은 문자열 `$ 12,454.88`을 숫자로 변환하는 예입니다.

```
select to_number('$ 12,454.88', 'FML99G999D99');

to_number
-----------
12454.88
```

다음은 문자열 `$ 2,012,454.88`을 숫자로 변환하는 예입니다.

```
select to_number('$ 2,012,454.88', 'FML9,999,999.99');

to_number
-----------
2012454.88
```

# TRY\$1CAST 함수
<a name="r_TRY_CAST"></a>

CAST 함수와 비교하여 TRY\$1CAST는 먼저 표현식을 지정된 유형으로 캐스팅하려고 시도합니다. 변환 오류로 인해 캐스팅이 실패하면 작업은 Null을 반환합니다. 변환이 명시적으로 허용되지 않는 경우 작업은 오류를 반환합니다. 아래 사용 노트에서 가능한 변환 목록을 확인할 수 있습니다. 예를 들어 부울을 타임스탬프로 변환하려고 시도하는 것은 허용되지 않습니다.

## 구문
<a name="r_TRY_CAST-syntax"></a>

```
TRY_CAST(expression AS type)
```

## 인수
<a name="r_TRY_CAST-arguments"></a>

 * expression*   
열 이름이나 리터럴 같이 하나 이상의 값으로 평가되는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 또한 표현식에는 공백이나 빈 문자열이 포함되어서도 안 됩니다.

 *\$1type*   
 지원되는 데이터 유형 중 하나입니다. 데이터 유형에 대한 전체 목록은 [데이터 타입](c_Supported_data_types.md) 섹션을 참조하세요. 지원되는 소스 데이터 유형 및 대상 데이터 유형 쌍의 목록은 아래 사용 노트를 참조하세요.

## 반환 타입
<a name="r_TRY_CAST-return-type"></a>

TRY\$1CAST는 *type* 인수에서 지정하는 데이터 유형을 반환합니다. 변환에 실패하면 작업이 Null을 반환합니다.

## 사용 노트
<a name="r_TRY_CAST-usage-notes"></a>

다음은 Amazon Redshift가 TRY\$1CAST에 대해 지원하는 소스 데이터 유형 및 대상 데이터 유형 쌍의 목록입니다.

 * BOOL *   
 SMALLINT, INT, BIGINT, SUPER 

 * SMALLINT *   
 BOOL, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER 

 * INT *   
 BOOL, SMALLINT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER 

 * BIGINT *   
 BOOL, SMALLINT, INT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER 

 * DECIMAL *   
 SMALLINT, INT, BIGINT, REAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER 

 * REAL *   
 SMALLINT, INT, BIGINT, DECIMAL, FLOAT, BPCHAR, TEXT, VARCHAR, SUPER 

 * FLOAT *   
 SMALLINT, INT, BIGINT, DECIMAL, REAL, BPCHAR, TEXT, VARCHAR, SUPER 

 * BPCHAR *   
 SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, TEXT, VARCHAR, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER 

 * TEXT *   
 SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, VARCHAR, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER 

 * VARCHAR *   
 SMALLINT, INT, BIGINT, DECIMAL, REAL, FLOAT, BPCHAR, TEXT, TIMESTAMP, TIMESTAMPTZ, DATE, TIME, TIMETZ, SUPER 

 * TIMESTAMP *   
 BPCHAR, TEXT, VARCHAR, TIMESTAMPTZ, DATE, TIME 

 * TIMESTAMPTZ *   
 BPCHAR, TEXT, VARCHAR, TIMESTAMP, DATE, TIME, TIMETZ 

 * DATE *   
 BPCHAR, TEXT, VARCHAR, TIMESTAMP, TIMESTAMPTZ 

 * TIME *   
 BPCHAR, TEXT, VARCHAR 

 * TIMETZ *   
 BPCHAR, TEXT, VARCHAR 

 * SUPER *   
 SUPER는 DATE, TIME, TIMETZ, TIMESTAMP 및 TIMESTAMPTZ를 제외한 다른 데이터 유형으로 변환할 수 있습니다.

## 예제
<a name="r_TRY_CAST-examples"></a>

다음 예제에서는 STRING을 INTEGER로 캐스팅합니다.

```
SELECT TRY_CAST('123' AS INT);

int
----
123
```

다음 예는 Null을 반환합니다. STRING을 INTEGER로 변환하는 것은 허용되므로 TRY\$1CAST는 오류를 반환하지 않지만 'foo'는 정수가 아니므로 함수는 Null을 반환합니다.

```
SELECT TRY_CAST('foo' AS INT)
```

다음 예제에서는 BOOLEAN을 TIMESTAMP로 변환할 수 없으므로 오류를 반환합니다.

```
SELECT TRY_CAST(true as timestamp);
```

TRY\$1CAST는 변환에 실패할 경우 즉시 오류를 반환하는 대신 Null을 반환하므로 TRY\$1CAST를 사용하여 잘못된 데이터를 필터링할 수 있습니다. Akua Mansa의 연령 열에서 변환 실패로 인해 잘못된 행이 필터링되는 다음 예제를 생각해 보세요.

```
CREATE TABLE IF NOT EXISTS student_data(
name VARCHAR(100) NOT NULL,
age VARCHAR(3) NOT NULL,
enrollment_date DATE NOT NULL);

INSERT INTO student_data (name, age, enrollment_date)
VALUES
('Alejandro Rosalez', '10', '01/01/2000'),
('Akua Mansa', 'Ten', '01/01/2000');

SELECT * FROM student_data WHERE TRY_CAST(age AS INT) IS NOT NULL;

--Akua is not returned.
 name              | age | enrollment_date
-------------------+-----+-----------------
 Alejandro Rosalez | 10  | 01/01/2000
```

# 날짜/시간 형식 문자열
<a name="r_FORMAT_strings"></a>

날짜/시간 형식 문자열을 위한 참조 정보를 찾아볼 수 있습니다.

다음 형식 문자열은 TO\$1CHAR 등의 함수에 적용됩니다. 이 문자열은 날짜/시간 구분자('`-`', '`/`', '`:`' 등)와 그 뒤를 이어 "날짜 부분" 및 "시간 부분"으로 구성됩니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_FORMAT_strings.html)

**참고**  
날짜/시간 구분자(예: '-', '/' 또는 ':')를 작은따옴표로 묶어야 하지만, 이전 테이블에 나열된 "날짜 부분"과 "시간 부분"은 큰따옴표로 묶어야 합니다.

## 예제
<a name="r_FORMAT_strings-examples"></a>

날짜를 문자열 형식으로 지정하는 예는 [TO\$1CHAR](r_TO_CHAR.md) 섹션을 참조하세요.

# 숫자 형식 문자열
<a name="r_Numeric_formating"></a>

다음에서 숫자 형식 문자열에 대한 참조를 찾을 수 있습니다.

다음 형식 문자열은 TO\$1NUMBER 및 TO\$1CHAR 등의 함수에 적용됩니다.
+ 문자열을 숫자 형식으로 지정하는 예는 [TO\$1NUMBER](r_TO_NUMBER.md) 섹션을 참조하세요.
+ 숫자를 문자열 형식으로 지정하는 예는 [TO\$1CHAR](r_TO_CHAR.md) 섹션을 참조하세요.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Numeric_formating.html)

# 숫자 데이터에 대한 Teradata 스타일 형식 지정 문자
<a name="r_Numeric-format-teradata"></a>

다음으로 TEXT\$1TO\$1INT\$1ALT 및 TEXT\$1TO\$1NUMERIC\$1ALT 함수가 입력 *expression* 문자열의 문자를 해석하는 방법을 찾아볼 수 있습니다. *format* 구문에서 지정할 수 있는 문자 목록도 찾아볼 수 있습니다. 또한 *format* 옵션에 대해 Teradata 스타일 형식 지정과 Amazon Redshift 간의 차이점에 대한 설명을 찾아볼 수 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Numeric-format-teradata.html)

## Signed Zone Decimal, Teradata 스타일의 숫자 데이터 형식 지정을 위한 데이터 형식 지정 문자입니다.
<a name="r_Numeric-format-teradata-signed-zone"></a>

Signed Zoned Decimal 값에 대해 TEXT\$1TO\$1INT\$1ALT 및 TEXT\$1TO\$1NUMERIC\$1ALT 함수의 *format* 구문에 다음 문자를 사용할 수 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Numeric-format-teradata.html)

# 날짜 및 시간 함수
<a name="Date_functions_header"></a>

이번 섹션에서는 Amazon Redshift에서 지원되는 날짜 및 시간 스칼라 함수에 대한 정보를 찾아볼 수 있습니다.

**Topics**
+ [날짜 및 시간 함수 요약](#date-functions-summary)
+ [트랜잭션의 날짜 및 시간 함수](#date-functions-transactions)
+ [지원되지 않는 리더 노드 전용 함수](#date-functions-deprecated)
+ [\$1(연결) 연산자](r_DATE-CONCATENATE_function.md)
+ [ADD\$1MONTHS 함수](r_ADD_MONTHS.md)
+ [AT TIME ZONE 함수](r_AT_TIME_ZONE.md)
+ [CONVERT\$1TIMEZONE 함수](CONVERT_TIMEZONE.md)
+ [CURRENT\$1DATE 함수](r_CURRENT_DATE_function.md)
+ [DATE\$1CMP 함수](r_DATE_CMP.md)
+ [DATE\$1CMP\$1TIMESTAMP 함수](r_DATE_CMP_TIMESTAMP.md)
+ [DATE\$1CMP\$1TIMESTAMPTZ 함수](r_DATE_CMP_TIMESTAMPTZ.md)
+ [DATEADD 함수](r_DATEADD_function.md)
+ [DATEDIFF 함수](r_DATEDIFF_function.md)
+ [DATE\$1PART 함수](r_DATE_PART_function.md)
+ [DATE\$1PART\$1YEAR 함수](r_DATE_PART_YEAR.md)
+ [DATE\$1TRUNC 함수](r_DATE_TRUNC.md)
+ [EXTRACT 함수](r_EXTRACT_function.md)
+ [GETDATE 함수](r_GETDATE.md)
+ [INTERVAL\$1CMP 함수](r_INTERVAL_CMP.md)
+ [LAST\$1DAY 함수](r_LAST_DAY.md)
+ [MONTHS\$1BETWEEN 함수](r_MONTHS_BETWEEN_function.md)
+ [NEXT\$1DAY 함수](r_NEXT_DAY.md)
+ [SYSDATE 함수](r_SYSDATE.md)
+ [TIMEOFDAY 함수](r_TIMEOFDAY_function.md)
+ [TIMESTAMP\$1CMP 함수](r_TIMESTAMP_CMP.md)
+ [TIMESTAMP\$1CMP\$1DATE 함수](r_TIMESTAMP_CMP_DATE.md)
+ [TIMESTAMP\$1CMP\$1TIMESTAMPTZ 함수](r_TIMESTAMP_CMP_TIMESTAMPTZ.md)
+ [TIMESTAMPTZ\$1CMP 함수](r_TIMESTAMPTZ_CMP.md)
+ [TIMESTAMPTZ\$1CMP\$1DATE 함수](r_TIMESTAMPTZ_CMP_DATE.md)
+ [TIMESTAMPTZ\$1CMP\$1TIMESTAMP 함수](r_TIMESTAMPTZ_CMP_TIMESTAMP.md)
+ [TIMEZONE 함수](r_TIMEZONE.md)
+ [TO\$1TIMESTAMP 함수](r_TO_TIMESTAMP.md)
+ [TRUNC 함수](r_TRUNC_date.md)
+ [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md)

## 날짜 및 시간 함수 요약
<a name="date-functions-summary"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/Date_functions_header.html)

**참고**  
경과 시간을 계산할 때 윤초는 고려하지 않습니다.

## 트랜잭션의 날짜 및 시간 함수
<a name="date-functions-transactions"></a>

다음 함수를 트랜잭션 블록(BEGIN … END) 내에서 실행할 경우에는 함수가 현재 문이 아닌 현재 트랜잭션의 시작 날짜 또는 시간을 반환합니다.
+ SYSDATE
+ TIMESTAMP
+ CURRENT\$1DATE

다음 함수는 트랜잭션 블록 내에서도 항상 현재 문의 시작 날짜 또는 시간을 반환합니다.
+ GETDATE
+ TIMEOFDAY

## 지원되지 않는 리더 노드 전용 함수
<a name="date-functions-deprecated"></a>

다음 날짜 함수는 리더 노드에서만 실행되기 때문에 더 이상 지원되지 않습니다. 자세한 내용은 [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md) 섹션을 참조하세요.
+ age. 대신 [DATEDIFF 함수](r_DATEDIFF_function.md)을 사용하세요.
+ Current Time. 대신에 [GETDATE 함수](r_GETDATE.md) 또는 [SYSDATE](r_SYSDATE.md)를 사용하십시오.
+ CURRENT\$1TIMESTAMP. 대신에 [GETDATE 함수](r_GETDATE.md) 또는 [SYSDATE](r_SYSDATE.md)를 사용하십시오.
+ LOCALTIME. 대신에 [GETDATE 함수](r_GETDATE.md) 또는 [SYSDATE](r_SYSDATE.md)를 사용하십시오.
+ LOCALTIMESTAMP. 대신에 [GETDATE 함수](r_GETDATE.md) 또는 [SYSDATE](r_SYSDATE.md)를 사용하십시오.
+ ISFINITE 
+ NOW. 대신에 [GETDATE 함수](r_GETDATE.md) 또는 [SYSDATE](r_SYSDATE.md)를 사용하십시오. 구체화된 뷰 내에서 NOW 함수를 사용하는 경우 현재 타임스탬프 대신 구체화된 뷰가 생성된 시점의 타임스탬프로 설정됩니다.

# \$1(연결) 연산자
<a name="r_DATE-CONCATENATE_function"></a>

DATE를 \$1 기호의 양쪽에 있는 TIME 또는 TIMETZ에 연결하고 TIMESTAMP 또는 TIMESTAMPTZ를 반환합니다.

## 구문
<a name="r_DATE-CONCATENATE_function-synopsis"></a>

```
date + {time | timetz}
```

인수의 순서는 반대로 할 수 있습니다. 예를 들어 **time \$1 **date입니다.

## 인수
<a name="r_DATE-CONCATENATE_function-arguments"></a>

 *날짜*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

 *시간*:   
`TIME` 데이터 형식의 열 또는 암시적으로 `TIME` 형식으로 평가되는 표현식입니다.

 *timetz*   
`TIMETZ` 데이터 형식의 열 또는 암시적으로 `TIMETZ` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_DATE-CONCATENATE_function-return-type"></a>

입력이 **date \$1 **time인 경우 TIMESTAMP입니다.

입력이 **date \$1 **timetz인 경우 TIMESTAMPTZ입니다.

## 예제
<a name="r_DATE-CONCATENATE_function-examples"></a>

### 예제 설정
<a name="r_DATE-CONCATENATE_function-example-setup"></a>

예제에서 사용된 TIME\$1TEST 및 TIMETZ\$1TEST 테이블을 설정하려면 다음 명령을 사용합니다.

```
create table time_test(time_val time);

insert into time_test values
('20:00:00'),
('00:00:00.5550'),
('00:58:00');
   
create table timetz_test(timetz_val timetz);
   
insert into timetz_test values
('04:00:00+00'),
('00:00:00.5550+00'),
('05:58:00+00');
```

### 시간 열이 있는 예
<a name="r_DATE-CONCATENATE_function-examples-time"></a>

다음 예제 테이블 TIME\$1TEST에는 3개의 값이 삽입된 TIME\$1VAL(TIME 형식) 열이 있습니다.

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

다음 예에서는 날짜 리터럴과 TIME\$1VAL 열을 연결합니다.

```
select date '2000-01-02' + time_val as ts from time_test;
            
ts
---------------------
2000-01-02 20:00:00
2000-01-02 00:00:00.5550
2000-01-02 00:58:00
```

다음 예에서는 날짜 리터럴과 시간 리터럴을 연결합니다.

```
select date '2000-01-01' + time '20:00:00' as ts;
            
         ts
---------------------
 2000-01-01 20:00:00
```

다음 예에서는 시간 리터럴과 날짜 리터럴을 연결합니다.

```
select time '20:00:00' + date '2000-01-01' as ts;
            
         ts
---------------------
 2000-01-01 20:00:00
```

### TIMETZ 열이 있는 예
<a name="r_DATE-CONCATENATE_function-examples-timetz"></a>

다음 예제 테이블 TIMETZ\$1TEST에는 3개의 값이 삽입된 TIMETZ\$1VAL(TIMETZ 형식) 열이 있습니다.

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

다음 예에서는 날짜 리터럴과 TIMETZ\$1VAL 열을 연결합니다.

```
select date '2000-01-01' + timetz_val as ts from timetz_test;
ts
---------------------
2000-01-01 04:00:00+00
2000-01-01 00:00:00.5550+00
2000-01-01 05:58:00+00
```

다음 예에서는 TIMETZ\$1VAL 열과 날짜 리터럴을 연결합니다.

```
select timetz_val + date '2000-01-01' as ts from timetz_test;
ts
---------------------
2000-01-01 04:00:00+00
2000-01-01 00:00:00.5550+00
2000-01-01 05:58:00+00
```

다음 예에서는 DATE 리터럴과 TIMETZ 리터럴을 연결합니다. 이 예제에서는 기본적으로 UTC 표준 시간대인 TIMESTAMPTZ를 반환합니다. UTC는 PST보다 8시간 빠르므로 결과는 입력 시간보다 8시간 앞당겨집니다.

```
select date '2000-01-01' + timetz '20:00:00 PST' as ts;
            
           ts
------------------------
 2000-01-02 04:00:00+00
```

# ADD\$1MONTHS 함수
<a name="r_ADD_MONTHS"></a>

ADD\$1MONTHS는 지정한 월 수를 날짜 또는 타임스탬프 값이나 표현식에 더합니다. [DATEADD](r_DATEADD_function.md) 함수가 이와 유사한 기능을 제공합니다.

## 구문
<a name="r_ADD_MONTHS-synopsis"></a>

```
ADD_MONTHS( {date | timestamp}, integer)
```

## 인수
<a name="r_ADD_MONTHS-arguments"></a>

 *date* \$1 *timestamp*   
`DATE` 또는 `TIMESTAMP` 데이터 형식의 `DATE` 또는 `TIMESTAMP` 형식으로 암시적으로 계산되는 표현식입니다. 날짜가 월의 마지막 날이거나, 혹은 결과에 따른 월이 더 짧은 경우에는 함수가 월의 마지막 날을 결과로 반환합니다. 그 밖에 다른 날짜일 때는 날짜 표현식과 동일한 날의 숫자가 결과로 반환됩니다.

 *integer*   
 데이터 형식의 값입니다`INTEGER` 날짜에서 월을 뺄 때는 음의 정수를 사용합니다.

## 반환 타입
<a name="r_ADD_MONTHS-return-type"></a>

TIMESTAMP

## 예제
<a name="r_ADD_MONTHS-example"></a>

다음은 TRUNC 함수 내에서 ADD\$1MONTHS 함수를 사용하는 쿼리입니다. TRUNC 함수는 ADD\$1MONTHS 결과에서 시간 부분을 제거합니다. ADD\$1MONTHS 함수는 CALDATE 열의 각 값에 12개월을 합산합니다. CALDATE 열의 값은 날짜입니다.

```
select distinct trunc(add_months(caldate, 12)) as calplus12,
trunc(caldate) as cal
from date
order by 1 asc;

 calplus12  |    cal
------------+------------
 2009-01-01 | 2008-01-01
 2009-01-02 | 2008-01-02
 2009-01-03 | 2008-01-03
...
(365 rows)
```

다음 예제에서는 ADD\$1MONTHS 함수를 사용하여 **타임스탬프에 1개월을 추가합니다.

```
select add_months('2008-01-01 05:07:30', 1); 

add_months
---------------------
2008-02-01 05:07:30
```

다음은 일 수가 서로 다른 월의 날짜에 대해 ADD\$1MONTHS 함수를 실행할 경우 동작에 대해서 설명하는 예입니다. 이 예제에서는 함수가 3월 31일에 1개월 추가 및 4월 30일에 1개월 추가를 처리하는 방법을 보여 줍니다. 4월은 30일이므로 3월 31일에 1개월을 더하면 4월 30일이 됩니다. 5월은 31일이므로 4월 30일에 1개월을 더하면 5월 31일이 됩니다.

```
select add_months('2008-03-31',1);

add_months
---------------------
2008-04-30 00:00:00

select add_months('2008-04-30',1); 

add_months
---------------------
2008-05-31 00:00:00
```

# AT TIME ZONE 함수
<a name="r_AT_TIME_ZONE"></a>

AT TIME ZONE은 TIMESTAMP 또는 TIMESTAMPTZ 표현식에 사용할 시간대를 지정합니다.

## 구문
<a name="r_AT_TIME_ZONE-syntax"></a>

```
AT TIME ZONE 'timezone'
```

## 인수
<a name="r_AT_TIME_ZONE-arguments"></a>

*timezone*  
반환 값의 `TIMEZONE`입니다. 시간대는 시간대 이름(**'Africa/Kampala'**, **'Singapore'** 등) 또는 시간대 약어(**'UTC'**, **'PDT'** 등)로 지정할 수 있습니다.  
지원되는 시간대 이름 목록을 보려면 다음 명령을 실행합니다.  

```
select pg_timezone_names();
```
 지원되는 시간대 이름 약어 목록을 보려면 다음 명령을 실행합니다.  

```
select pg_timezone_abbrevs();
```
 자세한 정보와 지침은 [시간대 사용 노트](CONVERT_TIMEZONE.md#CONVERT_TIMEZONE-usage-notes) 섹션을 참조하세요.

## 반환 타입
<a name="r_AT_TIME_ZONE-return-type"></a>

TIMESTAMP 표현식과 함께 사용할 경우에는 TIMESTAMPTZ이고, TIMESTAMPTZ 표현식과 함께 사용할 경우에는 TIMESTAMP입니다.

## 예제
<a name="r_AT_TIME_ZONE-examples"></a>

다음은 시간대를 제외한 타임스탬프 값을 변환하여 MST 시간(POSIX의 UTC\$17)로 해석하는 예입니다. 이 예시는 UTC 시간대에 대해 TIMESTAMPTZ 데이터 유형의 값을 반환합니다. 기본 시간대를 UTC 이외의 시간대로 구성하면 다른 결과가 표시될 수 있습니다.

```
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';

timezone
------------------------
2001-02-17 03:38:40+00
```

다음은 지정한 시간대가 EST(POSIX의 UTC\$15)일 때 시간대 값을 포함한 입력 타임스탬프를 MST(POSIX의 UTC\$17)로 변환하는 예입니다. 이 예에서는 TIMESTAMP 데이터 형식의 값을 반환합니다.

```
SELECT TIMESTAMPTZ '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';

timezone
------------------------
2001-02-16 18:38:40
```

# CONVERT\$1TIMEZONE 함수
<a name="CONVERT_TIMEZONE"></a>

CONVERT\$1TIMEZONE은 시간대끼리 타임스탬프를 변환합니다. 이 함수는 일광 절약 시간에 맞춰 자동으로 조정됩니다.

## 구문
<a name="CONVERT_TIMEZONE-syntax"></a>

```
CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')
```

## 인수
<a name="CONVERT_TIMEZONE-arguments"></a>

*source\$1timezone*  
(옵션) 현재 타임스탬프의 시간대입니다. 기본값은 UTC입니다. 자세한 내용은 [시간대 사용 노트](#CONVERT_TIMEZONE-usage-notes) 섹션을 참조하세요.

*target\$1timezone*   
새로운 타임스탬프의 시간대입니다. 자세한 내용은 [시간대 사용 노트](#CONVERT_TIMEZONE-usage-notes) 섹션을 참조하세요.

*timestamp*   
타임스탬프 열 또는 묵시적으로 타임스탬프로 변환되는 표현식입니다.

## 반환 타입
<a name="CONVERT_TIMEZONE-return-type"></a>

TIMESTAMP

## 시간대 사용 노트
<a name="CONVERT_TIMEZONE-usage-notes"></a>

*source\$1timezone* 또는 *target\$1timezone*은 시간대 이름('Africa/Kampala', 'Singapore' 등)이나 시간대 약어('UTC', 'PDT' 등)로 지정할 수 있습니다. 시간대 이름을 이름으로 변환하거나 약어를 약어로 변환할 필요가 없습니다. 예를 들어 소스 시간대 이름인 'Singapore'에서 타임스탬프를 선택하고 이를 시간대 약어 'PDT'의 타임스탬프로 변환할 수 있습니다.

**참고**  
시간대 이름 또는 시간대 약어 사용의 결과는 일광 절약 시간 등 지역별 계절 시간으로 인해 다를 수 있습니다.

### 시간대 이름 사용
<a name="CONVERT_TIMEZONE-using-name"></a>

현재 시간대 이름 및 시간대 이름의 전체 목록을 보려면 다음 명령을 실행하세요.

```
select pg_timezone_names();
```

각 행에는 시간대 이름, 약어, UTC 오프셋 및 시간대가 일광 절약 시간제(`t` 또는 `f`)를 준수하는지 여부를 표시하는 쉼표로 구분된 문자열이 포함됩니다. 예를 들어 다음 코드 조각은 두 개의 결과 행을 보여줍니다. 첫 번째 행은 `Antarctica/South Pole` 시간대(약어 `NZDT`)이며 UTC 오프셋이 `13:00:00`이고 `f`는 일광 절약 시간제를 준수하지 않음을 나타냅니다. 두 번째 행은 `Europe/Paris` 시간대(약어 `CET`)이며 UTC 오프셋이 `01:00:00`이고 `f`는 일광 절약 시간제를 준수함을 나타냅니다.

```
pg_timezone_names
------------------
(Antarctica/South_Pole,NZDT,13:00:00,t)	
(Europe/Paris,CET,01:00:00,f)
```

SQL 문을 실행하여 전체 목록을 가져오고 시간대 이름을 찾으세요. 대략 600개의 행이 반환됩니다. 반환된 일부 시간대 이름이 대문자 머리글자이거나 약어(GB, PRC, ROK 등)이기는 하지만 CONVERT\$1TIMEZONE 함수는 이를 시간대 약어가 아닌 시간대 이름으로 처리합니다.

시간대를 시간대 이름으로 지정하는 경우에는 CONVERT\$1TIMEZONE 함수가 일광 절약 시간(DST)에 맞춰, 혹은 서머 타임, 스탠다드 타임, 윈터 타임 같이 '*timestamp*'에서 지정한 날짜 및 시간에 해당하는 시간대의 지역별 계절 프로토콜에 맞춰 자동 조정합니다. 예를 들어 'Europe/London'은 겨울에는 UTC를 나타내고 여름에는 1시간이 추가됩니다. Amazon Redshift는 [IANA 시간대 데이터베이스](https://www.iana.org/time-zones)를 표준 시간대 사양의 신뢰할 수 있는 소스로 사용합니다.

### 시간대 약어 사용
<a name="CONVERT_TIMEZONE-using-abbrev"></a>

 현재 시간대 약어 및 시간대 약어의 전체 목록을 보려면 다음 명령을 실행하세요.

```
select pg_timezone_abbrevs();
```

결과에는 시간대 약어, UTC 오프셋 및 시간대가 일광 절약 시간제(`t` 또는 `f`)를 준수하는지 여부를 표시하는 쉼표로 구분된 문자열이 포함됩니다. 예를 들어 다음 코드 조각은 두 개의 결과 행을 보여줍니다. 첫 번째 행에는 UTC에서 `-07:00:00` 오프셋이 있는 일광 절약 태평양 표준시(Pacific Daylight Time, 약어 `PDT`)가 포함되며 `t`는 일광 절약 시간제를 준수함을 나타냅니다. 두 번째 행에는 UTC에서 `-08:00:00` 오프셋이 있는 태평양 표준시(Pacific Standard Time, 약어 `PST`)가 포함되며 `f`는 일광 절약 시간제를 준수하지 않을 나타냅니다.

```
pg_timezone_abbrevs
--------------------
(PDT,-07:00:00,t)	
(PST,-08:00:00,f)
```

SQL 문을 실행하여 전체 목록을 얻고 해당 오프셋 및 일광 절약 표시기를 기반으로 약어를 찾으세요. 대략 200개의 행이 반환됩니다.

시간대 약어는 UTC의 고정 오프셋을 나타냅니다. 시간대를 시간대 약어로 지정하는 경우에는 CONVERT\$1TIMEZONE 함수가 UTC의 고정 오프셋을 사용하기 때문에 지역별 계정 프로토콜에 따라 조정하지 않습니다.

### POSIX 스타일 형식 사용
<a name="CONVERT_TIMEZONE-using-posix"></a>

POSIX-스타일 시간대 사양은 *STDoffset* 또는 *STDoffsetDST* 형식을 따릅니다. 여기서 *STD*는 시간대의 약어이고, *offset*은 UTC의 숫자 오프셋(서부 시간)이고, *DST*는 일광 절약 시간대의 약어(옵션)입니다. 일광 절약 시간은 지정한 오프셋보다 1시간 앞서는 것으로 가정합니다.

POSIX-스타일 시간대 형식은 Greenwich에서 서쪽으로 양의 오프셋을 사용하는 반면 ISO-8601 규약은 Greenwich에서 동쪽으로 양의 오프셋을 사용합니다.

다음은 POSIX-스타일 시간대의 예입니다.
+  PST8
+  PST8PDT
+  EST5
+  EST5EDT

**참고**  
Amazon Redshift는 POSIX 스타일 시간대 사양의 유효성을 검사하지 않으므로 시간대를 잘못된 값으로 설정할 수 있습니다. 예를 들어 다음 명령을 시간대를 잘못된 값으로 설정하지만 오류를 반환하지 않습니다.  

```
set timezone to ‘xxx36’;
```

## 예제
<a name="CONVERT_TIMEZONE-examples"></a>

이 안내서에 나오는 예는 대부분 TICKIT 샘플 데이터 세트를 사용합니다. 자세한 내용은 [샘플 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)를 참조하세요.

다음은 타임스탬프 값을 기본 UTC 시간대에서 PST로 변환하는 예입니다.

```
select convert_timezone('PST', '2008-08-21 07:23:54');
                     
 convert_timezone
------------------------
2008-08-20 23:23:54
```

다음은 LISTTIME 열의 타임스탬프 값을 기본 UTC 시간대에서 PST로 변환하는 예입니다. 타임스탬프가 일광 절약 시간(PST)에 해당하더라도 대상 시간대가 약어로 지정되어 있기 때문에 스탠다드 타임으로 변환됩니다.

```
select listtime, convert_timezone('PST', listtime) from listing
where listid = 16;
                     
     listtime       |   convert_timezone
--------------------+-------------------
2008-08-24 09:36:12     2008-08-24 01:36:12
```

다음은 LISTTIME 열의 타임스탬프 값을 기본 UTC 시간대에서 US/Pacific 시간대로 변환하는 예입니다. 대상 시간대가 시간대 이름을 사용하고 있고, 타임스탬프가 일광 절약 시간에 해당하기 때문에 함수가 일광 절약 시간을 반환합니다.

```
select listtime, convert_timezone('US/Pacific', listtime) from listing
where listid = 16;
                     
     listtime       |   convert_timezone
--------------------+---------------------
2008-08-24 09:36:12 | 2008-08-24 02:36:12
```

다음은 타임스탬프 문자열을 EST에서 PST로 변환하는 예입니다.

```
select convert_timezone('EST', 'PST', '20080305 12:25:29');
                     
 convert_timezone
-------------------
2008-03-05 09:25:29
```

다음은 대상 시간대가 시간대 이름(America/New\$1York)을 사용하고 있고, 타임스탬프가 스탠다드 타임에 해당하기 때문에 타임스탬프를 미국 동부 스탠다드 타임으로 변환하는 예입니다.

```
select convert_timezone('America/New_York', '2013-02-01 08:00:00');

 convert_timezone
---------------------
2013-02-01 03:00:00
(1 row)
```

다음은 대상 시간대가 시간대 이름(America/New\$1York)을 사용하고 있고, 타임스탬프가 일광 절약 시간에 해당하기 때문에 타임스탬프를 미국 동부 일광 절약 시간으로 변환하는 예입니다.

```
select convert_timezone('America/New_York', '2013-06-01 08:00:00');

 convert_timezone
---------------------
2013-06-01 04:00:00
(1 row)
```

다음은 오프셋의 사용을 설명하는 예입니다.

```
SELECT CONVERT_TIMEZONE('GMT','NEWZONE +2','2014-05-17 12:00:00') as newzone_plus_2, 
CONVERT_TIMEZONE('GMT','NEWZONE-2:15','2014-05-17 12:00:00') as newzone_minus_2_15, 
CONVERT_TIMEZONE('GMT','America/Los_Angeles+2','2014-05-17 12:00:00') as la_plus_2,
CONVERT_TIMEZONE('GMT','GMT+2','2014-05-17 12:00:00') as gmt_plus_2;
 
   newzone_plus_2    | newzone_minus_2_15  |      la_plus_2      |     gmt_plus_2
---------------------+---------------------+---------------------+---------------------
2014-05-17 10:00:00 | 2014-05-17 14:15:00 | 2014-05-17 10:00:00 | 2014-05-17 10:00:00
(1 row)
```

# CURRENT\$1DATE 함수
<a name="r_CURRENT_DATE_function"></a>

CURRENT\$1DATE는 현재 세션 시간대(기본 UTC)의 날짜를 기본 형식(YYYY-MM-DD)으로 반환합니다.

**참고**  
CURRENT\$1DATE는 현재 문이 아닌 현재 트랜잭션의 시작 날짜를 반환합니다. 10/01/08 23:59에 여러 문이 포함된 트랜잭션을 시작하고, CURRENT\$1DATE가 포함된 문이 10/02/08 00:00에 실행되는 시나리오를 생각해 보세요. CURRENT\$1DATE는 `10/02/08`이 아닌 `10/01/08`을 반환합니다.

## 구문
<a name="r_CURRENT_DATE_function-syntax"></a>

```
CURRENT_DATE
```

## 반환 타입
<a name="r_CURRENT_DATE_function-return-type"></a>

DATE

## 예제
<a name="r_CURRENT_DATE_function-examples"></a>

다음은 현재 날짜(함수가 실행되는 AWS 리전 내)를 반환하는 예입니다.

```
select current_date;

   date
------------
2008-10-01
```

다음 예제에서는 테이블을 만들고 `todays_date` 열의 기본값이 CURRENT\$1DATE인 행을 삽입한 다음 테이블의 모든 행을 선택합니다.

```
CREATE TABLE insert_dates(
    label varchar(128) NOT NULL,
    todays_date DATE DEFAULT CURRENT_DATE);

INSERT INTO insert_dates(label)
VALUES('Date row inserted');

SELECT * FROM insert_dates;
         

 label            | todays_date
------------------+-------------
Date row inserted | 2023-05-10
```

# DATE\$1CMP 함수
<a name="r_DATE_CMP"></a>

DATE\$1CMP는 두 날짜를 서로 비교합니다. 이 함수는 날짜가 동일하면 `0`, *date1* 값이 더 크면 `1`, *date2* 값이 더 크면 `-1`을 반환합니다.

## 구문
<a name="r_DATE_CMP-synopsis"></a>

```
DATE_CMP(date1, date2)
```

## 인수
<a name="r_DATE_CMP-arguments"></a>

 *date1*   
`DATE` 데이터 형식의 열 또는 `DATE` 형식으로 계산되는 표현식입니다.

 *date2*   
`DATE` 데이터 형식의 열 또는 `DATE` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="r_DATE_CMP-return-type"></a>

INTEGER

## 예제
<a name="r_DATE_CMP-example"></a>

다음은 CALDATE 열의 DATE 값과 2008년 1월 4일을 서로 비교하여 CALDATE 열의 값이 2008년 1월 4일 이전인지(`-1`), 동일한지(`0`) 또는 이후인지(`1`) 결과를 반환하는 예입니다.

```
select caldate, '2008-01-04',
date_cmp(caldate,'2008-01-04')
from date
order by dateid
limit 10;

 caldate   |  ?column?  | date_cmp
-----------+------------+----------
2008-01-01 | 2008-01-04 |       -1
2008-01-02 | 2008-01-04 |       -1
2008-01-03 | 2008-01-04 |       -1
2008-01-04 | 2008-01-04 |        0
2008-01-05 | 2008-01-04 |        1
2008-01-06 | 2008-01-04 |        1
2008-01-07 | 2008-01-04 |        1
2008-01-08 | 2008-01-04 |        1
2008-01-09 | 2008-01-04 |        1
2008-01-10 | 2008-01-04 |        1
(10 rows)
```

# DATE\$1CMP\$1TIMESTAMP 함수
<a name="r_DATE_CMP_TIMESTAMP"></a>

DATE\$1CMP\$1TIMESTAMP는 날짜와 타임스탬프를 비교하여 값이 같으면 `0`, *date* 값이 시간순으로 더 크면 `1`, *timestamp* 값이 더 크면 `-1`을 반환합니다.

## 구문
<a name="r_DATE_CMP_TIMESTAMP-synopsis"></a>

```
DATE_CMP_TIMESTAMP(date, timestamp)
```

## 인수
<a name="r_DATE_CMP_TIMESTAMP-arguments"></a>

 *날짜*   
`DATE` 데이터 형식의 열 또는 `DATE` 형식으로 계산되는 표현식입니다.

 *timestamp*   
`TIMESTAMP` 데이터 형식의 열 또는 `TIMESTAMP` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="r_DATE_CMP_TIMESTAMP-return-type"></a>

INTEGER

## 예제
<a name="r_DATE_CMP_TIMESTAMP-examples"></a>

다음은 날짜 `2008-06-18`을 LISTTIME 열과 비교하는 예입니다. LISTTIME 열의 값은 타임스탬프입니다. 이 날짜 이전의 목록은 `1`을, 그리고 이 날짜 이후의 목록은 `-1`을 반환합니다.

```
select listid, '2008-06-18', listtime,
date_cmp_timestamp('2008-06-18', listtime)
from listing
order by 1, 2, 3, 4
limit 10;

 listid |  ?column?  |      listtime       | date_cmp_timestamp
--------+------------+---------------------+--------------------
      1 | 2008-06-18 | 2008-01-24 06:43:29 |                  1
      2 | 2008-06-18 | 2008-03-05 12:25:29 |                  1
      3 | 2008-06-18 | 2008-11-01 07:35:33 |                 -1
      4 | 2008-06-18 | 2008-05-24 01:18:37 |                  1
      5 | 2008-06-18 | 2008-05-17 02:29:11 |                  1
      6 | 2008-06-18 | 2008-08-15 02:08:13 |                 -1
      7 | 2008-06-18 | 2008-11-15 09:38:15 |                 -1
      8 | 2008-06-18 | 2008-11-09 05:07:30 |                 -1
      9 | 2008-06-18 | 2008-09-09 08:03:36 |                 -1
     10 | 2008-06-18 | 2008-06-17 09:44:54 |                  1
(10 rows)
```

# DATE\$1CMP\$1TIMESTAMPTZ 함수
<a name="r_DATE_CMP_TIMESTAMPTZ"></a>

DATE\$1CMP\$1TIMESTAMPTZ는 날짜를 시간대가 있는 타임스탬프와 비교하여 값이 같으면 `0`, *date* 값이 시간순으로 더 크면 `1`, *timestamptz* 값이 더 크면 `-1`을 반환합니다.

## 구문
<a name="r_DATE_CMP_TIMESTAMPTZ-syntax"></a>

```
DATE_CMP_TIMESTAMPTZ(date, timestamptz)
```

## 인수
<a name="r_DATE_CMP_TIMESTAMPTZ-arguments"></a>

 *날짜*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

 *timestamptz*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_DATE_CMP_TIMESTAMPTZ-return-type"></a>

INTEGER

## 예제
<a name="r_DATE_CMP_TIMESTAMPTZ-examples"></a>

다음은 날짜 `2008-06-18`을 LISTTIME 열과 비교하는 예입니다. 이 날짜 이전의 목록은 `1`을, 그리고 이 날짜 이후의 목록은 `-1`을 반환합니다.

```
select listid, '2008-06-18', CAST(listtime AS timestamptz),
date_cmp_timestamptz('2008-06-18', CAST(listtime AS timestamptz))
from listing
order by 1, 2, 3, 4
limit 10;

 listid |  ?column?  |      timestamptz       | date_cmp_timestamptz
--------+------------+------------------------+----------------------
      1 | 2008-06-18 | 2008-01-24 06:43:29+00 |                  1
      2 | 2008-06-18 | 2008-03-05 12:25:29+00 |                  1
      3 | 2008-06-18 | 2008-11-01 07:35:33+00 |                 -1
      4 | 2008-06-18 | 2008-05-24 01:18:37+00 |                  1
      5 | 2008-06-18 | 2008-05-17 02:29:11+00 |                  1
      6 | 2008-06-18 | 2008-08-15 02:08:13+00 |                 -1
      7 | 2008-06-18 | 2008-11-15 09:38:15+00 |                 -1
      8 | 2008-06-18 | 2008-11-09 05:07:30+00 |                 -1
      9 | 2008-06-18 | 2008-09-09 08:03:36+00 |                 -1
     10 | 2008-06-18 | 2008-06-17 09:44:54+00 |                  1
(10 rows)
```

# DATEADD 함수
<a name="r_DATEADD_function"></a>

DATE, TIME, TIMETZ 또는 TIMESTAMP 값을 지정된 간격만큼 늘립니다.

## 구문
<a name="r_DATEADD_function-synopsis"></a>

```
DATEADD( datepart, interval, {date|time|timetz|timestamp} )
```

## 인수
<a name="r_DATEADD_function-arguments"></a>

 *datepart*   
함수가 작동하는 날짜 부분(예: 년, 월, 일 또는 시)입니다. 자세한 내용은 [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md) 섹션을 참조하세요.

 *간격*   
대상 표현식에 합산할 간격(일 수 등)을 지정한 정수입니다. 음의 정수는 간격을 감산합니다.

 *date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE, TIME, TIMETZ 또는 TIMESTAMP 열 또는 암시적으로 DATE, TIME, TIMETZ 또는 TIMESTAMP로 변환하는 표현식입니다. DATE, TIME, TIMETZ 또는 TIMESTAMP 표현식에 지정한 날짜 부분이 포함되어야 합니다.

## 반환 타입
<a name="r_DATEADD_function-return-type"></a>

입력 데이터 형식에 따라 TIMESTAMP, TIME 또는 TIMETZ입니다.

## DATE 열이 있는 예
<a name="r_DATEADD_function-examples"></a>

다음은 DATE 테이블에 존재하는 11월 데이터에 각각 30일을 합산하는 예입니다.

```
select dateadd(day,30,caldate) as novplus30
from date
where month='NOV'
order by dateid;

novplus30
---------------------
2008-12-01 00:00:00
2008-12-02 00:00:00
2008-12-03 00:00:00
...
(30 rows)
```

 다음 예에서는 리터럴 날짜 값에 18개월을 추가합니다.

```
select dateadd(month,18,'2008-02-28');

date_add
---------------------
2009-08-28 00:00:00
(1 row)
```

DATEADD 함수에 사용되는 기본 열 이름은 DATE\$1ADD입니다. 날짜 값을 나타내는 기본 타임스탬프는 `00:00:00`입니다.

다음 예에서는 타임스탬프를 지정하지 않는 날짜 값에 30분을 추가합니다.

```
select dateadd(m,30,'2008-02-28');

date_add
---------------------
2008-02-28 00:30:00
(1 row)
```

날짜 부분은 전체 이름으로 또는 약어로 지정할 수 있습니다. 이 경우 *m*은 월이 아닌 분을 나타냅니다.

## TIME 열이 있는 예
<a name="r_DATEADD_function-examples-time"></a>

다음 예제 테이블 TIME\$1TEST에는 3개의 값이 삽입된 TIME\$1VAL(TIME 형식) 열이 있습니다.

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

다음 예에서는 TIME\$1TEST 테이블의 각 TIME\$1VAL에 5분을 추가합니다.

```
select dateadd(minute,5,time_val) as minplus5 from time_test;
            
minplus5
---------------
20:05:00
00:05:00.5550
01:03:00
```

다음 예에서는 리터럴 시간 값에 8시간을 추가합니다.

```
select dateadd(hour, 8, time '13:24:55');
            
date_add
---------------
21:24:55
```

다음 예에서는 시간이 24:00:00을 초과하거나 00:00:00 미만인 경우를 보여줍니다.

```
select dateadd(hour, 12, time '13:24:55');
            
date_add
---------------
01:24:55
```

## TIMETZ 열이 있는 예
<a name="r_DATEADD_function-examples-timetz"></a>

이 예의 출력 값은 기본 표준 시간대인 UTC를 기준으로 합니다.

다음 예제 테이블 TIMETZ\$1TEST에는 3개의 값이 삽입된 TIMETZ\$1VAL(TIMETZ 형식) 열이 있습니다.

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

다음 예에서는 TIMETZ\$1TEST 테이블의 각 TIMETZ\$1VAL에 5분을 추가합니다.

```
select dateadd(minute,5,timetz_val) as minplus5_tz from timetz_test;
            
minplus5_tz
---------------
04:05:00+00
00:05:00.5550+00
06:03:00+00
```

다음 예에서는 리터럴 timetz 값에 2시간을 추가합니다.

```
select dateadd(hour, 2, timetz '13:24:55 PST');
            
date_add
---------------
23:24:55+00
```

## TIMESTAMP 열이 있는 예시
<a name="r_DATEADD_function-examples-timestamp"></a>

이 예의 출력 값은 기본 표준 시간대인 UTC를 기준으로 합니다.

다음 예시 테이블 TIMESTAMP\$1TEST에는 3개의 값이 삽입된 TIMESTAMP\$1VAL(TIMESTAMP 형식) 열이 있습니다.

```
SELECT timestamp_val FROM timestamp_test;
            
timestamp_val
------------------
1988-05-15 10:23:31
2021-03-18 17:20:41
2023-06-02 18:11:12
```

다음 예시에서는 2000년 이전의 TIMESTAMP\$1TEST의 TIMESTAMP\$1VAL 값에만 20년을 더합니다.

```
SELECT dateadd(year,20,timestamp_val) 
FROM timestamp_test
WHERE timestamp_val < to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH:MI:SS');
            
date_add
---------------
2008-05-15 10:23:31
```

다음 예시에서는 초 표시기 없이 작성된 리터럴 타임스탬프 값에 5초를 추가합니다.

```
SELECT dateadd(second, 5, timestamp '2001-06-06');
            
date_add
---------------
2001-06-06 00:00:05
```

## 사용 노트
<a name="r_DATEADD_usage_notes"></a>

 DATEADD(month, ...) 함수와 ADD\$1MONTHS 함수는 매월 마지막 날짜를 서로 다르게 처리합니다.
+ ADD\$1MONTHS: 합산하려는 날짜가 월의 마지막 날짜인 경우에는 월의 길이에 상관없이 항상 결과에 따른 월의 마지막 날짜가 반환됩니다. 예를 들어 다음과 같이 4월 30일에 1개월을 합산하면 5월 31일이 됩니다.

  ```
  select add_months('2008-04-30',1);
  
  add_months
  ---------------------
  2008-05-31 00:00:00
  (1 row)
  ```
+ DATEADD: 합산하려는 날짜의 일 수가 결과에 따른 월보다 적은 경우에는 결과에 따른 월의 마지막 날짜가 아니고 해당하는 날짜가 반환됩니다. 예를 들어 다음과 같이 4월 30일에 1개월을 합산하면 5월 30일이 됩니다.

  ```
  select dateadd(month,1,'2008-04-30');
  
  date_add
  ---------------------
  2008-05-30 00:00:00
  (1 row)
  ```

DATEADD 함수는 dateadd(month, 12,…)를 사용할 때와 dateadd(year, 1, …)을 사용할 때 윤년 날짜인 2월 29일을 각각 다르게 처리합니다.

```
select dateadd(month,12,'2016-02-29');
               
date_add
---------------------
2017-02-28 00:00:00

select dateadd(year, 1, '2016-02-29');

date_add       
---------------------
2017-03-01 00:00:00
```

# DATEDIFF 함수
<a name="r_DATEDIFF_function"></a>

DATEDIFF는 두 날짜 또는 시간 표현식에서 날짜 부분의 차이점을 반환합니다.

## 구문
<a name="r_DATEDIFF_function-synopsis"></a>

```
DATEDIFF( datepart, {date|time|timetz|timestamp}, {date|time|timetz|timestamp} )
```

## 인수
<a name="r_DATEDIFF_function-arguments"></a>

 *datepart*   
함수가 작동하는 날짜 또는 시간 값의 특정 부분(년, 월 또는 일, 시, 분, 초, 밀리초 또는 마이크로초)입니다. 자세한 내용은 [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md) 섹션을 참조하세요.  
특히 DATEDIFF는 두 표현식이 서로 교차하는 날짜 부분 경계의 수를 결정합니다. 예를 들어 두 날짜 `12-31-2008`과 `01-01-2009` 사이의 연도 차이를 계산한다고 가정합니다. 이 경우 함수는 두 날짜가 단 하루 차이임에도 불구하고 1년을 반환합니다. 하지만 두 타임스탬프인 `01-01-2009 8:30:00`과 `01-01-2009 10:00:00` 사이의 시간차를 구하는 경우에는 함수 결과로 2시간이 반환됩니다. 하지만 두 타임스탬프인 `8:30:00`과 `10:00:00` 사이의 시간차를 구하는 경우에는 함수 결과로 2시간이 반환됩니다.

*date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE, TIME, TIMETZ 또는 TIMESTAMP 열 또는 암시적으로 DATE, TIME, TIMETZ 또는 TIMESTAMP로 변환하는 표현식입니다. 표현식에는 지정하는 날짜 또는 시간 부분이 모두 포함되어야 합니다. 두 번째 날짜 또는 시간이 첫 번째 날짜 또는 시간보다 이후인 경우에는 결과 값이 양수입니다. 하지만 두 번째 날짜 또는 시간이 첫 번째 날짜 또는 시간보다 이전인 경우에는 결과 값이 음수입니다.

## 반환 타입
<a name="r_DATEDIFF_function-return-type"></a>

BIGINT

## DATE 열이 있는 예
<a name="r_DATEDIFF_function-examples"></a>

다음은 두 리터럴 날짜 값 사이의 차이 값(주 수)을 구하는 예입니다.

```
select datediff(week,'2009-01-01','2009-12-31') as numweeks;

numweeks
----------
52
(1 row)
```

다음은 두 리터럴 날짜 값 사이의 차이 값(시간)을 구하는 예입니다. 날짜의 시간 값을 제공하지 않는 경우 기본값은 00:00:00입니다.

```
select datediff(hour, '2023-01-01', '2023-01-03 05:04:03');
            
date_diff
----------
53
(1 row)
```

다음은 두 리터럴 TIMESTAMETZ 값 사이의 차이(일수)를 구하는 예시입니다.

```
Select datediff(days, 'Jun 1,2008  09:59:59 EST', 'Jul 4,2008  09:59:59 EST')
         
date_diff
----------
33
```

다음은 테이블의 동일한 행에 있는 두 날짜 사이의 차이 값(일)을 구하는 예입니다.

```
select * from date_table;

start_date |   end_date
-----------+-----------
2009-01-01 | 2009-03-23
2023-01-04 | 2024-05-04
(2 rows)

select datediff(day, start_date, end_date) as duration from date_table;
         
duration
---------
      81
     486
(2 rows)
```

다음은 이전 날짜와 오늘 날짜의 리터럴 값 사이에서 차이 값(분기 수)을 구하는 예입니다. 이번 예는 오늘 날짜가 2008년 6월 5일이라는 가정을 전제로 합니다. 날짜 부분은 전체 이름으로 또는 약어로 지정할 수 있습니다. DATEDIFF 함수에 사용되는 기본 열 이름은 DATE\$1DIFF입니다.

```
select datediff(qtr, '1998-07-01', current_date);

date_diff
-----------
40
(1 row)
```

다음은 SALES 테이블과 LISTING 테이블을 조인하여 두 테이블의 나열 이후 목록 1000부터 1005까지 티켓이 판매된 일수를 계산하는 예입니다. 두 목록에서 가장 길게 기다린 판매 일수는 15일이었고, 가장 짧은 기다린 판매 일수는 1일 미만이었습니다(0일).

```
select priceperticket,
datediff(day, listtime, saletime) as wait
from sales, listing where sales.listid = listing.listid
and sales.listid between 1000 and 1005
order by wait desc, priceperticket desc;

priceperticket | wait
---------------+------
 96.00         |   15
 123.00        |   11
 131.00        |    9
 123.00        |    6
 129.00        |    4
 96.00         |    4
 96.00         |    0
(7 rows)
```

다음은 판매자들이 모든 티켓이 판매될 때까지 기다린 평균 시간을 계산하는 예입니다.

```
select avg(datediff(hours, listtime, saletime)) as avgwait
from sales, listing
where sales.listid = listing.listid;

avgwait
---------
465
(1 row)
```

## TIME 열이 있는 예
<a name="r_DATEDIFF_function-examples-time"></a>

다음 예제 테이블 TIME\$1TEST에는 3개의 값이 삽입된 TIME\$1VAL(TIME 형식) 열이 있습니다.

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

다음 예에서는 TIME\$1VAL 열과 시간 리터럴 간의 시간 차이를 찾습니다.

```
select datediff(hour, time_val, time '15:24:45') from time_test;
         
 date_diff
-----------
        -5
        15
        15
```

다음 예에서는 두 리터럴 시간 값 간의 분 수 차이를 찾습니다.

```
select datediff(minute, time '20:00:00', time '21:00:00') as nummins;  
         
nummins 
---------- 
60
```

## TIMETZ 열이 있는 예
<a name="r_DATEDIFF_function-examples-timetz"></a>

다음 예제 테이블 TIMETZ\$1TEST에는 3개의 값이 삽입된 TIMETZ\$1VAL(TIMETZ 형식) 열이 있습니다.

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

다음 예에서는 TIMETZ 리터럴과 timetz\$1val 간의 시간 차이를 찾습니다.

```
select datediff(hours, timetz '20:00:00 PST', timetz_val) as numhours from timetz_test;

numhours 
---------- 
0
-4
1
```

다음 예에서는 두 리터럴 TIMETZ 값 간의 시간 차이를 찾습니다.

```
select datediff(hours, timetz '20:00:00 PST', timetz '00:58:00 EST') as numhours;
         
numhours 
---------- 
1
```

# DATE\$1PART 함수
<a name="r_DATE_PART_function"></a>

DATE\$1PART는 표현식에서 날짜 부분 값을 추출합니다. DATE\$1PART는 PGDATE\$1PART 함수의 동의어입니다.

## 구문
<a name="r_DATE_PART_function-synopsis"></a>

```
DATE_PART(datepart, {date|timestamp})
```

## 인수
<a name="r_DATE_PART_function-arguments"></a>

 *datepart*   
날짜 값에서 함수가 실행되는 특정 부분(예: 년, 월 또는 일)의 식별자 리터럴 또는 문자열입니다. 자세한 내용은 [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md) 섹션을 참조하세요.

\$1*date*\$1*timestamp*\$1  
날짜 열, 타임스탬프 열 또는 묵시적으로 날짜 또는 타임스탬프로 변환되는 표현식입니다. *date* 또는 *timestamp*의 열 또는 표현식에는 *datepart*에 지정된 날짜 부분이 포함되어야 합니다.

## 반환 타입
<a name="r_DATE_PART_function-return-type"></a>

DOUBLE

## 예제
<a name="r_DATE_PART_function-examples"></a>

DATE\$1PART 함수에 사용되는 기본 열 이름은 `pgdate_part`입니다.

 이러한 예 중 일부에 사용되는 데이터에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음 예는 타임스탬프 리터럴에서 분을 찾습니다.

```
SELECT DATE_PART(minute, timestamp '20230104 04:05:06.789');
            
pgdate_part
-----------
         5
```

다음 예는 타임스탬프 리터럴에서 주 번호를 찾습니다. 주 번호 계산은 ISO 8601 표준을 따릅니다. 자세한 내용은 Wikipedia의 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)을 참조하세요.

```
SELECT DATE_PART(week, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         18
```

다음 예는 타임스탬프 리터럴에서 날짜를 찾습니다.

```
SELECT DATE_PART(day, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         2
```

다음 예는 타임스탬프 리터럴에서 요일을 찾습니다. 요일 번호 계산에는 일요일부터 시작하여 0\$16의 정수가 사용됩니다.

```
SELECT DATE_PART(dayofweek, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         1
```

다음 예는 타임스탬프 리터럴에서 세기를 찾습니다. 세기 계산은 ISO 8601 표준을 따릅니다. 자세한 내용은 Wikipedia의 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)을 참조하세요.

```
SELECT DATE_PART(century, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         21
```

다음 예는 타임스탬프 리터럴에서 천 년 단위를 찾습니다. 천 년 단위 계산은 ISO 8601 표준을 따릅니다. 자세한 내용은 Wikipedia의 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)을 참조하세요.

```
SELECT DATE_PART(millennium, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         3
```

다음 예는 타임스탬프 리터럴에서 마이크로초를 찾습니다. 마이크로초 계산은 ISO 8601 표준을 따릅니다. 자세한 내용은 Wikipedia의 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)을 참조하세요.

```
SELECT DATE_PART(microsecond, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
    789000
```

다음 예는 날짜 리터럴에서 월을 찾습니다.

```
SELECT DATE_PART(month, date '20220502');
            
pgdate_part
-----------
         5
```

다음 예에서는 테이블의 열에 DATE\$1PART 함수를 적용합니다.

```
SELECT date_part(w, listtime) AS weeks, listtime
FROM listing 
WHERE listid=10
            

weeks |      listtime
------+---------------------
 25   | 2008-06-17 09:44:54
(1 row)
```

날짜 부분은 전체 이름 또는 약어로 지정할 수 있으며, 여기서 *w*는 주를 의미합니다.

요일을 나타내는 날짜 부분은 일요일부터 시작하여 0\$16의 정수를 반환합니다. DATE\$1PART를 dow(DAYOFWEEK)와 함께 사용하면 일요일의 이벤트를 볼 수 있습니다.

```
SELECT date_part(dow, starttime) AS dow, starttime 
FROM event
WHERE date_part(dow, starttime)=6
ORDER BY 2,1;     

 dow |      starttime
-----+---------------------
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
...
(1147 rows)
```

# DATE\$1PART\$1YEAR 함수
<a name="r_DATE_PART_YEAR"></a>

DATE\$1PART\$1YEAR 함수는 날짜에서 연도를 추출합니다.

## 구문
<a name="r_DATE_PART_YEAR-synopsis"></a>

```
DATE_PART_YEAR(date)
```

## 인수
<a name="r_DATE_PART_YEAR-argument"></a>

 *날짜*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_DATE_PART_YEAR-return-type"></a>

INTEGER

## 예제
<a name="r_DATE_PART_YEAR-examples"></a>

다음 예는 날짜 리터럴에서 연도를 찾습니다.

```
SELECT DATE_PART_YEAR(date '20220502 04:05:06.789');

date_part_year
---------------
2022
```

다음은 CALDATE 열에서 연도를 추출하는 예입니다. CALDATE 열의 값은 날짜입니다. 이 예에 사용되는 데이터에 대한 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
select caldate, date_part_year(caldate)
from date
order by
dateid limit 10;

 caldate   | date_part_year
-----------+----------------
2008-01-01 |           2008
2008-01-02 |           2008
2008-01-03 |           2008
2008-01-04 |           2008
2008-01-05 |           2008
2008-01-06 |           2008
2008-01-07 |           2008
2008-01-08 |           2008
2008-01-09 |           2008
2008-01-10 |           2008
(10 rows)
```

# DATE\$1TRUNC 함수
<a name="r_DATE_TRUNC"></a>

DATE\$1TRUNC 함수는 시간, 일 또는 월 등 지정하는 날짜 부분을 기준으로 타임스탬프 표현식 또는 리터럴을 자릅니다.

## 구문
<a name="r_DATE_TRUNC-synopsis"></a>

```
DATE_TRUNC('datepart', timestamp)
```

## 인수
<a name="r_DATE_TRUNC-arguments"></a>

 *datepart*   
타임스탬프 값을 자를 때 기준이 되는 날짜 부분입니다. 입력 *timestamp*(타임스탬프)는 입력 *datepart*의 정밀도로 잘립니다. 예를 들어, `month`로 설정하면 해당 달의 첫 번째 날로 잘립니다. 유효한 형식은 다음과 같습니다.  
+ microsecond, microseconds
+ millisecond, milliseconds
+ second, seconds
+ minute, minutes
+ hour, hours
+ day, days
+ week, weeks
+ month, months
+ quarter, quarters
+ year, years
+ decade, decades
+ century, centuries
+ millennium, millennia
일부 형식의 약어에 대한 자세한 내용은 [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md) 섹션을 참조하세요.

 *timestamp*   
타임스탬프 열 또는 묵시적으로 타임스탬프로 변환되는 표현식입니다.

## 반환 타입
<a name="r_DATE_TRUNC-return-type"></a>

TIMESTAMP

## 예제
<a name="r_DATE_TRUNC-example"></a>

입력 타임스탬프를 초로 자릅니다.

```
SELECT DATE_TRUNC('second', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:05:06
```

입력 타임스탬프를 분으로 자릅니다.

```
SELECT DATE_TRUNC('minute', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:05:00
```

입력 타임스탬프를 시간으로 자릅니다.

```
SELECT DATE_TRUNC('hour', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:00:00
```

입력 타임스탬프를 일로 자릅니다.

```
SELECT DATE_TRUNC('day', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 00:00:00
```

입력 타임스탬프를 해당 월의 첫 번째 날로 자릅니다.

```
SELECT DATE_TRUNC('month', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-01 00:00:00
```

입력 타임스탬프를 해당 분기의 첫 번째 날로 자릅니다.

```
SELECT DATE_TRUNC('quarter', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-01 00:00:00
```

입력 타임스탬프를 해당 연도의 첫 번째 날로 자릅니다.

```
SELECT DATE_TRUNC('year', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-01-01 00:00:00
```

입력 타임스탬프를 해당 세기의 첫 번째 날로 자릅니다.

```
SELECT DATE_TRUNC('millennium', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2001-01-01 00:00:00
```

입력 타임스탬프를 해당 주의 월요일로 자릅니다.

```
select date_trunc('week', TIMESTAMP '20220430 04:05:06.789');
date_trunc
2022-04-25 00:00:00
```

다음은 DATE\$1TRUNC 함수에서 '주' 날짜 부분을 사용하여 각 주의 월요일에 해당하는 날짜를 반환하는 예입니다.

```
select date_trunc('week', saletime), sum(pricepaid) from sales where
saletime like '2008-09%' group by date_trunc('week', saletime) order by 1;

date_trunc  |    sum
------------+-------------
2008-09-01  | 2474899
2008-09-08  | 2412354
2008-09-15  | 2364707
2008-09-22  | 2359351
2008-09-29  |  705249
```

# EXTRACT 함수
<a name="r_EXTRACT_function"></a>

EXTRACT 함수는 TIMESTAMP, TIMESTAMPTZ, TIME, TIMETZ, INTERVAL YEAR TO MONTH 또는 INTERVAL DAY TO SECOND 값에서 날짜 또는 시간 부분을 반환합니다. 예에는 타임스탬프의 일, 월, 년, 시, 분, 초, 밀리초 또는 마이크로초가 포함됩니다.

## 구문
<a name="r_EXTRACT_function-synopsis"></a>

```
EXTRACT(datepart FROM source)
```

## 인수
<a name="r_EXTRACT_function-arguments"></a>

 *datepart*   
일, 월, 년, 시, 분, 초, 밀리초 또는 마이크로초 등 추출할 날짜 또는 시간의 하위 필드입니다. 에 대해 가능한 값은 [날짜 또는 타임스탬프 함수의 날짜 부분](r_Dateparts_for_datetime_functions.md) 섹션을 참조하세요.

 *source*   
TIMESTAMP, TIMESTAMPTZ, TIME, TIMETZ, INTERVAL YEAR TO MONTH 또는 INTERVAL DAY TO SECOND의 데이터 유형으로 평가되는 열 또는 표현식입니다.

## 반환 타입
<a name="r_EXTRACT_function-return-type"></a>

*source* 값이 TIMESTAMP, TIME, TIMETZ, INTERVAL YEAR TO MONTH 또는 INTERVAL DAY TO SECOND의 데이터 유형으로 평가되는 경우 INTEGER입니다.

*source* 값이 TIMESTAMPTZ의 데이터 유형으로 평가되는 경우 DOUBLE PRECISION입니다.

## TIMESTAMP를 사용한 예제
<a name="r_EXTRACT_function-examples"></a>

다음은 판매에서 지불 가격이 \$110,000 이상이었던 주차 번호(week numbers)를 확인하는 예입니다. 이 예제에서는 TICKIT 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
select salesid, extract(week from saletime) as weeknum
from sales 
where pricepaid > 9999 
order by 2;

salesid | weeknum
--------+---------
 159073 |       6
 160318 |       8
 161723 |      26
```

다음 예에서는 리터럴 타임스탬프 값에서 분 값을 반환합니다.

```
select extract(minute from timestamp '2009-09-09 12:08:43');
            
date_part
-----------
8
```

다음 예제에서는 리터럴 timestamp 값에서 밀리초 값을 반환합니다.

```
select extract(ms from timestamp '2009-09-09 12:08:43.101');
            
date_part
-----------
101
```

## TIMESTAMPTZ를 사용한 예제
<a name="r_EXTRACT_function-examples-timestamptz"></a>

다음 예제에서는 리터럴 timestamptz 값에서 년 값을 반환합니다.

```
select extract(year from timestamptz '1.12.1997 07:37:16.00 PST');
            
date_part
-----------
1997
```

## TIME을 사용한 예제
<a name="r_EXTRACT_function-examples-time"></a>

다음 예제 테이블 TIME\$1TEST에는 3개의 값이 삽입된 TIME\$1VAL(TIME 형식) 열이 있습니다.

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

다음 예에서는 각 time\$1val에서 분을 추출합니다.

```
select extract(minute from time_val) as minutes from time_test;
            
minutes
-----------
         0
         0
         58
```

다음 예에서는 각 time\$1val에서 시간을 추출합니다.

```
select extract(hour from time_val) as hours from time_test;
            
hours
-----------
         20
         0
         0
```

다음 예에서는 리터럴 값에서 밀리초를 추출합니다.

```
select extract(ms from time '18:25:33.123456');
            
 date_part
-----------
     123
```

## TIMETZ를 사용한 예제
<a name="r_EXTRACT_function-examples-timetz"></a>

다음 예제 테이블 TIMETZ\$1TEST에는 3개의 값이 삽입된 TIMETZ\$1VAL(TIMETZ 형식) 열이 있습니다.

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

다음 예에서는 각 timetz\$1val에서 시간을 추출합니다.

```
select extract(hour from timetz_val) as hours from time_test;
            
hours
-----------
         4
         0
         5
```

다음 예에서는 리터럴 값에서 밀리초를 추출합니다. 추출이 처리되기 전에 리터럴은 UTC로 변환되지 않습니다.

```
select extract(ms from timetz '18:25:33.123456 EST');
            
 date_part
-----------
     123
```

다음 예제에서는 리터럴 timetz 값에서 UTC로부터의 시간대 오프셋 시간을 반환합니다.

```
select extract(timezone_hour from timetz '1.12.1997 07:37:16.00 PDT');
            
date_part
-----------
-7
```

## INTERVAL YEAR TO MONTH 및 INTERVAL DAY TO SECOND 예제
<a name="r_EXTRACT_function-examples-interval"></a>

다음 예제에서는 36시간, 즉 1일 12시간을 정의하는 INTERVAL DAY TO SECOND에서 일 부분인 `1`을 추출합니다.

```
select EXTRACT('days' from INTERVAL '36 hours' DAY TO SECOND)
  
 date_part
------------------
 1
```

다음 예제에서는 15개월, 즉 1년 3개월을 정의하는 YEAR TO MONTH에서 월 부분인 `3`을 추출합니다.

```
select EXTRACT('month' from INTERVAL '15 months' YEAR TO MONTH)
  
 date_part
------------------
 3
```

다음 예제에서는 30개월, 즉 2년 6개월에서 월 부분인 `6`을 추출합니다.

```
select EXTRACT('month' from INTERVAL '30' MONTH)
   
 date_part
------------------
 6
```

다음 예제에서는 50시간, 즉 2일 2시간에서 시간 부분인 `2`를 추출합니다.

```
select EXTRACT('hours' from INTERVAL '50' HOUR)
  
 date_part
------------------
 2
```

다음 예제에서는 1시간 11분 11.123초에서 분 부분인 `11`을 추출합니다.

```
select EXTRACT('minute' from INTERVAL '70 minutes 70.123 seconds' MINUTE TO SECOND)
  
 date_part
------------------
 11
```

다음 예제에서는 1일 1시간 1분 1.11초에서 초 부분인 `1.11`을 추출합니다.

```
select EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 date_part
------------------
 1.11
```

다음 예제에서는 INTERVAL의 총 시간 수를 추출합니다. 각 부분이 추출되어 합계에 더해집니다.

```
select EXTRACT('days' from INTERVAL '50' HOUR) * 24 + EXTRACT('hours' from INTERVAL '50' HOUR)
 
 ?column?
------------------
 50
```

다음 예제에서는 INTERVAL의 총 초 수를 추출합니다. 각 부분이 추출되어 합계에 더해집니다.

```
select EXTRACT('days' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 86400 + 
       EXTRACT('hours' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 3600 +
       EXTRACT('minutes' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 60 + 
       EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 ?column?
------------------
 90061.11
```

# GETDATE 함수
<a name="r_GETDATE"></a>

GETDATE는 현재 세션 시간대(기본 UTC)의 현재 날짜 및 시간을 반환합니다. 트랜잭션 블록 내에 있는 경우에도 현재 문의 시작 날짜 또는 시간을 반환합니다.

## 구문
<a name="r_GETDATE-synopsis"></a>

```
GETDATE()
```

괄호가 필요합니다.

## 반환 타입
<a name="r_GETDATE-return-type"></a>

TIMESTAMP

## 예제
<a name="r_GETDATE-examples"></a>

다음은 GETDATE 함수를 사용하여 현재 날짜의 전체 타임스탬프를 반환하는 예입니다.

```
select getdate();

timestamp
---------------------
2008-12-04 16:10:43
```

다음은 TRUNC 함수 내에서 GETDATE 함수를 사용하여 시간을 제외하고 현재 날짜를 반환하는 예입니다.

```
select trunc(getdate());

trunc
------------
2008-12-04
```

# INTERVAL\$1CMP 함수
<a name="r_INTERVAL_CMP"></a>

INTERVAL\$1CMP는 두 간격을 서로 비교하여 첫 번째 간격이 더 큰 경우에는 `1`을, 두 번째 간격이 더 큰 경우에는 `-1`을, 그리고 두 간격이 동일한 경우에는 `0`을 반환합니다. 자세한 내용은 [한정자 구문이 없는 간격 리터럴의 예](r_interval_literals.md) 섹션을 참조하세요.

## 구문
<a name="r_INTERVAL_CMP-syntax"></a>

```
INTERVAL_CMP(interval1, interval2)
```

## 인수
<a name="r_INTERVAL_CMP-arguments"></a>

 *INTERVAL*   
간격 리터럴 값입니다.

 *INTERVAL*   
간격 리터럴 값입니다.

## 반환 타입
<a name="r_INTERVAL_CMP-return-type"></a>

INTEGER

## 예제
<a name="r_INTERVAL_CMP-examples"></a>

다음은 `3 days`의 값을 `1 year`의 값과 서로 비교하는 예입니다.

```
select interval_cmp('3 days','1 year');

interval_cmp
--------------
-1
```

이 예에서는 값 `7 days`와 `1 week`를 비교합니다.

```
select interval_cmp('7 days','1 week');

interval_cmp
--------------
0
```

다음은 `1 year`의 값을 `3 days`의 값과 서로 비교하는 예입니다.

```
select interval_cmp('1 year','3 days');

interval_cmp
--------------
1
```

# LAST\$1DAY 함수
<a name="r_LAST_DAY"></a>

LAST\$1DAY는 *date*가 포함된 월의 마지막 날짜를 반환합니다. 반환 형식은 *date* 인수의 데이터 형식과 상관없이 항상 DATE입니다.

특정 날짜 부분을 검색하는 방법에 대한 자세한 내용은 [DATE\$1TRUNC 함수](r_DATE_TRUNC.md) 섹션을 참조하세요.

## 구문
<a name="r_LAST_DAY-synopsis"></a>

```
LAST_DAY( { date | timestamp } )
```

## 인수
<a name="r_LAST_DAY-arguments"></a>

*date* \$1 *timestamp*

`DATE` 또는 `TIMESTAMP` 데이터 형식의 `DATE` 또는 `TIMESTAMP` 형식으로 암시적으로 계산되는 표현식입니다.

## 반환 타입
<a name="r_LAST_DAY-return-type"></a>

DATE

## 예제
<a name="r_LAST_DAY-examples"></a>

다음은 당월의 마지막 날짜를 반환하는 예입니다.

```
select last_day(sysdate);

  last_day
------------
 2014-01-31
```

다음은 당월 마지막 7일 중 매일 판매된 티켓 수를 반환하는 예입니다. SALETIME 열의 값은 타임스탬프입니다.

```
select datediff(day, saletime, last_day(saletime)) as "Days Remaining", sum(qtysold)
from sales
where datediff(day, saletime, last_day(saletime)) < 7
group by 1
order by 1;

days remaining |  sum
---------------+-------
             0 | 10140
             1 | 11187
             2 | 11515
             3 | 11217
             4 | 11446
             5 | 11708
             6 | 10988
(7 rows)
```

# MONTHS\$1BETWEEN 함수
<a name="r_MONTHS_BETWEEN_function"></a>

MONTHS\$1BETWEEN은 두 날짜 사이의 월 수를 계산합니다.

첫 번째 날짜가 두 번째 날짜 이후인 경우에는 결과 값이 양수이고, 그렇지 않으면 결과 값이 음수입니다.

두 인수 중 하나라도 NULL이면 결과 값도 NULL입니다.

## 구문
<a name="r_MONTHS_BETWEEN_function-synopsis"></a>

```
MONTHS_BETWEEN( date1, date2 )
```

## 인수
<a name="r_MONTHS_BETWEEN_function-arguments"></a>

 *date1*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

 *date2*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_MONTHS_BETWEEN_function-return-type"></a>

FLOAT8

결과 값에서 정수 부는 날짜의 년 값과 월 값의 차이에 따라 달라집니다. 결과 값에서 소수 부는 날짜 및 타임스탬프 값을 기준으로 계산되며, 한 달이 31일이라는 가정을 전제로 합니다.

*date1*과 *date2* 모두 월에서 동일한 날짜가 포함되어 있는 경우(예: 1/15/14와 2/15/14), 혹은 월에서 마지막 날짜가 포함되어 있는 경우(예: 8/31/14와 9/30/14)에는 타임스탬프 구간(있는 경우)의 일치 여부와 상관없이 날짜의 년 및 월 값에 따라 결과 값으로 정수가 반환됩니다.

## 예제
<a name="r_MONTHS_BETWEEN_function-examples"></a>

다음은 1/18/1969와 3/18/1969 사이의 월 수를 반환하는 예입니다.

```
select months_between('1969-01-18', '1969-03-18')
as months;

months
----------
-2
```

다음은 1/18/1969와 1/18/1969 사이의 월 수를 반환하는 예입니다.

```
select months_between('1969-01-18', '1969-01-18')
as months;

months
----------
0
```

 다음은 첫 번째 이벤트 공연 시점부터 마지막 공연 시점까지 월 수를 반환하는 예입니다.

```
select eventname, 
min(starttime) as first_show,
max(starttime) as last_show,
months_between(max(starttime),min(starttime)) as month_diff
from event 
group by eventname
order by eventname
limit 5;

eventname         first_show             last_show              month_diff
---------------------------------------------------------------------------
.38 Special       2008-01-21 19:30:00.0  2008-12-25 15:00:00.0  11.12
3 Doors Down      2008-01-03 15:00:00.0  2008-12-01 19:30:00.0  10.94
70s Soul Jam      2008-01-16 19:30:00.0  2008-12-07 14:00:00.0  10.7
A Bronx Tale      2008-01-21 19:00:00.0  2008-12-15 15:00:00.0  10.8
A Catered Affair  2008-01-08 19:30:00.0  2008-12-19 19:00:00.0  11.35
```

# NEXT\$1DAY 함수
<a name="r_NEXT_DAY"></a>

NEXT\$1DAY는 지정한 날짜 이후 지정한 요일이 처음 도래하는 날짜를 반환합니다.

**day 값이 주어진 날짜와 동일한 날짜인 경우에는 해당 요일의 다음 발생 날짜가 반환됩니다.

## 구문
<a name="r_NEXT_DAY-synopsis"></a>

```
NEXT_DAY( { date | timestamp }, day )
```

## 인수
<a name="r_NEXT_DAY-arguments"></a>

 *date* \$1 *timestamp*  
`DATE` 또는 `TIMESTAMP` 데이터 형식의 `DATE` 또는 `TIMESTAMP` 형식으로 암시적으로 계산되는 표현식입니다.

 *day*   
요일 이름을 포함한 문자열입니다. 대소문자는 구분하지 않습니다.  
유효한 값은 다음과 같습니다.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_NEXT_DAY.html)

## 반환 타입
<a name="r_NEXT_DAY-return-type"></a>

DATE

## 예제
<a name="r_NEXT_DAY-example"></a>

다음은 8/20/2014 이후 첫 번째 화요일의 날짜를 반환하는 예입니다.

```
select next_day('2014-08-20','Tuesday');

next_day
-----------
2014-08-26
```

다음 예에서는 2008년 1월 1일 이후 첫 번째 화요일의 날짜를 5:54:44로 반환합니다.

```
select listtime, next_day(listtime, 'Tue') from listing limit 1;

listtime            | next_day
--------------------+-----------
2008-01-01 05:54:44 | 2008-01-08
```

다음은 3분기 목표 마케팅 날짜를 가져오는 예입니다.

```
select username, (firstname ||' '|| lastname) as name,
eventname, caldate, next_day (caldate, 'Monday') as marketing_target
from sales, date, users, event
where sales.buyerid = users.userid
and sales.eventid = event.eventid
and event.dateid = date.dateid
and date.qtr = 3
order by marketing_target, eventname, name;

username  |     name          |     eventname        |    caldate   |   marketing_target
----------+-------------------+----------------------+--------------+-------------------
MBO26QSG  |   Callum Atkinson | .38 Special          |  2008-07-06  |	2008-07-07
WCR50YIU  |   Erasmus Alvarez | A Doll's House       |  2008-07-03  |	2008-07-07
CKT70OIE  |   Hadassah Adkins | Ana Gabriel          |  2008-07-06  |	2008-07-07
VVG07OUO  |   Nathan Abbott   | Armando Manzanero    |  2008-07-04  |	2008-07-07
GEW77SII  |   Scarlet Avila   | August: Osage County |  2008-07-06  |	2008-07-07
ECR71CVS  |   Caryn Adkins    | Ben Folds            |  2008-07-03  |	2008-07-07
KUW82CYU  |   Kaden Aguilar   | Bette Midler         |  2008-07-01  |	2008-07-07
WZE78DJZ  |   Kay Avila       | Bette Midler         |  2008-07-01  |	2008-07-07
HXY04NVE  |   Dante Austin    | Britney Spears       |  2008-07-02  |	2008-07-07
URY81YWF  |   Wilma Anthony   | Britney Spears       |  2008-07-02  |	2008-07-07
```

# SYSDATE 함수
<a name="r_SYSDATE"></a>

SYSDATE는 현재 세션 시간대(기본 UTC)의 현재 날짜 및 시간을 반환합니다.

**참고**  
SYSDATE는 현재 문이 아닌 현재 트랜잭션의 시작 날짜 및 시간을 반환합니다.

## 구문
<a name="r_SYSDATE-synopsis"></a>

```
SYSDATE
```

이 함수는 인수가 필요 없습니다.

## 반환 타입
<a name="r_SYSDATE-return-type"></a>

TIMESTAMP

## 예제
<a name="r_SYSDATE-examples"></a>

다음은 SYSDATE 함수를 사용하여 현재 날짜의 전체 타임스탬프를 반환하는 예입니다.

```
select sysdate;

timestamp
----------------------------
2008-12-04 16:10:43.976353
```

다음은 TRUNC 함수 내에서 SYSDATE 함수를 사용하여 시간을 제외하고 현재 날짜를 반환하는 예입니다.

```
select trunc(sysdate);

trunc
------------
2008-12-04
```

다음은 쿼리 실행 날짜와 어떤 날짜든 120일 이전 사이에 해당하는 날짜의 판매 정보를 반환하는 쿼리입니다.

```
select salesid, pricepaid, trunc(saletime) as saletime, trunc(sysdate) as now
from sales
where saletime between trunc(sysdate)-120 and trunc(sysdate)
order by saletime asc;

 salesid | pricepaid |  saletime  |    now
---------+-----------+------------+------------
91535    |    670.00 | 2008-08-07 | 2008-12-05
91635    |    365.00 | 2008-08-07 | 2008-12-05
91901    |   1002.00 | 2008-08-07 | 2008-12-05
...
```

# TIMEOFDAY 함수
<a name="r_TIMEOFDAY_function"></a>

TIMEOFDAY는 평일, 날짜 및 시간을 문자열 값으로 반환하는 데 사용되는 특수 별칭입니다. 트랜잭션 블록 내에 있는 경우에도 현재 문의 시간대 문자열을 반환합니다.

## 구문
<a name="r_TIMEOFDAY_function-syntax"></a>

```
TIMEOFDAY()
```

## 반환 타입
<a name="r_TIMEOFDAY_function-return-type"></a>

VARCHAR

## 예제
<a name="r_TIMEOFDAY_function-examples"></a>

다음은 TIMEOFDAY 함수를 사용하여 현재 날짜와 시간을 반환하는 예입니다.

```
select timeofday();

timeofday
------------
Thu Sep 19 22:53:50.333525 2013 UTC
```

# TIMESTAMP\$1CMP 함수
<a name="r_TIMESTAMP_CMP"></a>

타임스탬프 2개의 값을 서로 비교한 후 정수를 반환합니다. 타임스탬프가 동일하면 함수가 `0`을 반환합니다. 첫 번째 타임스탬프가 더 크면 함수가 `1`을 반환합니다. 반대로 두 번째 타임스탬프가 더 크면 함수가 `-1`을 반환합니다.

## 구문
<a name="r_TIMESTAMP_CMP-synopsis"></a>

```
TIMESTAMP_CMP(timestamp1, timestamp2)
```

## 인수
<a name="r_TIMESTAMP_CMP-arguments"></a>

 *timestamp1*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.

 *timestamp2*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMP_CMP-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMP_CMP-examples"></a>

다음 예시는 타임스탬프를 비교하고 비교 결과를 보여줍니다.

```
SELECT TIMESTAMP_CMP('2008-01-24 06:43:29', '2008-01-24 06:43:29'), TIMESTAMP_CMP('2008-01-24 06:43:29', '2008-02-18 02:36:48'), TIMESTAMP_CMP('2008-02-18 02:36:48', '2008-01-24 06:43:29');

timestamp_cmp  | timestamp_cmp | timestamp_cmp 
---------------+---------------+---------------
             0 |            -1 |             1
```

다음은 LISTTIME 열과 SALETIME 열을 목록별로 비교하는 예입니다. 예를 보면 판매 타임스탬프가 목록 타임스탬프 이후이기 때문에 TIMESTAMP\$1CMP 값이 `-1`임을 알 수 있습니다.

```
select listing.listid, listing.listtime,
sales.saletime, timestamp_cmp(listing.listtime, sales.saletime)
from listing, sales
where listing.listid=sales.listid
order by 1, 2, 3, 4
limit 10;

 listid |      listtime       |      saletime       | timestamp_cmp
--------+---------------------+---------------------+---------------
      1 | 2008-01-24 06:43:29 | 2008-02-18 02:36:48 |            -1
      4 | 2008-05-24 01:18:37 | 2008-06-06 05:00:16 |            -1
      5 | 2008-05-17 02:29:11 | 2008-06-06 08:26:17 |            -1
      5 | 2008-05-17 02:29:11 | 2008-06-09 08:38:52 |            -1
      6 | 2008-08-15 02:08:13 | 2008-08-31 09:17:02 |            -1
     10 | 2008-06-17 09:44:54 | 2008-06-26 12:56:06 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-10 02:12:36 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-16 11:59:24 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-22 02:23:17 |            -1
     12 | 2008-07-25 01:45:49 | 2008-08-04 03:06:36 |            -1
(10 rows)
```

다음은 타임스탬프가 동일할 때 TIMESTAMP\$1CMP가 0을 반환하는 예입니다.

```
select listid, timestamp_cmp(listtime, listtime)
from listing
order by 1 , 2
limit 10;

 listid | timestamp_cmp
--------+---------------
      1 |             0
      2 |             0
      3 |             0
      4 |             0
      5 |             0
      6 |             0
      7 |             0
      8 |             0
      9 |             0
     10 |             0
(10 rows)
```

# TIMESTAMP\$1CMP\$1DATE 함수
<a name="r_TIMESTAMP_CMP_DATE"></a>

TIMESTAMP\$1CMP\$1DATE는 타임스탬프 값과 날짜 값을 서로 비교합니다. 타임스탬프 값과 날짜 값이 동일하면 함수가 `0`을 반환합니다. 타임스탬프가 시간순으로 더 큰 경우 함수가 `1`을 반환합니다. 날짜가 더 크면 함수가 `-1`을 반환합니다.

## 구문
<a name="r_TIMESTAMP_CMP_DATE-syntax"></a>

```
TIMESTAMP_CMP_DATE(timestamp, date)
```

## 인수
<a name="r_TIMESTAMP_CMP_DATE-arguments"></a>

 *timestamp*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.

 *날짜*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMP_CMP_DATE-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMP_CMP_DATE-examples"></a>

다음은 LISTTIME을 날짜 `2008-06-18`과 비교하는 예입니다. 이 날짜 이후의 목록은 `1`을, 그리고 이 날짜 이전의 목록은 `-1`을 반환합니다. LISTTIME 값은 타임스탬프입니다.

```
select listid, listtime,
timestamp_cmp_date(listtime, '2008-06-18')
from listing
order by 1, 2, 3
limit 10;


 listid |      listtime       | timestamp_cmp_date
--------+---------------------+--------------------
      1 | 2008-01-24 06:43:29 |              -1
      2 | 2008-03-05 12:25:29 |              -1
      3 | 2008-11-01 07:35:33 |               1
      4 | 2008-05-24 01:18:37 |              -1
      5 | 2008-05-17 02:29:11 |              -1
      6 | 2008-08-15 02:08:13 |               1
      7 | 2008-11-15 09:38:15 |               1
      8 | 2008-11-09 05:07:30 |               1
      9 | 2008-09-09 08:03:36 |               1
     10 | 2008-06-17 09:44:54 |              -1
(10 rows)
```

# TIMESTAMP\$1CMP\$1TIMESTAMPTZ 함수
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ"></a>

TIMESTAMP\$1CMP\$1TIMESTAMPTZ는 타임스탬프 표현식 값과 시간대를 포함한 타임스탬프 표현식을 서로 비교합니다. 타임스탬프와 시간대를 포함한 타임스탬프가 동일하면 함수가 `0`을 반환합니다. 타임스탬프가 시간순으로 더 큰 경우 함수가 `1`을 반환합니다. 시간대를 포함한 타임스탬프가 더 크면 함수가 `–1`을 반환합니다.

## 구문
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-syntax"></a>

```
TIMESTAMP_CMP_TIMESTAMPTZ(timestamp, timestamptz)
```

## 인수
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-arguments"></a>

 *timestamp*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.

 *timestamptz*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-examples"></a>

다음 예에서는 타임스탬프와 표준 시간대가 있는 타임스탬프를 비교하고 그 결과를 보여줍니다.

```
SELECT TIMESTAMP_CMP_TIMESTAMPTZ('2008-01-24 06:43:29', '2008-01-24 06:43:29+00'), TIMESTAMP_CMP_TIMESTAMPTZ('2008-01-24 06:43:29', '2008-02-18 02:36:48+00'), TIMESTAMP_CMP_TIMESTAMPTZ('2008-02-18 02:36:48', '2008-01-24 06:43:29+00');

timestamp_cmp_timestamptz  | timestamp_cmp_timestamptz | timestamp_cmp_timestamptz 
---------------------------+---------------------------+--------------------------
             0             |            -1             |             1
```

# TIMESTAMPTZ\$1CMP 함수
<a name="r_TIMESTAMPTZ_CMP"></a>

TIMESTAMPTZ\$1CMP는 시간대를 포함한 타임스탬프 값 2개를 서로 비교한 후 정수를 반환합니다. 타임스탬프가 동일하면 함수가 `0`을 반환합니다. 첫 번째 타임스탬프가 시간순으로 더 큰 경우 함수가 `1`을 반환합니다. 반대로 두 번째 타임스탬프가 더 크면 함수가 `–1`을 반환합니다.

## 구문
<a name="r_TIMESTAMPTZ_CMP-synopsis"></a>

```
TIMESTAMPTZ_CMP(timestamptz1, timestamptz2)
```

## 인수
<a name="r_TIMESTAMPTZ_CMP-arguments"></a>

 *timestamptz1*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

 *timestamptz2*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMPTZ_CMP-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMPTZ_CMP-examples"></a>

다음 예제에서는 타임스탬프와 표준 시간대를 비교하고 그 결과를 보여 줍니다.

```
SELECT TIMESTAMPTZ_CMP('2008-01-24 06:43:29+00', '2008-01-24 06:43:29+00'), TIMESTAMPTZ_CMP('2008-01-24 06:43:29+00', '2008-02-18 02:36:48+00'), TIMESTAMPTZ_CMP('2008-02-18 02:36:48+00', '2008-01-24 06:43:29+00');

timestamptz_cmp  | timestamptz_cmp | timestamptz_cmp
-----------------+-----------------+----------------
        0        |       -1        |       1
```

# TIMESTAMPTZ\$1CMP\$1DATE 함수
<a name="r_TIMESTAMPTZ_CMP_DATE"></a>

TIMESTAMPTZ\$1CMP\$1DATE는 타임스탬프 값과 날짜 값을 서로 비교합니다. 타임스탬프 값과 날짜 값이 동일하면 함수가 `0`을 반환합니다. 타임스탬프가 시간순으로 더 큰 경우 함수가 `1`을 반환합니다. 날짜가 더 크면 함수가 `–1`을 반환합니다.

## 구문
<a name="r_TIMESTAMPTZ_CMP_DATE-syntax"></a>

```
TIMESTAMPTZ_CMP_DATE(timestamptz, date)
```

## 인수
<a name="r_TIMESTAMPTZ_CMP_DATE-arguments"></a>

 *timestamptz*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

 *날짜*   
`DATE` 데이터 형식의 열 또는 암시적으로 `DATE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMPTZ_CMP_DATE-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMPTZ_CMP_DATE-examples"></a>

다음 예는 타임스탬프와 표준 시간대가 포함된 타임스탬프인 LISTTIME을 날짜 `2008-06-18`과 비교하는 예입니다. 이 날짜 이후의 목록은 `1`을, 그리고 이 날짜 이전의 목록은 `-1`을 반환합니다.

```
select listid, CAST(listtime as timestamptz) as tstz,
timestamp_cmp_date(tstz, '2008-06-18')
from listing
order by 1, 2, 3
limit 10;


 listid |          tstz          | timestamptz_cmp_date
--------+------------------------+----------------------
      1 | 2008-01-24 06:43:29+00 |              -1
      2 | 2008-03-05 12:25:29+00 |              -1
      3 | 2008-11-01 07:35:33+00 |               1
      4 | 2008-05-24 01:18:37+00 |              -1
      5 | 2008-05-17 02:29:11+00 |              -1
      6 | 2008-08-15 02:08:13+00 |               1
      7 | 2008-11-15 09:38:15+00 |               1
      8 | 2008-11-09 05:07:30+00 |               1
      9 | 2008-09-09 08:03:36+00 |               1
     10 | 2008-06-17 09:44:54+00 |              -1
(10 rows)
```

# TIMESTAMPTZ\$1CMP\$1TIMESTAMP 함수
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP"></a>

TIMESTAMPTZ\$1CMP\$1TIMESTAMP는 시간대를 포함한 타임스탬프 표현식 값과 타임스탬프 표현식을 서로 비교합니다. 시간대를 포함한 타임스탬프 값과 타임스탬프 값이 동일하면 함수가 `0`을 반환합니다. 시간대를 포함한 타임스탬프가 시간순으로 더 크면 함수가 `1`을 반환합니다. 반대로 타임스탬프가 더 크면 함수가 `–1`을 반환합니다.

## 구문
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-syntax"></a>

```
TIMESTAMPTZ_CMP_TIMESTAMP(timestamptz, timestamp)
```

## 인수
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-arguments"></a>

 *timestamptz*   
`TIMESTAMPTZ` 데이터 형식의 열 또는 암시적으로 `TIMESTAMPTZ` 형식으로 평가되는 표현식입니다.

 *timestamp*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-return-type"></a>

INTEGER

## 예제
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-examples"></a>

다음 예제에서는 타임스탬프와 표준 시간대를 타임스탬프와 비교하고 그 결과를 보여 줍니다.

```
SELECT TIMESTAMPTZ_CMP_TIMESTAMP('2008-01-24 06:43:29+00', '2008-01-24 06:43:29'), TIMESTAMPTZ_CMP_TIMESTAMP('2008-01-24 06:43:29+00', '2008-02-18 02:36:48'), TIMESTAMPTZ_CMP_TIMESTAMP('2008-02-18 02:36:48+00', '2008-01-24 06:43:29');

timestamptz_cmp_timestamp  | timestamptz_cmp_timestamp | timestamptz_cmp_timestamp
---------------------------+---------------------------+---------------------------
              0            |            -1             |             1
```

# TIMEZONE 함수
<a name="r_TIMEZONE"></a>

TIMEZONE은 지정한 시간대와 타임스탬프 값에 대한 타임스탬프를 반환합니다.

시간대 설정 방법에 대한 자세한 내용과 예는 [timezone](r_timezone_config.md) 섹션을 참조하세요.

시간대를 변환하는 방법에 대한 자세한 내용과 예는 [CONVERT\$1TIMEZONE](CONVERT_TIMEZONE.md) 섹션을 참조하세요.

## 구문
<a name="r_TIMEZONE-syntax"></a>

```
TIMEZONE('timezone', { timestamp | timestamptz })
```

## 인수
<a name="r_TIMEZONE-arguments"></a>

*timezone*  
반환 값의 시간대입니다. 시간대는 시간대 이름(**'Africa/Kampala'**, **'Singapore'** 등) 또는 시간대 약어(**'UTC'**, **'PDT'** 등)로 지정할 수 있습니다. 지원되는 시간대 이름 목록을 보려면 다음 명령을 실행합니다.  

```
select pg_timezone_names();
```
 지원되는 시간대 이름 약어 목록을 보려면 다음 명령을 실행합니다.  

```
select pg_timezone_abbrevs();
```
Amazon Redshift는 [IANA 시간대 데이터베이스](https://www.iana.org/time-zones)를 표준 시간대 사양의 신뢰할 수 있는 소스로 사용합니다. 자세한 내용과 예제는 [시간대 사용 노트](CONVERT_TIMEZONE.md#CONVERT_TIMEZONE-usage-notes) 섹션을 참조하세요.

*timestamp* \$1 *timestamptz*  
타임스탬프 또는 TIMESTAMP 형식이나 TIMESTAMPTZ 형식 또는 표준 시간대가 있는 타임스탬프로 암시적으로 강제로 지정될 수 있는 값을 생성하는 표현식입니다.

## 반환 타입
<a name="r_TIMEZONE-return-type"></a>

TIMESTAMP 표현식과 함께 사용할 경우에는 TIMESTAMPTZ이고,

TIMESTAMPTZ 표현식과 함께 사용할 경우에는 TIMESTAMP입니다.

## 예제
<a name="r_TIMEZONE-examples"></a>

다음은 PST 시간대의 타임스탬프 `2008-06-17 09:44:54`를 사용하여 UTC 시간대에 대한 타임스탬프를 반환합니다.

```
SELECT TIMEZONE('PST', '2008-06-17 09:44:54');

timezone
-----------------------
2008-06-17 17:44:54+00
```

다음은 UTC 시간대 `2008-06-17 09:44:54+00`의 타임스탬프를 사용하여 PST 시간대에 대한 타임스탬프를 반환합니다.

```
SELECT TIMEZONE('PST', timestamptz('2008-06-17 09:44:54+00'));

timezone
-----------------------
2008-06-17 01:44:54
```

# TO\$1TIMESTAMP 함수
<a name="r_TO_TIMESTAMP"></a>

TO\$1TIMESTAMP는 TIMESTAMP 문자열을 TIMESTAMPTZ로 변환합니다. Amazon Redshift의 추가 날짜 및 시간 함수 목록은 [날짜 및 시간 함수](Date_functions_header.md) 섹션을 참조하세요.

## 구문
<a name="r_TO_TIMESTAMP-syntax"></a>

```
to_timestamp(timestamp, format)
```

```
to_timestamp (timestamp, format, is_strict)
```

## 인수
<a name="r_TO_TIMESTAMP-arguments"></a>

*timestamp*  
타임스탬프 값을 *format*에서 지정하는 형식으로 표현한 문자열입니다. 이 인수를 비워 두면 타임스탬프 값의 기본값은 `0001-01-01 00:00:00`입니다.

*형식*  
*timestamp* 값의 형식을 정의하는 문자열 리터럴입니다. 시간대(**TZ**, **tz** 또는 **OF**)가 포함된 형식은 입력 값으로 지원되지 않습니다. 유효한 타임스탬프 형식은 [날짜/시간 형식 문자열](r_FORMAT_strings.md) 섹션을 참조하세요.

*is\$1strict*  
입력 타임스탬프 값이 범위를 벗어날 경우 오류가 반환되는지 여부를 지정하는 옵션 부울 값입니다. *is\$1strict*가 TRUE로 설정되면 범위를 벗어난 값이 있는 경우 오류가 반환됩니다. *is\$1strict*가 기본값인 FALSE로 설정되면 오버플로 값이 허용됩니다.

## 반환 타입
<a name="r_TO_TIMESTAMP-return-type"></a>

TIMESTAMPTZ

## 예제
<a name="r_TO_TIMESTAMP-examples"></a>

다음 예는 TO\$1TIMESTAMP 함수를 사용하여 TIMESTAMP 문자열을 TIMESTAMPTZ로 변환하는 것을 보여줍니다.

```
select sysdate, to_timestamp(sysdate, 'YYYY-MM-DD HH24:MI:SS') as second;

timestamp                  | second
--------------------------   ----------------------
2021-04-05 19:27:53.281812 | 2021-04-05 19:27:53+00
```

날짜의 TO\$1TIMESTAMP 부분을 전달할 수 있습니다. 나머지 날짜 부분은 기본값으로 설정됩니다. 출력에 시간이 포함됩니다.

```
SELECT TO_TIMESTAMP('2017','YYYY');

to_timestamp
--------------------------
2017-01-01 00:00:00+00
```

다음 SQL 문은 '2011-12-18 24:38:15' 문자열을 TIMESTAMPTZ로 변환합니다. 결과는 시간 수가 24시간을 초과하므로 다음 날에 해당하는 TIMESTAMPTZ입니다.

```
SELECT TO_TIMESTAMP('2011-12-18 24:38:15', 'YYYY-MM-DD HH24:MI:SS');
         
to_timestamp
----------------------
2011-12-19 00:38:15+00
```

다음 SQL 문은 '2011-12-18 24:38:15' 문자열을 TIMESTAMPTZ로 변환합니다. 타임스탬프의 시간 값이 24시간을 초과하므로 결과는 오류입니다.

```
SELECT TO_TIMESTAMP('2011-12-18 24:38:15', 'YYYY-MM-DD HH24:MI:SS', TRUE);
         
ERROR:  date/time field time value out of range: 24:38:15.0
```

# TRUNC 함수
<a name="r_TRUNC_date"></a>

`TIMESTAMP`를 잘라내고 `DATE`를 반환합니다.

 이 함수를 사용하면 숫자를 잘라낼 수도 있습니다. 자세한 내용은 [TRUNC 함수](r_TRUNC.md) 섹션을 참조하세요.

## 구문
<a name="r_TRUNC_date-synopsis"></a>

```
TRUNC(timestamp)
```

## 인수
<a name="r_TRUNC_date-arguments"></a>

 *timestamp*   
`TIMESTAMP` 데이터 형식의 열 또는 암시적으로 `TIMESTAMP` 형식으로 평가되는 표현식입니다.  
`00:00:00`을 시간으로 하여 타임스탬프 값을 반환하려면 함수 결과를 `TIMESTAMP`로 캐스팅합니다.

## 반환 타입
<a name="r_TRUNC_date-return-type"></a>

DATE

## 예제
<a name="r_TRUNC_date-examples"></a>

다음은 SYSDATE 함수(타임스탬프 반환)의 결과에서 날짜 구간을 반환하는 예입니다.

```
SELECT SYSDATE;

+----------------------------+
|         timestamp          |
+----------------------------+
| 2011-07-21 10:32:38.248109 |
+----------------------------+

SELECT TRUNC(SYSDATE);

+------------+
|   trunc    |
+------------+
| 2011-07-21 |
+------------+
```

다음 예에서는 TRUNC 함수를 `TIMESTAMP` 열에 적용합니다. 반환 형식은 날짜입니다.

```
SELECT TRUNC(starttime) FROM event
ORDER BY eventid LIMIT 1;

+------------+
|   trunc    |
+------------+
| 2008-01-25 |
+------------+
```

다음 예는 TRUNC 함수 결과를 `TIMESTAMP`로 캐스팅하여 `00:00:00`을 시간으로 하는 타임스탬프 값을 반환하는 예입니다.

```
SELECT CAST((TRUNC(SYSDATE)) AS TIMESTAMP);

+---------------------+
|        trunc        |
+---------------------+
| 2011-07-21 00:00:00 |
+---------------------+
```

# 날짜 또는 타임스탬프 함수의 날짜 부분
<a name="r_Dateparts_for_datetime_functions"></a>

다음 표는 아래 함수의 인수로 허용되는 날짜 부분과 시간 부분의 이름 및 약어를 구분한 것입니다.
+ DATEADD 
+ DATEDIFF 
+ DATE\$1PART 
+ EXTRACT 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_Dateparts_for_datetime_functions.html)

## 초, 밀리초 및 마이크로초에서 결과의 차이
<a name="r_Dateparts_for_datetime_functions-variations-in-results"></a>

다른 날짜 함수에서 초, 밀리초 또는 마이크로초를 날짜 부분으로 지정하더라도 쿼리 결과에서는 최소한의 차이만 발생합니다.
+ EXTRACT 함수는 지정한 날짜 부분에 한해 정수를 반환하고 더 높거나 낮은 단위의 날짜 부분은 무시합니다. 예를 들어 지정한 날짜 부분이 초라면 밀리초와 마이크로초는 결과에 포함되지 않습니다. 지정한 날짜 부분이 밀리초라면 초와 마이크로초가 포함되지 않습니다. 지정한 날짜 부분이 마이크로초라면 초와 밀리초가 포함되지 않습니다.
+ DATE\$1PART 함수는 지정하는 날짜 부분에 상관없이 타임스탬프에서 전체 초 부분을 반환하며, 이때 반환되는 값은 필요에 따라 소수 값이 될 수도 있고, 정수가 될 수도 있습니다.

예를 들어 다음 쿼리의 결과를 서로 비교하십시오.

```
create table seconds(micro timestamp);

insert into seconds values('2009-09-21 11:10:03.189717');

select extract(sec from micro) from seconds;
               
date_part
-----------
3
               
select date_part(sec, micro) from seconds;
   
pgdate_part
-------------
3.189717
```

## CENTURY, EPOCH, DECADE 및 MIL 참고 사항
<a name="r_Dateparts_for_datetime_functions-century"></a>

CENTURY 또는 CENTURIES   
Amazon Redshift는 CENTURY를 *\$1\$1\$11*년부터 시작하여 `###0`년으로 끝나는 것으로 해석합니다.  

```
select extract (century from timestamp '2000-12-16 12:21:13');
date_part
-----------
20

select extract (century from timestamp '2001-12-16 12:21:13');
date_part
-----------
21
```

Epoch   
Amazon Redshift의 EPOCH 구현은 클러스터가 상주하는 시간대와 별도로 1970-01-01 00:00:00.000000을 따릅니다. 따라서 클러스터가 상주하는 시간대에 따라 시간차를 기준으로 결과를 오프셋 처리해야 할 수도 있습니다.  
 다음은 아래 과정을 설명한 예입니다.  

1.  EVENT 테이블에 EVENT\$1EXAMPLE이라는 이름의 테이블을 생성합니다. 이 CREATE AS 명령은 DATE\$1PART 함수를 사용하여 각 이벤트마다 epoch 값을 저장할 날짜 열(기본 이름 PGDATE\$1PART)을 생성합니다.

1.  PG\$1TABLE\$1DEF에서 EVENT\$1EXAMPLE의 열과 데이터 형식을 선택합니다.

1.  EVENT\$1EXAMPLE 테이블에서 EVENTNAME, STARTTIME 및 PGDATE\$1PART를 선택하여 다른 날짜 및 시간 형식을 확인합니다.

1.  EVENT EXAMPLE에서 EVENTNAME과 STARTTIME을 선택합니다. PGDATE\$1PART의 epoch 값을 1초 간격으로 시간대를 제외한 타임스탬프로 변환한 후 CONVERTED\$1TIMESTAMP라는 이름의 열에 결과를 반환합니다.

```
create table event_example
as select eventname, starttime, date_part(epoch, starttime) from event;

select "column", type from pg_table_def where tablename='event_example';

     column    |            type
---------------+-----------------------------
 eventname     | character varying(200)
 starttime     | timestamp without time zone
 pgdate_part   | double precision
(3 rows)
```

```
select eventname, starttime, pgdate_part from event_example;

   eventname          |      starttime      | pgdate_part
----------------------+---------------------+-------------
 Mamma Mia!           | 2008-01-01 20:00:00 |  1199217600
 Spring Awakening     | 2008-01-01 15:00:00 |  1199199600
 Nas                  | 2008-01-01 14:30:00 |  1199197800
 Hannah Montana       | 2008-01-01 19:30:00 |  1199215800
 K.D. Lang            | 2008-01-01 15:00:00 |  1199199600
 Spamalot             | 2008-01-02 20:00:00 |  1199304000
 Macbeth              | 2008-01-02 15:00:00 |  1199286000
 The Cherry Orchard   | 2008-01-02 14:30:00 |  1199284200
 Macbeth              | 2008-01-02 19:30:00 |  1199302200
 Demi Lovato          | 2008-01-02 19:30:00 |  1199302200

   
select eventname, 
starttime, 
timestamp with time zone 'epoch' + pgdate_part * interval '1 second' AS converted_timestamp 
from event_example;

       eventname      |      starttime      | converted_timestamp
----------------------+---------------------+---------------------
 Mamma Mia!           | 2008-01-01 20:00:00 | 2008-01-01 20:00:00
 Spring Awakening     | 2008-01-01 15:00:00 | 2008-01-01 15:00:00
 Nas                  | 2008-01-01 14:30:00 | 2008-01-01 14:30:00
 Hannah Montana       | 2008-01-01 19:30:00 | 2008-01-01 19:30:00
 K.D. Lang            | 2008-01-01 15:00:00 | 2008-01-01 15:00:00
 Spamalot             | 2008-01-02 20:00:00 | 2008-01-02 20:00:00
 Macbeth              | 2008-01-02 15:00:00 | 2008-01-02 15:00:00
 The Cherry Orchard   | 2008-01-02 14:30:00 | 2008-01-02 14:30:00
 Macbeth              | 2008-01-02 19:30:00 | 2008-01-02 19:30:00
 Demi Lovato          | 2008-01-02 19:30:00 | 2008-01-02 19:30:00
 ...
```

DECADE 또는 DECADES   
Amazon Redshift는 DECADE 또는 DECADES DATEPART를 일반 달력에 따라 해석합니다. 예를 들어 일반 역법은 0001년부터 시작하기 때문에 첫 10년(decade 1)은 0001-01-01부터 0009-12-31까지이며, 두 번째 10년(decade 2)은 0010-01-01부터 0019-12-31까지입니다. 이러한 식으로 decade 201은 2000-01-01부터 2009-12-31까지입니다.  

```
select extract(decade from timestamp '1999-02-16 20:38:40');
date_part
-----------
200

select extract(decade from timestamp '2000-02-16 20:38:40');
date_part
-----------
201

select extract(decade from timestamp '2010-02-16 20:38:40');
date_part
-----------
202
```

MIL 또는 MILS   
Amazon Redshift는 MIL을 *\$1001*년 첫 번째 날짜부터 시작하여 `#000`년 마지막 날짜로 끝나는 것으로 해석합니다.  

```
select extract (mil from timestamp '2000-12-16 12:21:13');
date_part
-----------
2

select extract (mil from timestamp '2001-12-16 12:21:13');
date_part
-----------
3
```

# 해시 함수
<a name="hash-functions"></a>

**Topics**
+ [CHECKSUM 함수](r_CHECKSUM.md)
+ [farmFingerprint64 함수](r_FARMFINGERPRINT64.md)
+ [FUNC\$1SHA1 함수](FUNC_SHA1.md)
+ [FNV\$1HASH 함수](r_FNV_HASH.md)
+ [MD5 함수](r_MD5.md)
+ [SHA 함수](SHA.md)
+ [SHA1 함수](SHA1.md)
+ [SHA2 함수](SHA2.md)
+ [MURMUR3\$132\$1HASH](MURMUR3_32_HASH.md)

해시 함수는 숫자 입력 값을 다른 값으로 변환하는 수학 함수입니다.

# CHECKSUM 함수
<a name="r_CHECKSUM"></a>

해시 인덱스를 빌드하기 위한 체크섬 값을 계산합니다.

## 구문
<a name="r_CHECKSUM-synopsis"></a>

```
CHECKSUM(expression)
```

## 인수
<a name="r_CHECKSUM-argument"></a>

 *expression*   
입력 표현식의 데이터 형식은 VARCHAR, INTEGER 또는 DECIMAL이 되어야 합니다.

## 반환 타입
<a name="r_CHECKSUM-return-type"></a>

CHECKSUM 함수는 정수를 반환합니다.

## 예제
<a name="r_CHECKSUM-example"></a>

다음은 COMMISSION 열의 체크섬 값을 계산하는 예입니다.

```
select checksum(commission)
from sales
order by salesid
limit 10;

checksum
----------
10920
1140
5250
2625
2310
5910
11820
2955
8865
975
(10 rows)
```

# farmFingerprint64 함수
<a name="r_FARMFINGERPRINT64"></a>

`Fingerprint64` 함수를 사용하여 입력 인수의 팜해시 값을 계산합니다.

## 구문
<a name="r_FARMFINGERPRINT64-synopsis"></a>

```
farmFingerprint64(expression)
```

## 인수
<a name="r_FARMFINGERPRINT64-argument"></a>

 *expression*   
입력 표현식은 `VARCHAR` 또는 `VARBYTE` 데이터 형식이어야 합니다.

## 반환 타입
<a name="r_FARMFINGERPRINT64-return-type"></a>

`farmFingerprint64` 함수는 `BIGINT`를 반환합니다.

## 예제
<a name="r_FARMFINGERPRINT64-example"></a>

다음 예에서는 입력인 `Amazon Redshift`의 `farmFingerprint64` 값을 `VARCHAR` 데이터 형식으로 반환합니다.

```
SELECT farmFingerprint64('Amazon Redshift');
```

```
  
  farmfingerprint64
---------------------
 8085098817162212970
```

다음 예에서는 입력인 `Amazon Redshift`의 `farmFingerprint64` 값을 `VARBYTE` 데이터 형식으로 반환합니다.

```
SELECT farmFingerprint64('Amazon Redshift'::varbyte);
```

```
  
  farmfingerprint64
---------------------
 8085098817162212970
```

# FUNC\$1SHA1 함수
<a name="FUNC_SHA1"></a>

SHA1 함수의 동의어입니다.

[SHA1 함수](SHA1.md) 섹션을 참조하세요.

# FNV\$1HASH 함수
<a name="r_FNV_HASH"></a>

모든 기본 데이터 형식에 대해 64비트 FNV-1a 비암호화 해시 함수를 계산합니다.

## 구문
<a name="r_FNV_HASH-synopsis"></a>

```
FNV_HASH(value [, seed])
```

## 인수
<a name="r_FNV_HASH-argument-arguments"></a>

 * 값*  
입력 값은 해시 처리할 수 있습니다. Amazon Redshift는 값의 이진 표현을 사용하여 입력 값을 해시 처리합니다. 예를 들어 INTEGER 값은 4바이트를 사용하여 해시 처리되고 BIGINT 값은 8바이트를 사용하여 해시 처리됩니다. 또한 해싱 CHAR 및 VARCHAR 입력은 후행 공백을 무시하지 않습니다.

 *%seed*  
해시 함수의 BIGINT 시드는 선택 사항입니다. 지정하지 않으면 Amazon Redshift는 기본 FNV 시드를 사용합니다. 이렇게 하면 변환 또는 연결 없이 여러 열의 해시를 결합할 수 있습니다.

## 반환 타입
<a name="r_FNV_HASH-return-type"></a>

BIGINT

## 예제
<a name="r_FNV_HASH-example"></a>

다음은 숫자의 FNV 해시, 'Amazon Redshift' 문자열 및 이 둘의 연결을 반환하는 예입니다.

```
select fnv_hash(1);
        fnv_hash
----------------------
 -5968735742475085980
(1 row)
```

```
select fnv_hash('Amazon Redshift');
      fnv_hash
---------------------
 7783490368944507294
(1 row)
```

```
select fnv_hash('Amazon Redshift', fnv_hash(1));
       fnv_hash
----------------------
 -2202602717770968555
(1 row)
```

## 사용 노트
<a name="r_FNV_HASH-usage-notes"></a>
+ 여러 열이 있는 테이블의 해시를 계산하려면 첫 번째 열의 FNV 해시를 계산하여 두 번째 열의 해시에 시드로 전달하면 됩니다. 그런 다음 두 번째 열의 FNV 해시를 세 번째 열의 해시에 시드로 전달합니다.

  다음은 여러 열이 있는 테이블을 해시 처리할 시드를 생성하는 예입니다.

  ```
  select fnv_hash(column_3, fnv_hash(column_2, fnv_hash(column_1))) from sample_table;
  ```
+ 동일한 속성을 사용하여 문자열 연결 해시를 계산할 수 있습니다.

  ```
  select fnv_hash('abcd');
         fnv_hash
  ---------------------
   -281581062704388899
  (1 row)
  ```

  ```
  select fnv_hash('cd', fnv_hash('ab'));
        fnv_hash
  ---------------------
   -281581062704388899
  (1 row)
  ```
+ 해시 함수는 입력 유형을 사용하여 해시 처리할 바이트 수를 결정합니다. 필요한 경우 캐스팅을 사용하여 특정 유형을 적용합니다.

  다음은 다른 결과를 생성하기 위해 다른 유형의 입력을 사용하는 예입니다.

  ```
  select fnv_hash(1::smallint);
        fnv_hash
  --------------------
   589727492704079044
  (1 row)
  ```

  ```
  select fnv_hash(1);
         fnv_hash
  ----------------------
   -5968735742475085980
  (1 row)
  ```

  ```
  select fnv_hash(1::bigint);
         fnv_hash
  ----------------------
   -8517097267634966620
  (1 row)
  ```

# MD5 함수
<a name="r_MD5"></a>

MD5 암호화 해시 함수를 사용하여 가변 길이 문자열을 128비트 체크섬의 16진수 값을 텍스트로 표현한 32자 문자열로 변환합니다.

## 구문
<a name="r_MD5-syntax"></a>

```
MD5(string)
```

## 인수
<a name="r_MD5-arguments"></a>

 *문자열*()   
가변 길이 문자열입니다.

## 반환 타입
<a name="r_MD5-return-type"></a>

MD5 함수는 128비트 체크섬의 16진수 값을 텍스트로 표현한 32자 문자열을 반환합니다.

## 예제
<a name="r_MD5-examples"></a>

다음은 문자열 'Amazon Redshift'를 128비트 값으로 표현한 예입니다.

```
select md5('Amazon Redshift');
md5
----------------------------------
f7415e33f972c03abd4f3fed36748f7a
(1 row)
```

# SHA 함수
<a name="SHA"></a>

SHA1 함수의 동의어입니다.

[SHA1 함수](SHA1.md) 섹션을 참조하세요.

# SHA1 함수
<a name="SHA1"></a>

SHA1 함수는 SHA1 암호화 해시 함수를 사용하여 가변 길이 문자열을 160비트 체크섬의 16진수 값을 텍스트로 표현한 40자 문자열로 변환합니다.

## 구문
<a name="SHA1-syntax"></a>

SHA1은 [SHA 함수](SHA.md) 및 [FUNC\$1SHA1 함수](FUNC_SHA1.md)의 동의어입니다.

```
SHA1(string)
```

## 인수
<a name="SHA1-arguments"></a>

 *문자열*()   
가변 길이 문자열입니다.

## 반환 타입
<a name="SHA1-returm-type"></a>

SHA1 함수는 160비트 체크섬의 16진수 값을 텍스트로 표현한 40자 문자열을 반환합니다.

## 예제
<a name="SHA1-example"></a>

다음은 단어 'Amazon Redshift'를 160비트 값으로 반환하는 예입니다.

```
select sha1('Amazon Redshift');
```

# SHA2 함수
<a name="SHA2"></a>

SHA2 함수는 SHA2 암호화 해시 함수를 사용하여 가변 길이 문자열을 문자열로 변환합니다. 문자열은 지정된 비트 수가 있는 체크섬의 16진수 값을 텍스트로 표현한 것입니다.

## 구문
<a name="SHA2-syntax"></a>

```
SHA2(string, bits)
```

## 인수
<a name="SHA2-arguments"></a>

 *문자열*()   
가변 길이 문자열입니다.

 *(정수*)   
해시 함수의 비트 수입니다. 유효한 값은 0(256과 동일), 224, 256, 384 및 512입니다.

## 반환 타입
<a name="SHA2-returm-type"></a>

SHA2 함수는 체크섬의 16진수 값을 텍스트로 표현한 문자열을 반환하거나 비트 수가 유효하지 않은 경우 빈 문자열을 반환합니다.

## 예제
<a name="SHA2-example"></a>

다음은 단어 'Amazon Redshift'를 256비트 값으로 반환하는 예입니다.

```
select sha2('Amazon Redshift', 256);
```

# MURMUR3\$132\$1HASH
<a name="MURMUR3_32_HASH"></a>

MURMUR3\$132\$1HASH 함수는 숫자 및 문자열 유형을 비롯한 모든 일반 데이터 유형에 대해 32비트 Murmur3A 비암호화 해시를 계산합니다.

## 구문
<a name="MURMUR3_32_HASH-syntax"></a>

```
MURMUR3_32_HASH(value [, seed])
```

## 인수
<a name="MURMUR3_32_HASH-arguments"></a>

 * 값*   
입력 값은 해시 처리합니다. Amazon Redshift 는 입력 값의 바이너리 표현을 해시한 예입니다. 이 동작은 [FNV\$1HASH 함수](r_FNV_HASH.md)과 비슷하지만 값이 [Apache Iceberg 32비트 Murmur3 해시 사양](https://iceberg.apache.org/spec/#appendix-b-32-bit-hash-requirements)에 지정된 바이너리 표현으로 변환됩니다.

 *%seed*   
해시 함수의 INT 시드입니다. 이 인수는 선택 사항입니다. 지정하지 않으면 Amazon Redshift는 기본 0 시드를 사용합니다. 이렇게 하면 변환 또는 연결 없이 여러 열의 해시를 결합할 수 있습니다.

## 반환 타입
<a name="MURMUR3_32_HASH-return-type"></a>

함수는 INT를 반환합니다.

## 예제
<a name="MURMUR3_32_HASH-example"></a>

다음은 숫자의 Murmur3 해시, 'Amazon Redshift' 문자열 및 이 둘의 연결을 반환하는 예입니다.

```
select MURMUR3_32_HASH(1);
    
    MURMUR3_32_HASH
----------------------
 1392991556
(1 row)
```

```
select MURMUR3_32_HASH('Amazon Redshift');
    
    MURMUR3_32_HASH
----------------------
 -1563580564
(1 row)
```

```
select MURMUR3_32_HASH('Amazon Redshift', MURMUR3_32_HASH(1));
    
    MURMUR3_32_HASH
----------------------
 -1346554171
(1 row)
```

## 사용 노트
<a name="MURMUR3_32_HASH-usage-notes"></a>

여러 열이 있는 테이블의 해시를 계산하려면 첫 번째 열의 Murmur3 해시를 계산하여 두 번째 열의 해시에 시드로 전달하면 됩니다. 그런 다음 두 번째 열의 Murmur3 해시를 세 번째 열의 해시에 시드로 전달합니다.

다음은 여러 열이 있는 테이블을 해시 처리할 시드를 생성하는 예입니다.

```
select MURMUR3_32_HASH(column_3, MURMUR3_32_HASH(column_2, MURMUR3_32_HASH(column_1))) from sample_table;
```

동일한 속성을 사용하여 문자열 연결 해시를 계산할 수 있습니다.

```
select MURMUR3_32_HASH('abcd');
   
   MURMUR3_32_HASH
---------------------
 1139631978
(1 row)
```

```
select MURMUR3_32_HASH('cd', MURMUR3_32_HASH('ab'));
   
   MURMUR3_32_HASH
---------------------
 1711522338
(1 row)
```

해시 함수는 입력 유형을 사용하여 해시 처리할 바이트 수를 결정합니다. 필요한 경우 캐스팅을 사용하여 특정 유형을 적용합니다.

다음은 다른 결과를 생성하기 위해 다른 입력 유형을 사용하는 예입니다.

```
select MURMUR3_32_HASH(1, MURMUR3_32_HASH(1));
   
   MURMUR3_32_HASH
--------------------
 -1193428387
(1 row)
```

```
select MURMUR3_32_HASH(1);
   
   MURMUR3_32_HASH
----------------------
 1392991556
(1 row)
```

```
select MURMUR3_32_HASH(1, MURMUR3_32_HASH(2));
   
   MURMUR3_32_HASH
----------------------
 1179621905
(1 row)
```

# HyperLogLog 함수
<a name="hyperloglog-functions"></a>

다음으로 Amazon Redshift에서 지원하는 SQL용 HyperLogLog 함수에 대한 설명을 찾아볼 수 있습니다.

**Topics**
+ [HLL 함수](r_HLL_function.md)
+ [HLL\$1CREATE\$1SKETCH 함수](r_HLL_CREATE_SKETCH.md)
+ [HLL\$1CARDINALITY 함수](r_HLL_CARDINALITY.md)
+ [HLL\$1COMBINE 함수](r_HLL_COMBINE.md)
+ [HLL\$1COMBINE\$1SKETCHES 함수](r_HLL_COMBINE_SKETCHES.md)

# HLL 함수
<a name="r_HLL_function"></a>

HLL 함수는 입력 표현식 값의 HyperLogLog 카디널리티를 반환합니다. HLL 함수는 HLLSKETCH 데이터 형식을 제외한 모든 데이터 형식에서 작동합니다. HLL 함수는 NULL 값을 무시합니다. 테이블에 행이 없거나 모든 행이 NULL이면 결과 카디널리티는 0입니다.

## 구문
<a name="r_HLL_function-synopsis"></a>

```
HLL (aggregate_expression)
```

## 인수
<a name="r_HLL_function-argument"></a>

 *aggregate\$1expression*   
열 이름과 같이 집계에 값을 제공하는 모든 유효 표현식입니다. 이 함수는 HLLSKETCH, GEOMETRY, GEOGRAPHY 및 VARBYTE를 제외한 모든 데이터 유형을 입력으로 지원합니다.

## 반환 타입
<a name="r_HLL_function-return-type"></a>

HLL 함수는 BIGINT 또는 INT8 값을 반환합니다.

## 예제
<a name="r_HLL_function-examples"></a>

다음 예에서는 테이블 `a_table`에 있는 열 `an_int`의 카디널리티를 반환합니다.

```
CREATE TABLE a_table(an_int INT);
INSERT INTO a_table VALUES (1), (2), (3), (4);

SELECT hll(an_int) AS cardinality FROM a_table;
cardinality
-------------
4
```

# HLL\$1CREATE\$1SKETCH 함수
<a name="r_HLL_CREATE_SKETCH"></a>

HLL\$1CREATE\$1SKETCH 함수는 입력 표현식 값을 캡슐화하는 HLLSKETCH 데이터 형식을 반환합니다. HLL\$1CREATE\$1SKETCH 함수는 모든 데이터 형식에서 작동하며 NULL 값을 무시합니다. 테이블에 행이 없거나 모든 행이 NULL이면 결과 스케치에 인덱스-값 페어(예: `{"version":1,"logm":15,"sparse":{"indices":[],"values":[]}}`)가 없습니다.

## 구문
<a name="r_HLL_CREATE_SKETCH-synopsis"></a>

```
HLL_CREATE_SKETCH (aggregate_expression)
```

## 인수
<a name="r_HLL_CREATE_SKETCH-argument"></a>

 *aggregate\$1expression*   
열 이름과 같이 집계에 값을 제공하는 모든 유효 표현식입니다. NULL 값은 무시됩니다. 이 함수는 HLLSKETCH, GEOMETRY, GEOGRAPHY 및 VARBYTE를 제외한 모든 데이터 유형을 입력으로 지원합니다.

## 반환 타입
<a name="r_HLL_CREATE_SKETCH-return-type"></a>

HLL\$1CREATE\$1SKETCH 함수는 HLLSKETCH 값을 반환합니다.

## 예제
<a name="r_HLL_CREATE_SKETCH-examples"></a>

다음 예에서는 테이블 `a_table`의 열 `an_int`에 대한 HLLSKETCH 형식을 반환합니다. JSON 객체는 스케치를 가져오거나 내보내거나 인쇄할 때 희소 HyperLogLog 스케치를 나타내는 데 사용됩니다. 문자열 표현(Base64 형식)은 고밀도 HyperLogLog 스케치를 나타내는 데 사용됩니다.

```
CREATE TABLE a_table(an_int INT);
INSERT INTO a_table VALUES (1), (2), (3), (4);

SELECT hll_create_sketch(an_int) AS sketch FROM a_table;
sketch
-------------------------------------------------------------------------------------------------------
{"version":1,"logm":15,"sparse":{"indices":[20812342,20850007,22362299,47158030],"values":[1,2,1,1]}}
(1 row)
```

# HLL\$1CARDINALITY 함수
<a name="r_HLL_CARDINALITY"></a>

HLL\$1CARDINALITY 함수는 입력 HLLSKETCH 데이터 형식의 카디널리티를 반환합니다.

## 구문
<a name="r_HLL_CARDINALITY-synopsis"></a>

```
HLL_CARDINALITY (hllsketch_expression)
```

## 인수
<a name="r_HLL_CARDINALITY-argument"></a>

 *hllsketch\$1expression*   
열 이름과 같이 HLLSKETCH 형식으로 평가되는 모든 유효한 표현식입니다. 입력 값은 HLLSKETCH 데이터 형식입니다.

## 반환 타입
<a name="r_HLL_CARDINALITY-return-type"></a>

HLL\$1CARDINALITY 함수는 BIGINT 또는 INT8 값을 반환합니다.

## 예제
<a name="r_HLL_CARDINALITY-examples"></a>

다음 예에서는 테이블 `hll_table`에 있는 열 `sketch`의 카디널리티를 반환합니다.

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

SELECT hll_cardinality(sketch) AS cardinality FROM hll_table;
cardinality
-------------
6
4
(2 rows)
```

# HLL\$1COMBINE 함수
<a name="r_HLL_COMBINE"></a>

HLL\$1COMBINE 집계 함수는 모든 입력 HLLSKETCH 값을 결합하는 HLLSKETCH 데이터 형식을 반환합니다.

둘 이상의 HyperLogLog 스케치 조합은 각 입력 스케치가 나타내는 고유 값의 조합에 대한 정보를 캡슐화하는 새로운 HLLSKETCH입니다. 스케치를 결합한 후 Amazon Redshift는 둘 이상의 데이터 집합 조합의 카디널리티를 추출합니다. 여러 스케치를 결합하는 방법에 대한 자세한 내용은 [예: 여러 스케치를 결합하여 HyperLogLog 스케치 반환](r_HLL-examples.md#hll-examples-multiple-sketches) 섹션을 참조하세요.

## 구문
<a name="r_HLL_COMBINE-synopsis"></a>

```
HLL_COMBINE (hllsketch_expression)
```

## 인수
<a name="r_HLL_COMBINE-argument"></a>

 *hllsketch\$1expression*   
열 이름과 같이 HLLSKETCH 형식으로 평가되는 모든 유효한 표현식입니다. 입력 값은 HLLSKETCH 데이터 형식입니다.

## 반환 타입
<a name="r_HLL_COMBINE-return-type"></a>

HLL\$1COMBINE 함수는 HLLSKETCH 형식을 반환합니다.

## 예제
<a name="r_HLL_COMBINE-examples"></a>

다음 예에서는 테이블 `hll_table`에 결합된 HLLSKETCH 값을 반환합니다.

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

SELECT hll_combine(sketch) AS sketches FROM hll_table;
sketches
----------------------------------------------------------------------------------------------------------------------------
{"version":1,"logm":15,"sparse":{"indices":[20812342,20850007,22362299,40314817,42650774,47158030],"values":[1,2,1,3,2,1]}}
(1 row)
```

# HLL\$1COMBINE\$1SKETCHES 함수
<a name="r_HLL_COMBINE_SKETCHES"></a>

HLL\$1COMBINE\$1SKETCHES는 두 개의 HLLSKETCH 값을 입력으로 받고 단일 HLLSKETCHE로 결합하는 스칼라 함수입니다.

둘 이상의 HyperLogLog 스케치 조합은 각 입력 스케치가 나타내는 고유 값의 조합에 대한 정보를 캡슐화하는 새로운 HLLSKETCH입니다.

## 구문
<a name="r_HLL_COMBINE_SKETCHES-synopsis"></a>

```
HLL_COMBINE_SKETCHES (hllsketch_expression1, hllsketch_expression2)
```

## 인수
<a name="r_HLL_COMBINE_SKETCHES-argument"></a>

 *hllsketch\$1expression1* 및 *hllsketch\$1expression2*   
열 이름과 같이 HLLSKETCH 형식으로 평가되는 모든 유효한 표현식입니다.

## 반환 타입
<a name="r_HLL_COMBINE_SKETCHES-return-type"></a>

HLL\$1COMBINE\$1SKETCHES 함수는 HLLSKETCH 형식을 반환합니다.

## 예제
<a name="r_HLL_COMBINE_SKETCHES-examples"></a>

다음 예에서는 테이블 `hll_table`에 결합된 HLLSKETCH 값을 반환합니다.

```
WITH tbl1(x, y)
     AS (SELECT Hll_create_sketch(1),
                Hll_create_sketch(2)
         UNION ALL
         SELECT Hll_create_sketch(3),
                Hll_create_sketch(4)
         UNION ALL
         SELECT Hll_create_sketch(5),
                Hll_create_sketch(6)
         UNION ALL
         SELECT Hll_create_sketch(7),
                Hll_create_sketch(8)),
     tbl2(x, y)
     AS (SELECT Hll_create_sketch(9),
                Hll_create_sketch(10)
         UNION ALL
         SELECT Hll_create_sketch(11),
                Hll_create_sketch(12)
         UNION ALL
         SELECT Hll_create_sketch(13),
                Hll_create_sketch(14)
         UNION ALL
         SELECT Hll_create_sketch(15),
                Hll_create_sketch(16)
         UNION ALL
         SELECT Hll_create_sketch(NULL),
                Hll_create_sketch(NULL)),
     tbl3(x, y)
     AS (SELECT *
         FROM   tbl1
         UNION ALL
         SELECT *
         FROM   tbl2)
SELECT Hll_combine_sketches(x, y)
FROM   tbl3;
```

# JSON 함수
<a name="json-functions"></a>

**Topics**
+ [JSON\$1PARSE 함수](JSON_PARSE.md)
+ [CAN\$1JSON\$1PARSE 함수](CAN_JSON_PARSE.md)
+ [JSON\$1SERIALIZE 함수](JSON_SERIALIZE.md)
+ [JSON\$1SERIALIZE\$1TO\$1VARBYTE 함수](JSON_SERIALIZE_TO_VARBYTE.md)
+ [텍스트 기반 JSON 함수](text-json-functions.md)

**참고**  
JSON 작업 시 다음 함수를 사용하는 것이 좋습니다.  
 [JSON\$1PARSE 함수](JSON_PARSE.md) 
 [CAN\$1JSON\$1PARSE 함수](CAN_JSON_PARSE.md) 
 [JSON\$1SERIALIZE 함수](JSON_SERIALIZE.md) 
 [JSON\$1SERIALIZE\$1TO\$1VARBYTE 함수](JSON_SERIALIZE_TO_VARBYTE.md) 
JSON\$1PARSE를 사용하면 모으기 시 JSON 텍스트를 SUPER 유형 값으로 한 번만 변환하면 되며, 그 이후에는 SUPER 값을 사용하여 작업을 수행할 수 있습니다. Amazon Redshift는 텍스트 기반 JSON 함수의 출력인 VARCHAR보다 SUPER 값을 더 효율적으로 구문 분석합니다. SUPER 데이터 유형에 대한 자세한 내용은 [Amazon Redshift의 반정형 데이터](super-overview.md) 섹션을 참조하세요.

비교적 작은 용량의 키-값 페어 집합을 저장해야 할 때는 JSON 형식으로 저장하면 공간을 절약할 수 있습니다. JSON 문자열은 단일 열에 저장할 수 있기 때문에 테이블 형식의 데이터 저장보다는 JSON을 사용하는 것이 더욱 효율적입니다. 예를 들어 가능한 모든 속성을 완전하게 표현하려면 다수의 열이 필요하지만 임의의 행 또는 열에서 대부분 열 값이 NULL인 희소(sparse) 테이블이 하나 있다고 가정하겠습니다. 이때 JSON을 사용하면 행 데이터를 키:값 페어로 단일 JSON 문자열에 저장하여 희박하게 채워진 테이블 열을 제거할 수 있습니다.

또한 JSON 스키마가 변경될 때 테이블에 열을 추가할 필요 없이 JSON 문자열을 쉽게 수정하여 추가 키:값 페어를 저장할 수 있습니다.

JSON은 적게 사용하는 것이 바람직합니다. 특히 대용량의 데이터 집합을 저장할 때는 JSON을 사용하지 않는 것이 좋습니다. 이때는 이질적인 데이터가 단일 열에 저장되면서 JSON가 Amazon Redshift 열 저장 아키텍처를 사용하지 못하기 때문입니다. Amazon Redshift는 CHAR 및 VARCHAR 열에 대한 JSON 함수를 지원하지만 JSON 직렬화 형식의 데이터를 처리하는 데 SUPER를 사용하는 것이 좋습니다. SUPER는 계층 데이터를 효율적으로 쿼리할 수 있는 사후 구문 분석 스키마 없는 표현을 사용합니다. SUPER 데이터 형식에 대한 자세한 내용은 [Amazon Redshift의 반정형 데이터](super-overview.md) 섹션을 참조하세요.

JSON은 UTF-8로 인코딩된 텍스트 문자열을 사용합니다. 따라서 JSON 문자열은 CHAR 또는 VARCHAR 데이터 형식으로 저장될 수 있습니다.

JSON 문자열은 다음 규칙에 따라 올바른 형식의 JSON이 되어야 합니다.
+ 루트 레벨 JSON은 JSON 객체 또는 JSON 배열일 수 있습니다. JSON 객체는 쉼표로 구분된 키:값 페어의 집합으로서 순서 지정 없이 중괄호로 묶입니다.

  예: `{"one":1, "two":2} `
+ JSON 배열은 쉼표로 구분된 값의 집합으로서 순서 지정과 함께 대괄호로 묶입니다.

  예제는 다음과 같습니다: `["first", {"one":1}, "second", 3, null] `
+ JSON 배열은 0부터 시작되는 인덱스를 사용하기 때문에 배열의 첫 요소가 0 위치에 자리합니다. JSON 키:값 페어에서 키는 큰따옴표로 묶이는 문자열입니다.
+ JSON 값은 다음 중 하나일 수 있습니다.
  + JSON 객체 
  + 배열 
  + 문자열
    + 큰따옴표를 사용하여 표시
  + number
    + 정수, 소수, 부동 소수점 포함
  + 부울
  + null 
+ 빈 객체와 빈 배열도 유효한 JSON 값입니다.
+ JSON 필드는 대/소문자를 구분합니다.
+ JSON 구조 요소 사이의 공백(`{ }, [ ]` 등)은 무시됩니다.

Amazon Redshift JSON 함수와 Amazon Redshift COPY 명령은 동일한 메서드를 사용하여 JSON 형식 데이터를 처리합니다. JSON 작업에 대한 자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

# JSON\$1PARSE 함수
<a name="JSON_PARSE"></a>

JSON\$1PARSE 함수는 JSON 형식의 데이터를 구문 분석하고 `SUPER` 표현으로 변환합니다.

INSERT 또는 UPDATE 명령을 사용하여 `SUPER` 데이터 형식으로 수집하려면 JSON\$1PARSE 함수를 사용합니다. JSON\$1PARSE()를 사용하여 JSON 문자열을 `SUPER` 값으로 구문 분석하는 경우 특정 제한 사항이 적용됩니다. 자세한 내용은 [SUPER에 대한 구문 분석 옵션](super-configurations.md#parsing-options-super) 섹션을 참조하세요.

## 구문
<a name="JSON_PARSE-synopsis"></a>

```
JSON_PARSE( {json_string | binary_value} )
```

## 인수
<a name="JSON_PARSE-arguments"></a>

 *json\$1string*  
직렬화된 JSON을 `VARBYTE` 또는 `VARCHAR` 형식으로 반환하는 표현식입니다.

 *binary\$1value*  
VARBYTE 유형의 이진 값입니다.

## 반환 타입
<a name="JSON_PARSE-return"></a>

`SUPER`

## 예제
<a name="JSON_PARSE-examples"></a>

JSON 배열 `[10001,10002,"abc"]`를 `SUPER` 데이터 형식으로 변환하려면 다음 예제를 사용합니다.

```
SELECT JSON_PARSE('[10001,10002,"abc"]');

+---------------------+
|     json_parse      |
+---------------------+
| [10001,10002,"abc"] |
+---------------------+
```

함수가 JSON 배열을 `SUPER` 데이터 형식으로 변환했는지 확인하려면 다음 예제를 사용합니다. 자세한 내용은 [JSON\$1TYPEOF 함수](r_json_typeof.md) 섹션을 참조하세요.

```
SELECT JSON_TYPEOF(JSON_PARSE('[10001,10002,"abc"]'));

+-------------+
| json_typeof |
+-------------+
| array       |
+-------------+
```

# CAN\$1JSON\$1PARSE 함수
<a name="CAN_JSON_PARSE"></a>

CAN\$1JSON\$1PARSE 함수는 JSON 형식의 데이터를 구문 분석하고 JSON\$1PARSE 함수를 사용하여 결과를 `SUPER` 값으로 변환할 수 있는 경우 `true`를 반환합니다.

## 구문
<a name="CAN_JSON_PARSE-synopsis"></a>

```
CAN_JSON_PARSE( {json_string | binary_value} )
```

## 인수
<a name="CAN_JSON_PARSE-arguments"></a>

 *json\$1string*  
직렬화된 JSON을 `VARCHAR` 형식으로 반환하는 표현식입니다.

 *binary\$1value*  
VARBYTE 유형의 이진 값입니다.

## 반환 타입
<a name="CAN_JSON_PARSE-return"></a>

`BOOLEAN`

## 사용 노트
<a name="CAN_JSON_PARSE-usage-notes"></a>
+ CAN\$1JSON\$1PARSE는 빈 문자열에 대해 false를 반환합니다. 입력 인수가 null이면 NULL을 반환합니다.

## 예제
<a name="CAN_JSON_PARSE-examples"></a>

 다음 예제에서는 CASE 조건을 사용하여 올바른 형식의 JSON 배열에 대해 실행되는 CAN\$1JSON\$1PARSE를 보여줍니다. true가 반환되므로 Amazon Redshift는 예제 값에 대해 JSON\$1PARSE 함수를 실행합니다.

```
SELECT CASE 
            WHEN CAN_JSON_PARSE('[10001,10002,"abc"]')
            THEN JSON_PARSE('[10001,10002,"abc"]')
        END;

 case
---------------------
'[10001,10002,"abc"]'
```

 다음 예제에서는 CASE 조건을 사용하여 JSON 형식이 아닌 값에 대해 실행되는 CAN\$1JSON\$1PARSE를 보여줍니다. false가 반환되므로 Amazon Redshift는 CASE 조건의 ELSE 절에 있는 세그먼트를 대신 반환합니다.

```
SELECT CASE 
            WHEN CAN_JSON_PARSE('This is a string.')
            THEN JSON_PARSE('This is a string.')
            ELSE 'This is not JSON.'
        END;

 case
---------------------
"This is not JSON."
```

# JSON\$1SERIALIZE 함수
<a name="JSON_SERIALIZE"></a>

JSON\$1SERIALIZE 함수는 RFC 8259에 따라 `SUPER` 표현식을 텍스트 JSON 표현으로 직렬화합니다. RFC에 대한 자세한 내용은 [The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc8259)을 참조하세요.

`SUPER` 크기 제한은 블록 제한과 거의 동일하고 `VARCHAR` 제한은 `SUPER` 크기 제한보다 작습니다. 따라서 JSON\$1SERIALIZE 함수는 JSON 형식이 시스템의 VARCHAR 제한을 초과하면 오류를 반환합니다. `SUPER` 표현식의 크기를 확인하려면 [JSON\$1SIZE](r_json_size.md) 함수를 참조하세요.

## 구문
<a name="JSON_SERIALIZE-synopsis"></a>

```
JSON_SERIALIZE(super_expression)
```

## 인수
<a name="JSON_SERIALIZE-arguments"></a>

 *super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="JSON_SERIALIZE-return"></a>

`VARCHAR`

**참고**  
반환되는 VARCHAR 값은 항상 null이 아닌 JSON 문자열입니다. *super\$1expression*이 NULL인 경우 JSON\$1SERIALIZE는 JSON 문자열 `'null'`을 반환합니다.

## 예제
<a name="JSON_SERIALIZE-examples"></a>

`SUPER` 값을 문자열로 직렬화하려면 다음 예제를 사용합니다.

```
SELECT JSON_SERIALIZE(JSON_PARSE('[10001,10002,"abc"]'));
   
+---------------------+
|   json_serialize    |
+---------------------+
| [10001,10002,"abc"] |
+---------------------+
```

# JSON\$1SERIALIZE\$1TO\$1VARBYTE 함수
<a name="JSON_SERIALIZE_TO_VARBYTE"></a>

JSON\$1SERIALIZE\$1TO\$1VARBYTE 함수는 `SUPER` 값을 JSON\$1SERIALIZE()와 유사한 JSON 문자열로 변환하지만 대신 `VARBYTE` 값에 저장합니다.

## 구문
<a name="JSON_SERIALIZE_TO_VARBYTE-synopsis"></a>

```
JSON_SERIALIZE_TO_VARBYTE(super_expression)
```

## 인수
<a name="JSON_SERIALIZE_TO_VARBYTE-arguments"></a>

 *super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="JSON_SERIALIZE_TO_VARBYTE-return"></a>

`VARBYTE`

## 예제
<a name="JSON_SERIALIZE_TO_VARBYTE-examples"></a>

`SUPER` 값을 직렬화하고 결과를 `VARBYTE` 형식으로 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_SERIALIZE_TO_VARBYTE(JSON_PARSE('[10001,10002,"abc"]'));

+----------------------------------------+
|       json_serialize_to_varbyte        |
+----------------------------------------+
| 5b31303030312c31303030322c22616263225d |
+----------------------------------------+
```

`SUPER` 값을 직렬화하고 결과를 `VARCHAR` 형식으로 캐스팅하려면 다음 예제를 사용합니다. 자세한 내용은 [CAST 함수](r_CAST_function.md) 섹션을 참조하세요.

```
SELECT CAST((JSON_SERIALIZE_TO_VARBYTE(JSON_PARSE('[10001,10002,"abc"]'))) AS VARCHAR);

+---------------------------+
| json_serialize_to_varbyte |
+---------------------------+
| [10001,10002,"abc"]       |
+---------------------------+
```

# 텍스트 기반 JSON 함수
<a name="text-json-functions"></a>

이 섹션의 함수는 JSON 값을 VARCHAR로 구문 분석합니다. JSON을 구문 분석하려면 JSON 값을 SUPER로 구문 분석하는 다음 함수를 대신 사용하는 것이 좋습니다. Amazon Redshift는 VARCHAR보다 SUPER 값을 더 효율적으로 구문 분석합니다.
+  [JSON\$1PARSE 함수](JSON_PARSE.md) 
+  [CAN\$1JSON\$1PARSE 함수](CAN_JSON_PARSE.md) 
+  [JSON\$1SERIALIZE 함수](JSON_SERIALIZE.md) 
+  [JSON\$1SERIALIZE\$1TO\$1VARBYTE 함수](JSON_SERIALIZE_TO_VARBYTE.md) 

**Topics**
+ [IS\$1VALID\$1JSON 함수](IS_VALID_JSON.md)
+ [IS\$1VALID\$1JSON\$1ARRAY 함수](IS_VALID_JSON_ARRAY.md)
+ [JSON\$1ARRAY\$1LENGTH 함수](JSON_ARRAY_LENGTH.md)
+ [JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 함수](JSON_EXTRACT_ARRAY_ELEMENT_TEXT.md)
+ [JSON\$1EXTRACT\$1PATH\$1TEXT 함수](JSON_EXTRACT_PATH_TEXT.md)

# IS\$1VALID\$1JSON 함수
<a name="IS_VALID_JSON"></a>

**참고**  
CAN\$1JSON\$1PARSE 및 관련 함수는 JSON 값을 SUPER로 구문 분석하는데, Amazon Redshift는 VARCHAR보다 더 효율적으로 구문 분석합니다.  
 IS\$1VALID\$1JSON을 사용하는 대신 [CAN\$1JSON\$1PARSE 함수](CAN_JSON_PARSE.md)를 사용하여 JSON 문자열을 검증하는 것이 좋습니다.

IS\$1VALID\$1JSON 함수는 JSON 문자열을 검증합니다. 이 함수는 문자열이 제대로 구성된 JSON인 경우 부울 값 `true`를, 문자열이 잘못 구성된 경우에는 부울 값 `false`를 반환합니다. JSON 배열을 확인하는 방법은 [IS\$1VALID\$1JSON\$1ARRAY 함수](IS_VALID_JSON_ARRAY.md) 섹션을 참조하세요.

자세한 내용은 [JSON 함수](json-functions.md) 섹션을 참조하세요.

## 구문
<a name="IS_VALID_JSON-synopsis"></a>

```
IS_VALID_JSON('json_string')
```

## 인수
<a name="IS_VALID_JSON-arguments"></a>

 *json\$1string*  
JSON 문자열로 평가되는 문자열 또는 식입니다.

## 반환 타입
<a name="IS_VALID_JSON-return"></a>

`BOOLEAN`

## 예제
<a name="IS_VALID_JSON-examples"></a>

테이블을 만들고 테스트용 JSON 문자열을 삽입하려면 다음 예제를 사용합니다.

```
CREATE TABLE test_json(id int IDENTITY(0,1), json_strings VARCHAR);

-- Insert valid JSON strings --
INSERT INTO test_json(json_strings) VALUES
('{"a":2}'), 
('{"a":{"b":{"c":1}}}'), 
('{"a": [1,2,"b"]}');

-- Insert invalid JSON strings --
INSERT INTO test_json(json_strings) VALUES
('{{}}'), 
('{1:"a"}'), 
('[1,2,3]');
```

앞선 예제에 있는 문자열의 유효성을 검사하려면 다음 예제를 사용합니다.

```
SELECT id, json_strings, IS_VALID_JSON(json_strings) 
FROM test_json
ORDER BY id;

+----+---------------------+---------------+
| id |    json_strings     | is_valid_json |
+----+---------------------+---------------+
|  0 | {"a":2}             | true          |
|  4 | {"a":{"b":{"c":1}}} | true          |
|  8 | {"a": [1,2,"b"]}    | true          |
| 12 | {{}}                | false         |
| 16 | {1:"a"}             | false         |
| 20 | [1,2,3]             | false         |
+----+---------------------+---------------+
```

# IS\$1VALID\$1JSON\$1ARRAY 함수
<a name="IS_VALID_JSON_ARRAY"></a>

**참고**  
JSON\$1PARSE 및 관련 함수는 JSON 값을 SUPER로 구문 분석하는데, Amazon Redshift는 VARCHAR보다 더 효율적으로 구문 분석합니다.  
 IS\$1VALID\$1JSON\$1ARRAY를 사용하는 대신 [JSON\$1PARSE 함수](JSON_PARSE.md)를 사용해 JSON 문자열을 구문 분석하여 SUPER 값을 얻는 것이 좋습니다. 그런 다음 [IS\$1ARRAY 함수](r_is_array.md) 함수를 사용하여 배열이 올바른 형식인지 확인합니다.

IS\$1VALID\$1JSON\$1ARRAY 함수는 JSON 배열을 검증합니다. 이 함수는 배열이 제대로 구성된 JSON인 경우 부울 값 `true`를, 배열이 잘못 구성된 경우에는 부울 값 `false`를 반환합니다. JSON 문자열을 확인하는 방법은 [IS\$1VALID\$1JSON 함수](IS_VALID_JSON.md) 섹션을 참조하세요.

자세한 내용은 [JSON 함수](json-functions.md) 섹션을 참조하세요.

## 구문
<a name="IS_VALID_JSON_ARRAY-synopsis"></a>

```
IS_VALID_JSON_ARRAY('json_array') 
```

## 인수
<a name="IS_VALID_JSON_ARRAY-arguments"></a>

 *json\$1array*  
JSON 배열로 평가되는 문자열 또는 식입니다.

## 반환 타입
<a name="IS_VALID_JSON_ARRAY-return"></a>

`BOOLEAN`

## 예제
<a name="IS_VALID_JSON_ARRAY-examples"></a>

테이블을 만들고 테스트용 JSON 문자열을 삽입하려면 다음 예제를 사용합니다.

```
CREATE TABLE test_json_arrays(id int IDENTITY(0,1), json_arrays VARCHAR);

-- Insert valid JSON array strings --
INSERT INTO test_json_arrays(json_arrays) 
VALUES('[]'), 
('["a","b"]'), 
('["a",["b",1,["c",2,3,null]]]');

-- Insert invalid JSON array strings --
INSERT INTO test_json_arrays(json_arrays) 
VALUES('{"a":1}'),
('a'),
('[1,2,]');
```

앞선 예제에 있는 문자열의 유효성을 검사하려면 다음 예제를 사용합니다.

```
SELECT json_arrays, IS_VALID_JSON_ARRAY(json_arrays) 
FROM test_json_arrays ORDER BY id;

+------------------------------+---------------------+
|         json_arrays          | is_valid_json_array |
+------------------------------+---------------------+
| []                           | true                |
| ["a","b"]                    | true                |
| ["a",["b",1,["c",2,3,null]]] | true                |
| {"a":1}                      | false               |
| a                            | false               |
| [1,2,]                       | false               |
+------------------------------+---------------------+
```

# JSON\$1ARRAY\$1LENGTH 함수
<a name="JSON_ARRAY_LENGTH"></a>

**참고**  
JSON\$1PARSE 및 관련 함수는 JSON 값을 SUPER로 구문 분석하는데, Amazon Redshift는 VARCHAR보다 더 효율적으로 구문 분석합니다.  
 JSON\$1ARRAY\$1LENGTH를 사용하는 대신 [JSON\$1PARSE 함수](JSON_PARSE.md)를 사용해 JSON 문자열을 구문 분석하여 SUPER 값을 얻는 것이 좋습니다. 그런 다음 [GET\$1ARRAY\$1LENGTH 함수](get_array_length.md)를 사용하여 배열의 길이를 구합니다.

JSON\$1ARRAY\$1LENGTH 함수는 JSON 문자열의 바깥쪽 배열에 속한 요소 수를 반환합니다. **null\$1if\$1invalid 인수가 `true`로 설정되어 있는데 JSON 문자열이 잘못된 경우, 이 함수는 오류 대신 `NULL`을 반환합니다.

자세한 내용은 [JSON 함수](json-functions.md) 섹션을 참조하세요.

## 구문
<a name="JSON_ARRAY_LENGTH-synopsis"></a>

```
JSON_ARRAY_LENGTH('json_array' [, null_if_invalid ] ) 
```

## 인수
<a name="JSON_ARRAY_LENGTH-arguments"></a>

 *json\$1array*  
올바른 형식의 JSON 배열입니다.

 *null\$1if\$1invalid*  
(선택) 입력 JSON 문자열이 잘못된 경우 오류 대신 `NULL`을 반환할지 여부를 지정하는 `BOOLEAN` 값입니다. JSON이 잘못되었을 때 `NULL`을 반환하게 하려면 `true`(`t`)를 지정합니다. JSON이 잘못되었을 때 오류를 반환하게 하려면 `false`(`f`)를 지정합니다. 기본값은 `false`입니다.

## 반환 타입
<a name="JSON_ARRAY_LENGTH-return"></a>

`INTEGER`

## 예제
<a name="JSON_ARRAY_LENGTH-examples"></a>

배열의 요소 수를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14]'); 

+-------------------+
| json_array_length |
+-------------------+
|                 5 |
+-------------------+
```

JSON이 유효하지 않아 오류를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14');
 
ERROR: invalid json array object [11,12,13,{"f1":21,"f2":[25,26]},14
```

잘못된 JSON에 대해 오류를 반환하는 대신 `NULL`을 반환하도록 **null\$1if\$1invalid를 **true로 설정하려면 다음 예제를 사용합니다.

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14',true);

+-------------------+
| json_array_length |
+-------------------+
| NULL              |
+-------------------+
```

# JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 함수
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT"></a>

**참고**  
JSON\$1PARSE 및 관련 함수는 JSON 값을 SUPER로 구문 분석하는데, Amazon Redshift는 VARCHAR보다 더 효율적으로 구문 분석합니다.  
JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT를 사용하는 대신 [JSON\$1PARSE 함수](JSON_PARSE.md)를 사용해 JSON 문자열을 구문 분석하여 SUPER 값을 얻는 것이 좋습니다. 그런 다음 `value[element position]` 구문으로 배열 인덱스를 사용하여 원하는 요소를 쿼리합니다. SUPER 값의 배열 요소를 쿼리하는 방법에 대한 자세한 내용은 [반정형 데이터 쿼리](query-super.md) 섹션을 참조하세요.

JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 함수는 0부터 시작되는 인덱스를 사용하여 가장 바깥쪽 JSON 문자열 배열의 JSON 배열 요소를 반환합니다. 배열의 첫 번째 요소는 0 위치에 자리합니다. 인덱스가 음의 값이거나 경계를 벗어나면 JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT가 `NULL`을 반환합니다. **null\$1if\$1invalid 인수가 `TRUE`로 설정되어 있는데 JSON 문자열이 잘못된 경우, 이 함수는 오류 대신 `NULL`을 반환합니다.

자세한 내용은 [JSON 함수](json-functions.md) 섹션을 참조하세요.

## 구문
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-synopsis"></a>

```
JSON_EXTRACT_ARRAY_ELEMENT_TEXT('json string', pos [, null_if_invalid ] )
```

## 인수
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-arguments"></a>

 *json\$1string*  
올바른 형식의 JSON 문자열입니다.

*pos*  
반환할 배열 요소의 인덱스를 0부터 시작되는 배열 인덱스를 사용하여 나타내는 `INTEGER`입니다.

*null\$1if\$1invalid*  
(선택) 입력 JSON 문자열이 잘못된 경우 오류 대신 `NULL`을 반환할지 여부를 지정하는 `BOOLEAN` 값입니다. JSON이 잘못되었을 때 `NULL`을 반환하게 하려면 `true`(`t`)를 지정합니다. JSON이 잘못되었을 때 오류를 반환하게 하려면 `false`(`f`)를 지정합니다. 기본값은 `false`입니다.

## 반환 타입
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-return"></a>

`VARCHAR`  
**pos에서 참조한 JSON 배열 요소를 나타내는 `VARCHAR` 문자열입니다.

## 예제
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-examples"></a>

0부터 시작하는 배열 인덱스의 세 번째 요소인 위치 2에 있는 배열 요소를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[111,112,113]', 2);
 
+---------------------------------+
| json_extract_array_element_text |
+---------------------------------+
|                             113 |
+---------------------------------+
```

JSON이 유효하지 않아 오류를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('["a",["b",1,["c",2,3,null,]]]',1);
 
ERROR: invalid json array object ["a",["b",1,["c",2,3,null,]]]
```

**다음 예에서는 null\$1if\$1invalid를 **true로 설정해 문이 잘못된 JSON에 대해 오류가 아니라 `NULL`을 반환하도록 합니다.

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('["a",["b",1,["c",2,3,null,]]]',1,true);
 
+---------------------------------+
| json_extract_array_element_text |
+---------------------------------+
| NULL                            |
+---------------------------------+
```

다음 예제 문을 살펴보세요. 제공된 JSON 문자열 또는 인덱스가 NULL인 경우 JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT가 다른 파라미터의 값에 관계없이 NULL을 반환합니다.

```
--Statement where json_string is NULL.
SELECT json_extract_array_element_text(NULL, 0)

 json_extract_array_element_text
---------------------------------
                            NULL

--Statement where pos is NULL and json_string is invalid JSON.
SELECT json_extract_array_element_text('invalid_json', NULL);

 json_extract_array_element_text
---------------------------------
                            NULL

--Statement where json_string is NULL and null_if_invalid is FALSE.
SELECT json_extract_array_element_text(NULL, 0, FALSE);

 json_extract_array_element_text
---------------------------------
                            NULL
```

다음 예제 문을 살펴보세요. *null\$1if\$1invalid*가 TRUE인 경우 *json\$1string*이 유효하지 않은 JSON이면 JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT가 NULL을 반환합니다. *null\$1if\$1invalid*가 FALSE이거나 설정되지 않은 경우 *json\$1string*이 유효하지 않으면 이 함수가 오류를 반환합니다.

```
--Statement with invalid JSON where null_if_invalid is TRUE.
SELECT json_extract_array_element_text('invalid_json', 0, TRUE);

 json_extract_array_element_text
---------------------------------
                            NULL
                            
--Statement with invalid JSON where null_if_invalid is FALSE.
SELECT json_extract_array_element_text('invalid_json', 0);

ERROR:  JSON parsing error
```

*json\$1string*이 유효한 JSON이고 *pos*가 JSON `null` 값을 참조하는 다음 예제를 살펴보세요. 이 경우 JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT는 *null\$1if\$1invalid* 값에 관계없이 NULL을 반환합니다.

```
--Statement selecting a null value.
SELECT json_extract_array_element_text('[null]', 0);

  json_extract_array_element_text 
----------------------------------
                             NULL
```

# JSON\$1EXTRACT\$1PATH\$1TEXT 함수
<a name="JSON_EXTRACT_PATH_TEXT"></a>

**참고**  
JSON\$1PARSE 및 관련 함수는 JSON 값을 SUPER로 구문 분석하는데, Amazon Redshift는 VARCHAR보다 더 효율적으로 구문 분석합니다.  
JSON\$1EXTRACT\$1PATH\$1TEXT를 사용하는 대신 [JSON\$1PARSE 함수](JSON_PARSE.md)를 사용해 JSON 문자열을 구문 분석하여 SUPER 값을 얻는 것이 좋습니다. 그런 다음 `value.attribute` 구문으로 원하는 요소를 쿼리합니다. SUPER 값의 배열 요소를 쿼리하는 방법에 대한 자세한 내용은 [반정형 데이터 쿼리](query-super.md) 섹션을 참조하세요.

JSON\$1EXTRACT\$1PATH\$1TEXT 함수는 JSON 문자열의 연속된 경로 요소에서 참조하는 키-값 페어 값을 반환합니다. JSON 경로는 최대 5개 레벨까지 중첩될 수 있습니다. 경로 요소는 대/소문자를 구분합니다. JSON 문자열에 경로 요소가 존재하지 않으면 JSON\$1EXTRACT\$1PATH\$1TEXT가 `NULL`을 반환합니다.

**null\$1if\$1invalid 인수가 `TRUE`로 설정되어 있는데 JSON 문자열이 잘못된 경우, 이 함수는 오류 대신 `NULL`을 반환합니다.

JSON\$1EXTRACT\$1PATH\$1TEXT의 최대 데이터 크기는 64KB입니다. 따라서 JSON 레코드가 64KB보다 큰 경우 JSON\$1EXTRACT\$1PATH\$1TEXT로 처리 시 오류가 발생합니다.

추가 JSON 함수에 대한 자세한 내용은 [JSON 함수](json-functions.md) 섹션을 참조하세요. JSON 작업에 대한 자세한 내용은 [JSON 형식의 COPY 지원](copy-usage_notes-copy-from-json.md) 섹션을 참조하세요.

## 구문
<a name="JSON_EXTRACT_PATH_TEXT-synopsis"></a>

```
JSON_EXTRACT_PATH_TEXT('json_string', 'path_elem' [,'path_elem'[, …] ] [, null_if_invalid ] )
```

## 인수
<a name="JSON_EXTRACT_PATH_TEXT-arguments"></a>

 *json\$1string*  
올바른 형식의 JSON 문자열입니다.

*path\$1elem*  
JSON 문자열의 경로 요소입니다. 경로 요소 1개는 필수이며, 추가로 5개 레벨까지 경로 요소를 지정할 수 있습니다.

*null\$1if\$1invalid*  
(선택) 입력 JSON 문자열이 잘못된 경우 오류 대신 `NULL`을 반환할지 여부를 지정하는 `BOOLEAN` 값입니다. JSON이 잘못되었을 때 `NULL`을 반환하게 하려면 `TRUE`(`t`)를 지정합니다. JSON이 잘못되었을 때 오류를 반환하게 하려면 `FALSE`(`f`)를 지정합니다. 기본값은 `FALSE`입니다.

JSON 문자열에서는 Amazon Redshift가 `\n`을 줄 바꿈 문자로, 그리고 `\t`를 탭 문자로 인식합니다. 백슬래시를 로드하려면 백슬래시(`\\`)로 이스케이프하세요. 자세한 내용은 [JSON의 이스케이프 문자](copy-usage_notes-copy-from-json.md#copy-usage-json-escape-characters) 섹션을 참조하세요.

## 반환 타입
<a name="JSON_EXTRACT_PATH_TEXT-return"></a>

`VARCHAR`  
경로 요소에서 참조한 JSON 값을 나타내는 `VARCHAR` 문자열입니다.

## 예제
<a name="JSON_EXTRACT_PATH_TEXT-examples"></a>

`'f4', 'f6'` 경로에 대한 값을 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4', 'f6');

+------------------------+
| json_extract_path_text |
+------------------------+
| star                   |
+------------------------+
```

JSON이 유효하지 않아 오류를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}','f4', 'f6');

ERROR: invalid json object {"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}
```

이 문이 오류를 반환하는 대신 유효하지 않은 JSON에 대해 `NULL`을 반환하도록 *null\$1if\$1invalid*를 *TRUE*로 설정하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}','f4', 'f6',true);

+------------------------+
| json_extract_path_text |
+------------------------+
| NULL                   |
+------------------------+
```

검색된 값이 세 번째 수준인 `'farm', 'barn', 'color'` 경로에 대한 값을 선택하는 다음 예제를 살펴보세요. 이 샘플은 가독성을 높여주는 JSON lint 도구로 형식이 지정되었습니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{
    "farm": {
        "barn": {
            "color": "red",
            "feed stocked": true
        }
    }
}', 'farm', 'barn', 'color');
+------------------------+
| json_extract_path_text |
+------------------------+
| red                    |
+------------------------+
```

`'color'` 요소가 누락되어 `NULL`을 반환하려면 다음 예제를 사용합니다. 이 샘플은 JSON lint 도구로 형식이 지정되었습니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{
    "farm": {
        "barn": {}
    }
}', 'farm', 'barn', 'color');

+------------------------+
| json_extract_path_text |
+------------------------+
| NULL                   |
+------------------------+
```

JSON이 유효한 경우 누락된 요소를 추출하려고 하면 `NULL`이 반환됩니다.

`'house', 'appliances', 'washing machine', 'brand'` 경로에 대한 값을 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_EXTRACT_PATH_TEXT('{
  "house": {
    "address": {
      "street": "123 Any St.",
      "city": "Any Town",
      "state": "FL",
      "zip": "32830"
    },
    "bathroom": {
      "color": "green",
      "shower": true
    },
    "appliances": {
      "washing machine": {
        "brand": "Any Brand",
        "color": "beige"
      },
      "dryer": {
        "brand": "Any Brand",
        "color": "white"
      }
    }
  }
}', 'house', 'appliances', 'washing machine', 'brand');  

+------------------------+
| json_extract_path_text |
+------------------------+
| Any Brand              |
+------------------------+
```

다음 예시에서는 샘플 테이블을 만들고 SUPER 값으로 채운 다음, 두 행의 경로 `'f2'` 값을 반환합니다.

```
CREATE TABLE json_example(id INT, json_text SUPER);

INSERT INTO json_example VALUES
(1, JSON_PARSE('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}')),
(2, JSON_PARSE('{
    "farm": {
        "barn": {
            "color": "red",
            "feed stocked": true
        }
    }
}'));

SELECT * FROM json_example;
id          | json_text
------------+--------------------------------------------
1           | {"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}
2           | {"farm":{"barn":{"color":"red","feed stocked":true}}}
 

SELECT id, JSON_EXTRACT_PATH_TEXT(JSON_SERIALIZE(json_text), 'f2') FROM json_example;
         
id          | json_text
------------+--------------------------------------------
1           | {"f3":1}
2           |
```

다음 예제 문을 살펴보세요. 제공된 *path\$1elem*가 NULL이므로 JSON\$1EXTRACT\$1PATH\$1TEXT는 다른 파라미터의 값에 관계없이 NULL을 반환합니다.

```
--Statement where path_elem is NULL and json_string is valid JSON.
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}',NULL);

 json_extract_path_text
------------------------
                   NULL

--Statement where only one path_elem is NULL.
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4',NULL);

 json_extract_path_text
------------------------
                   NULL
                   
--Statement where path_elem is NULL and json_string is invalid JSON.
SELECT json_extract_path_text('invalid_json', NULL);

 json_extract_path_text
------------------------
                   NULL

--Statement where path_elem is NULL and null_if_invalid is FALSE.
SELECT json_extract_path_text(NULL, 0, FALSE);

 json_extract_path_text
------------------------
                   NULL
```

다음 예제 문을 살펴보세요. *null\$1if\$1invalid*가 TRUE인 경우 *json\$1string*이 유효하지 않은 JSON이면 JSON\$1EXTRACT\$1PATH\$1TEXT가 NULL을 반환합니다. *null\$1if\$1invalid*가 FALSE이거나 설정되지 않은 경우 *json\$1string*이 유효하지 않으면 이 함수가 오류를 반환합니다.

```
--Statement with invalid JSON where null_if_invalid is TRUE.
SELECT json_extract_path_text('invalid_json', 0, TRUE);

 json_extract_path_text
------------------------
                   NULL
                                                    
--Statement with invalid JSON where null_if_invalid is FALSE.
SELECT json_extract_path_text('invalid_json', 0, FALSE);

ERROR:  JSON parsing error
```

*json\$1string*이 유효한 JSON이고 *path\$1elem*이 JSON `null` 값을 참조하는 다음 예제를 살펴보세요. 이 경우 JSON\$1EXTRACT\$1PATH\$1TEXT는 NULL을 반환합니다. 마찬가지로 *path\$1elem*이 존재하지 않는 값을 참조하면 JSON\$1EXTRACT\$1PATH\$1TEXT는 *null\$1if\$1invalid*의 값에 관계없이 NULL을 반환합니다.

```
--Statement selecting a null value.
SELECT json_extract_path_text('[null]', 0);

  json_extract_path_text  
-------------------------
                    NULL   
                             
--Statement selecting a non-existing value.               
SELECT json_extract_path_text('{}', 'a');
       
  json_extract_path_text  
-------------------------
                    NULL
```

# 기계 학습 함수
<a name="ml-function"></a>

Amazon Redshift 기계 학습을 사용하면 SQL 문으로 기계 학습 모델을 훈련하고 예측을 위해 SQL 쿼리에서 해당 기계 학습 모델을 호출할 수 있습니다. Amazon Redshift 모델 설명에는 훈련 데이터의 각 속성이 예측 결과에 어떻게 기여하는지 이해하는 데 도움이 되는 특성 중요도 값이 포함되어 있습니다.

다음으로 Amazon Redshift에서 지원하는 SQL용 기계 학습 함수에 대한 설명을 찾아볼 수 있습니다.

**Topics**
+ [EXPLAIN\$1MODEL 함수](r_explain_model_function.md)

# EXPLAIN\$1MODEL 함수
<a name="r_explain_model_function"></a>

EXPLAIN\$1MODEL 함수는 JSON 형식의 모델 설명 보고서가 포함된 SUPER 데이터 유형을 반환합니다. 설명 보고서에는 모든 모델 특성의 Shapley 값에 대한 정보가 들어 있습니다.

EXPLAIN\$1MODEL 함수는 현재 AUTO ON 또는 AUTO OFF XGBoost 모델만 지원합니다.

설명 보고서를 사용할 수 없는 경우 함수는 모델의 진행 상황을 보여주는 상태를 반환합니다. `Waiting for training job to complete`, `Waiting for processing job to complete` 및 `Processing job failed`가 포함됩니다.

CREATE MODEL 문을 실행하면 설명 상태가 `Waiting for training job to complete`이 됩니다. 모델이 훈련되고 설명 요청이 전송되면 설명 상태는 `Waiting for processing job to complete`이 됩니다. 모델 설명이 성공적으로 완료되면 전체 설명 보고서를 사용할 수 있습니다. 그렇지 않으면 상태는 `Processing job failed`가 됩니다.

CREATE MODEL 문을 실행할 때 선택적 `MAX_RUNTIME` 파라미터를 사용하여 교육에 소요되는 최대 시간을 지정할 수 있습니다. 모델 생성 시간이 해당 시간에 도달하면 Amazon Redshift는 모델 생성을 중지합니다. Autopilot 모델을 생성하는 동안 해당 시간 제한에 도달하면 Amazon Redshift가 지금까지 가장 적합한 모델을 반환합니다. 모델 설명 가능성은 모델 학습이 완료되면 사용할 수 있으므로 `MAX_RUNTIME`을 짧은 시간으로 설정하면 설명 가능성 보고서를 사용할 수 없을 수 있습니다. 학습 시간은 모델 복잡성, 데이터 크기 및 기타 요인에 따라 달라집니다.

## 구문
<a name="r_explain_model_function-synopsis"></a>

```
EXPLAIN_MODEL ('schema_name.model_name')
```

## 인수
<a name="r_explain_model_function-argument"></a>

 *schema\$1name*   
스키마의 이름입니다. schema\$1name을 지정하지 않으면 현재 스키마가 선택됩니다.

 *model\$1name*   
모델의 이름입니다. 스키마의 모델 이름은 고유해야 합니다.

## 반환 타입
<a name="r_explain_model_function-return-type"></a>

EXPLAIN\$1MODEL 함수는 다음과 같이 SUPER 데이터 유형을 반환합니다.

```
{"version":"1.0","explanations":{"kernel_shap":{"label0":{"global_shap_values":{"x0":0.05,"x1":0.10,"x2":0.30,"x3":0.15},"expected_value":0.50}}}}
```

## 예제
<a name="r_explain_model_function-examples"></a>

다음 예에서는 설명 상태 `waiting for training job to complete`을 반환합니다.

```
select explain_model('customer_churn_auto_model');
                 explain_model
--------------------------------------------------------
{"explanations":"waiting for training job to complete"}
(1 row)
```

모델 설명이 성공적으로 완료되면 다음과 같이 전체 설명 보고서를 사용할 수 있습니다.

```
select explain_model('customer_churn_auto_model');
                                       explain_model
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"version":"1.0","explanations":{"kernel_shap":{"label0":{"global_shap_values":{"x0":0.05386043365892927,"x1":0.10801289723274592,"x2":0.23227865827017378,"x3":0.0676685133940455,"x4":0.0897097667672375,"x5":0.08502141653270926,"x6":0.07581993936077065,"x7":0.16462880604578135},"expected_value":0.8492974042892456}}}}
(1 row)
```

EXPLAIN\$1MODEL 함수는 SUPER 데이터 유형을 반환하므로 설명 보고서를 쿼리할 수 있습니다. 이렇게 하면 `global_shap_values`, `expected_value` 또는 특성별 Shapley 값을 추출할 수 있습니다.

다음 예에서는 모델에 대해 `global_shap_values`를 추출합니다.

```
select json_table.report.explanations.kernel_shap.label0.global_shap_values from (select explain_model('customer_churn_auto_model') as report) as json_table;
                                                       global_shap_values
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"state":0.10983770427197151,"account_length":0.1772441398408543,"area_code":0.08626823968639591,"phone":0.0736669595282712,"intl_plan":3.344907436910987,"vmail_plan":0.09646600597854467,"vmail_message":0.2064922655089351,"day_mins":2.015038015251777,"day_calls":0.13179511076780168,"day_charge":0.4941091720480879,"eve_mins":0.46081379198626105,"eve_calls":0.16913440417758477,"eve_charge":0.09651014369401761,"night_mins":0.44218153640050845,"night_calls":0.15311640089218997,"night_charge":0.13850366104495426,"intl_mins":0.7583662464883899,"intl_calls":0.47144468610485685,"intl_charge":0.10945894673611875,"cust_serv_calls":0.31822051038387733}
(1 row)
```

다음 예에서는 특성 x0에 대해 `global_shap_values`를 추출합니다.

```
select json_table.report.explanations.kernel_shap.label0.global_shap_values.x0 from (select explain_model('customer_churn_auto_model') as report) as json_table;
          x0
------------------------
  0.05386043365892927
(1 row)
```

특정 스키마에서 모델이 생성되고 생성된 모델에 대한 액세스 권한이 있는 경우 다음과 같이 모델 설명을 쿼리할 수 있습니다.

```
-- Check the current schema
SHOW search_path;
   search_path
------------------
  $user, public
(1 row)         
-- If you have the privilege to access the model explanation
-- in `test_schema`
SELECT explain_model('test_schema.test_model_name');
                       explain_model
---------------------------------------------------------
{"explanations":"waiting for training job to complete"}
(1 row)
```

# 수학 함수
<a name="Math_functions"></a>

**Topics**
+ [수학 연산자 기호](r_OPERATOR_SYMBOLS.md)
+ [ABS 함수](r_ABS.md)
+ [ACOS 함수](r_ACOS.md)
+ [ASIN 함수](r_ASIN.md)
+ [ATAN 함수](r_ATAN.md)
+ [ATAN2 함수](r_ATAN2.md)
+ [CBRT 함수](r_CBRT.md)
+ [CEILING(또는 CEIL) 함수](r_CEILING_FLOOR.md)
+ [COS 함수](r_COS.md)
+ [COT 함수](r_COT.md)
+ [DEGREES 함수](r_DEGREES.md)
+ [DEXP 함수](r_DEXP.md)
+ [DLOG1 함수](r_DLOG1.md)
+ [DLOG10 함수](r_DLOG10.md)
+ [EXP 함수](r_EXP.md)
+ [FLOOR 함수](r_FLOOR.md)
+ [LN 함수](r_LN.md)
+ [LOG 함수](r_LOG.md)
+ [MOD 함수](r_MOD.md)
+ [PI 함수](r_PI.md)
+ [POWER 함수](r_POWER.md)
+ [RADIANS 함수](r_RADIANS.md)
+ [RANDOM 함수](r_RANDOM.md)
+ [ROUND 함수](r_ROUND.md)
+ [SIN 함수](r_SIN.md)
+ [SIGN 함수](r_SIGN.md)
+ [SQRT 함수](r_SQRT.md)
+ [TAN 함수](r_TAN.md)
+ [TRUNC 함수](r_TRUNC.md)

이번 섹션에서는 Amazon Redshift에서 지원되는 수학 연산자 및 함수에 대해 설명합니다.

# 수학 연산자 기호
<a name="r_OPERATOR_SYMBOLS"></a>

 다음 표는 지원되는 수학 연산자를 나열한 것입니다.

## 지원되는 연산자
<a name="r_OPERATOR_SYMBOLS-supported-operators"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_OPERATOR_SYMBOLS.html)

## 예제
<a name="r_OPERATOR_SYMBOLS-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

주어진 거래에 대해 지불한 수수료와 2.00 USD의 수수료를 계산하려면 다음 예제를 사용합니다.

```
SELECT
    commission,
    (commission + 2.00) AS comm
FROM
    sales
WHERE
    salesid = 10000;

+------------+-------+
| commission | comm  |
+------------+-------+
|      28.05 | 30.05 |
+------------+-------+
```

주어진 거래에 대한 판매 가격의 20%를 계산하려면 다음 예제를 사용합니다.

```
SELECT pricepaid, (pricepaid * .20) as twentypct 
FROM sales 
WHERE salesid=10000;

+-----------+-----------+
| pricepaid | twentypct |
+-----------+-----------+
|       187 |      37.4 |
+-----------+-----------+
```

지속적인 성장 패턴을 기반으로 티켓 판매를 예측하려면 다음 예제를 사용합니다. 이번 예에서는 하위 쿼리가 2008년 판매된 티켓 수량을 반환합니다. 그런 다음 그 결과를 10년 연속 성장률 5%와 거듭제곱합니다.

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid AND year=2008)^((5::float/100)*10) AS qty10years;

+------------------+
|    qty10years    |
+------------------+
| 587.664019657491 |
+------------------+
```

날짜 ID가 2000보다 크거나 같은 판매에 대한 총 지불 가격 및 수수료를 찾으려면 다음 예제를 사용합니다. 그런 다음 가격 총액에서 수수료 총액을 뺍니다.

```
SELECT SUM(pricepaid) AS sum_price, dateid,
SUM(commission) AS sum_comm, (SUM(pricepaid) - SUM(commission)) AS value
FROM sales 
WHERE dateid >= 2000
GROUP BY dateid 
ORDER BY dateid 
LIMIT 10;

+-----------+--------+----------+-----------+
| sum_price | dateid | sum_comm |   value   |
+-----------+--------+----------+-----------+
|    305885 |   2000 | 45882.75 | 260002.25 |
|    316037 |   2001 | 47405.55 | 268631.45 |
|    358571 |   2002 | 53785.65 | 304785.35 |
|    366033 |   2003 | 54904.95 | 311128.05 |
|    307592 |   2004 |  46138.8 |  261453.2 |
|    333484 |   2005 |  50022.6 |  283461.4 |
|    317670 |   2006 |  47650.5 |  270019.5 |
|    351031 |   2007 | 52654.65 | 298376.35 |
|    313359 |   2008 | 47003.85 | 266355.15 |
|    323675 |   2009 | 48551.25 | 275123.75 |
+-----------+--------+----------+-----------+
```

# ABS 함수
<a name="r_ABS"></a>

 ABS는 절대 숫자 값을 계산합니다. 여기에서 숫자란 리터럴이거나, 혹은 숫자로 평가되는 표현식이 될 수 있습니다.

## 구문
<a name="r_ABS-synopsis"></a>

```
ABS(number)
```

## 인수
<a name="r_ABS-arguments"></a>

 *number*   
숫자, 또는 숫자로 평가되는 표현식입니다. `SMALLINT`, `INTEGER`, `BIGINT`, `DECIMAL`, `FLOAT4`, `FLOAT8`, 또는 `SUPER` 형식이 될 수 있습니다.

## 반환 타입
<a name="r_ABS-return-type"></a>

ABS는 인수와 동일한 데이터 형식을 반환합니다.

## 예제
<a name="r_ABS-examples"></a>

`-38`의 절대값을 계산하려면 다음 예제를 사용합니다.

```
SELECT ABS(-38);

+-----+
| abs |
+-----+
|  38 |
+-----+
```

`(14-76)`의 절대값을 계산하려면 다음 예제를 사용합니다.

```
SELECT ABS(14-76);

+-----+
| abs |
+-----+
|  62 |
+-----+
```

# ACOS 함수
<a name="r_ACOS"></a>

ACOS는 숫자의 아크 코사인을 반환하는 삼각 함수입니다. 반환 값은 라디안 단위이며 `0`과 `PI` 사이입니다.

## 구문
<a name="r_ACOS-synopsis"></a>

```
ACOS(number)
```

## 인수
<a name="r_ACOS-arguments"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_ACOS-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_ACOS-examples"></a>

`-1`의 아크 코사인을 반환하려면 다음 예제를 사용합니다.

```
SELECT ACOS(-1);

+-------------------+
|       acos        |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

`.5`의 아크 코사인을 상응하는 도수로 변환하려면 다음 예제를 사용합니다.

```
SELECT (ACOS(.5) * 180/(SELECT PI())) AS degrees;

+-------------------+
|      degrees      |
+-------------------+
| 60.00000000000001 |
+-------------------+
```

# ASIN 함수
<a name="r_ASIN"></a>

ASIN은 숫자의 아크 사인을 반환하는 삼각 함수입니다. 반환 값은 라디안 단위이며 `PI/2`과 `-PI/2` 사이입니다.

## 구문
<a name="r_ASIN-synopsis"></a>

```
ASIN(number)
```

## 인수
<a name="r_ASIN-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_ASIN-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_ASIN-examples"></a>

`1`의 아크 사인을 반환하려면 다음 예제를 사용합니다.

```
SELECT ASIN(1) AS halfpi;

+--------------------+
|       halfpi       |
+--------------------+
| 1.5707963267948966 |
+--------------------+
```

`.5`의 아크 사인을 상응하는 도수로 변환하려면 다음 예제를 사용합니다.

```
SELECT (ASIN(.5) * 180/(SELECT PI())) AS degrees;

+--------------------+
|      degrees       |
+--------------------+
| 30.000000000000004 |
+--------------------+
```

# ATAN 함수
<a name="r_ATAN"></a>

ATAN은 숫자의 아크 탄젠트를 반환하는 삼각 함수입니다. 반환 값은 라디안 단위이며 `-PI`과 `PI` 사이입니다.

## 구문
<a name="r_ATAN-synopsis"></a>

```
ATAN(number)
```

## 인수
<a name="r_ATAN-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_ATAN-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_ATAN-examples"></a>

`1`의 아크 탄젠트를 반환하여 4와 곱하려면 다음 예제를 사용합니다.

```
SELECT ATAN(1) * 4 AS pi;
            
+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

`1`의 아크 탄젠트를 상응하는 도수로 변환하려면 다음 예제를 사용합니다.

```
SELECT (ATAN(1) * 180/(SELECT PI())) AS degrees;

+---------+
| degrees |
+---------+
|      45 |
+---------+
```

# ATAN2 함수
<a name="r_ATAN2"></a>

ATAN2는 다른 숫자로 나눈 숫자의 아크 탄젠트를 반환하는 삼각 함수입니다. 반환 값은 라디안 단위이며 `PI/2`과 `-PI/2` 사이입니다.

## 구문
<a name="r_ATAN2-synopsis"></a>

```
ATAN2(number1, number2)
```

## 인수
<a name="r_ATAN2-arguments"></a>

 *number1*   
`DOUBLE PRECISION` 수입니다.

 *number2*   
`DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_ATAN2-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_ATAN2-examples"></a>

`2/2`의 아크 탄젠트를 반환하여 4와 곱하려면 다음 예제를 사용합니다.

```
SELECT ATAN2(2,2) * 4 AS PI;

+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

`1/0`의 아크 탄젠트(0으로 평가됨)를 상응하는 도수로 변환하려면 다음 예제를 사용합니다.

```
SELECT (ATAN2(1,0) * 180/(SELECT PI())) AS degrees;

+---------+
| degrees |
+---------+
|      90 |
+---------+
```

# CBRT 함수
<a name="r_CBRT"></a>

 CBRT 함수는 주어진 숫자의 세제곱근을 계산하는 수학 함수입니다.

## 구문
<a name="r_CBRT-synopsis"></a>

```
CBRT(number)
```

## 인수
<a name="r_CBRT-argument"></a>

CBRT는 `DOUBLE PRECISION` 숫자를 인수로 사용합니다.

## 반환 타입
<a name="r_CBRT-return-type"></a>

`DOUBLE PRECISION` 

## 예제
<a name="r_CBRT-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

주어진 거래에 대해 지불한 수수료의 세제곱근을 계산하려면 다음 예제를 사용합니다.

```
SELECT CBRT(commission) FROM sales WHERE salesid=10000;

+--------------------+
|        cbrt        |
+--------------------+
| 3.0383953904884344 |
+--------------------+
```

# CEILING(또는 CEIL) 함수
<a name="r_CEILING_FLOOR"></a>

CEILING 또는 CEIL 함수는 숫자를 다음 정수(whole number)로 올림하는 데 사용됩니다. 반면 [FLOOR 함수](r_FLOOR.md)는 숫자를 다음 정수로 내림합니다.

## 구문
<a name="r_CEILING_FLOOR-synopsis"></a>

```
{CEIL | CEILING}(number)
```

## 인수
<a name="r_CEILING_FLOOR-arguments"></a>

 *number*   
숫자 또는 숫자로 평가되는 표현식입니다. `SMALLINT`, `INTEGER`, `BIGINT`, `DECIMAL`, `FLOAT4`, `FLOAT8`, 또는 `SUPER` 형식이 될 수 있습니다.

## 반환 타입
<a name="r_CEILING_FLOOR-return-type"></a>

CEILING과 CEIL은 인수와 동일한 데이터 형식을 반환합니다.

입력이 `SUPER` 형식이면 출력은 입력과 동일한 동적 형식을 유지하는 반면 정적 형식은 SUPER 형식을 유지합니다. `SUPER`의 동적 형식이 숫자가 아니면 Amazon Redshift는 null을 반환합니다.

## 예제
<a name="r_CEILING_FLOOR-example"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

주어진 판매 거래에 대해 지급되는 수수료의 한도를 계산하려면 다음 예제를 사용합니다.

```
SELECT CEILING(commission) FROM sales
WHERE salesid=10000;

+---------+
| ceiling |
+---------+
|      29 |
+---------+
```

# COS 함수
<a name="r_COS"></a>

COS는 숫자의 코사인을 반환하는 삼각 함수입니다. 반환 값은 라디안 단위이며 `-1`과 `1` 사이(경계값 포함)입니다.

## 구문
<a name="r_COS-synopsis"></a>

```
COS(double_precision)
```

## 인수
<a name="r_COS-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_COS-return-type"></a>

COS 함수는 `DOUBLE PRECISION` 숫자를 반환합니다.

## 예제
<a name="r_COS-examples"></a>

`0`의 코사인을 반환하려면 다음 예제를 사용합니다.

```
SELECT COS(0);

+-----+
| cos |
+-----+
|   1 |
+-----+
```

`pi`의 코사인을 반환하려면 다음 예제를 사용합니다.

```
SELECT COS(PI());

+-----+
| cos |
+-----+
|  -1 |
+-----+
```

# COT 함수
<a name="r_COT"></a>

COT는 숫자의 코탄젠트를 반환하는 삼각 함수입니다. 입력 파라미터는 0이 아닌 값이어야 합니다.

## 구문
<a name="r_COT-synopsis"></a>

```
COT(number)
```

## 인수
<a name="r_COT-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_COT-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_COT-examples"></a>

1의 코탄젠트를 반환하려면 다음 예제를 사용합니다.

```
SELECT COT(1);

+--------------------+
|        cot         |
+--------------------+
| 0.6420926159343306 |
+--------------------+
```

# DEGREES 함수
<a name="r_DEGREES"></a>

라디안 단위의 각도를 도 단위의 등가로 변환합니다.

## 구문
<a name="r_DEGREES-synopsis"></a>

```
DEGREES(number)
```

## 인수
<a name="r_DEGREES-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_DEGREES-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_DEGREES-examples"></a>

0.5 라디안에 상응하는 도수를 반환하려면 다음 예제를 사용합니다.

```
SELECT DEGREES(.5);

+-------------------+
|      degrees      |
+-------------------+
| 28.64788975654116 |
+-------------------+
```

PI 라디안을 도 단위로 변환하려면 다음 예제를 사용합니 

```
SELECT DEGREES(pi());

+---------+
| degrees |
+---------+
|     180 |
+---------+
```

# DEXP 함수
<a name="r_DEXP"></a>

DEXP 함수는 거듭제곱 값을 배정밀도 숫자의 유효숫자 표기법으로 반환합니다. DEXP 함수와 EXP 함수의 유일한 차이점은 DEXP 파라미터가 `DOUBLE PRECISION`이어야 한다는 데 있습니다.

## 구문
<a name="r_DEXP-synopsis"></a>

```
DEXP(number)
```

## 인수
<a name="r_DEXP-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_DEXP-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_DEXP-example"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

DEXP 함수를 사용하여 연속 성장 패턴에 따른 티켓 판매를 예측합니다. 이번 예에서는 하위 쿼리가 2008년 판매된 티켓 수량을 반환합니다. 그런 다음 그 결과를 DEXP 함수 결과와 곱합니다. 이때 10년 연속 성장률은 7%로 지정합니다.

```
SELECT (SELECT SUM(qtysold) 
FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * DEXP((7::FLOAT/100)*10) qty2010;

+-------------------+
|      qty2010      |
+-------------------+
| 695447.4837722216 |
+-------------------+
```

# DLOG1 함수
<a name="r_DLOG1"></a>

DLOG1 함수는 입력 파라미터의 자연 로그를 반환합니다. [LN 함수](r_LN.md)의 동의어입니다.

# DLOG10 함수
<a name="r_DLOG10"></a>

DLOG10 함수는 입력 파라미터의 밑이 10인 로그를 반환합니다.

[LOG 함수](r_LOG.md)의 동의어입니다.

## 구문
<a name="r_DLOG10-synopsis"></a>

```
DLOG10(number)
```

## 인수
<a name="r_DLOG10-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_DLOG10-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_DLOG10-example"></a>

숫자 100의 밑수 10 로그를 반환하려면 다음 예제를 사용합니다.

```
SELECT DLOG10(100);

+--------+
| dlog10 |
+--------+
|      2 |
+--------+
```

# EXP 함수
<a name="r_EXP"></a>

EXP 함수는 숫자 표현식의 지수 함수, 또는 자연 알고리즘 기반인 거듭제곱된 `e`를 실행합니다. EXP 함수는 [LN 함수](r_LN.md)의 역입니다.

## 구문
<a name="r_EXP-synopsis"></a>

```
EXP(expression)
```

## 인수
<a name="r_EXP-argument"></a>

 *expression*   
입력 표현식은 `INTEGER`, `DECIMAL` 또는 `DOUBLE PRECISION` 데이터 형식이어야 합니다.

## 반환 타입
<a name="r_EXP-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_EXP-example"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

EXP 함수를 사용하여 연속 성장 패턴에 따른 티켓 판매를 예측합니다. 이번 예에서는 하위 쿼리가 2008년 판매된 티켓 수량을 반환합니다. 그런 다음 그 결과를 EXP 함수 결과와 곱합니다. 이때 10년 연속 성장률은 7%로 지정합니다.

```
SELECT (SELECT SUM(qtysold) 
FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * EXP((7::FLOAT/100)*10) qty2018;

+-------------------+
|      qty2018      |
+-------------------+
| 695447.4837722216 |
+-------------------+
```

# FLOOR 함수
<a name="r_FLOOR"></a>

FLOOR 함수는 숫자를 다음 정수(whole number)로 내림합니다.

## 구문
<a name="r_FLOOR-synopsis"></a>

```
FLOOR(number)
```

## 인수
<a name="r_FLOOR-argument"></a>

 *number*   
숫자 또는 숫자로 평가되는 표현식입니다. `SMALLINT`, `INTEGER`, `BIGINT`, `DECIMAL`, `FLOAT4`, `FLOAT8`, 또는 `SUPER` 형식이 될 수 있습니다.

## 반환 타입
<a name="r_FLOOR-return-type"></a>

FLOOR는 인수와 동일한 데이터 형식을 반환합니다.

입력이 `SUPER` 형식이면 출력은 입력과 동일한 동적 형식을 유지하는 반면 정적 형식은 `SUPER` 형식을 유지합니다. `SUPER`의 동적 형식이 숫자가 아니면 Amazon Redshift는 `NULL`을 반환합니다.

## 예제
<a name="r_FLOOR-example"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

FLOOR 함수 사용 전후에 주어진 판매 거래에 대해 지불한 수수료의 값을 표시하려면 다음 예제를 사용합니다.

```
SELECT commission 
FROM sales 
WHERE salesid=10000;

+------------+
| commission |
+------------+
|      28.05 |
+------------+

SELECT FLOOR(commission) 
FROM sales 
WHERE salesid=10000;

+-------+
| floor |
+-------+
|    28 |
+-------+
```

# LN 함수
<a name="r_LN"></a>

인수의 자연 로그를 반환합니다.

[DLOG1 함수](r_DLOG1.md)의 동의어입니다.

## 구문
<a name="r_LN-synopsis"></a>

```
LN(expression)
```

## 인수
<a name="r_LN-argument"></a>

 *expression*   
함수가 실행되는 대상 열 또는 표현식입니다.  
이 함수는 표현식이 Amazon Redshift 사용자 생성 테이블이나 Amazon Redshift STL 또는 STV 시스템 테이블을 참조하는 경우 일부 데이터 형식에 대해 오류를 반환합니다.
다음과 같은 데이터 형식의 표현식은 사용자 생성 또는 시스템 테이블을 참조할 경우 오류를 나타냅니다. 이러한 데이터 형식의 표현식들은 리더 노드에서만 실행되기 때문입니다.  
+ `BOOLEAN` 
+ `CHAR` 
+ `DATE` 
+ `DECIMAL` 또는 `NUMERIC` 
+ `TIMESTAMP` 
+ `VARCHAR` 
다음과 같은 데이터 형식의 표현식은 사용자 생성 테이블이나 STL 또는 STV 시스템 테이블에서 성공적으로 실행됩니다.  
+ `BIGINT` 
+ `DOUBLE PRECISION` 
+ `INTEGER` 
+ `REAL` 
+ `SMALLINT` 

## 반환 타입
<a name="r_LN-return-type"></a>

LN 함수는 입력 **표현식과 동일한 형식을 반환합니다.

## 예제
<a name="r_LN-example"></a>

숫자 2.718281828의 자연 로그, 즉 밑이 `e`인 로그를 반환하려면 다음 예제를 사용합니다.

```
SELECT LN(2.718281828);

+--------------------+
|         ln         |
+--------------------+
| 0.9999999998311267 |
+--------------------+
```

반환되는 값은 거의 1에 일치합니다.

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

USERS 테이블의 userid 열에 있는 값의 자연 로그를 반환하려면 다음 예제를 사용합니다.

```
SELECT username, LN(userid) FROM users ORDER BY userid LIMIT 10;

+----------+--------------------+
| username |         ln         |
+----------+--------------------+
| JSG99FHE |                  0 |
| PGL08LJI | 0.6931471805599453 |
| IFT66TXU | 1.0986122886681098 |
| XDZ38RDD | 1.3862943611198906 |
| AEB55QTM | 1.6094379124341003 |
| NDQ15VBM |  1.791759469228055 |
| OWY35QYB | 1.9459101490553132 |
| AZG78YIP | 2.0794415416798357 |
| MSD36KVR | 2.1972245773362196 |
| WKW41AIW |  2.302585092994046 |
+----------+--------------------+
```

# LOG 함수
<a name="r_LOG"></a>

숫자의 로그를 반환합니다.

이 함수를 사용하여 밑이 10인 로그를 계산하는 경우 [DLOG10 함수](r_DLOG10.md)을 사용할 수도 있습니다. 

## 구문
<a name="r_LOG-synopsis"></a>

```
LOG([base, ]argument)
```

## 파라미터
<a name="r_LOG-argument"></a>

 *base*   
(선택) 로그 함수의 밑입니다. 이 숫자는 양수여야 하며 `1`과 같을 수 없습니다. 이 파라미터를 생략하면 Amazon Redshift는 인수의 밑이 10인 로그를 계산합니다.**

 *인수*   
로그 함수의 인수입니다. 이 숫자는 양수여야 합니다. **인수 값이 `1`이면 함수는 `0`을 반환합니다.

## 반환 타입
<a name="r_LOG-return-type"></a>

LOG 함수는 `DOUBLE PRECISION` 숫자를 반환합니다.

## 예제
<a name="r_LOG-example"></a>

밑이 2인 로그 100을 구하려면 다음 예제를 사용합니다.

```
SELECT LOG(2, 100);
+-------------------+
|        log        |
+-------------------+
| 6.643856189774725 |
+-------------------+
```

밑이 10인 로그 100을 구하려면 다음 예제를 사용합니다. 밑 파라미터를 생략하면 Amazon Redshift는 밑이 10이라고 가정합니다.

```
SELECT LOG(100);
            
+-----+
| log |
+-----+
|   2 |
+-----+
```

# MOD 함수
<a name="r_MOD"></a>

*모듈로* 연산이라고도 하는 두 숫자의 나머지를 반환합니다. 결과를 계산하려면 첫 번째 파라미터를 두 번째 파라미터로 나눕니다.

## 구문
<a name="r_MOD-synopsis"></a>

```
MOD(number1, number2)
```

## 인수
<a name="r_MOD-arguments"></a>

 *number1*   
첫 번째 입력 파라미터는 `INTEGER`, `SMALLINT`, `BIGINT` 또는 `DECIMAL` 숫자입니다. 두 파라미터 중 하나가 `DECIMAL` 형식이면 다른 파라미터도 `DECIMAL` 형식이어야 합니다 둘 중 한 파라미터가 `INTEGER` 형식이라면 나머지 파라미터는 `INTEGER`, `SMALLINT` 또는 `BIGINT` 형식이 될 수 있습니다. 두 파라미터 모두 `SMALLINT` 또는 `BIGINT`가 될 수 있지만 한 파라미터가 `BIGINT`라면 나머지 파라미터는 `SMALLINT`가 될 수 없습니다.

 *number2*   
두 번째 파라미터는 `INTEGER`, `SMALLINT`, `BIGINT`, 또는`DECIMAL` 숫자입니다. *number2*에도 *number1*과 동일한 데이터 형식 규칙이 적용됩니다.

## 반환 타입
<a name="r_MOD-return-type"></a>

MOD 함수의 반환 형식은 두 입력 파라미터의 형식이 동일하다는 가정 하에 입력 파라미터와 동일한 숫자 형식입니다. 하지만 둘 중 한 파라미터가 `INTEGER`이라면 반환 형식도 `INTEGER`가 됩니다. 유효한 반환 형식은 `DECIMAL`, `INT`, `SMALLINT` 및 `BIGINT`입니다.

## 사용 노트
<a name="r_MOD-usage-notes"></a>

`%`를 모듈로 연산자로 사용할 수 있습니다.

## 예제
<a name="r_MOD-example"></a>

숫자를 다른 숫자로 나눌 때 나머지를 반환하려면 다음 예제를 사용합니다.

```
SELECT MOD(10, 4);
               
+-----+
| mod |
+-----+
|   2 |
+-----+
```

MOD 함수를 사용할 때 `DECIMAL` 결과를 반환하려면 다음 예제를 사용합니다.

```
SELECT MOD(10.5, 4);
               
+-----+
| mod |
+-----+
| 2.5 |
+-----+
```

MOD 함수를 실행하기 전에 숫자를 캐스팅하려면 다음 예제를 사용합니다. 자세한 내용은 [CAST 함수](r_CAST_function.md) 섹션을 참조하세요.

```
SELECT MOD(CAST(16.4 AS INTEGER), 5);
               
+-----+
| mod |
+-----+
|   1 |
+-----+
```

첫 번째 파라미터를 2로 나누어 짝수인지 확인하려면 다음 예제를 사용합니다.

```
SELECT mod(5,2) = 0 AS is_even;
               
+---------+
| is_even |
+---------+
| false   |
+---------+
```

**%를 모듈 연산자로 사용하려면 다음 예제를 사용합니다.

```
SELECT 11 % 4 as remainder;
               
 +-----------+
| remainder |
+-----------+
|         3 |
+-----------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATEGORY 테이블에서 홀수 카테고리에 대한 정보를 반환하려면 다음 예제를 사용합니다.

```
SELECT catid, catname
FROM category
WHERE MOD(catid,2)=1
ORDER BY 1,2;

+-------+-----------+
| catid |  catname  |
+-------+-----------+
|     1 | MLB       |
|     3 | NFL       |
|     5 | MLS       |
|     7 | Plays     |
|     9 | Pop       |
|    11 | Classical |
+-------+-----------+
```

# PI 함수
<a name="r_PI"></a>

pi 함수는 PI 값을 소수점 14자리까지 반환합니다.

## 구문
<a name="r_PI-synopsis"></a>

```
PI()
```

## 반환 타입
<a name="r_PI-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_PI-examples"></a>

pi 값을 반환하려면 다음 예제를 사용합니다.

```
SELECT PI();

+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

# POWER 함수
<a name="r_POWER"></a>

 POWER 함수는 숫자 표현식을 두 번째 숫자 표현식의 거듭제곱으로 제곱하는 지수 함수입니다. 예를 들어 2의 세제곱은 `POWER(2,3)`으로 계산되어 `8`이라는 결과를 반환합니다.

## 구문
<a name="r_POWER-synopsis"></a>

```
{POW | POWER}(expression1, expression2)
```

## 인수
<a name="r_POWER-arguments"></a>

 *expression1*   
제곱할 숫자 표현식입니다. 데이터 형식은 `INTEGER`, `DECIMAL` 또는 `FLOAT`여야 합니다.

 *expression2*   
*expression1*을 제곱할 거듭제곱입니다. 데이터 형식은 `INTEGER`, `DECIMAL` 또는 `FLOAT`여야 합니다.

## 반환 타입
<a name="r_POWER-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_POWER-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 POWER 함수를 사용하여 2008년 티켓 판매 수량(하위 쿼리 결과)을 근거로 향후 10년간 티켓 판매 추이를 예측하는 예입니다. 이번 예에서는 연간 성장률을 7%로 설정하였습니다.

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * POW((1+7::FLOAT/100),10) qty2010;

+-------------------+
|      qty2010      |
+-------------------+
| 679353.7540885945 |
+-------------------+
```

다음은 연간 성장률은 7%이지만 간격을 월로 설정했을 때(10년 = 120개월) 위의 예에 대한 분산도를 나타낸 예입니다.

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * POW((1+7::FLOAT/100/12),120) qty2010;

+-----------------+
|     qty2010     |
+-----------------+
| 694034.54678046 |
+-----------------+
```

# RADIANS 함수
<a name="r_RADIANS"></a>

RADIANS 함수는 도 단위의 각도를 라디안 단위의 등가로 변환합니다.

## 구문
<a name="r_RADIANS-synopsis"></a>

```
RADIANS(number)
```

## 인수
<a name="r_RADIANS-argument"></a>

 *number*   
입력 파라미터는 `DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_RADIANS-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_RADIANS-examples"></a>

라디안 환산 180도를 반환하려면 다음 예제를 사용합니다.

```
SELECT RADIANS(180);

+-------------------+
|      radians      |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

# RANDOM 함수
<a name="r_RANDOM"></a>

RANDOM 함수는 0.0(포함)과 1.0(제외) 사이에서 무작위로 값을 생성합니다.

## 구문
<a name="r_RANDOM-synopsis"></a>

```
RANDOM()
```

## 반환 타입
<a name="r_RANDOM-return-type"></a>

`DOUBLE PRECISION`

## 사용 노트
<a name="r_RANDOM_usage_notes"></a>

RANDOM이 예측 가능한 순서로 숫자를 생성할 수 있도록 [SET](r_SET.md) 명령으로 시드 값을 설정한 후 RANDOM을 호출하세요.

## 예제
<a name="r_RANDOM-examples"></a>

0에서 99 사이의 무작위 값을 계산하려면 다음 예제를 사용합니다. 무작위 숫자가 0에서 1이면 이 쿼리는 0에서 100 사이의 무작위 숫자를 생성합니다.

```
SELECT CAST(RANDOM() * 100 AS INT);

+------+
| int4 |
+------+
|   59 |
+------+
```

다음은 RANDOM이 예측 가능한 순서로 숫자를 생성할 수 있도록 [SET](r_SET.md) 명령을 사용하여 SEED 값을 설정하는 예입니다.

SEED 값을 설정하지 않고 3개의 RANDOM 정수를 반환하려면 다음 예제를 사용합니다.

```
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|    6 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   68 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   56 |
+------+
```

SEED 값을 `.25`로 설정하고 RANDOM 숫자를 3개 더 반환하려면 다음 예제를 사용합니다.

```
SET SEED TO .25;
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   21 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   79 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   12 |
+------+
```

SEED 값을 `.25`로 재설정하고 RANDOM이 이전 세 번의 호출과 동일한 결과를 반환하는지 확인하려면 다음 예제를 사용합니다.

```
SET SEED TO .25;
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   21 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   79 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   12 |
+------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

SALES 테이블에서 10개 항목의 균일한 무작위 샘플을 검색하려면 다음 예제를 사용합니다.

```
SELECT * 
FROM sales
ORDER BY RANDOM()
LIMIT 10;

+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
| salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
|   45422 |  51114 |     5983 |   24482 |    4369 |   2118 |       1 |       195 |      29.25 | 2008-10-19 05:20:07 |
|   42481 |  47638 |     4573 |    6198 |    6479 |   1987 |       4 |      1140 |        171 | 2008-06-10 09:39:19 |
|   31494 |  34759 |    18895 |    4719 |    7753 |   2090 |       4 |      1024 |      153.6 | 2008-09-21 03:44:26 |
|  119388 | 136685 |    21815 |   41905 |    2071 |   1884 |       1 |       359 |      53.85 | 2008-02-27 10:43:10 |
|  166990 | 225037 |    18529 |    7628 |     746 |   2113 |       1 |      2009 |     301.35 | 2008-10-14 10:07:44 |
|   11146 |  12096 |    42685 |    6619 |    1876 |   2123 |       1 |        29 |       4.35 | 2008-10-24 06:23:54 |
|  148537 | 172056 |    15102 |   11787 |    6122 |   1923 |       2 |       480 |         72 | 2008-04-07 03:58:23 |
|   68945 |  78387 |     7359 |   18323 |    6636 |   1910 |       1 |       457 |      68.55 | 2008-03-25 08:31:03 |
|   52796 |  59576 |     9909 |   15102 |    7958 |   1951 |       1 |       479 |      71.85 | 2008-05-05 02:25:08 |
|   90684 | 103522 |    38052 |   21549 |    7384 |   2117 |       1 |       313 |      46.95 | 2008-10-18 05:43:11 |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
```

10개 품목의 무작위 샘플을 검색하되 가격에 비례하여 품목을 선택하려면 다음 예제를 사용합니다. 예를 들어 다른 항목보다 가격이 두 배 높은 항목은 쿼리 결과에 나타날 가능성이 두 배 더 높습니다.

```
SELECT * 
FROM sales
ORDER BY -LOG(RANDOM()) / pricepaid
LIMIT 10;

+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
| salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
|  158340 | 208208 |    17082 |   42018 |    1211 |   2160 |       4 |      6852 |     1027.8 | 2008-11-30 12:21:43 |
|   53250 |  60069 |    12644 |    7066 |    7942 |   1838 |       4 |      1528 |      229.2 | 2008-01-12 11:24:56 |
|   22929 |  24938 |    47314 |    6503 |     179 |   2000 |       3 |       741 |     111.15 | 2008-06-23 08:04:50 |
|  164980 | 221181 |     1949 |   19670 |    1471 |   1906 |       1 |      1330 |      199.5 | 2008-03-21 07:59:51 |
|  159641 | 211179 |    44897 |   16652 |    7458 |   2128 |       1 |      1019 |     152.85 | 2008-10-29 02:02:15 |
|   73143 |  83439 |     5716 |    5727 |    7314 |   1903 |       1 |       248 |       37.2 | 2008-03-18 11:07:42 |
|   84778 |  96749 |    46608 |   32980 |    3883 |   1999 |       2 |       958 |      143.7 | 2008-06-22 12:13:31 |
|  171096 | 232929 |    43683 |    8536 |    8353 |   1870 |       1 |       929 |     139.35 | 2008-02-13 01:36:36 |
|   74212 |  84697 |    39809 |   15569 |    5525 |   2105 |       2 |       896 |      134.4 | 2008-10-06 11:47:50 |
|  158011 | 207556 |    25399 |   16881 |     232 |   2088 |       2 |      2526 |      378.9 | 2008-09-19 06:00:26 |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
```

# ROUND 함수
<a name="r_ROUND"></a>

ROUND 함수는 숫자를 가장 가까운 정수 또는 소수로 반올림합니다.

ROUND 함수는 옵션으로 두 번째 인수를 추가할 수 있습니다. 이 두 번째 인수는 어느 방향이든 반올림할 소수 자릿수를 나타내는 `INTEGER`입니다. 두 번째 인수를 제공하지 않으면 함수는 가장 가까운 정수로 반올림됩니다. 두 번째 인수 **integer거 지정되면 함수는 전체 자릿수의 소수 자릿수가 integer**인 가장 가까운 숫자로 반올림됩니다.

## 구문
<a name="r_ROUND-synopsis"></a>

```
ROUND(number [ , integer ] )
```

## 인수
<a name="r_ROUND-argument"></a>

 *number*   
숫자 또는 숫자로 평가되는 표현식입니다. `DECIMAL`, `FLOAT8` 또는 `SUPER` 형식이 될 수 있습니다. Amazon Redshift는 다른 숫자 데이터 형식을 암시적으로 변환할 수 있습니다.

*(정수*)  
(선택) 어느 방향으로든 반올림을 위한 소수 자릿수를 나타내는 `INTEGER`입니다. `SUPER` 데이터 형식은 이 인수에 대해 지원되지 않습니다.

## 반환 타입
<a name="r_ROUND-return-type"></a>

ROUND는 입력 **숫자와 동일한 숫자 데이터 형식을 반환합니다.

입력이 `SUPER` 형식이면 출력은 입력과 동일한 동적 형식을 유지하는 반면 정적 형식은 `SUPER` 형식을 유지합니다. `SUPER`의 동적 형식이 숫자가 아니면 Amazon Redshift는 `NULL`을 반환합니다.

## 예제
<a name="r_ROUND-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

주어진 거래에서 지불되는 수수료를 가장 가까운 정수로 반올림하려면 다음 예제를 사용합니다.

```
SELECT commission, ROUND(commission)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |    28 |
+------------+-------+
```

주어진 거래에서 지불되는 수수료를 첫 번째 소수점 자리로 반올림하려면 다음 예제를 사용합니다.

```
SELECT commission, ROUND(commission, 1)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |  28.1 |
+------------+-------+
```

이전 예제와 반대 방향으로 정밀도를 확장하려면 다음 예제를 사용합니다.

```
SELECT commission, ROUND(commission, -1)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |    30 |
+------------+-------+
```

# SIN 함수
<a name="r_SIN"></a>

SIN은 숫자의 사인을 반환하는 삼각 함수입니다. 반환 값은 `-1`과 `1` 사이입니다.

## 구문
<a name="r_SIN-synopsis"></a>

```
SIN(number)
```

## 인수
<a name="r_SIN-argument"></a>

 *number*   
라디안 단위의 `DOUBLE PRECISION` 숫자입니다.

## 반환 타입
<a name="r_SIN-return-type"></a>

`DOUBLE PRECISION` 

## 예제
<a name="r_SIN-examples"></a>

`-PI`의 사인을 반환하려면 다음 예제를 사용합니다.

```
SELECT SIN(-PI());

+-------------------------+
|           sin           |
+-------------------------+
| -0.00000000000000012246 |
+-------------------------+
```

# SIGN 함수
<a name="r_SIGN"></a>

 SIGN 함수는 숫자의 부호(양의 부호 또는 음의 부호)를 반환합니다. SIGN 함수의 결과는 인수가 양수이면 `1`, 음수이면 `-1`, `0`이면 `0`이 됩니다.

## 구문
<a name="r_SIGN-synopsis"></a>

```
SIGN(number)
```

## 인수
<a name="r_SIGN-argument"></a>

 *number*   
숫자, 또는 숫자로 평가되는 표현식입니다. `DECIMAL`, `FLOAT8`, 또는 `SUPER` 형식이 될 수 있습니다. 다른 데이터 형식은 암시적 변환 규칙에 따라 Amazon Redshift에 의해 변환될 수 있습니다.

## 반환 타입
<a name="r_SIGN-return-type"></a>

SIGN은 입력 인수와 동일한 숫자 데이터 형식을 반환합니다. 입력이 `DECIMAL`인 경우 출력은 `DECIMAL(1,0)`입니다.

입력이 `SUPER` 형식이면 출력은 입력과 동일한 동적 형식을 유지하는 반면 정적 형식은 `SUPER` 형식을 유지합니다. `SUPER`의 동적 형식이 숫자가 아니면 Amazon Redshift는 `NULL`을 반환합니다.

## 예제
<a name="r_SIGN-examples"></a>

다음 예제에서는 입력이 `DOUBLE PRECISION`이므로 테이블 t2의 열 `d`의 형식이 `DOUBLE PRECISION`이고 입력이 `NUMERIC`이므로 테이블 t2의 열 `n`이 출력으로 `NUMERIC(1,0)`임을 보여 줍니다.

```
CREATE TABLE t1(d DOUBLE PRECISION, n NUMERIC(12, 2));
INSERT INTO t1 VALUES (4.25, 4.25), (-4.25, -4.25);
CREATE TABLE t2 AS SELECT SIGN(d) AS d, SIGN(n) AS n FROM t1;
SELECT table_name, column_name, data_type FROM SVV_REDSHIFT_COLUMNS WHERE table_name='t1' OR table_name='t2';
 
+------------+-------------+-----------------------+
| table_name | column_name |       data_type       |
+------------+-------------+-----------------------+
| t1         | d           | double precision      |
| t1         | n           | numeric(12,2)         |
| t2         | d           | double precision      |
| t2         | n           | numeric(1,0)          |
| t1         | col1        | character varying(20) |
+------------+-------------+-----------------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

판매 테이블에서 주어진 거래에 대해 지급된 수수료의 부호를 확인하려면 다음 예제를 사용합니다.

```
SELECT commission, SIGN(commission)
FROM sales WHERE salesid=10000;

+------------+------+
| commission | sign |
+------------+------+
|      28.05 |    1 |
+------------+------+
```

# SQRT 함수
<a name="r_SQRT"></a>

 SQRT 함수는 `NUMERIC` 값의 제곱근을 반환합니다. 한 숫자에 동일한 숫자를 곱하면 지정된 값을 얻을 경우 해당 숫자를 제곱근이라고 합니다.

## 구문
<a name="r_SQRT-synopsis"></a>

```
SQRT(expression)
```

## 인수
<a name="r_SQRT-argument"></a>

 *expression*   
표현식에는 `INTEGER`, `DECIMAL` 또는 `FLOAT` 데이터 형식 또는 이러한 데이터 형식으로 암시적으로 변환되는 데이터 형식이 있어야 합니다. 표현식에는 함수가 포함될 수 있습니다. **표현식에는 함수가 포함될 수 있습니다.

## 반환 타입
<a name="r_SQRT-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_SQRT-examples"></a>

16의 제곱근을 반환하려면 다음 예제를 사용합니다.

```
SELECT SQRT(16);
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

암시적 형식 변환을 사용하여 문자열 `16`의 제곱근을 반환하려면 다음 예제를 사용합니다.

```
SELECT SQRT('16');
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

ROUND 함수를 사용한 후 16.4의 제곱근을 반환하려면 다음 예제를 사용합니다.

```
SELECT SQRT(ROUND(16.4));
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

원의 넓이가 주어졌을 때 반지름의 길이를 반환하려면 다음 예제를 사용합니다. 예를 들어 면적을 제곱 인치로 지정하면, 반지름을 인치 단위로 계산합니다. 샘플에서 면적은 20입니다.

```
SELECT SQRT(20/PI()) AS radius;
               
+--------------------+
|      radius        |
+--------------------+
| 2.5231325220201604 |
+--------------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

SALES 테이블에서 COMMISSION 값의 제곱근을 반환하려면 다음 예제를 사용합니다. COMMISSION 열은 `DECIMAL` 열입니다. 이 예에서는 복잡한 조건부 논리가 있는 쿼리에서 함수를 사용하는 방법을 보여줍니다.

```
SELECT SQRT(commission)
FROM sales WHERE salesid < 10 ORDER BY salesid;

+--------------------+
|        sqrt        |
+--------------------+
| 10.449880382090505 |
| 3.3763886032268267 |
|  7.245688373094719 |
|  5.123475382979799 |
|  4.806245936279167 |
|  7.687652437513028 |
| 10.871982339941507 |
| 5.4359911699707535 |
|   9.41541289588513 |
+--------------------+
```

동일한 COMMISSION 값 집합에 대해 반올림된 제곱근을 반환하려면 다음 예제를 사용합니다.

```
SELECT ROUND(SQRT(commission))
FROM sales WHERE salesid < 10 ORDER BY salesid;

+-------+
| round |
+-------+
|    10 |
|     3 |
|     7 |
|     5 |
|     5 |
|     8 |
|    11 |
|     5 |
|     9 |
+-------+
```

# TAN 함수
<a name="r_TAN"></a>

TAN은 숫자의 탄젠트를 반환하는 삼각 함수입니다. 입력 인수는 숫자(라디안 단위)입니다.

## 구문
<a name="r_TAN-synopsis"></a>

```
TAN(number)
```

## 인수
<a name="r_TAN-argument"></a>

 *number*   
`DOUBLE PRECISION` 수입니다.

## 반환 타입
<a name="r_TAN-return-type"></a>

`DOUBLE PRECISION`

## 예제
<a name="r_TAN-examples"></a>

0의 탄젠트를 반환하려면 다음 예제를 사용합니다.

```
SELECT TAN(0);

+-----+
| tan |
+-----+
|   0 |
+-----+
```

# TRUNC 함수
<a name="r_TRUNC"></a>

TRUNC 함수는 숫자를 이전 정수 또는 소수로 자릅니다.

TRUNC 함수는 옵션으로 두 번째 인수를 추가할 수 있습니다. 이 두 번째 인수는 어느 방향이든 반올림할 소수 자릿수를 나타내는 `INTEGER`입니다. 두 번째 인수를 제공하지 않으면 함수는 가장 가까운 정수로 반올림됩니다. 두 번째 인수 **integer거 지정되면 함수는 전체 자릿수의 소수 자릿수가 integer**인 가장 가까운 숫자로 반올림됩니다.

 이 함수는 `TIMESTAMP`를 절사하고 `DATE`를 반환할 수도 있습니다. 자세한 내용은 [TRUNC 함수](r_TRUNC_date.md) 섹션을 참조하세요.

## 구문
<a name="r_TRUNC-synopsis"></a>

```
TRUNC(number [ , integer ])
```

## 인수
<a name="r_TRUNC-arguments"></a>

 *number*   
숫자 또는 숫자로 평가되는 표현식입니다. `DECIMAL`, `FLOAT8` 또는 `SUPER` 형식이 될 수 있습니다. 다른 데이터 형식은 암시적 변환 규칙에 따라 Amazon Redshift에 의해 변환될 수 있습니다.

 *(정수*)  
(선택) 어느 방향이든 정밀도의 소수점 자리 수를 나타내는 `INTEGER`입니다. **integer를 지정하지 않으면 숫자가 정수로 잘립니다. **integer를 지정하면 숫자가 지정한 소수점 자리에서 절사됩니다. `SUPER` 데이터 형식에는 지원되지 않습니다.

## 반환 타입
<a name="r_TRUNC-return-type"></a>

TRUNC는 첫 번째 입력 **숫자와 동일한 숫자 데이터 형식을 반환합니다.

입력이 `SUPER` 형식이면 출력은 입력과 동일한 동적 형식을 유지하는 반면 정적 형식은 `SUPER` 형식을 유지합니다. `SUPER`의 동적 형식이 숫자가 아니면 Amazon Redshift는 `NULL`을 반환합니다.

## 예제
<a name="r_TRUNC-examples"></a>

다음 예제 중 일부는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

주어진 판매 거래에 대해 지급된 수수료를 절사하려면 다음 예제를 사용합니다.

```
SELECT commission, TRUNC(commission)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 |   111 |
+------------+-------+
```

동일한 커미션 값을 소수점 첫째 자리에서 절사하려면 다음 예제를 사용합니다.

```
SELECT commission, TRUNC(commission,1)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 | 111.1 |
+------------+-------+
```

두 번째 인수의 음수 값으로 수수료를 절사하려면 다음 예제를 사용합니다. `111.15`는 `110`으로 반올림됩니다.

```
SELECT commission, TRUNC(commission,-1)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 |   110 |
+------------+-------+
```

# 객체 함수
<a name="Object_Functions"></a>

다음은 Amazon Redshift에서 SUPER 유형 객체를 생성하고 조작하기 위해 지원하는 SQL 객체 함수입니다.

**Topics**
+ [GET\$1NUMBER\$1ATTRIBUTES 함수](get_number_attributes.md)
+ [LOWER\$1ATTRIBUTE\$1NAMES 함수](r_lower_attribute_names.md)
+ [OBJECT 함수](r_object_function.md)
+ [OBJECT\$1TRANSFORM 함수](r_object_transform_function.md)
+ [UPPER\$1ATTRIBUTE\$1NAMES 함수](r_upper_attribute_names.md)

# GET\$1NUMBER\$1ATTRIBUTES 함수
<a name="get_number_attributes"></a>

딕셔너리 객체의 루트 수준에 존재하는 키-값 페어 수를 반환합니다.

## 구문
<a name="get_number_attributes-syntax"></a>

```
GET_NUMBER_ATTRIBUTES( super_expression )
```

## 인수
<a name="get_number_attributes-arguments"></a>

 *super\$1expression*   
사전 형식의 SUPER 표현식입니다.

## 반환 타입
<a name="get_number_attributes-return-type"></a>

GET\$1NUMBER\$1ATTRIBUTES 함수는 INT 유형을 반환합니다.

## Note
<a name="get_number_attributes-note"></a>

이 함수는 직접 속성만 계산하며 중첩된 사전 내에 페어를 포함하지 않습니다.

## 예제
<a name="get_number_attributes-example"></a>

다음 예제에서는 GET\$1NUMBER\$1ATTRIBUTES 함수를 보여 줍니다.

```
SELECT GET_NUMBER_ATTRIBUTES(JSON_PARSE('{"a": 1, "b": 2, "c": 3}'));
 get_number_attributes
-----------------------
            3
(1 row)
```

GET\$1NUMBER\$1ATTRIBUTES 함수는 사전의 첫 번째 수준에서만 작동합니다.

```
SELECT GET_NUMBER_ATTRIBUTES(JSON_PARSE('{"a": 1, "b": {"c": 3}}'));
 get_number_attributes
-----------------------
            2
(1 row)
```

# LOWER\$1ATTRIBUTE\$1NAMES 함수
<a name="r_lower_attribute_names"></a>

[LOWER 함수](r_LOWER.md)와 같은 대소문자 변환 루틴을 사용하여 SUPER 값의 모든 해당 속성 이름을 소문자로 변환합니다. LOWER\$1ATTRIBUTE\$1NAMES는 UTF-8 멀티바이트 문자를 지원하여 문자당 최대 4바이트까지 가능합니다.

 SUPER 속성 이름을 대문자로 변환하려면 [UPPER\$1ATTRIBUTE\$1NAMES 함수](r_upper_attribute_names.md)를 사용합니다.

## 구문
<a name="r_lower_attribute_names-synopsis"></a>

```
LOWER_ATTRIBUTE_NAMES( super_expression )
```

## 인수
<a name="r_lower_attribute_names-arguments"></a>

*super\$1expression*  
SUPER 표현식입니다.

## 반환 타입
<a name="r_lower_attribute_names-return-type"></a>

`SUPER`

## 사용 노트
<a name="r_lower_attribute_names-usage-notes"></a>

Amazon Redshift에서 열 식별자는 일반적으로 대소문자를 구분하지 않고 소문자로 변환됩니다. JSON과 같이 대소문자를 구분하는 데이터 형식의 데이터를 수집하는 경우 데이터에 대소문자가 혼합된 속성 이름이 포함될 수 있습니다.

다음 예제를 살펴보세요.

```
CREATE TABLE t1 (s) AS SELECT JSON_PARSE('{"AttributeName": "Value"}');


SELECT s.AttributeName FROM t1;  

attributename
-------------
NULL


SELECT s."AttributeName" FROM t1;

attributename
-------------
NULL
```

Amazon Redshift는 두 쿼리 모두에 대해 NULL을 반환합니다. `AttributeName`을 쿼리하려면 LOWER\$1ATTRIBUTE\$1NAMES를 사용하여 데이터의 속성 이름을 소문자로 변환합니다. 다음 예제를 살펴보세요.

```
CREATE TABLE t2 (s) AS SELECT LOWER_ATTRIBUTE_NAMES(s) FROM t1;


SELECT s.attributename FROM t2;

attributename
-------------
"Value"


SELECT s.AttributeName FROM t2; 

attributename
-------------
"Value"


SELECT s."attributename" FROM t2;

attributename
-------------
"Value"


SELECT s."AttributeName" FROM t2;

attributename
-------------
"Value"
```

대소문자가 혼합된 객체 속성 이름을 사용하기 위한 관련 옵션은 Amazon Redshift가 SUPER 속성 이름의 대소문자를 인식할 수 있도록 하는 `enable_case_sensitive_super_attribute` 구성 옵션입니다. LOWER\$1ATTRIBUTE\$1NAMES 대신 이 옵션을 사용할 수 있습니다. `enable_case_sensitive_super_attribute`에 대한 자세한 내용은 [enable\$1case\$1sensitive\$1super\$1attribute](r_enable_case_sensitive_super_attribute.md) 섹션을 참조하세요.

## 예제
<a name="r_lower_attribute_names_examples"></a>

**SUPER 속성 이름을 소문자로 변환**  
다음 예제에서는 LOWER\$1ATTRIBUTE\$1NAMES를 사용하여 테이블에 있는 모든 SUPER 값의 속성 이름을 변환합니다.

```
-- Create a table and insert several SUPER values.
CREATE TABLE t (i INT, s SUPER);

INSERT INTO t VALUES
  (1, NULL), 
  (2, 'A'::SUPER),
  (3, JSON_PARSE('{"AttributeName": "B"}')),
  (4, JSON_PARSE(
     '[{"Subobject": {"C": "C"},
        "Subarray": [{"D": "D"}, "E"]
      }]'));

-- Convert all attribute names to lowercase.
UPDATE t SET s = LOWER_ATTRIBUTE_NAMES(s);

SELECT i, s FROM t ORDER BY i;

 i |                        s
---+--------------------------------------------------
 1 | NULL
 2 | "A"
 3 | {"attributename":"B"}
 4 | [{"subobject":{"c":"C"},"subarray":[{"d":"D"}, "E"]}]
```

LOWER\$1ATTRIBUTE\$1NAMES가 어떻게 작동하는지 살펴보세요.
+  NULL 값 및 스칼라 SUPER 값(예: `"A"`)은 변경되지 않습니다.
+  SUPER 객체에서는 모든 속성 이름이 소문자로 변경되지만 `"B"`와 같은 속성 값은 변경되지 않습니다.
+  LOWER\$1ATTRIBUTE\$1NAMES는 SUPER 배열 또는 다른 객체 내에 중첩된 모든 SUPER 객체에 재귀적으로 적용됩니다.

**속성 이름이 중복된 SUPER 객체에 LOWER\$1ATTRIBUTE\$1NAMES 사용**  
SUPER 객체에 이름의 대소문자만 다른 속성이 포함되어 있는 경우 LOWER\$1ATTRIBUTE\$1NAMES에서 오류가 발생합니다. 다음 예제를 살펴보세요.

```
SELECT LOWER_ATTRIBUTE_NAMES(JSON_PARSE('{"A": "A", "a": "a"}'));      

error:   Invalid input
code:    8001
context: SUPER value has duplicate attributes after case conversion.
```

# OBJECT 함수
<a name="r_object_function"></a>

SUPER 데이터 형식의 객체를 만듭니다.

## 구문
<a name="r_object_function-synopsis"></a>

```
OBJECT ( [ key1, value1 ], [ key2, value2 ...] )
```

## 인수
<a name="r_object_function-arguments"></a>

*key1, key2*  
VARCHAR 형식 문자열로 평가되는 표현식입니다.

*value1, value2*  
Amazon Redshift는 datetime 형식을 SUPER 데이터 형식으로 캐스팅하지 않으므로 datetime 형식을 제외한 모든 Amazon Redshift 데이터 형식의 표현식입니다. datetime 형식에 대한 자세한 내용은 [날짜/시간 형식](r_Datetime_types.md) 섹션을 참조하세요.  
객체의 `value` 표현식들이 동일한 데이터 형식일 필요는 없습니다.

## 반환 타입
<a name="r_object_function-returns"></a>

`SUPER`

## 예제
<a name="r_object_function_example"></a>

```
-- Creates an empty object.
select object();

object
--------
{}
(1 row)
            
-- Creates objects with different keys and values.
select object('a', 1, 'b', true, 'c', 3.14);

object
---------------------------
{"a":1,"b":true,"c":3.14}
(1 row)
               
select object('a', object('aa', 1), 'b', array(2,3), 'c', json_parse('{}'));
               
object
---------------------------------
{"a":{"aa":1},"b":[2,3],"c":{}}
(1 row)
            
-- Creates objects using columns from a table.
create table bar (k varchar, v super);
insert into bar values ('k1', json_parse('[1]')), ('k2', json_parse('{}'));
select object(k, v) from bar;

object
------------
{"k1":[1]}
{"k2":{}}
(2 rows)
            
-- Errors out because DATE type values can't be converted to SUPER type.
select object('k', '2008-12-31'::date);

ERROR:  OBJECT could not convert type date to super
```

# OBJECT\$1TRANSFORM 함수
<a name="r_object_transform_function"></a>

SUPER 객체를 변환합니다.

## 구문
<a name="r_object_transform_function-synopsis"></a>

```
OBJECT_TRANSFORM(
  input
  [KEEP path1, ...]
  [SET
    path1, value1,
    ...,  ...
  ]
)
```

## 인수
<a name="r_object_transform_function-arguments"></a>

* 입력*:  
SUPER 유형 객체로 해석되는 식입니다.

*KEEP*  
이 절에 지정된 모든 **경로 값이 유지되고 출력 객체로 전달됩니다.  
이 절은 선택 사항입니다.

**path1, **path2, ...  
마침표로 구분되고 큰따옴표로 묶인 경로 구성 요소 형식의 상수 문자열 리터럴입니다. 예를 들어, `'"a"."b"."c"'`는 유효한 경로 값입니다. 이는 KEEP 절과 SET 절의 경로 파라미터에 적용됩니다.

*SET*  
**경로와 **값 쌍을 사용하여 기존 경로를 수정하거나 새 경로를 추가하고 출력 객체에 해당 경로의 값을 설정합니다.  
이 절은 선택 사항입니다.

**value1, **value2, ...  
SUPER 유형 값으로 해석되는 식입니다. 참고로 숫자, 텍스트, 부울 유형은 SUPER로 해석할 수 있습니다.

## 반환 타입
<a name="r_object_transform_function-returns"></a>

`SUPER`

## 사용 노트
<a name="r_object_transform_function-usage-notes"></a>

OBJECT\$1TRANSFORM은 KEEP에 지정된 **입력의 경로 값과 SET에 지정된 **경로 및 **값 쌍을 포함하는 SUPER 유형 객체를 반환합니다.

KEEP과 SET가 모두 비어 있는 경우 OBJECT\$1TRANSFORM은 **입력을 반환합니다.

**입력이 SUPER 유형 **객체가 아닌 경우 OBJECT\$1TRANSFORM은 KEEP 또는 SET 값과 관계없이 **입력을 반환합니다.

## 예제
<a name="r_object_transform_function-example"></a>

다음 예시에서는 SUPER 객체를 다른 SUPER 객체로 변환합니다.

```
CREATE TABLE employees (
    col_person SUPER
);

INSERT INTO employees
VALUES
    (
        json_parse('
            {
                "name": {
                    "first": "John",
                    "last": "Doe"
                },
                "age": 25,
                "ssn": "111-22-3333",
                "company": "Company Inc.",
                "country": "U.S."
            }
        ')
    ),
    (
        json_parse('
            {
                "name": {
                    "first": "Jane",
                    "last": "Appleseed"
                },
                "age": 34,
                "ssn": "444-55-7777",
                "company": "Organization Org.",
                "country": "Ukraine"
            }
        ')
    )
;

SELECT
    OBJECT_TRANSFORM(
        col_person
        KEEP
            '"name"."first"',
            '"age"',
            '"company"',
            '"country"'
        SET
            '"name"."first"', UPPER(col_person.name.first::TEXT),
            '"age"', col_person.age + 5,
            '"company"', 'Amazon'
    ) AS col_person_transformed
FROM employees;
    
--This result is formatted for ease of reading.
                  col_person_transformed
-------------------------------------------------------------
{
    "name": {
        "first": "JOHN"
    },
    "age": 30,
    "company": "Amazon",
    "country": "U.S."
}
{
    "name": {
        "first": "JANE"
    },
    "age": 39,
    "company": "Amazon",
    "country": "Ukraine"
}
```

# UPPER\$1ATTRIBUTE\$1NAMES 함수
<a name="r_upper_attribute_names"></a>

[UPPER 함수](r_UPPER.md)와 같은 대소문자 변환 루틴을 사용하여 SUPER 값의 모든 해당 속성 이름을 대문자로 변환합니다. UPPER\$1ATTRIBUTE\$1NAMES는 UTF-8 멀티바이트 문자를 지원하여 문자당 최대 4바이트까지 가능합니다.

 SUPER 속성 이름을 소문자로 변환하려면 [LOWER\$1ATTRIBUTE\$1NAMES 함수](r_lower_attribute_names.md)를 사용합니다.

## 구문
<a name="r_upper_attribute_names-synopsis"></a>

```
UPPER_ATTRIBUTE_NAMES( super_expression )
```

## 인수
<a name="r_upper_attribute_names-arguments"></a>

*super\$1expression*  
SUPER 표현식입니다.

## 반환 타입
<a name="r_upper_attribute_names-return-type"></a>

`SUPER`

## 예제
<a name="r_upper_attribute_names_examples"></a>

**SUPER 속성 이름을 대문자로 변환**  
다음 예제에서는 UPPER\$1ATTRIBUTE\$1NAMES를 사용하여 테이블에 있는 모든 SUPER 값의 속성 이름을 변환합니다.

```
-- Create a table and insert several SUPER values.
CREATE TABLE t (i INT, s SUPER);

INSERT INTO t VALUES
  (1, NULL), 
  (2, 'a'::SUPER),
  (3, JSON_PARSE('{"AttributeName": "b"}')),
  (4, JSON_PARSE(
     '[{"Subobject": {"c": "c"},
        "Subarray": [{"d": "d"}, "e"]
      }]'));

-- Convert all attribute names to uppercase.
UPDATE t SET s = UPPER_ATTRIBUTE_NAMES(s);

SELECT i, s FROM t ORDER BY i;

 i |                        s
---+--------------------------------------------------
 1 | NULL
 2 | "a"
 3 | {"ATTRIBUTENAME":"B"}
 4 | [{"SUBOBJECT":{"C":"c"},"SUBARRAY":[{"D":"d"}, "e"]}]
```

UPPER\$1ATTRIBUTE\$1NAMES가 어떻게 작동하는지 살펴보세요.
+  NULL 값 및 스칼라 SUPER 값(예: `"a"`)은 변경되지 않습니다.
+  SUPER 객체에서는 모든 속성 이름이 대문자로 변경되지만 `"b"`와 같은 속성 값은 변경되지 않습니다.
+  UPPER\$1ATTRIBUTE\$1NAMES는 SUPER 배열 또는 다른 객체 내에 중첩된 모든 SUPER 객체에 재귀적으로 적용됩니다.

**속성 이름이 중복된 SUPER 객체에 UPPER\$1ATTRIBUTE\$1NAMES 사용**  
SUPER 객체에 이름의 대소문자만 다른 속성이 포함되어 있는 경우 UPPER\$1ATTRIBUTE\$1NAMES에서 오류가 발생합니다. 다음 예제를 살펴보세요.

```
SELECT UPPER_ATTRIBUTE_NAMES(JSON_PARSE('{"A": "A", "a": "a"}'));      

error:   Invalid input
code:    8001
context: SUPER value has duplicate attributes after case conversion.
```

# 공간 함수
<a name="geospatial-functions"></a>

지오메트리 객체 간의 관계는 DE-9IM(Dimensionally Extended 9-Intersection Model)을 기반으로 합니다. 이 모델은 같음, 포함, 덮임과 같은 조건자를 정의합니다. 공간 관계 정의에 대한 자세한 내용은 Wikipedia의 [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM)을 참조하십시오.

Amazon Redshift에서 공간 데이터를 사용하는 방법에 대한 자세한 내용은 [Amazon Redshift에서 공간 데이터 쿼리](geospatial-overview.md) 단원을 참조하세요.

Amazon Redshift는 `GEOMETRY` 및 `GEOGRAPHY` 데이터 유형과 함께 작동하는 공간 함수를 제공합니다. 다음은 `GEOGRAPHY` 데이터 유형을 지원하는 함수 목록입니다.
+ [ST\$1Area](ST_Area-function.md)
+ [ST\$1AsEWKT](ST_AsEWKT-function.md)
+ [ST\$1AsGeoJSON](ST_AsGeoJSON-function.md)
+ [ST\$1AsHexEWKB](ST_AsHexEWKB-function.md)
+ [ST\$1AsHexWKB](ST_AsHexWKB-function.md)
+ [ST\$1AsText](ST_AsText-function.md)
+ [ST\$1Distance](ST_Distance-function.md)
+ [ST\$1GeogFromText](ST_GeogFromText-function.md)
+ [ST\$1GeogFromWKB](ST_GeogFromWKB-function.md)
+ [ST\$1Length](ST_Length-function.md)
+ [ST\$1NPoints](ST_NPoints-function.md)
+ [ST\$1Perimeter](ST_Perimeter-function.md)

다음은 Amazon Redshift에서 지원하는 전체 공간 함수 집합 목록입니다.

**Topics**
+ [AddBBox](AddBBox-function.md)
+ [DropBBox](DropBBox-function.md)
+ [GeometryType](GeometryType-function.md)
+ [H3\$1Boundary](H3_Boundary-function.md)
+ [H3\$1Center](H3_Center-function.md)
+ [H3\$1FromLongLat](H3_FromLongLat-function.md)
+ [H3\$1FromPoint](H3_FromPoint-function.md)
+ [H3\$1IsValid](H3_IsValid-function.md)
+ [H3\$1Polyfill](H3_Polyfill-function.md)
+ [H3\$1Resolution](H3_Resolution-function.md)
+ [H3\$1ToChildren](H3_ToChildren-function.md)
+ [H3\$1ToParent](H3_ToParent-function.md)
+ [ST\$1AddPoint](ST_AddPoint-function.md)
+ [ST\$1Angle](ST_Angle-function.md)
+ [ST\$1Area](ST_Area-function.md)
+ [ST\$1AsBinary](ST_AsBinary-function.md)
+ [ST\$1AsEWKB](ST_AsEWKB-function.md)
+ [ST\$1AsEWKT](ST_AsEWKT-function.md)
+ [ST\$1AsGeoJSON](ST_AsGeoJSON-function.md)
+ [ST\$1AsHexWKB](ST_AsHexWKB-function.md)
+ [ST\$1AsHexEWKB](ST_AsHexEWKB-function.md)
+ [ST\$1AsText](ST_AsText-function.md)
+ [ST\$1Azimuth](ST_Azimuth-function.md)
+ [ST\$1Boundary](ST_Boundary-function.md)
+ [ST\$1Buffer](ST_Buffer-function.md)
+ [ST\$1Centroid](ST_Centroid-function.md)
+ [ST\$1Collect](ST_Collect-function.md)
+ [ST\$1Contains](ST_Contains-function.md)
+ [ST\$1ContainsProperly](ST_ContainsProperly-function.md)
+ [ST\$1ConvexHull](ST_ConvexHull-function.md)
+ [ST\$1CoveredBy](ST_CoveredBy-function.md)
+ [ST\$1Covers](ST_Covers-function.md)
+ [ST\$1Crosses](ST_Crosses-function.md)
+ [ST\$1Dimension](ST_Dimension-function.md)
+ [ST\$1Disjoint](ST_Disjoint-function.md)
+ [ST\$1Distance](ST_Distance-function.md)
+ [ST\$1DistanceSphere](ST_DistanceSphere-function.md)
+ [ST\$1DWithin](ST_DWithin-function.md)
+ [ST\$1EndPoint](ST_EndPoint-function.md)
+ [ST\$1Envelope](ST_Envelope-function.md)
+ [ST\$1Equals](ST_Equals-function.md)
+ [ST\$1ExteriorRing](ST_ExteriorRing-function.md)
+ [ST\$1Force2D](ST_Force2D-function.md)
+ [ST\$1Force3D](ST_Force3D-function.md)
+ [ST\$1Force3DM](ST_Force3DM-function.md)
+ [ST\$1Force3DZ](ST_Force3DZ-function.md)
+ [ST\$1Force4D](ST_Force4D-function.md)
+ [ST\$1GeoHash](ST_GeoHash-function.md)
+ [ST\$1GeogFromText](ST_GeogFromText-function.md)
+ [ST\$1GeogFromWKB](ST_GeogFromWKB-function.md)
+ [ST\$1GeometryN](ST_GeometryN-function.md)
+ [ST\$1GeometryType](ST_GeometryType-function.md)
+ [ST\$1GeomFromEWKB](ST_GeomFromEWKB-function.md)
+ [ST\$1GeomFromEWKT](ST_GeomFromEWKT-function.md)
+ [ST\$1GeomFromGeoHash](ST_GeomFromGeoHash-function.md)
+ [ST\$1GeomFromGeoJSON](ST_GeomFromGeoJSON-function.md)
+ [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md)
+ [ST\$1GeomFromText](ST_GeomFromText-function.md)
+ [ST\$1GeomFromWKB](ST_GeomFromWKB-function.md)
+ [ST\$1GeoSquare](ST_GeoSquare-function.md)
+ [ST\$1InteriorRingN](ST_InteriorRingN-function.md)
+ [ST\$1Intersects](ST_Intersects-function.md)
+ [ST\$1Intersection](ST_Intersection-function.md)
+ [ST\$1IsPolygonCCW](ST_IsPolygonCCW-function.md)
+ [ST\$1IsPolygonCW](ST_IsPolygonCW-function.md)
+ [ST\$1IsClosed](ST_IsClosed-function.md)
+ [ST\$1IsCollection](ST_IsCollection-function.md)
+ [ST\$1IsEmpty](ST_IsEmpty-function.md)
+ [ST\$1IsRing](ST_IsRing-function.md)
+ [ST\$1IsSimple](ST_IsSimple-function.md)
+ [ST\$1IsValid](ST_IsValid-function.md)
+ [ST\$1Length](ST_Length-function.md)
+ [ST\$1LengthSphere](ST_LengthSphere-function.md)
+ [ST\$1Length2D](ST_Length2D-function.md)
+ [ST\$1LineFromMultiPoint](ST_LineFromMultiPoint-function.md)
+ [ST\$1LineInterpolatePoint](ST_LineInterpolatePoint-function.md)
+ [ST\$1M](ST_M-function.md)
+ [ST\$1MakeEnvelope](ST_MakeEnvelope-function.md)
+ [ST\$1MakeLine](ST_MakeLine-function.md)
+ [ST\$1MakePoint](ST_MakePoint-function.md)
+ [ST\$1MakePolygon](ST_MakePolygon-function.md)
+ [ST\$1MemSize](ST_MemSize-function.md)
+ [ST\$1MMax](ST_MMax-function.md)
+ [ST\$1MMin](ST_MMin-function.md)
+ [ST\$1Multi](ST_Multi-function.md)
+ [ST\$1NDims](ST_NDims-function.md)
+ [ST\$1NPoints](ST_NPoints-function.md)
+ [ST\$1NRings](ST_NRings-function.md)
+ [ST\$1NumGeometries](ST_NumGeometries-function.md)
+ [ST\$1NumInteriorRings](ST_NumInteriorRings-function.md)
+ [ST\$1NumPoints](ST_NumPoints-function.md)
+ [ST\$1Perimeter](ST_Perimeter-function.md)
+ [ST\$1Perimeter2D](ST_Perimeter2D-function.md)
+ [ST\$1Point](ST_Point-function.md)
+ [ST\$1PointN](ST_PointN-function.md)
+ [ST\$1Points](ST_Points-function.md)
+ [ST\$1Polygon](ST_Polygon-function.md)
+ [ST\$1RemovePoint](ST_RemovePoint-function.md)
+ [ST\$1Reverse](ST_Reverse-function.md)
+ [ST\$1SetPoint](ST_SetPoint-function.md)
+ [ST\$1SetSRID](ST_SetSRID-function.md)
+ [ST\$1Simplify](ST_Simplify-function.md)
+ [ST\$1SRID](ST_SRID-function.md)
+ [ST\$1StartPoint](ST_StartPoint-function.md)
+ [ST\$1Touches](ST_Touches-function.md)
+ [ST\$1Transform](ST_Transform-function.md)
+ [ST\$1Union](ST_Union-function.md)
+ [ST\$1Within](ST_Within-function.md)
+ [ST\$1X](ST_X-function.md)
+ [ST\$1XMax](ST_XMax-function.md)
+ [ST\$1XMin](ST_XMin-function.md)
+ [ST\$1Y](ST_Y-function.md)
+ [ST\$1YMax](ST_YMax-function.md)
+ [ST\$1YMin](ST_YMin-function.md)
+ [ST\$1Z](ST_Z-function.md)
+ [ST\$1ZMax](ST_ZMax-function.md)
+ [ST\$1ZMin](ST_ZMin-function.md)
+ [SupportsBBox](SupportsBBox-function.md)

# AddBBox
<a name="AddBBox-function"></a>

AddBBox는 미리 계산된 경계 상자로 인코딩을 지원하는 입력 지오메트리의 복사본을 반환합니다. 경계 상자 지원에 대한 자세한 내용은 [경계 상자](spatial-terminology.md#spatial-terminology-bounding-box) 섹션을 참조하세요.

## 구문
<a name="AddBBox-function-syntax"></a>

```
AddBBox(geom)
```

## 인수
<a name="AddBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="AddBBox-function-return"></a>

`GEOMETRY`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="AddBBox-function-examples"></a>

다음 SQL은 경계 상자로 인코딩되는 것을 지원하는 입력 다각형 지오메트리의 복사본을 반환합니다.

```
SELECT ST_AsText(AddBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
 st_astext
----------
 POLYGON((0 0,1 0,0 1,0 0))
```

# DropBBox
<a name="DropBBox-function"></a>

DropBBox는 미리 계산된 경계 상자로 인코딩을 지원하지 않는 입력 지오메트리의 복사본을 반환합니다. 경계 상자 지원에 대한 자세한 내용은 [경계 상자](spatial-terminology.md#spatial-terminology-bounding-box) 섹션을 참조하세요.

## 구문
<a name="DropBBox-function-syntax"></a>

```
DropBBox(geom)
```

## 인수
<a name="DropBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="DropBBox-function-return"></a>

`GEOMETRY`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="DropBBox-function-examples"></a>

다음 SQL은 경계 상자로 인코딩되는 것을 지원하지 않는 입력 다각형 지오메트리의 복사본을 반환합니다.

```
SELECT ST_AsText(DropBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
 st_astext
----------
 POLYGON((0 0,1 0,0 1,0 0))
```

# GeometryType
<a name="GeometryType-function"></a>

GeometryType은 입력 지오메트리의 하위 유형을 문자열로 반환합니다.

## 구문
<a name="GeometryType-function-syntax"></a>

```
GeometryType(geom)
```

## 인수
<a name="GeometryType-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="GeometryType-function-return"></a>

*geom*의 하위 유형을 나타내는 `VARCHAR`입니다.

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 2D, 3DZ, 4D 지오메트리에 대해 반환된 문자열 값 | 3DM 지오메트리에 대해 반환된 문자열 값 | 지오메트리 하위 유형 | 
| --- | --- | --- | 
| `POINT` | `POINTM` | *geom*이 `POINT` 하위 유형인 경우 반환됩니다. | 
| `LINESTRING` | `LINESTRINGM` | *geom*이 `LINESTRING` 하위 유형인 경우 반환됩니다. | 
| `POLYGON` | `POLYGONM` | *geom*이 `POLYGON` 하위 유형인 경우 반환됩니다. | 
| `MULTIPOINT` | `MULTIPOINTM` | *geom*이 `MULTIPOINT` 하위 유형인 경우 반환됩니다. | 
| `MULTILINESTRING` | `MULTILINESTRINGM` | *geom*이 `MULTILINESTRING` 하위 유형인 경우 반환됩니다. | 
| `MULTIPOLYGON` | `MULTIPOLYGONM` | *geom*이 `MULTIPOLYGON` 하위 유형인 경우 반환됩니다. | 
| `GEOMETRYCOLLECTION` | `GEOMETRYCOLLECTIONM` | *geom*이 `GEOMETRYCOLLECTION` 하위 유형인 경우 반환됩니다. | 

## 예제
<a name="GeometryType-function-examples"></a>

다음 SQL은 다각형의 WKT(Well-Known Text) 표현을 변환하고 `GEOMETRY` 하위 유형을 문자열로 반환합니다.

```
SELECT GeometryType(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
geometrytype
-------------
 POLYGON
```

# H3\$1Boundary
<a name="H3_Boundary-function"></a>

H3\$1Boundary는 입력 인덱스에서 H3 셀 ID의 경계를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_Boundary-function-syntax"></a>

```
H3_Boundary(index)
```

## 인수
<a name="H3_Boundary-function-arguments"></a>

 * 인덱스*   
H3 셀의 인덱스를 나타내는 데이터 유형 `BIGINT` 또는 `VARCHAR`의 값입니다. 또는 이러한 데이터 유형 중 하나로 평가되는 표현식입니다.

## 반환 타입
<a name="H3_Boundary-function-return"></a>

`POLYGON` - 공간 참조 시스템 식별자(SRID)가 `0`인 다각형을 나타냅니다.

*index*가 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="H3_Boundary-function-examples"></a>

다음 SQL은 H3 셀의 인덱스를 나타내는 `VARCHAR`를 입력하고, 입력 H3 셀의 경계를 나타내는 SRID가 0인 POLYGON을 반환합니다. H3\$1Boundary의 출력은 ST\$1AwEWKT에 입력되어 EWKT(Extended Well-Known Text) 표현으로 표시됩니다.

```
SELECT ST_AsEWKT(H3_Boundary('8025fffffffffff'));
```

```
 st_asewkt
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POLYGON((87.7729641223953 52.6542030078627,86.7082098104731 40.3127667561966,98.2285042557705 33.6210697806835,110.694610548823 37.163896485796,116.212895637138 47.3094513028131,106.40349563788 56.210610737585,87.7729641223953 52.6542030078627))
```

다음 SQL은 H3 셀의 인덱스를 나타내는 `BIGINT`를 입력하고, 입력 H3 셀의 경계를 나타내는 SRID가 0인 POLYGON을 반환합니다. H3\$1Boundary의 출력은 ST\$1AwEWKT에 입력되어 EWKT(Extended Well-Known Text) 표현으로 표시됩니다.

```
SELECT ST_AsEWKT(H3_Boundary(577129255373111295)); 
```

```
 st_asewkt
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((87.7729641223953 52.6542030078627,86.7082098104731 40.3127667561966,98.2285042557705 33.6210697806835,110.694610548823 37.163896485796,116.212895637138 47.3094513028131,106.40349563788 56.210610737585,87.7729641223953 52.6542030078627))
```

# H3\$1Center
<a name="H3_Center-function"></a>

H3\$1Center는 입력 인덱스에서 H3 셀 ID의 중심을 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_Center-function-syntax"></a>

```
H3_Center(index)
```

## 인수
<a name="H3_Center-function-arguments"></a>

 * 인덱스*   
H3 셀의 인덱스를 나타내는 데이터 유형 `BIGINT` 또는 `VARCHAR`의 값입니다. 또는 이러한 데이터 유형 중 하나로 평가되는 표현식입니다.

## 반환 타입
<a name="H3_Center-function-return"></a>

`POINT` - 공간 참조 시스템 식별자(SRID)가 `0`인 H3 셀의 중심을 나타냅니다.

*index*가 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="H3_Center-function-examples"></a>

다음 SQL은 H3 셀의 인덱스를 나타내는 `VARCHAR`를 입력하고, 입력 H3 셀의 중심을 나타내는 SRID가 0인 POINT를 반환합니다.

```
SELECT H3_Center('8025fffffffffff');
```

```
 h3_center
--------------------------------------------
 010100000070707A550B605940AEE9D70B327E4640
```

다음 SQL은 H3 셀의 인덱스를 나타내는 `BIGINT`를 입력하고, 입력 H3 셀의 중심을 나타내는 SRID가 0인 POINT를 반환합니다.

```
SELECT H3_Center(577129255373111295);
```

```
 h3_center
--------------------------------------------
 010100000070707A550B605940AEE9D70B327E4640
```

다음 SQL은 H3 셀의 인덱스를 나타내는 `VARCHAR`를 입력하고, 입력 H3 셀의 중심을 나타내는 SRID가 0인 POINT를 반환합니다. H3\$1Center의 출력은 ST\$1AwEWKT에 입력되어 EWKT(Extended Well-Known Text) 표현으로 표시됩니다.

```
SELECT ST_AsEWKT(H3_Center('8075fffffffffff'));
```

```
 st_asewkt
-----------------------------------------
POINT(-5.24539029677733 2.30088211162675)
```

# H3\$1FromLongLat
<a name="H3_FromLongLat-function"></a>

H3\$1FromLonglat은 입력된 경도, 위도 및 해상도에 따라 해당하는 H3 셀 ID를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_FromLongLat-function-syntax"></a>

```
H3_FromLongLat(longitude, latitude, resolution)
```

## 인수
<a name="H3_FromLongLat-function-arguments"></a>

 *longitude*: , ,   
`DOUBLE PRECISION` 데이터 형식의 값 또는 `DOUBLE PRECISION` 형식으로 계산되는 표현식입니다.

 *latitude*: ,   
`DOUBLE PRECISION` 데이터 형식의 값 또는 `DOUBLE PRECISION` 형식으로 계산되는 표현식입니다.

 *resolution*   
`INTEGER` 데이터 유형의 값 또는 `INTEGER` 유형으로 계산되는 식입니다. 값은 H3 그리드 시스템의 해상도를 나타냅니다. 값은 0에서 15까지의 정수여야 합니다. `0`이 가장 거칠고 `15`가 가장 정교합니다.

## 반환 타입
<a name="H3_FromLongLat-function-return"></a>

`BIGINT` - H3 셀 ID를 나타냅니다.

**해상도가 범위를 벗어나면 오류가 반환됩니다.

## 예제
<a name="H3_FromLongLat-function-examples"></a>

다음 SQL은 경도 `0`, 위도 `0` 및 해상도 `10`에 대한 H3 셀 ID를 반환합니다.

```
SELECT H3_FromLongLat(0, 0, 10);
```

```
 h3_fromlonglat
-------------------
 623560421467684863
```

# H3\$1FromPoint
<a name="H3_FromPoint-function"></a>

H3\$1FromPoint는 입력된 지오메트리 포인트 및 해상도에 따라 해당하는 H3 셀 ID를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_FromPoint-function-syntax"></a>

```
H3_FromPoint(geom, resolution)
```

## 인수
<a name="H3_FromPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. **geom은 `POINT`여야 합니다.

 *resolution*   
`INTEGER` 데이터 유형의 값 또는 `INTEGER` 유형으로 계산되는 식입니다. 값은 H3 그리드 시스템의 해상도를 나타냅니다. 값은 0에서 15까지의 정수여야 합니다. `0`이 가장 거칠고 `15`가 가장 정교합니다.

## 반환 타입
<a name="H3_FromPoint-function-return"></a>

`BIGINT` - H3 셀 ID를 나타냅니다.

*geom*이 `POINT`이 아니면 오류가 반환됩니다.

**해상도가 범위를 벗어나면 오류가 반환됩니다.

**geom이 비어 있으면 NULL이 반환됩니다.

## 예제
<a name="H3_FromPoint-function-examples"></a>

다음 SQL은 포인트 `0,0` 및 해상도 `10`에 대한 H3 셀 ID를 반환합니다.

```
SELECT H3_FromPoint(ST_GeomFromText('POINT(0 0)'), 10);
```

```
 h3_frompoint
-------------------
 623560421467684863
```

# H3\$1IsValid
<a name="H3_IsValid-function"></a>

H3\$1IsValid는 입력이 H3 셀 ID를 나타내는 경우 true를 반환하고 그렇지 않으면 false를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_IsValid-function-syntax"></a>

```
H3_IsValid(index)
```

## 인수
<a name="H3_IsValid-function-arguments"></a>

 * 인덱스*   
`BIGINT` 또는 `VARCHAR` 데이터 유형의 값이나 이러한 데이터 유형으로 평가되는 표현식입니다.

## 반환 타입
<a name="H3_IsValid-function-return"></a>

`BOOLEAN` – 입력이 유효한 H3 셀 ID를 나타내는 경우 true이고 그렇지 않으면 false입니다.

*index*가 NULL이면 NULL이 반환됩니다.

## 예제
<a name="H3_IsValid-function-examples"></a>

다음 SQL은 H3 셀 ID를 나타내는 VARCHAR를 입력하고 true를 반환합니다.

```
SELECT H3_IsValid('8025fffffffffff');
```

```
 h3_isvalid
------------
 true
```

다음 SQL은 H3 셀 ID를 나타내는 BIGINT를 입력하고 true를 반환합니다.

```
SELECT H3_IsValid(577129255373111295);
```

```
 h3_isvalid
------------
 true
```

다음 SQL은 잘못된 H3 셀 ID를 입력하고 false를 반환합니다.

```
SELECT H3_IsValid('');
```

```
 h3_isvalid
------------
 false
```

# H3\$1Polyfill
<a name="H3_Polyfill-function"></a>

H3\$1Polyfill은 주어진 해상도의 입력 다각형에 포함된 육각형 및 오각형에 해당하는 H3 셀 ID를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_Polyfill-function-syntax"></a>

```
H3_Polyfill(geom, resolution)
```

## 인수
<a name="H3_Polyfill-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. **geom은 `POLYGON`여야 합니다.

 *resolution*   
`INTEGER` 데이터 유형의 값 또는 `INTEGER` 유형으로 계산되는 식입니다. 값은 H3 그리드 시스템의 해상도를 나타냅니다. 값은 0에서 15까지의 정수여야 합니다. `0`이 가장 거칠고 `15`가 가장 정교합니다.

## 반환 타입
<a name="H3_Polyfill-function-return"></a>

`SUPER` - H3 셀 ID 목록을 나타냅니다.

*geom*이 `POLYGON`이 아니면 오류가 반환됩니다.

**해상도가 범위를 벗어나면 오류가 반환됩니다.

**geom이 비어 있으면 NULL이 반환됩니다.

## 예제
<a name="H3_Polyfill-function-examples"></a>

다음 SQL은 다각형과 해상도 `4`에 대해 H3 셀 ID로 구성된 SUPER 데이터 유형 배열을 반환합니다.

```
SELECT H3_Polyfill(ST_GeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))'), 4);
```

```
 h3_polyfill
----------------------------------------------------------------------------------------------------------------------------------------------------------
 [596538848238895103,596538805289222143,596538856828829695,596538813879156735,596537920525959167,596538685030137855,596538693620072447,596538839648960511]
```

# H3\$1Resolution
<a name="H3_Resolution-function"></a>

H3\$1Resolution은 입력 인덱스에서 H3 셀 ID의 해상도를 반환합니다. 해상도는 0(가장 낮음)에서 15(가장 높음) 사이의 정수입니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_Resolution-function-syntax"></a>

```
H3_Resolution(index)
```

## 인수
<a name="H3_Resolution-function-arguments"></a>

 * 인덱스*   
H3 셀의 인덱스를 나타내는 `BIGINT` 또는 `VARCHAR` 데이터 유형의 값이나 이러한 데이터 유형으로 평가되는 표현식입니다.

## 반환 타입
<a name="H3_Resolution-function-return"></a>

`INTEGER` - 입력 H3 셀 ID의 해상도를 나타냅니다.

*index*가 NULL이면 NULL이 반환됩니다.

*index*가 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="H3_Resolution-function-examples"></a>

다음 SQL은 H3 셀의 인덱스를 나타내는 VARCHAR를 입력하고, 입력 H3 셀의 해상도를 나타내는 INTEGER를 반환합니다.

```
SELECT H3_Resolution('8025fffffffffff');
```

```
 h3_resolution
---------------
 0
```

다음 SQL은 H3 셀의 인덱스를 나타내는 VARCHAR를 입력하고, 입력 H3 셀의 해상도를 나타내는 BIGINT를 반환합니다.

```
SELECT H3_Resolution(614553222213795839);
```

```
 h3_resolution
---------------
 8
```

# H3\$1ToChildren
<a name="H3_ToChildren-function"></a>

H3\$1ToChildren은 주어진 H3 인덱스에 대해 지정된 해상도로 하위 H3 셀 ID 목록을 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_ToChildren-function-syntax"></a>

```
H3_ToChildren(index, resolution)
```

## 인수
<a name="H3_ToChildren-function-arguments"></a>

 * 인덱스*   
H3 셀의 인덱스를 나타내는 `BIGINT` 또는 `VARCHAR` 데이터 유형의 값이나 이러한 데이터 유형으로 평가되는 표현식입니다.

 *resolution*   
`INTEGER` 데이터 유형의 값 또는 `INTEGER` 유형으로 계산되는 식입니다. 값은 하위 셀 ID의 해상도를 나타냅니다. 값은 입력 *인덱스*의 해상도와 15 사이의 정수여야 합니다.

## 반환 타입
<a name="H3_ToChildren-function-return"></a>

`SUPER` - H3 셀 ID 목록을 나타냅니다.

*인덱스* 또는 *해상도*가 NULL이면 NULL이 반환됩니다.

*index*가 유효하지 않으면 오류가 반환됩니다.

*인덱스*의 해상도와 15 사이의 *해상도*가 아닌 경우 오류가 반환됩니다.

출력 크기가 최대 SUPER 크기 제한을 초과하면 오류가 반환됩니다.

## 예제
<a name="H3_ToChildren-function-examples"></a>

다음 SQL은 H3 셀의 인덱스를 나타내는 VARCHAR와 모든 하위 요소의 원하는 해상도를 나타내는 INTEGER를 입력하고 해상도 6에서 하위 요소가 포함된 SUPER 배열을 반환합니다.

```
SELECT H3_ToChildren('85283473fffffff', 6);
```

```
 h3_tochildren                                                
--------------------------------------------------------------------------------------------------------------------------------------
 [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]
```

다음 SQL은 H3 셀의 인덱스를 나타내는 BIGINT와 모든 하위 요소의 원하는 해상도를 나타내는 INTEGER를 입력하고 해상도 6에서 하위 요소가 포함된 SUPER 배열을 반환합니다.

```
SELECT H3_ToChildren(599686042433355775, 6);
```

```
 h3_tochildren                                              
--------------------------------------------------------------------------------------------------------------------------------------
 [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]
```

참고: *해상도*와 *인덱스* 해상도의 차이가 7 이하이면 안전합니다.

다음 예제에서는 SUPER 크기 제한을 초과하는 쿼리에 대한 해결 방법을 보여줍니다. 입력 H3 인덱스와 원하는 하위 해상도 간의 해상도 차이가 너무 큰 경우(7 초과). 이 절차에서는 하위 항목을 더 작은 단계(한 번에 최대 5개 해상도)로 점진적으로 확장하고 최종 결과를 사용자 생성 테이블에 저장하여 문제를 해결합니다.

```
CREATE OR REPLACE PROCEDURE generate_h3_children()
LANGUAGE plpgsql
AS $$
BEGIN
    -- Drop and create h3_children table that will contain the results
    DROP TABLE IF EXISTS h3_children;
    CREATE TABLE h3_children (
        h3_index BIGINT,
        child_res INTEGER,
        children SUPER
    );

    -- Create temporary table for steps
    DROP TABLE IF EXISTS h3_steps;
    CREATE TABLE h3_steps (
        h3_index BIGINT,
        current_res INTEGER,
        target_res INTEGER,
        h3_array SUPER
    );

    -- Initial insert into h3_steps
    INSERT INTO h3_steps
    SELECT h3_index, H3_Resolution(h3_index), child_res, ARRAY(h3_index)
    FROM h3_indexes; -- Insert from your table with h3_index and child_res as columns

    -- Loop until we reach target resolution
    -- We expect at most 3 iterations considering that we can start at resolution
    -- 0 and target/child resolution equal to 15 (0 -> 5 -> 10 -> 15)
    WHILE EXISTS (
        SELECT 1
        FROM h3_steps h
        GROUP BY h3_index, target_res
        HAVING MAX(current_res) < target_res
    ) LOOP
        -- Populate the h3_steps table with the tables that need to
        -- reach closer to the target res
        INSERT INTO h3_steps
        SELECT
            h.h3_index,
            LEAST(h.current_res + 5, h.target_res), -- Do not exceed target res
            h.target_res,
            -- Take the children of the child cell at resolution current_res of the
            -- h3_index
            H3_ToChildren(c.child::BIGINT, LEAST(h.current_res + 5, h.target_res))
        FROM h3_steps h, UNNEST(h.h3_array) AS c(child)
        WHERE h.current_res < h.target_res
        AND h.current_res = (SELECT MAX(current_res)
                           FROM h3_steps
                           WHERE h3_index = h.h3_index
        );
    END LOOP;

    -- Store final results
    INSERT INTO h3_children
    SELECT h3_index AS h3_index, target_res AS child_res, h3_array AS children
    FROM h3_steps
    WHERE current_res = target_res;
END;
$$;

-- Create the source table for H3_ToChildren queries
CREATE TABLE h3_indexes (
    h3_index BIGINT,
    child_res INTEGER,
    PRIMARY KEY (h3_index, child_res)
);
INSERT INTO h3_indexes (h3_index, child_res)
VALUES (x'8001fffffffffff'::BIGINT, 11);

-- Execute the procedure
CALL generate_h3_children();

-- View results
SELECT * FROM h3_children;
```

# H3\$1ToParent
<a name="H3_ToParent-function"></a>

H3\$1ToParent는 주어진 H3 인덱스에 대해 지정된 상위 해상도에서 상위 H3 셀 ID를 반환합니다. H3 인덱싱에 대한 자세한 내용은 [H3](spatial-terminology.md#spatial-terminology-h3) 섹션을 참조하세요.

## 구문
<a name="H3_ToParent-function-syntax"></a>

```
H3_ToParent(index, resolution)
```

## 인수
<a name="H3_ToParent-function-arguments"></a>

 * 인덱스*   
H3 셀의 인덱스를 나타내는 `BIGINT` 또는 `VARCHAR` 데이터 유형의 값이나 이러한 데이터 유형으로 평가되는 표현식입니다.

 *resolution*   
`INTEGER` 데이터 유형의 값 또는 `INTEGER` 유형으로 계산되는 식입니다. 값은 상위 셀 ID의 해상도를 나타냅니다. 값은 0과 *인덱스* 해상도 사이여야 합니다.

## 반환 타입
<a name="H3_ToParent-function-return"></a>

`BIGINT` - 상위의 H3 셀 ID를 나타냅니다.

*인덱스* 또는 *해상도*가 NULL이면 NULL이 반환됩니다.

*index*가 유효하지 않으면 오류가 반환됩니다.

*해상도*가 0보다 작거나 *인덱스* 해상도보다 크면 오류가 반환됩니다.

## 예제
<a name="H3_ToParent-function-examples"></a>

다음 SQL은 H3 셀의 인덱스를 나타내는 VARCHAR와 원하는 상위의 원하는 해상도를 나타내는 INTEGER를 입력하고, 입력 H3 셀의 해상도 0에서 상위를 나타내는 BIGINT를 반환합니다.

```
SELECT H3_ToParent('85283473fffffff', 0);
```

```
 h3_toparent
--------------------
 577199624117288959
```

다음 SQL은 H3 셀의 인덱스를 나타내는 BIGINT와 원하는 상위의 원하는 해상도를 나타내는 INTEGER를 입력하고, 입력 H3 셀의 해상도 0에서 상위를 나타내는 BIGINT를 반환합니다.

```
SELECT H3_ToParent(646078419604526808, 8);
```

```
 h3_toparent
--------------------
 614553222213795839
```

# ST\$1AddPoint
<a name="ST_AddPoint-function"></a>

ST\$1AddPoint는 점이 추가된 입력 지오메트리와 동일한 라인스트링 지오메트리를 반환합니다. 인덱스가 제공되면 인덱스 위치에 점이 추가됩니다. 인덱스가 -1이거나 제공되지 않으면 점이 라인스트링에 추가됩니다.

인덱스는 0부터 시작합니다. 결과의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다.

반환된 지오메트리의 차원은 *geom1* 값의 차원과 같습니다. *geom1*과 *geom2*의 차원이 다른 경우 *geom2*는 *geom1*의 차원에 나타납니다.

## 구문
<a name="ST_AddPoint-function-syntax"></a>

```
ST_AddPoint(geom1, geom2)
```

```
ST_AddPoint(geom1, geom2, index)
```

## 인수
<a name="ST_AddPoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다. 점은 빈 점일 수 있습니다.

 * 인덱스*   
0부터 시작하는 인덱스의 위치를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_AddPoint-function-return"></a>

`GEOMETRY` 

*geom1*, *geom2* 또는 *index*가 null이면 null이 반환됩니다.

*geom2*가 빈 점이면 *geom1*의 복사본이 반환됩니다.

*geom1*이 `LINESTRING`이 아니면 오류가 반환됩니다.

*geom2*가 `POINT`가 아니면 오류가 반환됩니다.

*index*가 범위를 벗어나면 오류가 반환됩니다. 인덱스 위치에 대해 유효한 값은 -1 또는 0과 `ST_NumPoints(geom1)` 사이의 값입니다.

## 예제
<a name="ST_AddPoint-function-examples"></a>

다음 SQL은 닫힌 라인스트링으로 만들도록 라인스트링에 점을 추가합니다.

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_AddPoint(g, ST_StartPoint(g))) FROM tmp;
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5,0 5,0 0)
```

다음 SQL은 라인스트링의 특정 위치에 점을 추가합니다.

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_AddPoint(g, ST_SetSRID(ST_Point(5, 10), 4326), 3)) FROM tmp;
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 10,5 5,0 5)
```

# ST\$1Angle
<a name="ST_Angle-function"></a>

ST\$1Angle은 다음과 같이 시계 방향으로 측정된 점 사이의 각도를 라디안 단위로 반환합니다.
+ 3개의 점이 입력되면 P1에서 P3까지 P2를 중심으로 시계 방향으로 회전하여 각도를 얻은 것처럼 반환된 각도 P1-P2-P3이 측정됩니다.
+ 4개의 점이 입력되면 방향선 P1-P2 및 P3-P4에 의해 형성된 반환된 시계 방향 각도가 반환됩니다. 입력이 퇴화되면(즉, P1이 P2와 같거나 P3이 P4와 같음) null이 반환됩니다.

반환 값은 라디안 단위이며 범위는 [0, 2π)입니다.

ST\$1Angle은 입력 지오메트리의 2D 프로젝션에서 작동합니다.

## 구문
<a name="ST_Angle-function-syntax"></a>

```
ST_Angle(geom1, geom2, geom3)
```

```
ST_Angle(geom1, geom2, geom3, geom4)
```

## 인수
<a name="ST_Angle-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다.

 *geom3*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다.

 *geom4*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다.

## 반환 타입
<a name="ST_Angle-function-return"></a>

`DOUBLE PRECISION`. 

*geom1*이 *geom2*와 같거나 *geom2*가 *geom3*과 같으면 null이 반환됩니다.

*geom1*, *geom2*, *geom3* 또는 *geom4*가 null이면 null이 반환됩니다.

*geom1*, *geom2*, *geom3*, *geom4*중 하나라도 빈 점이면 오류가 반환됩니다.

*geom1*, *geom2*, *geom3*, *geom4*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_Angle-function-examples"></a>

다음 SQL은 세 입력 점의 각도로 변환된 각도를 반환합니다.

```
SELECT ST_Angle(ST_Point(1,1), ST_Point(0,0), ST_Point(1,0)) / Pi() * 180.0 AS angle;
```

```
 angle
---------------
    45
```

다음 SQL은 네 입력 점의 각도로 변환된 각도를 반환합니다.

```
SELECT ST_Angle(ST_Point(1,1), ST_Point(0,0), ST_Point(1,0), ST_Point(2,0)) / Pi() * 180.0 AS angle;
```

```
 angle
---------------
   225
```

# ST\$1Area
<a name="ST_Area-function"></a>

입력 기하학의 경우 ST\$1Area는 2D 프로젝션의 데카르트 영역을 반환합니다. 영역 단위는 입력 지오메트리의 좌표가 표현되는 단위와 동일합니다. 점, 라인스트링, 다중 점 및 다중 라인스트링의 경우 이 함수는 0을 반환합니다. 지오메트리 컬렉션의 경우 컬렉션에 있는 지오메트리 영역의 합계를 반환합니다.

입력 지오그래피의 경우 ST\$1Area는 SRID에 의해 결정된 회전 타원체에서 계산된 입력 영역 지오그래피의 2D 투영의 측지 영역을 반환합니다. 길이 단위는 평방 미터입니다. 이 함수는 점, 다중 점 및 선형 지오그래피에 대해 0을 반환합니다. 입력이 지오메트리 컬렉션인 경우 함수는 컬렉션에 있는 영역 지오그래피 영역의 합계를 반환합니다.

## 구문
<a name="ST_Area-function-syntax"></a>

```
ST_Area(geo)
```

## 인수
<a name="ST_Area-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Area-function-return"></a>

`DOUBLE PRECISION`

*geo*가 null이면 null이 반환됩니다.

## 예제
<a name="ST_Area-function-examples"></a>

다음 SQL은 다중 다각형의 데카르트 영역을 반환합니다.

```
SELECT ST_Area(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_area
---------
     100
```

다음 SQL은 지오그래피에서 다각형의 영역을 반환합니다.

```
SELECT ST_Area(ST_GeogFromText('polygon((34 35, 28 30, 25 34, 34 35))'));
```

```
     st_area
------------------
 201824655743.383
```

다음 SQL은 선형 지오그래피에 대해 0을 반환합니다.

```
SELECT ST_Area(ST_GeogFromText('multipoint(0 0, 1 1, -21.32 121.2)'));
```

```
 st_area
---------
       0
```

# ST\$1AsBinary
<a name="ST_AsBinary-function"></a>

ST\$1AsBinary는 입력 지오메트리의 16진수 WKB(Well-known Binary) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리의 경우 ST\$1AsBinary는 지오메트리 유형에 대해 OGC(Open Geospatial Consortium) 표준 값을 사용합니다.

## 구문
<a name="ST_AsBinary-function-syntax"></a>

```
ST_AsBinary(geom)
```

## 인수
<a name="ST_AsBinary-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_AsBinary-function-return"></a>

`VARBYTE`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_AsBinary-function-examples"></a>

다음 SQL은 다각형의 16진수 WKB 표현을 반환합니다.

```
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_asbinary
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsEWKB
<a name="ST_AsEWKB-function"></a>

ST\$1AsEWKT는 입력 지오메트리의 EWKB(well-known binary) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리의 경우 ST\$1AsEWKB는 지오메트리 유형에 대해Open Geospatial Consortium(OGC) 표준 값을 사용합니다.

## 구문
<a name="ST_AsEWKB-function-syntax"></a>

```
ST_AsEWKB(geom)
```

## 인수
<a name="ST_AsEWKB-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_AsEWKB-function-return"></a>

`VARBYTE`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_AsEWKB-function-examples"></a>

다음 SQL은 다각형의 16진수 EWKB 표현을 반환합니다.

```
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_asewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsEWKT
<a name="ST_AsEWKT-function"></a>

ST\$1AsEWKT는 입력 지오메트리 또는 지오그래피의 EWKT(Extended Well-Known Text) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리의 경우 ST\$1AsEWKT는 지오메트리 유형의 WKT 값에 Z, M 또는 ZM을 추가합니다.

## 구문
<a name="ST_AsEWKT-function-syntax"></a>

```
ST_AsEWKT(geo)
```

```
ST_AsEWKT(geo, precision)
```

## 인수
<a name="ST_AsEWKT-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

 *precision*   
 데이터 형식의 값입니다`INTEGER` 지오메트리의 경우 *geo*의 좌표는 지정된 정밀도 1\$120을 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다. 지오그래피의 경우 *geo*의 좌표는 지정된 정밀도를 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다.

## 반환 타입
<a name="ST_AsEWKT-function-return"></a>

`VARCHAR`

*geo*가 null이면 null이 반환됩니다.

*precision*이 null이면 null이 반환됩니다.

결과가 64KB `VARCHAR`보다 크면 오류가 반환됩니다.

## 예제
<a name="ST_AsEWKT-function-examples"></a>

다음 SQL은 라인스트링의 EWKT 표현을 반환합니다.

```
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326));
```

```
st_asewkt
--------------------------------
 SRID=4326;LINESTRING(3.14159265358979 -6.28318530717959,2.71828182845905 -1.41421356237309)
```

다음 SQL은 라인스트링의 EWKT 표현을 반환합니다. 지오메트리의 좌표는 6자리의 정밀도로 표시됩니다.

```
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326), 6);
```

```
st_asewkt
--------------------------------
 SRID=4326;LINESTRING(3.14159 -6.28319,2.71828 -1.41421)
```

다음 SQL은 지오그래피의 EWKT 표현을 반환합니다.

```
SELECT ST_AsEWKT(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
                  st_asewkt
----------------------------------------------
 SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
```

# ST\$1AsGeoJSON
<a name="ST_AsGeoJSON-function"></a>

ST\$1AsGeoJSON은 입력 지오메트리 또는 지오그래피의 GeoJSON 표현을 반환합니다. GeoJSON에 대한 자세한 내용은 Wikipedia의 [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON)을 참조하십시오.

3DZ 및 4D 지오메트리의 경우 출력 지오메트리는 입력 3DZ 또는 4D 지오메트리의 3DZ 프로젝션입니다. 즉, `x`, `y` 및 `z` 좌표가 출력에 있습니다. 3DM 지오메트리의 경우 출력 지오메트리는 입력 3DM 지오메트리의 2D 프로젝션입니다. 즉, `x` 및 `y` 좌표만 출력에 있습니다.

입력 지오그래피의 경우 ST\$1AsGeoJSON은 입력 지오그래피의 GeoJSON 표현을 반환합니다. 지오그래피의 좌표는 지정된 정밀도를 사용하여 표시됩니다.

## 구문
<a name="ST_AsGeoJSON-function-syntax"></a>

```
ST_AsGeoJSON(geo)
```

```
ST_AsGeoJSON(geo, precision)
```

## 인수
<a name="ST_AsGeoJSON-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

 *precision*   
 데이터 형식의 값입니다`INTEGER` 지오메트리의 경우 *geo*의 좌표는 지정된 정밀도 1\$120을 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다. 지오그래피의 경우 *geo*의 좌표는 지정된 정밀도를 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다.

## 반환 타입
<a name="ST_AsGeoJSON-function-return"></a>

`VARCHAR`

*geo*가 null이면 null이 반환됩니다.

*precision*이 null이면 null이 반환됩니다.

결과가 64KB `VARCHAR`보다 크면 오류가 반환됩니다.

## 예제
<a name="ST_AsGeoJSON-function-examples"></a>

다음 SQL은 라인스트링의 GeoJSON 표현을 반환합니다.

```
SELECT ST_AsGeoJSON(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)'));
```

```
st_asgeojson
----------------------------------------------------------------------------------------------------------------
 {"type":"LineString","coordinates":[[3.14159265358979,-6.28318530717959],[2.71828182845905,-1.41421356237309]]}
```

다음 SQL은 라인스트링의 GeoJSON 표현을 반환합니다. 지오메트리의 좌표는 6자리의 정밀도로 표시됩니다.

```
SELECT ST_AsGeoJSON(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)'), 6);
```

```
st_asgeojson
-----------------------------------------------------------------------------
  {"type":"LineString","coordinates":[[3.14159,-6.28319],[2.71828,-1.41421]]}
```

다음 SQL은 지오그래피의 GeoJSON 표현을 반환합니다.

```
SELECT ST_AsGeoJSON(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
                             st_asgeojson
----------------------------------------------------------------------
 {"type":"LineString","coordinates":[[110,40],[2,3],[-10,80],[-7,9]]}
```

# ST\$1AsHexWKB
<a name="ST_AsHexWKB-function"></a>

ST\$1AsHexWKB는 ASCII 16진수 문자(0\$19, A\$1F)를 사용하여 입력 지오메트리 또는 지오그래피의 16진수 WKB(Well-known Binary) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리 또는 지오그래피의 경우 ST\$1AsHexWKB는 지오메트리 또는 지오그래피 유형에 대해 OGC(Open Geospatial Consortium) 표준 값을 사용합니다.

## 구문
<a name="ST_AsHexWKB-function-syntax"></a>

```
ST_AsHexWKB(geo)
```

## 인수
<a name="ST_AsHexWKB-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_AsHexWKB-function-return"></a>

`VARCHAR`

*geo*가 null이면 null이 반환됩니다.

결과가 64KB `VARCHAR`보다 크면 오류가 반환됩니다.

## 예제
<a name="ST_AsHexWKB-function-examples"></a>

다음 SQL은 지오메트리에서 다각형의 16진수 WKB 표현을 반환합니다.

```
SELECT ST_AsHexWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_ashexwkb
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

다음 SQL은 지오그래피에서 다각형의 16진수 WKB 표현을 반환합니다.

```
SELECT ST_AsHexWKB(ST_GeogFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'));
```

```
st_ashexwkb
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsHexEWKB
<a name="ST_AsHexEWKB-function"></a>

ST\$1AsHexEWKB는 ASCII 16진수 문자(0\$19, A\$1F)를 사용하여 입력 지오메트리 또는 지오그래피의 16진수 EWKB(Extended Well-Known Binary) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리 또는 지오그래피의 경우 ST\$1AsHexEWKB는 지오메트리또는 지오그래피 유형에 대해 PostGIS 확장 WKB 값을 사용합니다.

## 구문
<a name="ST_AsHexEWKB-function-syntax"></a>

```
ST_AsHexEWKB(geo)
```

## 인수
<a name="ST_AsHexEWKB-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_AsHexEWKB-function-return"></a>

`VARCHAR`

*geo*가 null이면 null이 반환됩니다.

결과가 64KB `VARCHAR`보다 크면 오류가 반환됩니다.

## 예제
<a name="ST_AsHexEWKB-function-examples"></a>

다음 SQL은 지오메트리에서 다각형의 16진수 EWKB 표현을 반환합니다.

```
SELECT ST_AsHexEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_ashexewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

다음 SQL은 지오그래피에서 다각형의 16진수 EWKB 표현을 반환합니다.

```
SELECT ST_AsHexEWKB(ST_GeogFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'));
```

```
st_ashexewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsText
<a name="ST_AsText-function"></a>

ST\$1AsText는 입력 지오메트리 또는 지오그래피의 WKT(Well-Known Text) 표현을 반환합니다. 3DZ, 3DM 및 4D 지오메트리 또는 지오그래피의 경우 ST\$1AsEWKT는 지오메트리 또는 지오그래피 유형의 WKT 값에 Z, M 또는 ZM을 추가합니다.

## 구문
<a name="ST_AsText-function-syntax"></a>

```
ST_AsText(geo)
```

```
ST_AsText(geo, precision)
```

## 인수
<a name="ST_AsText-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

 *precision*   
 데이터 형식의 값입니다`INTEGER` 지오메트리의 경우 *geo*의 좌표는 지정된 정밀도 1\$120을 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다. 지오그래피의 경우 *geo*의 좌표는 지정된 정밀도를 사용하여 표시됩니다. *precision*이 지정되지 않은 경우 기본값은 15입니다.

## 반환 타입
<a name="ST_AsText-function-return"></a>

`VARCHAR`

*geo*가 null이면 null이 반환됩니다.

*precision*이 null이면 null이 반환됩니다.

결과가 64KB `VARCHAR`보다 크면 오류가 반환됩니다.

## 예제
<a name="ST_AsText-function-examples"></a>

다음 SQL은 라인스트링의 WKT 표현을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326));
```

```
st_astext
--------------------------------
LINESTRING(3.14159265358979 -6.28318530717959,2.71828182845905 -1.41421356237309)
```

다음 SQL은 라인스트링의 WKT 표현을 반환합니다. 지오메트리의 좌표는 6자리의 정밀도로 표시됩니다.

```
SELECT ST_AsText(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326), 6);
```

```
st_astext
----------------------------------------------
 LINESTRING(3.14159 -6.28319,2.71828 -1.41421)
```

다음 SQL은 지오그래피의 WKT 표현을 반환합니다.

```
SELECT ST_AsText(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
             st_astext
------------------------------------
 LINESTRING(110 40,2 3,-10 80,-7 9)
```

# ST\$1Azimuth
<a name="ST_Azimuth-function"></a>

ST\$1Azimuth는 두 입력 점의 2D 프로젝션을 사용하여 북쪽 기반 직교 방위각을 반환합니다.

## 구문
<a name="ST_Azimuth-function-syntax"></a>

```
ST_Azimuth(point1, point2)
```

## 인수
<a name="ST_Azimuth-function-arguments"></a>

 *point1*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다. *point1*의 SRID(공간 참조 시스템 식별자)는 *point2*의 SRID와 일치해야 합니다.

 *point2*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다. *point2*의 SRID는 *point1*의 SRID와 일치해야 합니다.

## 반환 타입
<a name="ST_Azimuth-function-return"></a>

`DOUBLE PRECISION` 데이터 형식의 라디안 각도입니다. 값의 범위는 0(포함)부터 2pi(제외)까지입니다.

*point1* 또는 *point2*가 빈 점이 아니면 오류가 반환됩니다.

*point1* 또는 *point2*가 null이면 null이 반환됩니다.

*point1*과 *point2*이 같으면 null이 반환됩니다.

*point1* 또는 *point2*가 점이 아니면 오류가 반환됩니다.

*point1*과 *point2*에 공간 참조 시스템 식별자(SRID) 값이 없으면 오류가 반환됩니다.

## 예제
<a name="ST_Azimuth-function-examples"></a>

다음 SQL은 입력 지점의 방위각을 반환합니다.

```
SELECT ST_Azimuth(ST_Point(1,2), ST_Point(5,6));
```

```
st_azimuth
-------------------
 0.7853981633974483
```

# ST\$1Boundary
<a name="ST_Boundary-function"></a>

ST\$1Boundine은 다음과 같이 입력 지오메트리의 경계를 반환합니다.
+ 입력 지오메트리가 비어 있으면(즉, 점이 없음) 있는 그대로 반환됩니다.
+ 입력 지오메트리가 점이거나 비어 있지 않은 다중 점이면 빈 지오메트리 컬렉션이 반환됩니다.
+ 입력이 라인스트링 또는 다중 라인스트링이면 경계의 모든 점을 포함하는 다중 점이 반환됩니다. 다중 점은 비어 있을 수 있습니다.
+ 입력이 내부 링이 없는 다각형이면 경계를 나타내는 닫힌 라인스트링이 반환됩니다.
+ 입력이 내부 링이 있는 다각형이거나 다중 다각형인 경우 다중 라인스트링이 반환됩니다. 다중 라인스트링 문자열에는 영역 지오메트리에 있는 모든 링의 모든 경계가 닫힌 라인스트링으로 포함됩니다.

점 동등성을 판별하기 위해 ST\$1Boundary는 입력 지오메트리의 2D 프로젝션에서 작동합니다. 입력 지오메트리가 비어 있으면 해당 복사본이 입력과 동일한 차원으로 반환됩니다. 비어 있지 않은 3DM 및 4D 지오메트리의 경우 `m` 좌표가 삭제됩니다. 특수한 경우의 3DZ 및 4D 다중 라인스트링에서 다중 라인스트링 경계 점의 `z` 좌표는 동일한 2D 프로젝션을 사용하는 라인스트링 경계 점의 고유한 z 값의 평균으로 계산됩니다.

## 구문
<a name="ST_Boundary-function-syntax"></a>

```
ST_Boundary(geom)
```

## 인수
<a name="ST_Boundary-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Boundary-function-return"></a>

`GEOMETRY`

*geom*이 null이면 null이 반환됩니다.

*geom*이 `GEOMETRYCOLLECTION`이 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Boundary-function-examples"></a>

다음 SQL은 입력 다각형의 경계를 다중 라인스트링으로 반환합니다.

```
SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1))')));
```

```
st_asewkt
--------------------
 MULTILINESTRING((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1))
```

# ST\$1Buffer
<a name="ST_Buffer-function"></a>

ST\$1Buffer는 xy 데카르트 평면에 투영된 입력 형상으로부터의 거리가 입력 거리보다 작거나 같은 모든 점을 나타내는 2D 형상을 반환합니다.

## 구문
<a name="ST_Buffer-function-syntax"></a>

```
ST_Buffer(geom, distance)
```

```
ST_Buffer(geom, distance, number_of_segments_per_quarter_circle)
```

## 인수
<a name="ST_Buffer-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *distance*   
버퍼의 거리(또는 반지름)를 나타내는 데이터 형식 `DOUBLE PRECISION` 값입니다.

 *number\$1of\$1segments\$1per\$1quarter\$1circle*   
 데이터 형식의 값입니다`INTEGER` 이 값은 입력 형상의 각 꼭짓점 주위의 1/4 원을 근사화하는 점의 수를 결정합니다. 음수 값은 기본적으로 0입니다. 기본값은 8입니다.

## 반환 타입
<a name="ST_Buffer-function-return"></a>

`GEOMETRY`

ST\$1Buffer 함수는 xy 데카르트 평면에서 2차원(2D) 형상을 반환합니다.

*geom*이 `GEOMETRYCOLLECTION`이 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Buffer-function-examples"></a>

다음 SQL은 입력 라인스트링의 버퍼를 반환합니다.

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('LINESTRING(1 2,5 2,5 8)'), 2));
```

```
               st_asewkt  
POLYGON((-1 2,-0.96157056080646 2.39018064403226,-0.847759065022573 2.76536686473018,-0.662939224605089 3.11114046603921,-0.414213562373093 3.4142135623731,-0.111140466039201 3.66293922460509,0.234633135269824 3.84775906502257,0.609819355967748 3.96157056080646,1 4,3 4,3 8,3.03842943919354 8.39018064403226,3.15224093497743 8.76536686473018,3.33706077539491 9.11114046603921,3.58578643762691 9.4142135623731,3.8888595339608 9.66293922460509,4.23463313526982 9.84775906502257,4.60981935596775 9.96157056080646,5 10,5.39018064403226 9.96157056080646,5.76536686473018 9.84775906502257,6.11114046603921 9.66293922460509,6.4142135623731 9.41421356237309,6.66293922460509 9.1111404660392,6.84775906502258 8.76536686473017,6.96157056080646 8.39018064403225,7 8,7 2,6.96157056080646 1.60981935596774,6.84775906502257 1.23463313526982,6.66293922460509 0.888859533960796,6.41421356237309 0.585786437626905,6.1111404660392 0.33706077539491,5.76536686473018 0.152240934977427,5.39018064403226 0.0384294391935391,5 0,1 0,0.609819355967744 0.0384294391935391,0.234633135269821 0.152240934977427,-0.111140466039204 0.337060775394909,-0.414213562373095 0.585786437626905,-0.662939224605091 0.888859533960796,-0.847759065022574 1.23463313526982,-0.961570560806461 1.60981935596774,-1 2))
```

다음 SQL은 원을 근사화하는 입력 점 형상의 버퍼를 반환합니다. 이 명령은 1/4 원당 세그먼트 수를 지정하지 않으므로 함수에서는 기본값인 8개 세그먼트를 사용하여 1/4 원을 근사화합니다.

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('POINT(3 4)'), 2));
```

```
               st_asewkt
POLYGON((1 4,1.03842943919354 4.39018064403226,1.15224093497743 4.76536686473018,1.33706077539491 5.11114046603921,1.58578643762691 5.4142135623731,1.8888595339608 5.66293922460509,2.23463313526982 5.84775906502257,2.60981935596775 5.96157056080646,3 6,3.39018064403226 5.96157056080646,3.76536686473019 5.84775906502257,4.11114046603921 5.66293922460509,4.4142135623731 5.41421356237309,4.66293922460509 5.1111404660392,4.84775906502258 4.76536686473017,4.96157056080646 4.39018064403225,5 4,4.96157056080646 3.60981935596774,4.84775906502257 3.23463313526982,4.66293922460509 2.8888595339608,4.41421356237309 2.58578643762691,4.1111404660392 2.33706077539491,3.76536686473018 2.15224093497743,3.39018064403226 2.03842943919354,3 2,2.60981935596774 2.03842943919354,2.23463313526982 2.15224093497743,1.8888595339608 2.33706077539491,1.58578643762691 2.58578643762691,1.33706077539491 2.8888595339608,1.15224093497743 3.23463313526982,1.03842943919354 3.60981935596774,1 4))
```

다음 SQL은 원을 근사화하는 입력 점 형상의 버퍼를 반환합니다. 이 명령은 1/4 원당 세그먼트 수로 3을 지정하므로 함수에서는 기본값인 3개 세그먼트를 사용하여 1/4 원을 근사화합니다.

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('POINT(3 4)'), 2, 3));
```

```
               st_asewkt
POLYGON((1 4,1.26794919243112 5,2 5.73205080756888,3 6,4 5.73205080756888,4.73205080756888 5,5 4,4.73205080756888 3,4 2.26794919243112,3 2,2 2.26794919243112,1.26794919243112 3,1 4))
```

# ST\$1Centroid
<a name="ST_Centroid-function"></a>

ST\$1Centroid는 다음과 같이 지오메트리의 중심을 나타내는 점을 반환합니다.
+ `POINT` 지오메트리의 경우 좌표가 지오메트리의 점 좌표의 평균인 점을 반환합니다.
+ `LINESTRING` 지오메트리의 경우 좌표가 지오메트리 세그먼트의 중간점의 가중 평균인 점을 반환합니다. 여기서 가중치는 지오메트리 세그먼트의 길이입니다.
+ `POLYGON` 지오메트리의 경우 좌표가 영역 지오메트리의 삼각 분할 중심의 가중 평균인 점을 반환합니다. 여기서 가중치는 삼각 분할에서 삼각형의 면적입니다.
+ 지오메트리 컬렉션의 경우 지오메트리 컬렉션에서 최대 토폴로지 차원의 지오메트리 중심의 가중 평균을 반환합니다.

## 구문
<a name="ST_Centroid-function-syntax"></a>

```
ST_Centroid(geom)
```

## 인수
<a name="ST_Centroid-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Centroid-function-return"></a>

`GEOMETRY` 

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 null이 반환됩니다.

## 예제
<a name="ST_Centroid-function-examples"></a>

다음 SQL은 입력 라인스트링의 중심점을 반환합니다.

```
SELECT ST_AsEWKT(ST_Centroid(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9, -22 -33)', 4326)))
```

```
                     st_asewkt
----------------------------------------------------
 SRID=4326;POINT(15.6965103455214 27.0206782881905)
```

# ST\$1Collect
<a name="ST_Collect-function"></a>

ST\$1Collect에는 두 가지 변형이 있습니다. 하나는 2개의 지오메트리를 허용하고 다른 하나는 집계 표현식을 허용합니다.

ST\$1Collect의 첫 번째 변형은 입력 지오메트리에서 지오메트리를 생성합니다. 입력 지오메트리의 순서는 유지됩니다. 이 변형은 다음과 같이 작동합니다.
+ 두 입력 지오메트리가 모두 점이면 2개의 점이 있는 `MULTIPOINT`가 반환됩니다.
+ 두 입력 지오메트리가 모두 라인스트링이면 2개의 라인스트링이 있는 `MULTILINESTRING`이 반환됩니다.
+ 두 입력 지오메트리가 모두 다각형이면 2개의 다각형이 있는 `MULTIPOLYGON`이 반환됩니다.
+ 그렇지 않으면 2개의 지오메트리가 있는 `GEOMETRYCOLLECTION`이 반환됩니다.

ST\$1Collect의 두 번째 변형은 지오메트리 열의 지오메트리에서 지오메트리를 생성합니다. 지오메트리의 결정된 반환 순서는 없습니다. 반환된 지오메트리의 순서를 지정하려면 WITHIN GROUP (ORDER BY ...) 절을 지정합니다. 이 변형은 다음과 같이 작동합니다.
+ 입력 집계 표현식의 NULL이 아닌 모든 행이 점이면 집계 표현식의 모든 점을 포함하는 다중 점이 반환됩니다.
+ 집계 표현식의 NULL이 아닌 모든 행이 라인스트링이면 집계 표현식의 모든 라인스트링을 포함하는 다중 라인스트링이 반환됩니다.
+ 집계 표현식의 NULL이 아닌 모든 행이 다각형이면 집계 표현식의 모든 다각형을 포함하는 다중 다각형이 반환됩니다.
+ 그렇지 않으면 집계 표현식의 모든 지오메트리를 포함하는 `GEOMETRYCOLLECTION`이 반환됩니다.

ST\$1Collect는 입력 지오메트리와 동일한 차원의 지오메트리를 반환합니다. 모든 입력 지오메트리의 차원이 같아야 합니다.

## 구문
<a name="ST_Collect-function-syntax"></a>

```
ST_Collect(geom1, geom2)
```

```
ST_Collect(aggregate_expression)  [WITHIN GROUP (ORDER BY sort_expression1 [ASC | DESC] [, sort_expression2 [ASC | DESC] ...])]
```

## 인수
<a name="ST_Collect-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *aggregate\$1expression*   
`GEOMETRY` 데이터 형식의 열 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 [WITHIN GROUP (ORDER BY *sort\$1expression1* [ASC \$1 DESC] [, *sort\$1expression2* [ASC \$1 DESC] ...])]   
(옵션) 집계된 값의 정렬 순서를 지정하는 절입니다. ORDER BY 절에는 정렬 표현식 목록이 포함되어 있습니다. 정렬 표현식은 열 이름과 같은 쿼리 선택 목록의 유효한 정렬 표현식과 유사한 표현식입니다. 오름차순(`ASC`) 또는 내림차순(`DESC`)을 지정할 수 있습니다. 기본값은 `ASC`입니다.

## 반환 타입
<a name="ST_Collect-function-return"></a>

하위 유형 `MULTIPOINT`, `MULTILINESTRING`, `MULTIPOLYGON` 또는 `GEOMETRYCOLLECTION`의 `GEOMETRY`입니다.

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 입력 지오메트리의 SRID 값입니다.

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*aggregate\$1expression*의 모든 행이 null이면 null이 반환됩니다.

*geom1*이 null이면 *geom2*의 복사본이 반환됩니다. 마찬가지로 *geom2*가 null이면 *geom1*의 복사본이 반환됩니다.

*geom1*과 *geom2*의 SRID 값이 다른 경우 오류가 반환됩니다.

*aggregate\$1expression*에 있는 두 지오메트리의 SRID 값이 다르면 오류가 반환됩니다.

반환된 지오메트리가 최대 크기 `GEOMETRY`보다 크면 오류가 반환됩니다.

*geom1*과 *geom2*의 차원이 다르면 오류가 반환됩니다.

*aggregate\$1expression*에 있는 두 지오메트리의 차원이 다르면 오류가 반환됩니다.

## 예제
<a name="ST_Collect-function-examples"></a>

다음 SQL은 2개의 지오메트리를 포함하는 지오메트리 컬렉션을 반환합니다.

```
SELECT ST_AsText(ST_Collect(ST_GeomFromText('LINESTRING(0 0,1 1)'), ST_GeomFromText('POLYGON((10 10,20 10,10 20,10 10))')));
```

```
st_astext
-----------
 GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),POLYGON((10 10,20 10,10 20,10 10)))
```

다음 SQL은 테이블의 모든 지오메트리를 지오메트리 컬렉션으로 수집합니다.

```
WITH tbl(g) AS (SELECT ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT NULL::geometry UNION ALL
SELECT ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326))
SELECT ST_AsEWKT(ST_Collect(g)) FROM tbl;
```

```
st_astext
-----------
 SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(0 0,10 0),MULTIPOINT((13 4),(8 5),(4 4)),POLYGON((0 0,10 0,0 10,0 0)))
```

다음 SQL은 ID 열별로 그룹화되고 이 ID로 정렬된 테이블의 모든 지오메트리를 수집합니다. 이 예에서 결과 지오메트리는 다음과 같이 ID별로 그룹화됩니다.
+ id 1 – 다중 점의 점.
+ id 2 – 다중 라인스트링의 라인스트링.
+ id 3 – 지오메트리 컬렉션의 혼합 하위 유형.
+ id 4 – 다중 다각형의 다각형.
+ id 5 – null이고 결과는 null임.

```
WITH tbl(id, g) AS (SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL
SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL
SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry)
SELECT id, ST_AsEWKT(ST_Collect(g)) FROM tbl GROUP BY id ORDER BY id;
```

```
 id |                                                 st_asewkt                                                 
----+-----------------------------------------------------------------------------------------------------------
  1 | SRID=4326;MULTIPOINT((1 2),(4 5))
  2 | SRID=4326;MULTILINESTRING((0 0,10 0),(10 0,20 -5))
  3 | SRID=4326;GEOMETRYCOLLECTION(MULTIPOINT((13 4),(8 5),(4 4)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5)))
  4 | SRID=4326;MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((20 20,20 30,30 20,20 20)))
  5 |
```

다음 SQL은 테이블의 모든 지오메트리를 지오메트리 컬렉션에 수집합니다. 결과는 `id`의 내림차순으로 정렬된 다음 최소 및 최대 x 좌표에 따라 사전순으로 정렬됩니다.

```
WITH tbl(id, g) AS (
SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL
SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL
SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL
SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry)
SELECT ST_AsEWKT(ST_Collect(g) WITHIN GROUP (ORDER BY id DESC, ST_XMin(g), ST_XMax(g))) FROM tbl;
```

```
                                                                                                                  st_asewkt                                                                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=4326;GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),POLYGON((20 20,20 30,30 20,20 20)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5)),MULTIPOINT((13 4),(8 5),(4 4)),LINESTRING(0 0,10 0),LINESTRING(10 0,20 -5),POINT(1 2),POINT(4 5)
```

# ST\$1Contains
<a name="ST_Contains-function"></a>

ST\$1Contains는 첫 번째 입력 지오메트리의 2D 프로젝션에 두 번째 입력 지오메트리의 2D 프로젝션이 포함된 경우 true를 반환합니다. 지오메트리 `A`의 모든 점이 지오메트리 `B`의 점이고 그 내부에 비어 있지 않은 교차점이 있는 경우, `B`는 `A`를 포함합니다.

ST\$1Contains(`A`, `B`)는 ST\$1Within(`B`, `A`)와 동등합니다.

## 구문
<a name="ST_Contains-function-syntax"></a>

```
ST_Contains(geom1, geom2)
```

## 인수
<a name="ST_Contains-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 이 값을 *geom1*과 비교하여 해당 값이 *geom1*에 포함되어 있는지 판별합니다.

## 반환 타입
<a name="ST_Contains-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Contains-function-examples"></a>

다음 SQL은 첫 번째 다각형에 두 번째 다각형이 포함되어 있는지 확인합니다.

```
SELECT ST_Contains(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_contains
-----------
 false
```

# ST\$1ContainsProperly
<a name="ST_ContainsProperly-function"></a>

ST\$1ContainsProperly는 두 입력 지오메트리가 비어 있지 않고 두 번째 지오메트리의 2D 프로젝션의 모든 점이 첫 번째 지오메트리의 2D 프로젝션의 내부 점인 경우 true를 반환합니다.

## 구문
<a name="ST_ContainsProperly-function-syntax"></a>

```
ST_ContainsProperly(geom1, geom2)
```

## 인수
<a name="ST_ContainsProperly-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `GEOMETRYCOLLECTION`일 수 없습니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `GEOMETRYCOLLECTION`일 수 없습니다. 이 값을 *geom1*과 비교하여 모든 점이 *geom1*의 내부 점인지 확인합니다.

## 반환 타입
<a name="ST_ContainsProperly-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_ContainsProperly-function-examples"></a>

다음 SQL은 입력 라인스트링이 입력 다각형의 경계와 내부를 교차하는 ST\$1Contains 및 ST\$1ContainsProperly의 값을 반환합니다(외부는 아님). 다각형에 라인스트링이 포함되어 있지만 라인스트링이 제대로 포함되어 있지 않습니다.

```
WITH tmp(g1, g2) 
AS (SELECT ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('LINESTRING(5 5,10 5,10 6,5 5)')) SELECT ST_Contains(g1, g2), ST_ContainsProperly(g1, g2) 
FROM tmp;
```

```
 st_contains | st_containsproperly 
-------------+---------------------
 t           | f
```

# ST\$1ConvexHull
<a name="ST_ConvexHull-function"></a>

ST\$1ConvexHull은 입력 지오메트리에 포함된 비어 있지 않은 점의 볼록 껍질을 나타내는 지오메트리를 반환합니다.

빈 입력의 경우 결과 지오메트리는 입력 지오메트리와 동일합니다. 비어 있지 않은 모든 입력에 대해 이 함수는 입력 지오메트리의 2D 프로젝션에서 작동합니다. 그러나 출력 지오메트리의 차원은 입력 지오메트리의 차원에 따라 달라집니다. 보다 구체적으로 입력 지오메트리가 비어 있지 않은 3DM 또는 3D 지오메트리인 경우 `m` 좌표가 삭제됩니다. 즉, 반환된 지오메트리의 차원은 각각 2D 또는 3DZ입니다. 입력이 비어 있지 않은 2D 또는 3DZ 지오메트리인 경우 결과 지오메트리는 동일한 차원을 갖습니다.

## 구문
<a name="ST_ConvexHull-function-syntax"></a>

```
ST_ConvexHull(geom)
```

## 인수
<a name="ST_ConvexHull-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_ConvexHull-function-return"></a>

`GEOMETRY`

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 볼록 껍질의 점 수 | 지오메트리 하위 유형 | 
| --- | --- | 
| 0 | *geom*의 복사본이 반환됩니다. | 
| 1 | `POINT` 하위 유형이 반환됩니다. | 
| 2 | `LINESTRING` 하위 유형이 반환됩니다. 반환된 라인스트링의 두 점은 사전순으로 정렬됩니다. | 
| 3 이상 | 내부 링이 없는 `POLYGON` 하위 유형이 반환됩니다. 다각형은 시계 방향이고 외부 링의 첫 번째 점은 사전순으로 링의 가장 작은 점입니다. | 

## 예제
<a name="ST_ConvexHull-function-examples"></a>

다음 SQL은 라인스트링의 EWKT(Extended Well-Known Text) 표현을 반환합니다. 이 경우 반환된 블록 껍질이 다각형입니다.

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('LINESTRING(0 0,1 0,0 1,1 1,0.5 0.5)'))) as output;
```

```
output
-------------
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

다음 SQL은 라인스트링의 EWKT 표현을 반환합니다. 이 경우 반환된 블록 껍질이 라인스트링입니다.

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('LINESTRING(0 0,1 1,0.2 0.2,0.6 0.6,0.5 0.5)'))) as output;
```

```
output
-------------
LINESTRING(0 0,1 1)
```

다음 SQL은 다중 점의 EWKT 표현을 반환합니다. 이 경우 반환된 블록 껍질이 점입니다.

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('MULTIPOINT(0 0,0 0,0 0)'))) as output;
```

```
output
-------------
POINT(0 0)
```

# ST\$1CoveredBy
<a name="ST_CoveredBy-function"></a>

ST\$1CoveredBy는 첫 번째 입력 지오메트리의 2D 프로젝션이 두 번째 입력 지오메트리의 2D 프로젝션으로 덮인 경우 true를 반환합니다. 지오메트리 `A`의 모든 점이 지오메트리 `B`의 점이고 둘 다 비어 있지 않은 경우 `A`는 `B`에 의해 덮여 있습니다.

ST\$1CoveredBy(`A`, `B`)는 ST\$1Covers(`B`, `A`)와 동등합니다.

## 구문
<a name="ST_CoveredBy-function-syntax"></a>

```
ST_CoveredBy(geom1, geom2)
```

## 인수
<a name="ST_CoveredBy-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 이 값을 *geom2*와 비교하여 *geom2*에 의해 덮여 있는지 판별합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_CoveredBy-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_CoveredBy-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다각형에 의해 덮여 있는지 확인합니다.

```
SELECT ST_CoveredBy(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_coveredby
-----------
 true
```

# ST\$1Covers
<a name="ST_Covers-function"></a>

ST\$1Covers는 첫 번째 입력 지오메트리의 2D 프로젝션이 두 번째 입력 지오메트리의 2D 프로젝션을 덮고 있는 경우 true를 반환합니다. 지오메트리 `A`의 모든 점이 지오메트리 `B`의 점이고 둘 다 비어 있지 않은 경우 `B`가 `A`를 덮고 있습니다.

ST\$1Covers(`A`, `B`)는 ST\$1CoveredBy(`B`, `A`)와 동등합니다.

## 구문
<a name="ST_Covers-function-syntax"></a>

```
ST_Covers(geom1, geom2)
```

## 인수
<a name="ST_Covers-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 이 값을 *geom1*과 비교하여 *geom1*을 덮고 있는지 판별합니다.

## 반환 타입
<a name="ST_Covers-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Covers-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다각형을 덮고 있는지 확인합니다.

```
SELECT ST_Covers(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_covers
-----------
 false
```

# ST\$1Crosses
<a name="ST_Crosses-function"></a>

ST\$1Crosses는 두 입력 지오메트리의 2D 프로젝션이 서로 교차하면 true를 반환합니다.

## 구문
<a name="ST_Crosses-function-syntax"></a>

```
ST_Crosses(geom1, geom2)
```

## 인수
<a name="ST_Crosses-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Crosses-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_Crosses-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다중 점과 교차하는지 확인합니다. 이 예에서 다중 점은 다각형의 내부와 외부를 모두 가로지르므르 ST\$1Crosses가 true를 반환합니다.

```
SELECT ST_Crosses (ST_GeomFromText('polygon((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('multipoint(5 5,0 0,-1 -1)'));
```

```
st_crosses              
-------------
 true
```

다음 SQL은 첫 번째 다각형이 두 번째 다중 점과 교차하는지 확인합니다. 이 예에서 다중 점은 다각형의 외부를 가로지르므르 ST\$1Crosses가 false를 반환합니다.

```
SELECT ST_Crosses (ST_GeomFromText('polygon((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('multipoint(0 0,-1 -1)'));
```

```
st_crosses              
-------------
 false
```

# ST\$1Dimension
<a name="ST_Dimension-function"></a>

ST\$1Dimension은 입력 지오메트리의 고유 차원을 반환합니다. *고유 차원*은 지오메트리에 정의된 하위 유형의 차원 값입니다.

3DM, 3DZ 및 4D 지오메트리 입력의 경우 ST\$1Dimension은 2D 지오메트리 입력과 동일한 결과를 반환합니다.

## 구문
<a name="ST_Dimension-function-syntax"></a>

```
ST_Dimension(geom)
```

## 인수
<a name="ST_Dimension-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Dimension-function-return"></a>

*geom*의 고유한 차원을 나타내는 `INTEGER`입니다.

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 반환 값 | 지오메트리 하위 유형 | 
| --- | --- | 
| 0 | *geom*이 `POINT` 또는 `MULTIPOINT` 하위 유형인 경우 반환됩니다. | 
| 1 | *geom*이 `LINESTRING` 또는 `MULTILINESTRING` 하위 유형인 경우 반환됩니다. | 
| 2 | *geom*이 `POLYGON` 또는 `MULTIPOLYGON` 하위 유형인 경우 반환됩니다. | 
| 0 | *geom*이 빈 `GEOMETRYCOLLECTION` 하위 유형인 경우 반환됩니다. | 
| 컬렉션 구성 요소의 가장 큰 차원 | *geom*이 `GEOMETRYCOLLECTION` 하위 유형인 경우 반환됩니다. | 

## 예제
<a name="ST_Dimension-function-examples"></a>

다음 SQL은 4개의 점 LINESTRING의 WKT(Well-Known Text) 표현을 GEOMETRY 객체로 변환하고 라인스트링의 차원을 반환합니다.

```
SELECT ST_Dimension(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_dimension
-------------
1
```

# ST\$1Disjoint
<a name="ST_Disjoint-function"></a>

ST\$1Disjoint는 두 입력 지오메트리의 2D 프로젝션에 공통되는 점이 없는 경우 true를 반환합니다.

## 구문
<a name="ST_Disjoint-function-syntax"></a>

```
ST_Disjoint(geom1, geom2)
```

## 인수
<a name="ST_Disjoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Disjoint-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Disjoint-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다각형과 분리되어 있는지 확인합니다.

```
SELECT ST_Disjoint(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), ST_Point(4, 4));
```

```
st_disjoint               
-----------
 true
```

# ST\$1Distance
<a name="ST_Distance-function"></a>

입력 지오메트리의 경우 ST\$1Distance는 두 입력 지오메트리 값의 2D 프로젝션 간 최소 유클리드 거리를 반환합니다.

3DM, 3DZ, 4D 기하학의 경우 ST\$1Distance는 두 입력 지오메트리 값의 2D 프로젝션 간 유클리드 거리를 반환합니다.

입력 지오그래피의 경우 ST\$1Distance는 두 2D 점의 측지 거리를 반환합니다. 거리 단위는 미터입니다. 점과 빈 점이 아닌 지오그래피의 경우 오류가 반환됩니다.

## 구문
<a name="ST_Distance-function-syntax"></a>

```
ST_Distance(geo1, geo2)
```

## 인수
<a name="ST_Distance-function-arguments"></a>

 *geo1*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다. *geo1*의 데이터 유형은 *geo2*와 동일해야 합니다.

 *geo2*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다. *geo2*의 데이터 유형은 *geo1*과 동일해야 합니다.

## 반환 타입
<a name="ST_Distance-function-return"></a>

`DOUBLE PRECISION`입력 지오메트리 또는 지오그래피와 동일한 단위의 입니다.

*geo1* 또는 *geo2*가 null이거나 비어 있으면 null이 반환됩니다.

*geo1*과 *geo2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geo1* 또는 *geo2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Distance-function-examples"></a>

다음 SQL은 두 다각형 사이의 거리를 반환합니다.

```
SELECT ST_Distance(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 -3,-2 -1,0 -3,-1 -3))'));
```

```
  st_distance
-----------
1.4142135623731
```

다음 SQL은 GEOGRAPHY 데이터 유형을 사용하여 베를린의 브란덴부르크 문과 독일 의회 건물 사이의 거리(미터)를 반환합니다.

```
SELECT ST_Distance(ST_GeogFromText('POINT(13.37761826722198 52.516411678282445)'), ST_GeogFromText('POINT(13.377950831464005 52.51705102546893)'));
```

```
   st_distance
------------------
 74.64129172609631
```

# ST\$1DistanceSphere
<a name="ST_DistanceSphere-function"></a>

ST\$1DistanceSphere는 구에 있는 두 점 지오메트리 사이의 거리를 반환합니다.

## 구문
<a name="ST_DistanceSphere-function-syntax"></a>

```
ST_DistanceSphere(geom1, geom2)
```

```
ST_DistanceSphere(geom1, geom2, radius)
```

## 인수
<a name="ST_DistanceSphere-function-arguments"></a>

 *geom1*   
구에 놓인 `GEOMETRY` 데이터 형식의 점 값(도)입니다. 점의 첫 번째 좌표는 경도 값입니다. 점의 두 번째 좌표는 위도 값입니다. 3DZ, 3DM 또는 4D 지오메트리의 경우 처음 두 좌표만 사용됩니다.

 *geom2*   
구에 놓인 `GEOMETRY` 데이터 형식의 점 값(도)입니다. 점의 첫 번째 좌표는 경도 값입니다. 점의 두 번째 좌표는 위도 값입니다. 3DZ, 3DM 또는 4D 지오메트리의 경우 처음 두 좌표만 사용됩니다.

 *radius*   
데이터 형식이 `DOUBLE PRECISION`인 구의 반경입니다. *radius*가 제공되지 않으면 구의 기본값은 Earth로 설정되며 타원체의 WGS(World Geodetic System) 84 표현에서 반경이 계산됩니다.

## 반환 타입
<a name="ST_DistanceSphere-function-return"></a>

`DOUBLE PRECISION`반경과 같은 단위의 입니다. 반경이 제공되지 않은 경우 거리는 미터 단위입니다.

*geom1* 또는 *geom2*가 null이거나 비어 있으면 null이 반환됩니다.

*radius*가 제공되지 않으면 결과는 지표면을 따라 측정된 미터 단위가 반환됩니다.

*radius*가 음수이면 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 점이 아니면 오류가 반환됩니다.

## 예제
<a name="ST_DistanceSphere-function-examples"></a>

다음 예시 SQL은 지구상의 두 지점 사이의 거리를 킬로미터 단위로 계산합니다.

```
SELECT ROUND(ST_DistanceSphere(ST_Point(-122, 47), ST_Point(-122.1, 47.1))/ 1000, 0);
```

```
  round
-----------
 13
```

다음 예제 SQL은 독일의 세 공항 위치 Berlin Tegel(TXL), Munich International(MUC) 및 Frankfurt International(FRA) 사이의 거리를 킬로미터 단위로 계산합니다.

```
WITH airports_raw(code,lon,lat) AS (
(SELECT 'MUC', 11.786111, 48.353889) UNION
(SELECT 'FRA', 8.570556, 50.033333) UNION
(SELECT 'TXL', 13.287778, 52.559722)),
airports1(code,location) AS (SELECT code, ST_Point(lon, lat) FROM airports_raw),
airports2(code,location) AS (SELECT * from airports1)
SELECT (airports1.code || ' <-> ' || airports2.code) AS airports,
round(ST_DistanceSphere(airports1.location, airports2.location) / 1000, 0) AS distance_in_km
FROM airports1, airports2 WHERE airports1.code < airports2.code ORDER BY 1;
```

```
  airports   | distance_in_km 
-------------+----------------
 FRA <-> MUC |            299
 FRA <-> TXL |            432
 MUC <-> TXL |            480
```

# ST\$1DWithin
<a name="ST_DWithin-function"></a>

ST\$1DWithin은 두 입력 지오메트리 값의 2D 프로젝션 간 유클리드 거리가 임계값보다 크지 않은 경우 true를 반환합니다.

## 구문
<a name="ST_DWithin-function-syntax"></a>

```
ST_DWithin(geom1, geom2, threshold)
```

## 인수
<a name="ST_DWithin-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *threshold*   
 데이터 형식의 값입니다`DOUBLE PRECISION` 이 값은 입력 인수 단위입니다.

## 반환 타입
<a name="ST_DWithin-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*threshold*가 음수이면 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_DWithin-function-examples"></a>

다음 SQL은 두 다각형 사이의 거리가 5단위 이내인지 확인합니다.

```
SELECT ST_DWithin(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'),5);
```

```
st_dwithin
-----------
 true
```

# ST\$1EndPoint
<a name="ST_EndPoint-function"></a>

ST\$1EndPoint는 입력 라인스트링의 마지막 점을 반환합니다. 결과의 SRID(공간 참조 시스템 식별자) 값은 입력 지오메트리의 값과 동일합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_EndPoint-function-syntax"></a>

```
ST_EndPoint(geom)
```

## 인수
<a name="ST_EndPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

## 반환 타입
<a name="ST_EndPoint-function-return"></a>

`GEOMETRY` 

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 `LINESTRING`이 아니면 null이 반환됩니다.

## 예제
<a name="ST_EndPoint-function-examples"></a>

다음 SQL은 `LINESTRING` 객체에 대한 4개의 점 `GEOMETRY`의 EWKT(Extended Well-Known Text) 표현을 반환하고 라인스트링의 종료 지점을 반환합니다.

```
SELECT ST_AsEWKT(ST_EndPoint(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 5)
```

# ST\$1Envelope
<a name="ST_Envelope-function"></a>

ST\$1Envelope은 다음과 같이 입력 지오메트리의 최소 경계 상자를 반환합니다.
+ 입력 지오메트리가 비어 있으면 반환된 지오메트리는 입력 지오메트리의 복사본입니다.
+ 입력 지오메트리의 최소 경계 상자가 점으로 변형되는 경우 반환된 지오메트리는 점입니다.
+ 입력 지오메트리의 최소 경계 상자가 1차원이면 두 점 라인스트링이 반환됩니다.
+ 이전 항목 중 어느 것도 true가 아니면 이 함수는 정점이 최소 경계 상자의 모서리인 시계 방향 다각형을 반환합니다.

반환된 지오메트리의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다.

비어 있지 않은 모든 입력에 대해 이 함수는 입력 지오메트리의 2D 프로젝션에서 작동합니다.

## 구문
<a name="ST_Envelope-function-syntax"></a>

```
ST_Envelope(geom)
```

## 인수
<a name="ST_Envelope-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Envelope-function-return"></a>

`GEOMETRY` 

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_Envelope-function-examples"></a>

다음 SQL은 4개의 점 `LINESTRING`의 WKT(Well-Known Text) 표현을 `GEOMETRY` 객체로 변환하고 모서리가 최소 경계 상자인 정점을 가진 다각형을 반환합니다.

```
SELECT ST_AsText(ST_Envelope(ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))')));
```

```
    st_astext
------------------------------------
  POLYGON((0 0,0 10,20 10,20 0,0 0))
```

# ST\$1Equals
<a name="ST_Equals-function"></a>

ST\$1Equals는 입력 지오메트리의 2D 프로젝션이 기하학적으로 동일한 경우 true를 반환합니다. 지오메트리는 점 세트가 동일하고 그 내부에 비어 있지 않은 교차점이 있는 경우 기하학적으로 동일한 것으로 간주됩니다.

## 구문
<a name="ST_Equals-function-syntax"></a>

```
ST_Equals(geom1, geom2)
```

## 인수
<a name="ST_Equals-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 이 값을 *geom1*과 비교하여 *geom1*과 같은지 판별합니다.

## 반환 타입
<a name="ST_Equals-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Equals-function-examples"></a>

다음 SQL은 두 다각형이 기하학적으로 같은지 확인합니다.

```
SELECT ST_Equals(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_equals
-----------
 false
```

다음 SQL은 두 라인스트링이 기하학적으로 같은지 확인합니다.

```
SELECT ST_Equals(ST_GeomFromText('LINESTRING(1 0,10 0)'), ST_GeomFromText('LINESTRING(1 0,5 0,10 0)'));
```

```
st_equals
-----------
 true
```

# ST\$1ExteriorRing
<a name="ST_ExteriorRing-function"></a>

ST\$1ExteriorRing은 입력 다각형의 외부 링을 나타내는 닫힌 라인스트링을 반환합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_ExteriorRing-function-syntax"></a>

```
ST_ExteriorRing(geom)
```

## 인수
<a name="ST_ExteriorRing-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_ExteriorRing-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`LINESTRING`

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 다각형이 아니면 null이 반환됩니다.

*geom*이 비어 있으면 빈 다각형이 반환됩니다.

## 예제
<a name="ST_ExteriorRing-function-examples"></a>

다음 SQL은 다각형의 외부 링을 닫힌 라인스트링으로 반환합니다.

```
SELECT ST_AsEWKT(ST_ExteriorRing(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))')));
```

```
st_asewkt
-----------
 LINESTRING(7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9)
```

# ST\$1Force2D
<a name="ST_Force2D-function"></a>

ST\$1Force2D는 입력 지오메트리의 2D 지오메트리를 반환합니다. 2D 지오메트리의 경우 입력 복사본이 반환됩니다. 3DZ, 3DM 및 4D 지오메트리의 경우 ST\$1Force2D는 지오메트리를 xy-데카르트 평면에 표시합니다. 입력 지오메트리의 빈 점은 출력 지오메트리의 빈 점으로 남아 있습니다.

## 구문
<a name="ST_Force2D-function-syntax"></a>

```
ST_Force2D(geom)
```

## 인수
<a name="ST_Force2D-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Force2D-function-return"></a>

`GEOMETRY`. 

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 지오메트리가 반환됩니다.

## 예제
<a name="ST_Force2D-function-examples"></a>

다음 SQL은 3DZ 지오메트리에서 2D 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Force2D(ST_GeomFromText('MULTIPOINT Z(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT((0 1),EMPTY,(2 3),(5 6))
```

# ST\$1Force3D
<a name="ST_Force3D-function"></a>

ST\$1Force3D는 ST\$1Force3DZ의 별칭입니다. 자세한 내용은 [ST\$1Force3DZ](ST_Force3DZ-function.md) 섹션을 참조하세요.

# ST\$1Force3DM
<a name="ST_Force3DM-function"></a>

ST\$1Force3DM은 입력 지오메트리의 3DM 지오메트리를 반환합니다. 2D 지오메트리의 경우 출력 지오메트리의 비어 있지 않은 점의 `m` 좌표는 모두 `0`으로 설정됩니다. 3DM 지오메트리의 경우 입력 지오메트리 복사본이 반환됩니다. 3DZ 지오메트리의 경우 지오메트리는 xy-데카르트 평면에 나타나고 출력 지오메트리에서 비어 있지 않은 점의 `m` 좌표는 모두 `0`으로 설정됩니다. 4D 지오메트리의 경우 지오메트리가 xym-데카르트 공간에 나타납니다. 입력 지오메트리의 빈 점은 출력 지오메트리의 빈 점으로 남아 있습니다.

## 구문
<a name="ST_Force3DM-function-syntax"></a>

```
ST_Force3DM(geom)
```

## 인수
<a name="ST_Force3DM-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Force3DM-function-return"></a>

`GEOMETRY`. 

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 지오메트리가 반환됩니다.

## 예제
<a name="ST_Force3DM-function-examples"></a>

다음 SQL은 3DZ 지오메트리에서 3DM 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Force3DM(ST_GeomFromText('MULTIPOINT Z(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT M ((0 1 0),EMPTY,(2 3 0),(5 6 0))
```

# ST\$1Force3DZ
<a name="ST_Force3DZ-function"></a>

ST\$1Force3DZ는 입력 지오메트리에서 3DZ 지오메트리를 반환합니다. 2D 지오메트리의 경우 출력 지오메트리의 비어 있지 않은 점의 `z` 좌표는 모두 `0`으로 설정됩니다. 3DM 지오메트리의 경우 지오메트리는 xy-데카르트 평면에 나타나고 출력 지오메트리에서 비어 있지 않은 점의 `z` 좌표는 모두 `0`으로 설정됩니다. 3DZ 지오메트리의 경우 입력 지오메트리 복사본이 반환됩니다. 4D 지오메트리의 경우 지오메트리가 xyz-데카르트 공간에 나타납니다. 입력 지오메트리의 빈 점은 출력 지오메트리의 빈 점으로 남아 있습니다.

## 구문
<a name="ST_Force3DZ-function-syntax"></a>

```
ST_Force3DZ(geom)
```

## 인수
<a name="ST_Force3DZ-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Force3DZ-function-return"></a>

`GEOMETRY`. 

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 지오메트리가 반환됩니다.

## 예제
<a name="ST_Force3DZ-function-examples"></a>

다음 SQL은 3DM 지오메트리에서 3DZ 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Force3DZ(ST_GeomFromText('MULTIPOINT M(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT Z ((0 1 0),EMPTY,(2 3 0),(5 6 0))
```

# ST\$1Force4D
<a name="ST_Force4D-function"></a>

ST\$1Force4D는 입력 지오메트리의 4D 지오메트리를 반환합니다. 2D 지오메트리의 경우 출력 지오메트리의 비어 있지 않은 점의 `z` 및 `m` 좌표는 모두 `0`으로 설정됩니다. 3DM 지오메트리의 경우 출력 지오메트리의 비어 있지 않은 점의 `z` 좌표는 모두 `0`으로 설정됩니다. 3DZ 지오메트리의 경우 출력 지오메트리의 비어 있지 않은 점의 `m` 좌표는 모두 `0`으로 설정됩니다. 4D 지오메트리의 경우 입력 지오메트리 복사본이 반환됩니다. 입력 지오메트리의 빈 점은 출력 지오메트리의 빈 점으로 남아 있습니다.

## 구문
<a name="ST_Force4D-function-syntax"></a>

```
ST_Force4D(geom)
```

## 인수
<a name="ST_Force4D-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Force4D-function-return"></a>

`GEOMETRY`. 

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 지오메트리가 반환됩니다.

## 예제
<a name="ST_Force4D-function-examples"></a>

다음 SQL은 3DM 지오메트리에서 4D 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Force4D(ST_GeomFromText('MULTIPOINT M(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT ZM ((0 1 0 2),EMPTY,(2 3 0 4),(5 6 0 7))
```

# ST\$1GeoHash
<a name="ST_GeoHash-function"></a>

ST\$1GeoHash는 지정된 정밀도로 입력 점의 `geohash` 표현을 반환합니다. 기본 정밀도 값은 20입니다. Geohash의 정의에 대한 자세한 내용은 Wikipedia의 [Geohash](https://en.wikipedia.org/wiki/Geohash)를 참조하세요.

## 구문
<a name="ST_GeoHash-function-syntax"></a>

```
ST_GeoHash(geom)
```

```
ST_GeoHash(geom, precision)
```

## 인수
<a name="ST_GeoHash-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *precision*   
 데이터 형식의 값입니다`INTEGER` 기본값은 20입니다.

## 반환 타입
<a name="ST_GeoHash-function-return"></a>

`GEOMETRY`

이 함수는 입력 점의 `geohash` 표현을 반환합니다.

입력 점이 비어 있으면 null을 반환합니다.

입력 형상이 점이 아니면 오류를 반환합니다.

## 예제
<a name="ST_GeoHash-function-examples"></a>

다음 SQL은 입력 점의 geohash 표현을 반환합니다.

```
SELECT ST_GeoHash(ST_GeomFromText('POINT(45 -45)'), 25) AS geohash;
```

```
          geohash
---------------------------
 m000000000000000000000gzz
```

입력 점이 비어 있으므로 다음 SQL은 null을 반환합니다.

```
SELECT ST_GeoHash(ST_GeomFromText('POINT EMPTY'), 10) IS NULL AS result;
```

```
 result
---------
 true
```

# ST\$1GeogFromText
<a name="ST_GeogFromText-function"></a>

ST\$1GeogFromText는 입력 지오그래피의 WKT(Well-Known Text) 또는 EWKT(Extended Well-Known Text) 표현으로 지오그래피 객체를 구성합니다.

## 구문
<a name="ST_GeogFromText-function-syntax"></a>

```
ST_GeogFromText(wkt_string)
```

## 인수
<a name="ST_GeogFromText-function-arguments"></a>

 *wkt\$1string*   
지오그래피의 WKT 또는 EWKT 표현인 `VARCHAR` 데이터 유형의 값입니다.

## 반환 타입
<a name="ST_GeogFromText-function-return"></a>

`GEOGRAPHY`

SRID 값이 입력에 제공된 값으로 설정된 경우. SRID가 제공되지 않으면 `4326`으로 설정됩니다.

*wkt\$1string*이 null이면 null이 반환됩니다.

*wkt\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeogFromText-function-examples"></a>

다음 SQL은 SRID 값을 사용하여 지오그래피 객체로 다각형을 구성합니다.

```
SELECT ST_AsEWKT(ST_GeogFromText('SRID=4324;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))'));
```

```
  st_asewkt
------------------------------------------------
 SRID=4324;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))
```

다음 SQL은 지오그래피 객체로 다각형을 구성합니다. SRID 값이 `4326`으로 설정됩니다.

```
SELECT ST_AsEWKT(ST_GeogFromText('POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))'));
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))
```

# ST\$1GeogFromWKB
<a name="ST_GeogFromWKB-function"></a>

ST\$1GeogFromWKB는 입력 지오그래피의 16진수 WKB(Well-Known Binary) 표현으로 지오그래피 객체를 구성합니다.

## 구문
<a name="ST_GeogFromWKB-function-syntax"></a>

```
ST_GeogFromWKB(wkb_string)
```

## 인수
<a name="ST_GeogFromWKB-function-arguments"></a>

 *wkb\$1string*   
지오그래피의 16진수 WKB 표현인 `VARCHAR` 데이터 유형의 값입니다.

## 반환 타입
<a name="ST_GeogFromWKB-function-return"></a>

`GEOGRAPHY`

SRID 값이 제공되면 제공된 값으로 설정됩니다. SRID가 제공되지 않으면 `4326`으로 설정됩니다.

*wkb\$1string*이 null이면 null이 반환됩니다.

*wkb\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeogFromWKB-function-examples"></a>

다음 SQL은 16진수 WKB 값으로 지오그래피를 구성합니다.

```
SELECT ST_AsEWKT(ST_GeogFromWKB('01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));
```

```
 st_asewkt
------------------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeometryN
<a name="ST_GeometryN-function"></a>

ST\$1GeometryN은 다음과 같이 입력 지오메트리의 입력 인덱스가 가리키는 지오메트리를 반환합니다.
+ 입력이 점, 라인스트링 또는 다각형인 경우 인덱스가 1과 같으면 지오메트리가 그대로 반환되고 인덱스가 1이 아니면 null이 반환됩니다.
+ 입력이 다중 점, 다중 라인스트링, 다중 다각형 또는 지오메트리 컬렉션이면 입력 인덱스가 가리키는 대로 점, 라인스트링, 다각형 또는 지오메트리 컬렉션이 반환됩니다.

인덱스는 1부터 시작합니다. 결과의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_GeometryN-function-syntax"></a>

```
ST_GeometryN(geom, index)
```

## 인수
<a name="ST_GeometryN-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 * 인덱스*   
1부터 시작하는 인덱스의 위치를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_GeometryN-function-return"></a>

`GEOMETRY` 

*geom* 또는 *index*가 null이면 null이 반환됩니다.

*index*가 범위를 벗어나면 오류가 반환됩니다.

## 예제
<a name="ST_GeometryN-function-examples"></a>

다음 SQL은 지오메트리 컬렉션의 지오메트리를 반환합니다.

```
WITH tmp1(idx) AS (SELECT 1 UNION SELECT 2),
tmp2(g) AS (SELECT ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))'))
SELECT idx, ST_AsEWKT(ST_GeometryN(g, idx)) FROM tmp1, tmp2 ORDER BY idx;
```

```
 idx |          st_asewkt           
-----+------------------------------
   1 | POLYGON((0 0,10 0,0 10,0 0))
   2 | LINESTRING(20 10,20 0,10 0)
```

# ST\$1GeometryType
<a name="ST_GeometryType-function"></a>

ST\$1GeometryType은 입력 지오메트리의 하위 유형을 문자열로 반환합니다.

3DM, 3DZ 및 4D 지오메트리 입력의 경우 ST\$1GeometryType은 2D 지오메트리 입력과 동일한 결과를 반환합니다.

## 구문
<a name="ST_GeometryType-function-syntax"></a>

```
ST_GeometryType(geom)
```

## 인수
<a name="ST_GeometryType-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_GeometryType-function-return"></a>

*geom*의 하위 유형을 나타내는 `VARCHAR`입니다.

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 반환된 문자열 값 | 지오메트리 하위 유형 | 
| --- | --- | 
| `ST_Point` | *geom*이 `POINT` 하위 유형인 경우 반환됩니다. | 
| `ST_LineString` | *geom*이 `LINESTRING` 하위 유형인 경우 반환됩니다. | 
| `ST_Polygon` | *geom*이 `POLYGON` 하위 유형인 경우 반환됩니다. | 
| `ST_MultiPoint` | *geom*이 `MULTIPOINT` 하위 유형인 경우 반환됩니다. | 
| `ST_MultiLineString` | *geom*이 `MULTILINESTRING` 하위 유형인 경우 반환됩니다. | 
| `ST_MultiPolygon` | *geom*이 `MULTIPOLYGON` 하위 유형인 경우 반환됩니다. | 
| `ST_GeometryCollection` | *geom*이 `GEOMETRYCOLLECTION` 하위 유형인 경우 반환됩니다. | 

## 예제
<a name="ST_GeometryType-function-examples"></a>

다음 SQL은 입력 라인스트링 지오메트리의 하위 유형을 반환합니다.

```
SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_geometrytype
-------------
 ST_LineString
```

# ST\$1GeomFromEWKB
<a name="ST_GeomFromEWKB-function"></a>

ST\$1GeomFromEWKB는 입력 지오메트리의 EWKB(Extended Well-Known Binary) 표현으로부터 지오메트리 객체를 구성합니다.

ST\$1GeomFromEWKB는 WKB 및 EWKB 16진수 형식으로 작성된 3DZ, 3DM 및 4D 지오메트리를허용합니다.

## 구문
<a name="ST_GeomFromEWKB-function-syntax"></a>

```
ST_GeomFromEWKB(ewkb_string)
```

## 인수
<a name="ST_GeomFromEWKB-function-arguments"></a>

 *ewkb\$1string*   
지오메트리의 16진수 EWKB 표현인 `VARCHAR` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_GeomFromEWKB-function-return"></a>

`GEOMETRY`

*ewkb\$1string*이 null이면 null이 반환됩니다.

*ewkb\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromEWKB-function-examples"></a>

다음 SQL은 EWKB 값에서 다각형을 구성하고 다각형의 EWKT 표현을 반환합니다.

```
SELECT ST_AsEWKT(ST_GeomFromEWKB('0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));
```

```
 st_asewkt
--------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeomFromEWKT
<a name="ST_GeomFromEWKT-function"></a>

ST\$1GeomFromEWKT는 입력 지오메트리의 EWKT(Extended Well-Known Text) 표현으로부터 지오메트리 객체를 구성합니다.

ST\$1GeomFromEWKT는 3DZ, 3DM 및 4D를 허용합니다. 여기서 지오메트리 유형에는 각각 Z, M 또는 ZM 접두사가 붙습니다.

## 구문
<a name="ST_GeomFromEWKT-function-syntax"></a>

```
ST_GeomFromEWKT(ewkt_string)
```

## 인수
<a name="ST_GeomFromEWKT-function-arguments"></a>

 *ewkt\$1string*   
데이터 형식 `VARCHAR`의 값 또는 지오메트리의 EWKT 표현인 `VARCHAR` 형식으로 평가되는 표현식입니다.  
WKT 키워드 `EMPTY`를 사용하여 빈 점, 빈 점이 있는 다중 점 또는 빈 점이 있는 지오메트리 컬렉션을 지정할 수 있습니다. 다음 예에서는 빈 점을 생성합니다.  

```
ST_GeomFromEWKT('SRID=4326;POINT EMPTY');
```

## 반환 타입
<a name="ST_GeomFromEWKT-function-return"></a>

`GEOMETRY`

*ewkt\$1string*이 null이면 null이 반환됩니다.

*ewkt\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromEWKT-function-examples"></a>

다음 SQL은 EWKT 값에서 다중 라인스트링을 구성하고 지오메트리를 반환합니다. 지오메트리의 ST\$1AsEWKT 결과도 반환합니다.

```
SELECT ST_GeomFromEWKT('SRID=4326;MULTILINESTRING((1 0,1 0),(2 0,3 0),(4 0,5 0,6 0))') as geom, ST_AsEWKT(geom);
```

```
                                                                                                                                                       geom                                                                                                                                                       |                          st_asewkt                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------
 0105000020E610000003000000010200000002000000000000000000F03F0000000000000000000000000000F03F00000000000000000102000000020000000000000000000040000000000000000000000000000008400000000000000000010200000003000000000000000000104000000000000000000000000000001440000000000000000000000000000018400000000000000000 | SRID=4326;MULTILINESTRING((1 0,1 0),(2 0,3 0),(4 0,5 0,6 0))
```

# ST\$1GeomFromGeoHash
<a name="ST_GeomFromGeoHash-function"></a>

ST\$1GeomFromGeoHash는 입력 지오메트리의 geohash 표현으로부터 지오메트리 객체를 구성합니다. ST\$1GeomFromGeoHash는 공간 참조 식별자(SRID)가 영(0)인 2차원(2D) 기하학을 반환합니다. geohash 형식에 대한 자세한 내용은 Wikipedia의 [Geohash](https://en.wikipedia.org/wiki/Geohash)를 참조하세요.

## 구문
<a name="ST_GeomFromGeoHash-function-syntax"></a>

```
ST_GeomFromGeoHash(geohash_string)
```

```
ST_GeomFromGeoHash(geohash_string, precision)
```

## 인수
<a name="ST_GeomFromGeoHash-function-arguments"></a>

 *geohash\$1string*   
데이터 형식 `VARCHAR`의 값 또는 지오메트리의 geohash 표현인 `VARCHAR` 형식으로 평가되는 표현식입니다.

 *precision*   
geohash의 정밀도를 나타내는 데이터 형식 `INTEGER`의 값입니다. 값은 정밀도로 사용할 geohash의 문자 수입니다. 값이 지정되지 않은 경우 0보다 작거나 *geohash\$1string* 길이보다 큽니다. 그런 다음 *geohash\$1string* 길이가 사용됩니다.

## 반환 타입
<a name="ST_GeomFromGeoHash-function-return"></a>

`GEOMETRY`

*geohash\$1string*이 null이면 null이 반환됩니다.

*geohash\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromGeoHash-function-examples"></a>

다음 SQL은 정밀도가 높은 다각형을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646))
```

다음 SQL은 정밀도가 높은 점을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz00'));
```

```
 st_asewkt       
-----------------------
 POINT(-115.172816 36.114646)
```

다음 SQL은 정밀도가 낮은 다각형을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qq'));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.3125 35.15625,-115.3125 36.5625,-113.90625 36.5625,-113.90625 35.15625,-115.3125 35.15625))
```

다음 SQL은 정밀도가 낮은 점을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 3));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.3125 35.15625,-115.3125 36.5625,-113.90625 36.5625,-113.90625 35.15625,-115.3125 35.15625))
```

# ST\$1GeomFromGeoJSON
<a name="ST_GeomFromGeoJSON-function"></a>

ST\$1GeomFromGeoJSON은 입력 지오메트리의 GeoJSON 표현으로부터 지오메트리 객체를 구성합니다. GeoJSON 형식에 대한 자세한 내용은 Wikipedia의 [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON)을 참조하세요.

좌표가 세 개 이상인 점이 하나 이상 있는 경우 결과 지오메트리는 3DZ이며, 여기서 Z 구성 요소는 좌표가 두 개뿐인 점의 경우 0입니다. 입력 GeoJSON의 모든 점이 두 개의 좌표를 포함하거나 비어 있는 경우 ST\$1geomFromGeoJSON은 2D 지오메트리를 반환합니다. 반환된 지오메트리의 공간 참조 식별자(SRID) 값은 언제나 4326입니다.

## 구문
<a name="ST_GeomFromGeoJSON-function-syntax"></a>

```
ST_GeomFromGeoJSON(geojson_string)
```

## 인수
<a name="ST_GeomFromGeoJSON-function-arguments"></a>

 *geojson\$1string*   
데이터 형식 `VARCHAR` 또는 `SUPER`의 값이나 지오메트리의 GeoJSON 표현인 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="ST_GeomFromGeoJSON-function-return"></a>

`GEOMETRY`

*geojson\$1string*이 null이면 null이 반환됩니다.

*geojson\$1string*이 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromGeoJSON-function-examples"></a>

다음 SQL은 입력 GeoJSON에 표현된 2D 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}'));
```

```
 st_asewkt       
-----------------------
 SRID=4326;POINT(1 2)
```

다음 SQL은 입력 GeoJSON에 표현된 3DZ 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}'));
```

```
 st_asewkt  
------------------------------------------
 SRID=4326;LINESTRING Z (1 2 3,4 5 6,7 8 9)
```

다음 SQL은 한 점에만 세 개의 좌표가 있고 다른 모든 점은 입력 GeoJSON에 두 개의 좌표가 있는 경우 3DZ 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[0, 0],[0, 1, 8],[1, 0],[0, 0]]]}'));
```

```
 st_asewkt  
------------------------------------------------
 SRID=4326;POLYGON Z ((0 0 0,0 1 8,1 0 0,0 0 0))
```

# ST\$1GeomFromGeoSquare
<a name="ST_GeomFromGeoSquare-function"></a>

ST\$1GeomFromGeoSquare는 입력된 지오스퀘어 값으로 표시되는 영역을 포함하는 지오메트리를 반환합니다. 반환되는 지오메트리는 항상 2차원입니다. 지리 제곱 값을 계산하려면 [ST\$1GeoSquare](ST_GeoSquare-function.md) 단원을 참조하세요.

## 구문
<a name="ST_GeomFromGeoSquare-function-syntax"></a>

```
ST_GeomFromGeoSquare(geosquare)
```

```
ST_GeomFromGeoSquare(geosquare, max_depth)
```

## 인수
<a name="ST_GeomFromGeoSquare-function-arguments"></a>

 *geosquare*   
원하는 제곱에 도달하기 위해 초기 도메인에서 수행한 세분화 시퀀스를 설명하는 지오스퀘어 값인 데이터 형식 `BIGINT` 또는 `BIGINT` 형식으로 평가되는 표현식의 값입니다. 이 값은 [ST\$1GeoSquare](ST_GeoSquare-function.md)에 의해 계산됩니다.

 *max\$1depth*   
초기 도메인에서 만들어진 최대 도메인 세분화 수를 나타내는 데이터 형식 `INTEGER`의 값입니다. 값은 `1`보다 크거나 같아야 합니다.

## 반환 타입
<a name="ST_GeomFromGeoSquare-function-return"></a>

`GEOMETRY`

**geosquare가 유효하지 않으면 함수는 오류를 반환합니다.

입력 **max\$1depth가 범위 내에 있지 않으면 함수는 오류를 반환합니다.

## 예제
<a name="ST_GeomFromGeoSquare-function-examples"></a>

다음 SQL은 지오스퀘어 값에서 지오메트리를 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoSquare(797852));
```

```
 st_astext       
--------------------------------------------------------------------------------------------------------------------
 POLYGON((13.359375 52.3828125,13.359375 52.734375,13.7109375 52.734375,13.7109375 52.3828125,13.359375 52.3828125))
```

다음 SQL은 지오스퀘어 값과 최대 깊이 `3`의 지오메트리를 반환합니다.

```
SELECT ST_AsText(ST_GeomFromGeoSquare(797852, 3));
```

```
 st_astext       
--------------------------------------
 POLYGON((0 45,0 90,45 90,45 45,0 45))
```

다음 SQL은 먼저 x 좌표를 경도로, y 좌표를 위도(-122.3, 47.6)로 지정하여 시애틀에 대한 지오스퀘어 값을 계산합니다. 그런 다음 지오스퀘어에 대한 폴리곤을 반환합니다. 출력은 2차원 지오메트리이지만 경도와 위도 측면에서 공간 데이터를 계산하는 데 사용할 수 있습니다.

```
SELECT ST_AsText(ST_GeomFromGeoSquare(ST_GeoSquare(ST_Point(-122.3, 47.6))));
```

```
 st_astext
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((-122.335167014971 47.6080129947513,-122.335167014971 47.6080130785704,-122.335166931152 47.6080130785704,-122.335166931152 47.6080129947513,-122.335167014971 47.6080129947513))
```

# ST\$1GeomFromText
<a name="ST_GeomFromText-function"></a>

ST\$1GeomFromText는 입력 지오메트리의 WKT(Well-Known Text) 표현으로부터 지오메트리 객체를 구성합니다.

ST\$1GeomFromText는 3DZ, 3DM 및 4D를 허용합니다. 여기서 지오메트리 유형에는 각각 Z, M 또는 ZM 접두사가 붙습니다.

## 구문
<a name="ST_GeomFromText-function-syntax"></a>

```
ST_GeomFromText(wkt_string)
```

```
ST_GeomFromText(wkt_string, srid)
```

## 인수
<a name="ST_GeomFromText-function-arguments"></a>

 *wkt\$1string*   
지오메트리의 WKT 표현인 `VARCHAR` 데이터 형식의 값입니다.  
WKT 키워드 `EMPTY`를 사용하여 빈 점, 빈 점이 있는 다중 점 또는 빈 점이 있는 지오메트리 컬렉션을 지정할 수 있습니다. 다음 예에서는 하나의 빈 점과 하나의 비어 있지 않은 점이 있는 다중 점을 생성합니다.  

```
ST_GeomFromEWKT('MULTIPOINT(1 0,EMPTY)');
```

 *srid*   
SRID(공간 참조 식별자)인 `INTEGER` 데이터 형식의 값입니다. SRID 값이 제공되면 반환된 지오메트리에 이 SRID 값이 있습니다. 그렇지 않으면 반환된 지오메트리의 SRID 값이 0으로 설정됩니다.

## 반환 타입
<a name="ST_GeomFromText-function-return"></a>

`GEOMETRY`

*wkt\$1string* 또는 *srid*가 null이면 null이 반환됩니다.

*srid*가 음수이면 null이 반환됩니다.

*wkt\$1string*이 유효하지 않으면 오류가 반환됩니다.

*srid*가 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromText-function-examples"></a>

다음 SQL은 WKT 표현 및 SRID 값으로부터 지오메트리 객체를 구성합니다.

```
SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326);
```

```
st_geomfromtext
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1GeomFromWKB
<a name="ST_GeomFromWKB-function"></a>

ST\$1GeomFromWKB는 입력 지오메트리의 16진수 WKB(Well-Known Binary) 표현으로부터 지오메트리 객체를 구성합니다.

ST\$1GeomFromWKB는 WKB 16진수 형식으로 작성된 3DZ, 3DM 및 4D 지오메트리를허용합니다.

## 구문
<a name="ST_GeomFromWKB-function-syntax"></a>

```
ST_GeomFromWKB(wkb_string)
```

```
ST_GeomFromWKB(wkb_string, srid)
```

## 인수
<a name="ST_GeomFromWKB-function-arguments"></a>

 *wkb\$1string*   
지오메트리의 16진수 WKB 표현인 `VARCHAR` 데이터 형식의 값입니다.

 *srid*   
SRID(공간 참조 식별자)인 `INTEGER` 데이터 형식의 값입니다. SRID 값이 제공되면 반환된 지오메트리에 이 SRID 값이 있습니다. 그렇지 않으면 반환된 지오메트리의 SRID 값이 0으로 설정됩니다.

## 반환 타입
<a name="ST_GeomFromWKB-function-return"></a>

`GEOMETRY`

*wkb\$1string* 또는 *srid*가 null이면 null이 반환됩니다.

*srid*가 음수이면 null이 반환됩니다.

*wkb\$1string*이 유효하지 않으면 오류가 반환됩니다.

*srid*가 유효하지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_GeomFromWKB-function-examples"></a>

다음 SQL은 WKB 값에서 다각형을 구성하고 다각형의 WKT 표현을 반환합니다.

```
SELECT ST_AsText(ST_GeomFromWKB('01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));            
```

```
 st_astext
--------------------------------
 POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeoSquare
<a name="ST_GeoSquare-function"></a>

ST\$1GeoSquare는 도메인([-180, 180], [-90, 90])을 지정된 깊이까지 지오스퀘어로 불리는 동일한 정사각형 리전으로 재귀적으로 세분화합니다.** 세분화는 제공된 점의 위치를 기반으로 합니다. 점을 포함하는 지오스퀘어 중 하나는 최대 깊이에 도달할 때까지 각 단계에서 세분화됩니다. 이 지오스퀘어의 선택은 안정적입니다. 즉 함수 결과는 입력 인자에만 의존합니다. 이 함수는 점이 위치한 최종 지오스퀘어를 식별하는 고유 값을 반환합니다.

ST\$1GeoSquare는 x 좌표가 경도를 나타내고 y 좌표가 위도를 나타내는 POINT를 받습니다. 경도와 위도는 각각 [-180, 180] 및 [-90, 90]으로 제한됩니다. ST\$1GeoSquare의 출력은 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 함수에 대한 입력으로 사용할 수 있습니다.

지구의 적도 원주 호를 중심으로 360°를 두 개의 반구(동반구 및 서반구)로 나누고, 각각 0° 자오선에서 180°의 세로선(자오선)을 갖습니다. 규칙에 따라 동경은 데카르트 평면의 X축에 투영할 때 "\$1"(양수) 좌표이고, 서경은 데카르트 평면의 X축에 투영할 때 "-"(음수) 좌표입니다. 지구의 적도 둘레 0°를 기준으로 북쪽과 남쪽에 각각 90°의 위도선이 있으며, 이 위도선은 지구의 적도 둘레 0°와 평행합니다. 규칙에 따라 북위도선은 데카르트 평면에 투영할 때 "\$1"(양수) y축과 교차하고, 남위도선은 데카르트 평면에 투영할 때 "-"(음수) y축과 교차합니다. 경도선과 위도선이 교차하여 형성된 구형 격자는 직교 평면에 투영된 격자로 변환되며, 직교 평면의 표준 양수 및 음수 x 좌표와 양수 및 음수 y 좌표로 변환됩니다.

ST\$1GeoSquare의 목적은 동일한 코드 값으로 가까운 점을 태그하거나 표시하는 것입니다. 동일한 지오스퀘어에 있는 포인트는 동일한 코드 값을 받습니다. 지오스퀘어는 지리적 좌표(위도 및 경도)를 정수로 인코딩하는 데 사용됩니다. 더 큰 리전은 다양한 해상도로 맵에 영역을 묘사하기 위해 그리드로 나뉩니다. 지오스퀘어는 공간 인덱싱, 공간 비닝, 근접 검색, 위치 검색, 고유한 장소 식별자 생성에 사용할 수 있습니다. [ST\$1GeoHash](ST_GeoHash-function.md) 함수는 리전을 그리드로 나누는 유사한 프로세스를 따르지만 인코딩이 다릅니다.

## 구문
<a name="ST_GeoSquare-function-syntax"></a>

```
ST_GeoSquare(geom)
```

```
ST_GeoSquare(geom, max_depth)
```

## 인수
<a name="ST_ST_GeoSquare-function-arguments"></a>

 *geom*   
데이터 형식 `GEOMETRY`의 POINT 값 또는 POINT 하위 유형으로 평가되는 표현식입니다. 점의 x 좌표(경도)는 `-180` - `180` 범위 내에 있어야 합니다. 점의 y 좌표(위도)는 `-90` - `90` 범위 내에 있어야 합니다.  

 *max\$1depth*   
 데이터 형식의 값입니다`INTEGER` 점을 포함하는 도메인이 재귀적으로 세분되는 최대 횟수입니다. 값은 1 \$1 32 사이의 정수여야 합니다. 기본값은 32입니다. 세분화의 실제 최종 개수가 지정된 max\$1depth보다 작거나 같아야 합니다.**

## 반환 타입
<a name="ST_GeoSquare-function-return"></a>

`BIGINT`

이 함수는 입력 지점이 위치한 최종 지오스퀘어를 식별하는 고유 값을 반환합니다.

입력 geom이** 점이 아닌 경우 함수는 오류를 반환합니다.

입력 점이 비어 있는 경우 반환 값은 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 함수에 대한 유효한 입력이 아닙니다. 빈 점으로 ST\$1GeoSquare를 호출하지 않도록 하려면 [ST\$1IsEmpty](ST_IsEmpty-function.md) 함수를 사용하세요.

입력 점이 범위 내에 있지 않으면 함수는 오류를 반환합니다.

입력 **max\$1depth가 범위를 벗어나면 함수는 오류를 반환합니다.

## 예제
<a name="ST_ST_GeoSquare-function-examples"></a>

다음 SQL은 입력 점에서 지오스퀘어를 반환합니다.

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5));
```

```
  st_geosquare
-----------------------
 -4410772491521635895
```

다음 SQL은 입력 점에서 최대 깊이가 `10`인 지오스퀘어를 반환합니다.

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5), 10);
```

```
 st_geosquare
--------------
 797852
```

# ST\$1InteriorRingN
<a name="ST_InteriorRingN-function"></a>

ST\$1InteriorRingN은 인덱스 위치에서 입력 다각형의 내부 링에 해당하는 닫힌 라인스트링을 반환합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_InteriorRingN-function-syntax"></a>

```
ST_InteriorRingN(geom, index)
```

## 인수
<a name="ST_InteriorRingN-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 * 인덱스*   
1부터 시작하는 인덱스 링의 위치를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_InteriorRingN-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`LINESTRING`

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*geom* 또는 *index*가 null이면 null이 반환됩니다.

*index*가 범위를 벗어난 경우 null이 반환됩니다.

*geom*이 다각형이 아니면 null이 반환됩니다.

*geom*이 빈 다각형이면 null이 반환됩니다.

## 예제
<a name="ST_InteriorRingN-function-examples"></a>

다음 SQL은 다각형의 두 번째 링을 닫힌 라인스트링으로 반환합니다.

```
SELECT ST_AsEWKT(ST_InteriorRingN(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'),2));
```

```
st_asewkt
-----------
 LINESTRING(12 14,15 14,13 11,12 14)
```

# ST\$1Intersects
<a name="ST_Intersects-function"></a>

ST\$1Intersects는 두 입력 지오메트리의 2D 프로젝션에 공통되는 점이 하나 이상인 경우 true를 반환합니다.

## 구문
<a name="ST_Intersects-function-syntax"></a>

```
ST_Intersects(geom1, geom2)
```

## 인수
<a name="ST_Intersects-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Intersects-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Intersects-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다각형과 교차하는지 확인합니다.

```
SELECT ST_Intersects(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), ST_GeomFromText('MULTIPOINT((4 4),(6 6))'));
```

```
st_intersects              
-------------
 true
```

# ST\$1Intersection
<a name="ST_Intersection-function"></a>

ST\$1Intersection은 두 지오메트리의 점 집합 교차를 나타내는 지오메트리를 반환합니다. 즉, 두 입력 지오메트리 간에 공유되는 부분을 반환합니다.

## 구문
<a name="ST_Intersection-function-syntax"></a>

```
ST_Intersection(geom1, geom2)
```

## 인수
<a name="ST_Intersection-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Intersection-function-return"></a>

`GEOMETRY`

*geom1*과 *geom2*가 공간을 공유하지 않으면(분리되어 있음) 빈 지오메트리가 반환됩니다.

*geom1* 또는 *geom2*가 비어 있으면 빈 지오메트리가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

*geom1* 또는 *geom2*가 2차원(2D) 지오메트리가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Intersection-function-examples"></a>

다음 SQL은 두 입력 지오메트리의 교차를 나타내는 비어 있지 않은 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Intersection(ST_GeomFromText('polygon((0 0,100 100,0 200,0 0))'), ST_GeomFromText('polygon((0 0,10 0,0 10,0 0))')));
```

```
        st_asewkt        
-------------------------
 POLYGON((0 0,0 10,5 5,0 0))
```

다음 SQL은 분리되어 있는(교차하지 않는) 입력 지오메트리를 전달할 때 빈 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Intersection(ST_GeomFromText('linestring(0 100,0 0)'), ST_GeomFromText('polygon((1 0,10 0,1 10,1 0))')));
```

```
    st_asewkt     
------------------
 LINESTRING EMPTY
```

# ST\$1IsPolygonCCW
<a name="ST_IsPolygonCCW-function"></a>

ST\$1IsPolygonCCW는 입력 Polygon 또는 Multipolygon의 2D 프로젝션이 시계 반대 방향인 경우 true를 반환합니다. 입력 지오메트리가 점, 라인스트링, 다중 점 또는 다중 라인스트링이면 true가 반환됩니다. 지오메트리 컬렉션의 경우 컬렉션의 모든 지오메트리가 시계 반대 방향이면 ST\$1IsPolygonCCW가 true를 반환합니다.

## 구문
<a name="ST_IsPolygonCCW-function-syntax"></a>

```
ST_IsPolygonCCW(geom)
```

## 인수
<a name="ST_IsPolygonCCW-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsPolygonCCW-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsPolygonCCW-function-examples"></a>

다음 SQL은 다각형이 시계 반대 방향인지 확인합니다.

```
SELECT ST_IsPolygonCCW(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'));
```

```
 st_ispolygonccw
----------
 true
```

# ST\$1IsPolygonCW
<a name="ST_IsPolygonCW-function"></a>

ST\$1IsPolygonCW는 입력 Polygon 또는 Multipolygon의 2D 프로젝션이 시계 방향인 경우 true를 반환합니다. 입력 지오메트리가 점, 라인스트링, 다중 점 또는 다중 라인스트링이면 true가 반환됩니다. 지오메트리 컬렉션의 경우 컬렉션의 모든 지오메트리가 시계 방향이면 ST\$1IsPolygonCW가 true를 반환합니다.

## 구문
<a name="ST_IsPolygonCW-function-syntax"></a>

```
ST_IsPolygonCW(geom)
```

## 인수
<a name="ST_IsPolygonCW-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsPolygonCW-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsPolygonCW-function-examples"></a>

다음 SQL은 다각형이 시계 방향인지 확인합니다.

```
SELECT ST_IsPolygonCW(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'));
```

```
 st_ispolygonccw
----------
 true
```

# ST\$1IsClosed
<a name="ST_IsClosed-function"></a>

ST\$1IsClosed는 입력 지오메트리의 2D 프로젝션이 닫혀 있으면 true를 반환합니다. 다음 규칙은 닫힌 지오메트리를 정의합니다.
+ 입력 지오메트리가 점 또는 다중 점입니다.
+ 입력 지오메트리가 라인스트링이며 라인스트링의 시작 점과 끝 점이 일치합니다.
+ 입력 지오메트리가 비어 있지 않은 다중 라인스트링이며 해당 라인스트링이 모두 닫혀 있습니다.
+ 입력 지오메트리가 비어 있지 않은 다각형이고 모든 다각형의 링이 비어 있지 않으며 모든 링의 시작 점과 끝 점이 일치합니다.
+ 입력 지오메트리는 비어 있지 않은 다중 다각형이며 모든 다각형이 닫혀 있습니다.
+ 입력 지오메트리가 비어 있지 않은 지오메트리 컬렉션이며 모든 구성 요소가 닫혀 있습니다.

## 구문
<a name="ST_IsClosed-function-syntax"></a>

```
ST_IsClosed(geom)
```

## 인수
<a name="ST_IsClosed-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsClosed-function-return"></a>

`BOOLEAN`

*geom*이 빈 점이면 false가 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsClosed-function-examples"></a>

다음 SQL은 다각형이 닫혀 있는지 확인합니다.

```
SELECT ST_IsClosed(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_isclosed
-----------
 true
```

# ST\$1IsCollection
<a name="ST_IsCollection-function"></a>

ST\$1IsCollection은 입력 지오메트리가 `GEOMETRYCOLLECTION`, `MULTIPOINT`, `MULTILINESTRING` 또는 `MULTIPOLYGON` 하위 유형 중 하나인 경우 true를 반환합니다.

## 구문
<a name="ST_IsCollection-function-syntax"></a>

```
ST_IsCollection(geom)
```

## 인수
<a name="ST_IsCollection-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsCollection-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsCollection-function-examples"></a>

다음 SQL은 다각형이 컬렉션인지 확인합니다.

```
SELECT ST_IsCollection(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_iscollection
-----------
 false
```

# ST\$1IsEmpty
<a name="ST_IsEmpty-function"></a>

ST\$1IsEmpty는 입력 지오메트리가 비어 있는 경우 true를 반환합니다. 하나 이상의 비어 있지 않은 점이 포함된 지오메트리는 비어 있지 않습니다.

ST\$1IsEmpty는 입력 지오메트리에 비어 있지 않은 점이 하나 이상 있으면 true를 반환합니다.

## 구문
<a name="ST_IsEmpty-function-syntax"></a>

```
ST_IsEmpty(geom)
```

## 인수
<a name="ST_IsEmpty-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsEmpty-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsEmpty-function-examples"></a>

다음 SQL은 지정된 다각형이 비어 있는지 확인합니다.

```
SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_isempty
-----------
 false
```

# ST\$1IsRing
<a name="ST_IsRing-function"></a>

입력 라인스트링이 링이면 ST\$1IsRing은 true를 반환합니다. 라인스트링은 닫혀 있고 단순하면 링입니다.

## 구문
<a name="ST_IsRing-function-syntax"></a>

```
ST_IsRing(geom)
```

## 인수
<a name="ST_IsRing-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 지오메트리는 `LINESTRING`이어야 합니다.

## 반환 타입
<a name="ST_IsRing-function-return"></a>

`BOOLEAN`

*geom*이 `LINESTRING`이 아니면 오류가 반환됩니다.

## 예제
<a name="ST_IsRing-function-examples"></a>

다음 SQL은 지정된 라인스트링이 링인지 확인합니다.

```
SELECT ST_IsRing(ST_GeomFromText('linestring(0 0, 1 1, 1 2, 0 0)'));
```

```
st_isring
-----------
 true
```

# ST\$1IsSimple
<a name="ST_IsSimple-function"></a>

ST\$1IsSimple은 입력 지오메트리의 2D 프로젝션이 단순하면 true를 반환합니다. 단순 지오메트리의 정의에 대한 자세한 내용은 [기하학적 단순성](spatial-terminology.md#spatial-terminology-simplicity) 섹션을 참조하세요.

## 구문
<a name="ST_IsSimple-function-syntax"></a>

```
ST_IsSimple(geom)
```

## 인수
<a name="ST_IsSimple-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsSimple-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsSimple-function-examples"></a>

다음 SQL은 지정된 라인스트링이 단순한지 확인합니다. 이 예에서는 자체 교차점이 있기 때문에 단순하지 않습니다.

```
SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(0 0,10 0,5 5,5 -5)'));
```

```
 st_issimple
-----------
 false
```

# ST\$1IsValid
<a name="ST_IsValid-function"></a>

ST\$1IsValid는 입력 지오메트리의 2D 프로젝션이 유효하면 true를 반환합니다. 유효한 지오메트리의 정의에 대한 자세한 내용은 [기하학적 유효성](spatial-terminology.md#spatial-terminology-validity) 섹션을 참조하세요.

## 구문
<a name="ST_IsValid-function-syntax"></a>

```
ST_IsValid(geom)
```

## 인수
<a name="ST_IsValid-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_IsValid-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_IsValid-function-examples"></a>

다음 SQL은 지정된 다각형이 유효한지 확인합니다. 이 예에서는 다각형 내부가 단순히 연결되어 있지 않기 때문에 다각형이 유효하지 않습니다.

```
SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 0,10 5,5 10,0 5,5 0))'));
```

```
 st_isvalid
-----------
 false
```

# ST\$1Length
<a name="ST_Length-function"></a>

선형 지오메트리의 경우 ST\$1Length는 2D 프로젝션의 데카르트 길이를 반환합니다. 길이 단위는 입력 지오메트리의 좌표가 표현되는 단위와 동일합니다. 이 함수는 점, 다중 점 및 영역 지오메트리에 대해 0을 반환합니다. 입력이 지오메트리 컬렉션인 경우 이 함수는 컬렉션에 있는 지오메트리 길이의 합계를 반환합니다.

지오그래피의 경우 ST\$1Length는 SRID에 의해 결정된 회전 타원체에서 계산된 입력 선형 지오그래피의 2D 투영의 측지 길이를 반환합니다. 길이 단위는 미터입니다. 이 함수는 점, 다중 점 및 영역 지오그래피에 대해 0을 반환합니다. 입력이 지오메트리 컬렉션인 경우 이 함수는 컬렉션에 있는 지오그래피 길이의 합계를 반환합니다.

## 구문
<a name="ST_Length-function-syntax"></a>

```
ST_Length(geo)
```

## 인수
<a name="ST_Length-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Length-function-return"></a>

`DOUBLE PRECISION`

*geo*가 null이면 null이 반환됩니다.

SRID 값을 찾을 수 없으면 오류가 반환됩니다.

## 예제
<a name="ST_Length-function-examples"></a>

다음 SQL은 다중 라인스트링의 데카르트 길이를 반환합니다.

```
SELECT ST_Length(ST_GeomFromText('MULTILINESTRING((0 0,10 0,0 10),(10 0,20 0,20 10))'));
```

```
st_length
--------------------------------
  44.142135623731
```

다음 SQL은 지오그래피에서 라인스트링의 길이를 반환합니다.

```
SELECT ST_Length(ST_GeogFromText('SRID=4326;LINESTRING(5 0,6 0,4 0)'));
```

```
 st_length 
------------------
 333958.472379804
```

다음 SQL은 지오그래피에서 점의 길이를 반환합니다.

```
SELECT ST_Length(ST_GeogFromText('SRID=4326;POINT(4 5)'));
```

```
 st_length 
-----------
 0
```

# ST\$1LengthSphere
<a name="ST_LengthSphere-function"></a>

ST\$1LengthSphere는 선형 지오메트리의 길이(미터 단위)를 반환합니다. 점, 다중 점 및 영역 지오메트리의 경우 ST\$1LengthSphere는 0을 반환합니다. 지오메트리 컬렉션의 경우 ST\$1LengthSphere는 컬렉션에 있는 선형 지오메트리의 총 길이(미터 단위)를 반환합니다.

ST\$1LengthSphere는 입력 지오메트리의 각 점 좌표를 경도 및 위도(도)로 해석합니다. 3DZ, 3DM 또는 4D 지오메트리의 경우 처음 두 좌표만 사용됩니다.

## 구문
<a name="ST_LengthSphere-function-syntax"></a>

```
ST_LengthSphere(geom)
```

## 인수
<a name="ST_LengthSphere-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_LengthSphere-function-return"></a>

`DOUBLE PRECISION` 길이(미터 단위)입니다. 길이 계산은 반지름이 Earth의 WGS(World Geodetic System) 84 타원체 모델의 평균 반지름인 Earth의 구형 모델을 기반으로 합니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_LengthSphere-function-examples"></a>

다음 예제 SQL은 라인스트링의 길이(미터 단위)를 계산합니다.

```
SELECT ST_LengthSphere(ST_GeomFromText('LINESTRING(10 10,45 45)'));
```

```
 st_lengthsphere  
------------------
 5127736.08292556
```

# ST\$1Length2D
<a name="ST_Length2D-function"></a>

ST\$1Length2D는 ST\$1Length의 별칭입니다. 자세한 내용은 [ST\$1Length](ST_Length-function.md) 섹션을 참조하세요.

# ST\$1LineFromMultiPoint
<a name="ST_LineFromMultiPoint-function"></a>

ST\$1LineFromMultiPoint는 입력 다중 점 지오메트리에서 라인스트링을 반환합니다. 점의 순서는 유지됩니다. 반환된 지오메트리의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_LineFromMultiPoint-function-syntax"></a>

```
ST_LineFromMultiPoint(geom)
```

## 인수
<a name="ST_LineFromMultiPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `MULTIPOINT`이어야 합니다.

## 반환 타입
<a name="ST_LineFromMultiPoint-function-return"></a>

`GEOMETRY`

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 `LINESTRING`이 반환됩니다.

*geom*에 빈 점이 포함된 경우 이러한 빈 점은 무시됩니다.

*geom*이 `MULTIPOINT`가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_LineFromMultiPoint-function-examples"></a>

다음 SQL은 다중 점에서 라인스트링을 생성합니다.

```
SELECT ST_AsEWKT(ST_LineFromMultiPoint(ST_GeomFromText('MULTIPOINT(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
 st_asewkt
---------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5,0 5)
```

# ST\$1LineInterpolatePoint
<a name="ST_LineInterpolatePoint-function"></a>

ST\$1LineInterpolatePoint는 선의 시작 부분에서 분수 거리에 있는 선을 따라 점을 반환합니다.

점 동등성을 판별하기 위해 ST\$1LineInterpolatePoint는 입력 지오메트리의 2D 프로젝션에서 작동합니다. 입력 지오메트리가 비어 있으면 해당 복사본이 입력과 동일한 차원으로 반환됩니다. 3DZ, 3DM 및 4D 지오메트리의 경우 `z` 또는 `m` 좌표는 점이 있는 세그먼트의 `z` 또는 `m` 좌표의 평균입니다.

## 구문
<a name="ST_LineInterpolatePoint-function-syntax"></a>

```
ST_LineInterpolatePoint(geom, fraction)
```

## 인수
<a name="ST_LineInterpolatePoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`입니다.

 *fraction*   
선에 대한 라인스트링을 따라 점의 위치를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다. 값은 0\$11(포함) 범위의 분수입니다.

## 반환 타입
<a name="ST_LineInterpolatePoint-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POINT`

*geom* 또는 *fraction*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 점이 반환됩니다.

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

*fraction*이 범위를 벗어나면 오류가 반환됩니다.

*geom*이 라인스트링이 아니면 오류가 반환됩니다.

## 예제
<a name="ST_LineInterpolatePoint-function-examples"></a>

다음 SQL은 라인스트링을 따라 중간 점을 반환합니다.

```
SELECT ST_AsEWKT(ST_LineInterpolatePoint(ST_GeomFromText('LINESTRING(0 0, 5 5, 7 7, 10 10)'), 0.50));
```

```
st_asewkt
-----------
 POINT(5 5)
```

다음 SQL은 라인스트링을 따라 90% 점을 반환합니다.

```
SELECT ST_AsEWKT(ST_LineInterpolatePoint(ST_GeomFromText('LINESTRING(0 0, 5 5, 7 7, 10 10)'), 0.90));
```

```
st_asewkt
-----------
 POINT(9 9)
```

# ST\$1M
<a name="ST_M-function"></a>

ST\$1M은 입력 점의 `m` 좌표를 반환합니다.

## 구문
<a name="ST_M-function-syntax"></a>

```
ST_M(point)
```

## 인수
<a name="ST_M-function-arguments"></a>

 *point*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다.

## 반환 타입
<a name="ST_M-function-return"></a>

`m` 좌표의 `DOUBLE PRECISION` 값입니다.

*point*가 null이면 null이 반환됩니다.

*point*가 2D 또는 3DZ 점이면 null이 반환됩니다.

*point*가 빈 점이면 null이 반환됩니다.

*point*가 `POINT`가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_M-function-examples"></a>

다음 SQL은 3DM 지오메트리에서 점의 `m` 좌표를 반환합니다.

```
SELECT ST_M(ST_GeomFromEWKT('POINT M (1 2 3)'));
```

```
st_m
-----------
 3
```

다음 SQL은 4D 지오메트리에서 점의 `m` 좌표를 반환합니다.

```
SELECT ST_M(ST_GeomFromEWKT('POINT ZM (1 2 3 4)'));
```

```
st_m
-----------
 4
```

# ST\$1MakeEnvelope
<a name="ST_MakeEnvelope-function"></a>

ST\$1MakeEnvelope은 다음과 같이 지오메트리를 반환합니다.
+ 입력 좌표에서 점을 지정하면 반환된 지오메트리는 점입니다.
+ 입력 좌표에서 선을 지정하면 반환된 지오메트리는 라인스트링입니다.
+ 그렇지 않으면 반환된 지오메트리는 입력 좌표가 상자의 왼쪽 아래 모서리와 오른쪽 위 모서리를 지정하는 다각형입니다.

제공되는 경우 반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값으로 설정됩니다.

## 구문
<a name="ST_MakeEnvelope-function-syntax"></a>

```
ST_MakeEnvelope(xmin, ymin, xmax, ymax)
```

```
ST_MakeEnvelope(xmin, ymin, xmax, ymax, srid)
```

## 인수
<a name="ST_MakeEnvelope-function-arguments"></a>

 *xmin*   
 데이터 형식의 값입니다`DOUBLE PRECISION` 이 값은 상자의 왼쪽 아래 모서리의 첫 번째 좌표입니다.

 *ymin*   
 데이터 형식의 값입니다`DOUBLE PRECISION` 이 값은 상자의 왼쪽 아래 모서리의 두 번째 좌표입니다.

 *xmax*   
 데이터 형식의 값입니다`DOUBLE PRECISION` 이 값은 상자의 오른쪽 위 모서리의 첫 번째 좌표입니다.

 *ymax*   
 데이터 형식의 값입니다`DOUBLE PRECISION` 이 값은 상자의 오른쪽 위 모서리의 두 번째 좌표입니다.

 *srid*   
공간 참조 시스템 식별자(SRID)를 나타내는 `INTEGER` 데이터 형식의 값입니다. SRID 값이 제공되지 않으면 0으로 설정됩니다.

## 반환 타입
<a name="ST_MakeEnvelope-function-return"></a>

하위 유형 `POINT`, `LINESTRING` 또는 `POLYGON`의 `GEOMETRY`입니다.

반환된 지오메트리의 SRID는 `srid` 또는 0(`srid`가 설정되지 않은 경우)으로 설정됩니다.

If *xmin*, *ymin*, *xmax*, *ymax* 또는 *srid*가 null이면 null이 반환됩니다.

*srid*가 음수이면 오류가 반환됩니다.

## 예제
<a name="ST_MakeEnvelope-function-examples"></a>

다음 SQL은 4개의 입력 좌표 값으로 정의된 봉투를 나타내는 다각형을 반환합니다.

```
SELECT ST_AsEWKT(ST_MakeEnvelope(2,4,5,7));
```

```
 st_astext
---------------
 POLYGON((2 4,2 7,5 7,5 4,2 4))
```

다음 SQL은 4개의 입력 좌표 값과 SRID 값으로 정의된 봉투를 나타내는 다각형을 반환합니다.

```
SELECT ST_AsEWKT(ST_MakeEnvelope(2,4,5,7,4326));
```

```
 st_astext
----------------------------------
 SRID=4326;POLYGON((2 4,2 7,5 7,5 4,2 4))
```

# ST\$1MakeLine
<a name="ST_MakeLine-function"></a>

ST\$1MakeLine은 입력 지오메트리에서 라인스트링을 생성합니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다. 두 입력 지오메트리의 차원이 같아야 합니다.

## 구문
<a name="ST_MakeLine-function-syntax"></a>

```
ST_MakeLine(geom1, geom2)
```

## 인수
<a name="ST_MakeLine-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`, `LINESTRING`, 또는 `MULTIPOINT`이어야 합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`, `LINESTRING`, 또는 `MULTIPOINT`이어야 합니다.

## 반환 타입
<a name="ST_MakeLine-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`LINESTRING`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1* 및 *geom2*가 빈 점이거나 빈 점을 포함하면 이러한 빈 점은 무시됩니다.

*geom1* 및 *geom2*가 비어 있으면 빈 `LINESTRING`이 반환됩니다.

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 입력 지오메트리의 SRID 값입니다.

*geom1*과 *geom2*의 SRID 값이 다른 경우 오류가 반환됩니다.

*geom1* 또는 *geom2*가 `POINT`, `LINESTRING` 또는 `MULTIPOINT`가 아니면 오류가 반환됩니다.

*geom1*과 *geom2*의 차원이 다른 경우 오류가 반환됩니다.

## 예제
<a name="ST_MakeLine-function-examples"></a>

다음 SQL은 두 개의 입력 라인스트링에서 라인스트링을 구성합니다.

```
SELECT ST_MakeLine(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'), ST_GeomFromText('LINESTRING(88.29 39.07,88.42 39.26,88.27 39.31,88.29 39.07)'));
```

```
st_makeline
-----------
 010200000008000000C3F5285C8F52534052B81E85EB113D407B14AE47E15A5340C3F5285C8F423D40E17A14AE475153408FC2F5285C4F3D40C3F5285C8F52534052B81E85EB113D40C3F5285C8F125640295C8FC2F58843407B14AE47E11A5640E17A14AE47A14340E17A14AE4711564048E17A14AEA74340C3F5285C8F125640295C8FC2F5884340
```

# ST\$1MakePoint
<a name="ST_MakePoint-function"></a>

ST\$1MakePoint는 좌표 값이 입력 값인 점 지오메트리를 반환합니다.

## 구문
<a name="ST_MakePoint-function-syntax"></a>

```
ST_MakePoint(x, y)
```

```
ST_MakePoint(x, y, z)
```

```
ST_MakePoint(x, y, z, m)
```

## 인수
<a name="ST_MakePoint-function-arguments"></a>

 *=x*   
첫 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

 *\$1y*   
두 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

 *z*   
세 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

 *m*   
네 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_MakePoint-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POINT`

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 0으로 설정됩니다.

*x*, *y*, *z* 또는 *m*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_MakePoint-function-examples"></a>

다음 SQL은 제공된 좌표 값을 갖는 `GEOMETRY` 하위 유형의 `POINT` 유형을 반환합니다.

```
SELECT ST_AsText(ST_MakePoint(1,3));
```

```
st_astext
-----------
 POINT(1 3)
```

다음 SQL은 제공된 좌표 값을 갖는 `GEOMETRY` 하위 유형의 `POINT` 유형을 반환합니다.

```
SELECT ST_AsEWKT(ST_MakePoint(1, 2, 3));
```

```
st_asewkt
----------------
 POINT Z (1 2 3)
```

다음 SQL은 제공된 좌표 값을 갖는 `GEOMETRY` 하위 유형의 `POINT` 유형을 반환합니다.

```
SELECT ST_AsEWKT(ST_MakePoint(1, 2, 3, 4));
```

```
st_asewkt
-------------------
 POINT ZM (1 2 3 4)
```

# ST\$1MakePolygon
<a name="ST_MakePolygon-function"></a>

ST\$1MakePolygon에는 다각형을 반환하는 두 가지 변형이 있습니다. 하나는 단일 지오메트리를 사용하고 다른 하나는 2개의 지오메트리를 사용합니다.
+ 첫 번째 변형의 입력은 출력 다각형의 외부 링을 정의하는 라인스트링입니다.
+ 두 번째 변형의 입력은 라인스트링과 다중 라인스트링입니다. 둘 다 비어 있거나 닫혀 있습니다.

  출력 다각형의 외부 링 경계는 입력 라인스트링이고 다각형의 내부 링 경계는 입력 다중 라인스트링의 라인스트링입니다. 입력 라인스트링이 비어 있으면 빈 다각형이 반환됩니다. 다중 라인스트링의 빈 라인스트링은 무시됩니다. 결과 지오메트리의 공간 참조 시스템 식별자(SRID)는 두 입력 지오메트리의 공통 SRID입니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다. 외부 링과 내부 링의 차원이 같아야 합니다.

## 구문
<a name="ST_MakePolygon-function-syntax"></a>

```
ST_MakePolygon(geom1)
```

```
ST_MakePolygon(geom1, geom2)
```

## 인수
<a name="ST_MakePolygon-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다. *linestring* 값은 닫혀 있거나 비어 있어야 합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `MULTILINESTRING`이어야 합니다.

## 반환 타입
<a name="ST_MakePolygon-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POLYGON`

반환된 지오메트리의 공간 참조 시스템 식별자(SRID)는 입력의 SRID와 같습니다.

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*이 라인스트링이 아니면 오류가 반환됩니다.

*geom2*가 다중 라인스트링이 아니면 오류가 반환됩니다.

*geom1*이 닫히지 않으면 오류가 반환됩니다.

*geom1*이 단일 점이거나 닫혀 있지 않으면 오류가 반환됩니다.

*geom2*에 단일 점이 있거나 닫혀 있지 않은 라인스트링이 하나 이상 포함되어 있으면 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID 값이 다른 경우 오류가 반환됩니다.

*geom1*과 *geom2*의 차원이 다른 경우 오류가 반환됩니다.

## 예제
<a name="ST_MakePolygon-function-examples"></a>

다음 SQL은 입력 라인스트링에서 다각형을 반환합니다.

```
SELECT ST_AsText(ST_MakePolygon(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')));
```

```
 st_astext
---------------
POLYGON((77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07))
```

다음 SQL은 닫힌 라인스트링과 닫힌 다중 라인스트링에서 다각형을 생성합니다. 라인스트링은 다각형의 외부 링에 사용됩니다. 다중 라인스트링의 라인스트링은 다각형의 내부 링에 사용됩니다.

```
SELECT ST_AsEWKT(ST_MakePolygon(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,0 10,0 0)'), ST_GeomFromText('MULTILINESTRING((1 1,1 2,2 1,1 1),(3 3,3 4,4 3,3 3))')));
```

```
 st_astext
----------------------------------
POLYGON((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1),(3 3,3 4,4 3,3 3))
```

# ST\$1MemSize
<a name="ST_MemSize-function"></a>

ST\$1MemSize는 입력 지오메트리에서 사용하는 메모리 공간의 양(바이트)을 반환합니다. 이 크기는 지오메트리의 Amazon Redshift 내부 표현에 따라 달라지므로 내부 표현이 변경되면 변경될 수 있습니다. 이 크기를 Amazon Redshift에서 지오메트리 객체의 상대적 크기를 나타내는 표시로 사용할 수 있습니다.

## 구문
<a name="ST_MemSize-function-syntax"></a>

```
ST_MemSize(geom)
```

## 인수
<a name="ST_MemSize-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_MemSize-function-return"></a>

*geom*의 고유한 차원을 나타내는 `INTEGER`입니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_MemSize-function-examples"></a>

다음 SQL은 지오메트리 컬렉션의 메모리 크기를 반환합니다.

```
SELECT ST_MemSize(ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))'))::varchar + ' bytes';
```

```
 ?column?  
-----------
 172 bytes
```

# ST\$1MMax
<a name="ST_MMax-function"></a>

ST\$1MMax는 입력 지오메트리의 최대 `m` 좌표를 반환합니다.

## 구문
<a name="ST_MMax-function-syntax"></a>

```
ST_MMax(geom)
```

## 인수
<a name="ST_MMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_MMax-function-return"></a>

최대 `m` 좌표의 `DOUBLE PRECISION` 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 2D 또는 3DZ 지오메트리이면 null이 반환됩니다.

## 예제
<a name="ST_MMax-function-examples"></a>

다음 SQL은 3DM 지오메트리에서 라인스트링의 가장 큰 `m` 좌표를 반환합니다.

```
SELECT ST_MMax(ST_GeomFromEWKT('LINESTRING M (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_mmax
-----------
  8
```

다음 SQL은 4D 지오메트리에서 라인스트링의 가장 큰 `m` 좌표를 반환합니다.

```
SELECT ST_MMax(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_mmax
-----------
  11
```

# ST\$1MMin
<a name="ST_MMin-function"></a>

ST\$1MMin은 입력 지오메트리의 최소 `m` 좌표를 반환합니다.

## 구문
<a name="ST_MMin-function-syntax"></a>

```
ST_MMin(geom)
```

## 인수
<a name="ST_MMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_MMin-function-return"></a>

최소 `m` 좌표의 `DOUBLE PRECISION` 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 2D 또는 3DZ 지오메트리이면 null이 반환됩니다.

## 예제
<a name="ST_MMin-function-examples"></a>

다음 SQL은 3DM 지오메트리에서 라인스트링의 가장 작은 `m` 좌표를 반환합니다.

```
SELECT ST_MMin(ST_GeomFromEWKT('LINESTRING M (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_mmin
-----------
  2
```

다음 SQL은 4D 지오메트리에서 라인스트링의 가장 작은 `m` 좌표를 반환합니다.

```
SELECT ST_MMin(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_mmin
-----------
  3
```

# ST\$1Multi
<a name="ST_Multi-function"></a>

ST\$1Multi는 지오메트리를 해당 다중 유형으로 변환합니다. 입력 지오메트리가 이미 다중 유형 또는 지오메트리 컬렉션인 경우 해당 지오메트리의 복사본이 반환됩니다. 입력 지오메트리가 점, 라인스트링 또는 다각형이면 입력 지오메트리를 포함하는 다중 점, 다중 라인스트링 또는 다중 다각형이 반환됩니다.

## 구문
<a name="ST_Multi-function-syntax"></a>

```
ST_Multi(geom)
```

## 인수
<a name="ST_Multi-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Multi-function-return"></a>

하위 유형이 `MULTIPOINT`, `MULTILINESTRING`, `MULTIPOLYGON` 또는 `GEOMETRYCOLLECTION`인 `GEOMETRY`입니다.

반환된 지오메트리의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_Multi-function-examples"></a>

다음 SQL은 입력 다중 점에서 다중 점을 반환합니다.

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('MULTIPOINT((1 2),(3 4))', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;MULTIPOINT((1 2),(3 4))
```

다음 SQL은 입력 점에서 다중 점을 반환합니다.

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('POINT(1 2)', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;MULTIPOINT((1 2))
```

다음 SQL은 입력 지오메트리 컬렉션의 지오메트리 컬렉션을 반환합니다.

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('GEOMETRYCOLLECTION(POINT(1 2),MULTIPOINT((1 2),(3 4)))', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),MULTIPOINT((1 2),(3 4)))
```

# ST\$1NDims
<a name="ST_NDims-function"></a>

ST\$1NDims는 지오메트리의 좌표 차원을 반환합니다. ST\$1NDims는 지오메트리의 토폴로지 차원을 고려하지 않습니다. 대신 지오메트리의 차원에 따라 상수 값을 반환합니다.

## 구문
<a name="ST_NDims-function-syntax"></a>

```
ST_NDims(geom)
```

## 인수
<a name="ST_NDims-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NDims-function-return"></a>

*geom*의 고유한 차원을 나타내는 `INTEGER`입니다.

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 반환 값 | 입력 지오메트리의 차원 | 
| --- | --- | 
| 2 | 2D | 
| 3 | 3DZ 또는 3DM | 
| 4 | 4D | 

## 예제
<a name="ST_NDims-function-examples"></a>

다음 SQL은 2D 라인스트링의 차원 수를 반환합니다.

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING(0 0,1 1,2 2,0 0)'));
```

```
st_ndims
-------------
 2
```

다음 SQL은 3DZ 라인스트링의 차원 수를 반환합니다.

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING Z(0 0 3,1 1 3,2 2 3,0 0 3)'));
```

```
st_ndims
-------------
 3
```

다음 SQL은 3DM 라인스트링의 차원 수를 반환합니다.

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING M(0 0 4,1 1 4,2 2 4,0 0 4)'));
```

```
st_ndims
-------------
 3
```

다음 SQL은 4D 라인스트링의 차원 수를 반환합니다.

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING ZM(0 0 3 4,1 1 3 4,2 2 3 4,0 0 3 4)'));
```

```
st_ndims
-------------
 4
```

# ST\$1NPoints
<a name="ST_NPoints-function"></a>

ST\$1NPoints는 입력 지오메트리 또는 지오그래피의 비어 있지 않은 점 수를 반환합니다.

## 구문
<a name="ST_NPoints-function-syntax"></a>

```
ST_NPoints(geo)
```

## 인수
<a name="ST_NPoints-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NPoints-function-return"></a>

`INTEGER`

*geo*가 빈 점이면 `0`이 반환됩니다.

*geo*가 null이면 null이 반환됩니다.

## 예제
<a name="ST_NPoints-function-examples"></a>

다음 SQL은 라인스트링의 점 수를 반환합니다.

```
SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_npoints
-------------
 4
```

다음 SQL은 지오그래피에서 라인스트링의 점 수를 반환합니다.

```
SELECT ST_NPoints(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
st_npoints
-------------
 4
```

# ST\$1NRings
<a name="ST_NRings-function"></a>

ST\$1NRings는 입력 지오메트리의 링 수를 반환합니다.

## 구문
<a name="ST_NRings-function-syntax"></a>

```
ST_NRings(geom)
```

## 인수
<a name="ST_NRings-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NRings-function-return"></a>

`INTEGER`

*geom*이 null이면 null이 반환됩니다.

값은 다음과 같이 반환됩니다.


| 반환 값 | 지오메트리 하위 유형 | 
| --- | --- | 
| 0 | *geom*이 `POINT`, `LINESTRING`, `MULTIPOINT` 또는`MULTILINESTRING` 하위 유형인 경우 반환됩니다. | 
| 링 수 | *geom*이 `POLYGON` 또는 `MULTIPOLYGON` 하위 유형인 경우 반환됩니다. | 
| 모든 구성 요소의 링 수 | *geom*이 `GEOMETRYCOLLECTION` 하위 유형인 경우 반환됩니다. | 

## 예제
<a name="ST_NRings-function-examples"></a>

다음 SQL은 다중 다각형의 링 수를 반환합니다.

```
SELECT ST_NRings(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((0 0,-10 0,0 -10,0 0)))'));
```

```
 st_nrings
-------------
 2
```

# ST\$1NumGeometries
<a name="ST_NumGeometries-function"></a>

ST\$1NumGeometries는 입력 지오메트리의 지오메트리 수를 반환합니다.

## 구문
<a name="ST_NumGeometries-function-syntax"></a>

```
ST_NumGeometries(geom)
```

## 인수
<a name="ST_NumGeometries-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NumGeometries-function-return"></a>

*geom*의 지오메트리 수를 나타내는 `INTEGER`입니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있는 단일 지오메트리이면 `0`이 반환됩니다.

*geom*이 비어 있지 않은 단일 지오메트리이면 `1`이 반환됩니다.

*geom*이 `GEOMETRYCOLLECTION` 또는 `MULTI` 하위 유형인 경우 지오메트리 수가 반환됩니다.

## 예제
<a name="ST_NumGeometries-function-examples"></a>

다음 SQL은 입력 다중 라인스트링의 지오메트리 수를 반환합니다.

```
SELECT ST_NumGeometries(ST_GeomFromText('MULTILINESTRING((0 0,1 0,0 5),(3 4,13 26))'));
```

```
st_numgeometries
-------------
 2
```

# ST\$1NumInteriorRings
<a name="ST_NumInteriorRings-function"></a>

ST\$1NumInteriorRings는 입력 다각형 지오메트리의 링 수를 반환합니다.

## 구문
<a name="ST_NumInteriorRings-function-syntax"></a>

```
ST_NumInteriorRings(geom)
```

## 인수
<a name="ST_NumInteriorRings-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NumInteriorRings-function-return"></a>

`INTEGER`

*geom*이 null이면 null이 반환됩니다.

*geom*이 다각형이 아니면 null이 반환됩니다.

## 예제
<a name="ST_NumInteriorRings-function-examples"></a>

다음 SQL은 입력 다각형의 내부 링 수를 반환합니다.

```
SELECT ST_NumInteriorRings(ST_GeomFromText('POLYGON((0 0,100 0,100 100,0 100,0 0),(1 1,1 5,5 1,1 1),(7 7,7 8,8 7,7 7))'));
```

```
 st_numinteriorrings
-------------
 2
```

# ST\$1NumPoints
<a name="ST_NumPoints-function"></a>

ST\$1NumPoints는 입력 지오메트리의 점 수를 반환합니다.

## 구문
<a name="ST_NumPoints-function-syntax"></a>

```
ST_NumPoints(geom)
```

## 인수
<a name="ST_NumPoints-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_NumPoints-function-return"></a>

`INTEGER`

*geom*이 null이면 null이 반환됩니다.

*geom*이 하위 유형 `LINESTRING`이 아니면 null이 반환됩니다.

## 예제
<a name="ST_NumPoints-function-examples"></a>

다음 SQL은 입력 라인스트링의 점 수를 반환합니다.

```
SELECT ST_NumPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_numpoints
-------------
4
```

입력 *geom*이 하위 유형 `LINESTRING`이 아니기 때문에 다음 SQL이 null을 반환합니다.

```
SELECT ST_NumPoints(ST_GeomFromText('MULTIPOINT(1 2,3 4)'));
```

```
st_numpoints
-------------
```

# ST\$1Perimeter
<a name="ST_Perimeter-function"></a>

입력 영역 지오메트리의 경우 ST\$1Perimeter는 2D 프로젝션의 데카르트 둘레(경계의 길이)를 반환합니다. 둘레 단위는 입력 지오메트리의 좌표가 표현되는 단위와 동일합니다. 이 함수는 점, 다중 점 및 선형 지오메트리에 대해 0을 반환합니다. 입력이 지오메트리 컬렉션인 경우 이 함수는 컬렉션에 있는 지오메트리 둘레의 합계를 반환합니다.

입력 지오그래피의 경우 ST\$1Perimeter는 SRID에 의해 결정된 회전 타원체에서 계산된 입력 영역 지오그래피의 2D 투영의 측지 둘레(경계 길이)를 반환합니다. 둘레 단위는 미터입니다. 이 함수는 점, 다중 점 및 선형 지오그래피에 대해 0을 반환합니다. 입력이 지오메트리 컬렉션인 경우 이 함수는 컬렉션에 있는 지오그래피 둘레의 합계를 반환합니다.

## 구문
<a name="ST_Perimeter-function-syntax"></a>

```
ST_Perimeter(geo)
```

## 인수
<a name="ST_Perimeter-function-arguments"></a>

 *geo*   
`GEOMETRY` 또는 `GEOGRAPHY` 데이터 유형의 값이나 `GEOMETRY` 또는 `GEOGRAPHY` 유형으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Perimeter-function-return"></a>

`DOUBLE PRECISION`

*geo*가 null이면 null이 반환됩니다.

SRID 값을 찾을 수 없으면 오류가 반환됩니다.

## 예제
<a name="ST_Perimeter-function-examples"></a>

다음 SQL은 다중 다각형의 데카르트 둘레를 반환합니다.

```
SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_perimeter
--------------------------------
    68.2842712474619
```

다음 SQL은 다중 다각형의 데카르트 둘레를 반환합니다.

```
SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_perimeter
--------------------------------
    68.2842712474619
```

다음 SQL은 지오그래피에서 다각형의 둘레를 반환합니다.

```
SELECT ST_Perimeter(ST_GeogFromText('SRID=4326;POLYGON((0 0,1 0,0 1,0 0))'));
```

```
 st_perimeter 
------------------
 378790.428393693
```

다음 SQL은 지오그래피에서 라인스트링의 둘레를 반환합니다.

```
SELECT ST_Perimeter(ST_GeogFromText('SRID=4326;LINESTRING(5 0,10 0)'));
```

```
 st_perimeter 
--------------
 0
```

# ST\$1Perimeter2D
<a name="ST_Perimeter2D-function"></a>

ST\$1Perimeter2D는 ST\$1Perimeter의 별칭입니다. 자세한 내용은 [ST\$1Perimeter](ST_Perimeter-function.md) 섹션을 참조하세요.

# ST\$1Point
<a name="ST_Point-function"></a>

ST\$1Point는 입력 좌표 값에서 점 지오메트리를 반환합니다.

## 구문
<a name="ST_Point-function-syntax"></a>

```
ST_Point(x, y)
```

## 인수
<a name="ST_Point-function-arguments"></a>

 *=x*   
첫 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

 *\$1y*   
두 번째 좌표를 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_Point-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POINT`

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 0으로 설정됩니다.

*x* 또는 *y*가 null이면 null이 반환됩니다.

## 예제
<a name="ST_Point-function-examples"></a>

다음 SQL은 입력 좌표에서 점 지오메트리를 구성합니다.

```
SELECT ST_AsText(ST_Point(5.0, 7.0));
```

```
st_astext
-------------
POINT(5 7)
```

# ST\$1PointN
<a name="ST_PointN-function"></a>

ST\$1PointN은 인덱스 값으로 지정된 라인스트링의 점을 반환합니다. 음수 인덱스 값은 라인스트링 끝에서 역방향으로 계산되므로 -1이 마지막 점입니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_PointN-function-syntax"></a>

```
ST_PointN(geom, index)
```

## 인수
<a name="ST_PointN-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

 * 인덱스*   
라인스트링에 있는 점의 인덱스를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_PointN-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POINT`

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 0으로 설정됩니다.

*geom* 또는 *index*가 null이면 null이 반환됩니다.

*index*가 범위를 벗어난 경우 null이 반환됩니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 `LINESTRING`이 아니면 null이 반환됩니다.

## 예제
<a name="ST_PointN-function-examples"></a>

다음 SQL은 `LINESTRING` 객체에 대한 6개의 점 `GEOMETRY`의 EWKT(Extended Well-Known Text) 표현을 반환하고 라인스트링의 인덱스 5에 있는 점을 반환합니다.

```
SELECT ST_AsEWKT(ST_PointN(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5,0 0)',4326), 5));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 5)
```

# ST\$1Points
<a name="ST_Points-function"></a>

ST\$1Points는 입력 지오메트리의 비어 있지 않은 모든 점을 포함하는 다중 점 지오메트리를 반환합니다. ST\$1Points는 링 지오메트리의 시작 점과 끝 점을 포함하여 입력에 중복된 점을 제거하지 않습니다.

## 구문
<a name="ST_Points-function-syntax"></a>

```
ST_Points(geom)
```

## 인수
<a name="ST_Points-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Points-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`MULTIPOINT`

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 *geom*과 같습니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 빈 다중 점이 반환됩니다.

## 예제
<a name="ST_Points-function-examples"></a>

다음 SQL 예는 입력 지오메트리에서 다중 점 지오메트리를 구성합니다. 결과는 입력 지오메트리의 비어 있지 않은 점을 포함하는 다중 점 지오메트리입니다.

```
SELECT ST_AsEWKT(ST_Points(ST_SetSRID(ST_GeomFromText('LINESTRING(1 0,2 0,3 0)'), 4326)));
```

```
st_asewkt
-------------
SRID=4326;MULTIPOINT((1 0),(2 0),(3 0))
```

```
SELECT ST_AsEWKT(ST_Points(ST_SetSRID(ST_GeomFromText('MULTIPOLYGON(((0 0,1 0,0 1,0 0)))'), 4326)));
```

```
st_asewkt
-------------
SRID=4326;MULTIPOINT((0 0),(1 0),(0 1),(0 0))
```

# ST\$1Polygon
<a name="ST_Polygon-function"></a>

ST\$1Polygon은 외부 링이 SRID(공간 참조 시스템 식별자)에 대해 입력된 값을 갖는 입력 라인스트링인 다각형 지오메트리를 반환합니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_Polygon-function-syntax"></a>

```
ST_Polygon(linestring, srid)
```

## 인수
<a name="ST_Polygon-function-arguments"></a>

 *linestring*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 라인스트링을 나타내는 `LINESTRING`이어야 합니다. *linestring* 값은 닫혀 있어야 합니다.

 *srid*   
SRID를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_Polygon-function-return"></a>

`GEOMETRY` 하위 유형의 입니다.`POLYGON`

반환된 지오메트리의 SRID 값은 *srid*로 설정됩니다.

*linestring* 또는 *srid*가 null이면 null이 반환됩니다.

*linestring*이 라인스트링이 아니면 오류가 반환됩니다.

*linestring*이 닫혀 있지 않으면 오류가 반환됩니다.

*srid*가 음수이면 오류가 반환됩니다.

## 예제
<a name="ST_Polygon-function-examples"></a>

다음 SQL은 SRID 값으로 다각형을 구성합니다.

```
SELECT ST_AsEWKT(ST_Polygon(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'),4356));
```

```
st_asewkt
-------------
 SRID=4356;POLYGON((77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07))
```

# ST\$1RemovePoint
<a name="ST_RemovePoint-function"></a>

ST\$1RemovePoint는 인덱스 위치에서 입력 지오메트리의 점이 제거된 라인스트링 지오메트리를 반환합니다.

인덱스는 0부터 시작합니다. 결과의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리와 동일합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_RemovePoint-function-syntax"></a>

```
ST_RemovePoint(geom, index)
```

## 인수
<a name="ST_RemovePoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

 * 인덱스*   
0부터 시작하는 인덱스의 위치를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_RemovePoint-function-return"></a>

`GEOMETRY` 

*geom* 또는 *index*가 null이면 null이 반환됩니다.

*geom*이 하위 유형 `LINESTRING`이 아니면 오류가 반환됩니다.

*index*가 범위를 벗어나면 오류가 반환됩니다. 인덱스 위치에 대한 유효한 값은 0과 `ST_NumPoints(geom)` - 1 사이의 값입니다.

## 예제
<a name="ST_RemovePoint-function-examples"></a>

다음 SQL은 라인스트링의 마지막 점을 제거합니다.

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_RemovePoint(g, ST_NumPoints(g) - 1)) FROM tmp;
```

```
   st_asewkt
-----------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5)
```

# ST\$1Reverse
<a name="ST_Reverse-function"></a>

ST\$1Reverse는 선형 및 영역 지오메트리의 꼭짓점 순서를 반대로 합니다. 점 또는 다중 점 지오메트리의 경우 원래 지오메트리의 복사본이 반환됩니다. 지오메트리 컬렉션의 경우 ST\$1Reverse는 컬렉션의 각 지오메트리 꼭짓점 순서를 반대로 합니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_Reverse-function-syntax"></a>

```
ST_Reverse(geom)
```

## 인수
<a name="ST_Reverse-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Reverse-function-return"></a>

`GEOMETRY` 

반환된 지오메트리의 SRID(공간 참조 시스템 식별자)는 입력 지오메트리의 값과 동일합니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_Reverse-function-examples"></a>

다음 SQL은 라인스트링에서 점의 순서를 반대로 합니다.

```
SELECT ST_AsEWKT(ST_Reverse(ST_GeomFromText('LINESTRING(1 0,2 0,3 0,4 0)', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;LINESTRING(4 0,3 0,2 0,1 0)
```

# ST\$1SetPoint
<a name="ST_SetPoint-function"></a>

ST\$1SetPoint는 인덱스에 의해 지정된 입력 라인스트링의 위치와 관련하여 업데이트된 좌표가 있는 라인스트링을 반환합니다. 새 좌표는 입력 점의 좌표입니다.

반환된 지오메트리의 차원은 *geom1* 값의 차원과 같습니다. *geom1*과 *geom2*의 차원이 다른 경우 *geom2*는 *geom1*의 차원에 나타납니다.

## 구문
<a name="ST_SetPoint-function-syntax"></a>

```
ST_SetPoint(geom1, index, geom2)
```

## 인수
<a name="ST_SetPoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

 * 인덱스*   
인덱스의 위치를 나타내는 `INTEGER` 데이터 형식의 값입니다. `0`은 라인스트링의 왼쪽에서 첫 번째 점을 가리키고, `1`은 두 번째 점을 가리킵니다. 인덱스는 음수 값일 수 있습니다. `-1`은 라인스트링의 오른쪽에서 첫 번째 점을 가리키고, `-2`는 라인스트링의 오른쪽에서 두 번째 점을 가리킵니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `POINT`이어야 합니다.

## 반환 타입
<a name="ST_SetPoint-function-return"></a>

`GEOMETRY`

*geom2*가 빈 점이면 *geom1*이 반환됩니다.

*geom1*, *geom2* 또는 *index*가 null이면 null이 반환됩니다.

*geom1*이 라인스트링이 아니면 오류가 반환됩니다.

*index*가 유효한 인덱스 범위 내에 있지 않으면 오류가 반환됩니다.

*geom2*가 점이 아니면 오류가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

## 예제
<a name="ST_SetPoint-function-examples"></a>

다음 SQL은 입력 라인스트링의 두 번째 점을 지정된 점으로 설정한 새로운 라인스트링을 반환합니다.

```
SELECT ST_AsText(ST_SetPoint(ST_GeomFromText('LINESTRING(1 2, 3 2, 5 2, 1 2)'), 2, ST_GeomFromText('POINT(7 9)')));
```

```
st_astext              
-------------
 LINESTRING(1 2,3 2,7 9,1 2)
```

다음 SQL 예는 라인스트링의 오른쪽에서 세 번째 점(인덱스가 음수임)를 지정된 점으로 설정한 새로운 라인스트링을 반환합니다.

```
SELECT ST_AsText(ST_SetPoint(ST_GeomFromText('LINESTRING(1 2, 3 2, 5 2, 1 2)'), -3, ST_GeomFromText('POINT(7 9)')));
```

```
st_astext              
-------------
 LINESTRING(1 2,7 9,5 2,1 2)
```

# ST\$1SetSRID
<a name="ST_SetSRID-function"></a>

ST\$1SetSRID는 SRID(공간 참조 시스템 식별자)에 대한 입력 값으로 업데이트된 것을 제외하고 입력 지오메트리와 동일한 지오메트리를 반환합니다.

## 구문
<a name="ST_SetSRID-function-syntax"></a>

```
ST_SetSRID(geom, srid)
```

## 인수
<a name="ST_SetSRID-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *srid*   
SRID를 나타내는 `INTEGER` 데이터 형식의 값입니다.

## 반환 타입
<a name="ST_SetSRID-function-return"></a>

`GEOMETRY`

반환된 지오메트리의 SRID 값은 *srid*로 설정됩니다.

*geom* 또는 *srid*가 null이면 null이 반환됩니다.

*srid*가 음수이면 오류가 반환됩니다.

## 예제
<a name="ST_SetSRID-function-examples"></a>

다음 SQL은 라인스트링의 SRID 값을 설정합니다.

```
SELECT ST_AsEWKT(ST_SetSRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'),50));
```

```
st_asewkt
-------------
 SRID=50;LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)
```

# ST\$1Simplify
<a name="ST_Simplify-function"></a>

ST\$1Simplify는 주어진 허용치로 Ramer-Douglas-Peucker 알고리즘을 사용하여 입력 지오메트리의 단순화된 복사본을 반환합니다. 입력 지오메트리의 토폴로지가 유지되지 않을 수 있습니다. 알고리즘에 대한 자세한 내용은 Wikipedia의 [Ramer–Douglas–Peucker algorithm](https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm)을 참조하세요.

ST\$1Simplify가 지오메트리를 단순화하기 위해 거리를 계산할 때 ST\$1Simplify는 입력 지오메트리의 2D 프로젝션에서 작동합니다.

## 구문
<a name="ST_Simplify-function-syntax"></a>

```
ST_Simplify(geom, tolerance)
```

## 인수
<a name="ST_Simplify-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *tolerance*   
Ramer-Douglas-Peucker 알고리즘의 허용치 수준을 나타내는 `DOUBLE PRECISION` 데이터 형식의 값입니다. *tolerance*가 음수이면 0이 사용됩니다.

## 반환 타입
<a name="ST_Simplify-function-return"></a>

`GEOMETRY`. 

반환된 지오메트리의 공간 참조 시스템 식별자(SRID) 값은 입력 지오메트리의 SRID 값입니다.

반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_Simplify-function-examples"></a>

다음 SQL은 Ramer-Douglas-Peucker 알고리즘과 함께 유클리드 거리 허용치 1을 사용하여 입력 라인스트링을 단순화합니다. 거리의 단위는 지오메트리 좌표의 단위와 같습니다.

```
SELECT ST_AsEWKT(ST_Simplify(ST_GeomFromText('LINESTRING(0 0,1 2,1 1,2 2,2 1)'), 1));
```

```
 st_asewkt
-----------
LINESTRING(0 0,1 2,2 1)
```

# ST\$1SRID
<a name="ST_SRID-function"></a>

ST\$1SRID는 입력 지오메트리의 SRID(공간 참조 시스템 식별자)를 반환합니다. SRID에 대한 자세한 내용은 [Amazon Redshift에서 공간 데이터 쿼리](geospatial-overview.md) 단원을 참조하세요.

## 구문
<a name="ST_SRID-function-syntax"></a>

```
ST_SRID(geom)
```

## 인수
<a name="ST_SRID-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_SRID-function-return"></a>

*geom*의 SRID 값을 나타내는 `INTEGER`입니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_SRID-function-examples"></a>

다음 SQL은 SRID `4326`으로 설정된 라인 문자열의 SRID 값을 반환합니다.

```
SELECT ST_SRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)',4326));
```

```
st_srid
-------------
 4326
```

다음 SQL은 생성 시 설정되지 않은 라인 문자열의 SRID 값을 반환합니다. 그 결과 SRID 값은 `0`이 됩니다.

```
SELECT ST_SRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_srid
-------------
 0
```

# ST\$1StartPoint
<a name="ST_StartPoint-function"></a>

ST\$1StartPoint는 입력 라인스트링의 첫 번째 점을 반환합니다. 결과의 SRID(공간 참조 시스템 식별자) 값은 입력 지오메트리의 값과 동일합니다. 반환된 지오메트리의 차원은 입력 지오메트리의 차원과 같습니다.

## 구문
<a name="ST_StartPoint-function-syntax"></a>

```
ST_StartPoint(geom)
```

## 인수
<a name="ST_StartPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 하위 유형은 `LINESTRING`이어야 합니다.

## 반환 타입
<a name="ST_StartPoint-function-return"></a>

`GEOMETRY` 

*geom*이 null이면 null이 반환됩니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 `LINESTRING`이 아니면 null이 반환됩니다.

## 예제
<a name="ST_StartPoint-function-examples"></a>

다음 SQL은 `LINESTRING` 객체에 대한 4개의 점 `GEOMETRY`의 EWKT(Extended Well-Known Text) 표현을 반환하고 라인스트링의 시작 지점을 반환합니다.

```
SELECT ST_AsEWKT(ST_StartPoint(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 0)
```

# ST\$1Touches
<a name="ST_Touches-function"></a>

ST\$1Touches는 두 입력 지오메트리의 2D 프로젝션이 접촉하면 true를 반환합니다. 두 지오메트리가 비어 있지 않고 교차하며 공통된 내부 점이 없는 경우 두 지오메트리가 접촉합니다.

## 구문
<a name="ST_Touches-function-syntax"></a>

```
ST_Touches(geom1, geom2)
```

## 인수
<a name="ST_Touches-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Touches-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Touches-function-examples"></a>

다음 SQL은 다각형이 라인스트링과 접촉하는지 확인합니다.

```
SELECT ST_Touches(ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))'), ST_GeomFromText('LINESTRING(20 10,20 0,10 0)'));
```

```
 st_touches              
-------------
 t
```

# ST\$1Transform
<a name="ST_Transform-function"></a>

ST\$1Transform은 입력 공간 참조 시스템 식별자(SRID)에 의해 정의된 공간 참조 시스템에서 변환된 좌표가 있는 새 지오메트리를 반환합니다.

## 구문
<a name="ST_Transform-function-syntax"></a>

```
ST_Transform(geom, srid)
```

## 인수
<a name="ST_Transform-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *srid*   
SRID를 나타내는 `INTEGER` 데이터 유형의 값입니다.

## 반환 타입
<a name="ST_Transform-function-return"></a>

`GEOMETRY`.

반환된 지오메트리의 SRID 값은 *srid*로 설정됩니다.

*geom* 또는 *srid*가 null이면 null이 반환됩니다.

입력 *geom*과 연결된 SRID 값이 없으면 오류가 반환됩니다.

*srid*가 없으면 오류가 반환됩니다.

## 예제
<a name="ST_Transform-function-examples"></a>

다음 SQL은 빈 지오메트리 컬렉션의 SRID를 변환합니다.

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY', 3857), 4326));
```

```
             st_asewkt
------------------------------------
 SRID=4326;GEOMETRYCOLLECTION EMPTY
```

다음 SQL은 라인스트링의 SRID를 변환합니다.

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9, -22 -33)', 4326), 26918));
```

```
                                                                                            st_asewkt
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=26918;LINESTRING(73106.6977300955 15556182.9688576,14347201.5059964 1545178.32934967,1515090.41262989 9522193.25115316,10491250.83295 2575457.28410878,5672303.72135968 -5233682.61176205)
```

다음 SQL은 다각형의 SRID를 변환합니다.

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('POLYGON Z ((-10 10 -7, -65 10 -6, -10 64 -5, -10 10 -7), (-11 11 5, -11 12 6, -12 11 7, -11 11 5))', 6989), 6317));
```

```
                                                                                                                                                                                                                      st_asewkt
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=6317;POLYGON Z ((6186430.2771091 -1090834.57212608 1100247.33216237,2654831.67853801 -5693304.90741276 1100247.50581055,2760987.41750022 -486836.575101877 5709710.44137268,6186430.2771091 -1090834.57212608 1100247.33216237),(6146675.25029258 -1194792.63532103 1209007.1115113,6125027.87562215 -1190584.81194058 1317403.77865723,6124888.99555252 -1301885.3455052 1209007.49312929,6146675.25029258 -1194792.63532103 1209007.1115113))
```

# ST\$1Union
<a name="ST_Union-function"></a>

ST\$1Union은 두 지오메트리의 유니언을 나타내는 지오메트리를 반환합니다. 즉, 입력 지오메트리를 병합하여 겹치지 않는 결과 형상을 생성합니다.

## 구문
<a name="ST_Union-function-syntax"></a>

```
ST_Union(geom1, geom2)
```

## 인수
<a name="ST_Union-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Union-function-return"></a>

`GEOMETRY`

반환된 지오메트리의 SRID(공간 참조 시스템 식별자) 값은 입력 지오메트리의 SRID 값입니다.

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1* 또는 *geom2*가 비어 있으면 빈 지오메트리가 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 같지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션, 라인스트링 또는 다중 라인스트링인 경우 오류가 반환됩니다.

*geom1* 또는 *geom2*가 2차원(2D) 지오메트리가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Union-function-examples"></a>

다음 SQL은 두 입력 지오메트리의 유니언을 나타내는 비어 있지 않은 지오메트리를 반환합니다.

```
SELECT ST_AsEWKT(ST_Union(ST_GeomFromText('POLYGON((0 0,100 100,0 200,0 0))'), ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))')));
```

```
        st_asewkt        
-------------------------
 POLYGON((0 0,0 200,100 100,5 5,10 0,0 0))
```

# ST\$1Within
<a name="ST_Within-function"></a>

ST\$1Within은 첫 번째 입력 지오메트리의 2D 프로젝션이 두 번째 입력 지오메트리의 2D 프로젝션 내에 있는 경우 true를 반환합니다.

예를 들어 지오메트리 `A`의 모든 점이 지오메트리 `B`의 점이고 그 내부에 비어 있지 않은 교차점이 있는 경우, `A`는 `B` 내부에 있습니다.

ST\$1Within(`A`, `B`)는 ST\$1Contains(`B`, `A`)와 동등합니다.

## 구문
<a name="ST_Within-function-syntax"></a>

```
ST_Within(geom1, geom2)
```

## 인수
<a name="ST_Within-function-arguments"></a>

 *geom1*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다. 이 값을 *geom2*와 비교하여 *geom2* 내부에 있는지 판별합니다.

 *geom2*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_Within-function-return"></a>

`BOOLEAN`

*geom1* 또는 *geom2*가 null이면 null이 반환됩니다.

*geom1*과 *geom2*의 SRID(공간 참조 시스템 식별자) 값이 동일하지 않으면 오류가 반환됩니다.

*geom1* 또는 *geom2*가 지오메트리 컬렉션인 경우 오류가 반환됩니다.

## 예제
<a name="ST_Within-function-examples"></a>

다음 SQL은 첫 번째 다각형이 두 번째 다각형 내부에 있는지 확인합니다.

```
SELECT ST_Within(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_within
-----------
 true
```

# ST\$1X
<a name="ST_X-function"></a>

ST\$1X는 입력 점의 첫 번째 좌표를 반환합니다.

## 구문
<a name="ST_X-function-syntax"></a>

```
ST_X(point)
```

## 인수
<a name="ST_X-function-arguments"></a>

 *point*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다.

## 반환 타입
<a name="ST_X-function-return"></a>

`DOUBLE PRECISION`첫 번째 좌표의 값입니다.

*point*가 null이면 null이 반환됩니다.

*point*가 빈 점이면 null이 반환됩니다.

*point*가 `POINT`가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_X-function-examples"></a>

다음 SQL은 점의 첫 번째 좌표를 반환합니다.

```
SELECT ST_X(ST_Point(1,2));
```

```
st_x
-----------
 1.0
```

# ST\$1XMax
<a name="ST_XMax-function"></a>

ST\$1XMax는 입력 지오메트리의 최대 첫 번째 좌표를 반환합니다.

## 구문
<a name="ST_XMax-function-syntax"></a>

```
ST_XMax(geom)
```

## 인수
<a name="ST_XMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_XMax-function-return"></a>

`DOUBLE PRECISION`최대 첫 번째 좌표의 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_XMax-function-examples"></a>

다음 SQL은 라인스트링의 가장 큰 첫 번째 좌표를 반환합니다.

```
SELECT ST_XMax(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_xmax
-----------
 77.42
```

# ST\$1XMin
<a name="ST_XMin-function"></a>

ST\$1XMin은 입력 지오메트리의 최소 첫 번째 좌표를 반환합니다.

## 구문
<a name="ST_XMin-function-syntax"></a>

```
ST_XMin(geom)
```

## 인수
<a name="ST_XMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_XMin-function-return"></a>

`DOUBLE PRECISION`최소 첫 번째 좌표의 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_XMin-function-examples"></a>

다음 SQL은 라인스트링의 가장 작은 첫 번째 좌표를 반환합니다.

```
SELECT ST_XMin(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_xmin
-----------
 77.27
```

# ST\$1Y
<a name="ST_Y-function"></a>

ST\$1Y는 입력 점의 두 번째 좌표를 반환합니다.

## 구문
<a name="ST_Y-function-syntax"></a>

```
ST_Y(point)
```

## 인수
<a name="ST_Y-function-arguments"></a>

 *point*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다.

## 반환 타입
<a name="ST_Y-function-return"></a>

`DOUBLE PRECISION`두 번째 좌표의 값입니다.

*point*가 null이면 null이 반환됩니다.

*point*가 빈 점이면 null이 반환됩니다.

*point*가 `POINT`가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Y-function-examples"></a>

다음 SQL은 점의 두 번째 좌표를 반환합니다.

```
SELECT ST_Y(ST_Point(1,2));
```

```
st_y
-----------
 2.0
```

# ST\$1YMax
<a name="ST_YMax-function"></a>

ST\$1YMax는 입력 지오메트리의 최대 두 번째 좌표를 반환합니다.

## 구문
<a name="ST_YMax-function-syntax"></a>

```
ST_YMax(geom)
```

## 인수
<a name="ST_YMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_YMax-function-return"></a>

`DOUBLE PRECISION`최대 두 번째 좌표의 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_YMax-function-examples"></a>

다음 SQL은 라인스트링의 가장 큰 두 번째 좌표를 반환합니다.

```
SELECT ST_YMax(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_ymax
-----------
 29.31
```

# ST\$1YMin
<a name="ST_YMin-function"></a>

ST\$1YMin은 입력 지오메트리의 최소 두 번째 좌표를 반환합니다.

## 구문
<a name="ST_YMin-function-syntax"></a>

```
ST_YMin(geom)
```

## 인수
<a name="ST_YMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_YMin-function-return"></a>

`DOUBLE PRECISION`최소 두 번째 좌표의 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="ST_YMin-function-examples"></a>

다음 SQL은 라인스트링의 가장 작은 두 번째 좌표를 반환합니다.

```
SELECT ST_YMin(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_ymin
-----------
 29.07
```

# ST\$1Z
<a name="ST_Z-function"></a>

ST\$1Z은 입력 점의 `z` 좌표를 반환합니다.

## 구문
<a name="ST_Z-function-syntax"></a>

```
ST_Z(point)
```

## 인수
<a name="ST_Z-function-arguments"></a>

 *point*   
`POINT` 데이터 형식의 `GEOMETRY` 값입니다.

## 반환 타입
<a name="ST_Z-function-return"></a>

`m` 좌표의 `DOUBLE PRECISION` 값입니다.

*point*가 null이면 null이 반환됩니다.

*point*가 2D 또는 3DM 점이면 null이 반환됩니다.

*point*가 빈 점이면 null이 반환됩니다.

*point*가 `POINT`가 아니면 오류가 반환됩니다.

## 예제
<a name="ST_Z-function-examples"></a>

다음 SQL은 3DZ 지오메트리에서 점의 `z` 좌표를 반환합니다.

```
SELECT ST_Z(ST_GeomFromEWKT('POINT Z (1 2 3)'));
```

```
st_z
-----------
 3
```

다음 SQL은 4D 지오메트리에서 점의 `z` 좌표를 반환합니다.

```
SELECT ST_Z(ST_GeomFromEWKT('POINT ZM (1 2 3 4)'));
```

```
st_z
-----------
 3
```

# ST\$1ZMax
<a name="ST_ZMax-function"></a>

ST\$1ZMax는 입력 지오메트리의 최대 `z` 좌표를 반환합니다.

## 구문
<a name="ST_ZMax-function-syntax"></a>

```
ST_ZMax(geom)
```

## 인수
<a name="ST_ZMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_ZMax-function-return"></a>

최대 `z` 좌표의 `DOUBLE PRECISION` 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 2D 또는 3DM 지오메트리이면 null이 반환됩니다.

## 예제
<a name="ST_ZMax-function-examples"></a>

다음 SQL은 3DZ 지오메트리에서 라인스트링의 가장 큰 `z` 좌표를 반환합니다.

```
SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING Z (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_zmax
-----------
  8
```

다음 SQL은 4D 지오메트리에서 라인스트링의 가장 큰 `z` 좌표를 반환합니다.

```
SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_zmax
-----------
  10
```

# ST\$1ZMin
<a name="ST_ZMin-function"></a>

ST\$1ZMin은 입력 지오메트리의 최소 `z` 좌표를 반환합니다.

## 구문
<a name="ST_ZMin-function-syntax"></a>

```
ST_ZMin(geom)
```

## 인수
<a name="ST_ZMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="ST_ZMin-function-return"></a>

최소 `z` 좌표의 `DOUBLE PRECISION` 값입니다.

*geom*이 비어 있으면 null이 반환됩니다.

*geom*이 null이면 null이 반환됩니다.

*geom*이 2D 또는 3DM 지오메트리이면 null이 반환됩니다.

## 예제
<a name="ST_ZMin-function-examples"></a>

다음 SQL은 3DZ 지오메트리에서 라인스트링의 가장 작은 `z` 좌표를 반환합니다.

```
SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING Z (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_zmin
-----------
  2
```

다음 SQL은 4D 지오메트리에서 라인스트링의 가장 작은 `z` 좌표를 반환합니다.

```
SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_zmin
-----------
  2
```

# SupportsBBox
<a name="SupportsBBox-function"></a>

SupportsBBox는 입력 지오메트리가 미리 계산된 경계 상자로 인코딩을 지원하면 true를 반환합니다. 경계 상자 지원에 대한 자세한 내용은 [경계 상자](spatial-terminology.md#spatial-terminology-bounding-box) 섹션을 참조하세요.

## 구문
<a name="SupportsBBox-function-syntax"></a>

```
SupportsBBox(geom)
```

## 인수
<a name="SupportsBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 데이터 형식의 값 또는 `GEOMETRY` 형식으로 계산되는 표현식입니다.

## 반환 타입
<a name="SupportsBBox-function-return"></a>

`BOOLEAN`

*geom*이 null이면 null이 반환됩니다.

## 예제
<a name="SupportsBBox-function-examples"></a>

다음 SQL은 입력 점 지오메트리가 경계 상자로 인코딩을 지원하기 때문에 true를 반환합니다.

```
SELECT SupportsBBox(AddBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
supportsbbox
--------------
t
```

다음 SQL은 입력 점 지오메트리가 경계 상자로 인코딩을 지원하지 않기 때문에 false를 반환합니다.

```
SELECT SupportsBBox(DropBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
supportsbbox
--------------
f
```

# 문자열 함수
<a name="String_functions_header"></a>

**Topics**
+ [\$1\$1(연결) 연산자](r_concat_op.md)
+ [ASCII 함수](r_ASCII.md)
+ [BPCHARCMP 함수](r_BPCHARCMP.md)
+ [BTRIM 함수](r_BTRIM.md)
+ [BTTEXT\$1PATTERN\$1CMP 함수](r_BTTEXT_PATTERN_CMP.md)
+ [CHAR\$1LENGTH 함수](r_CHAR_LENGTH.md)
+ [CHARACTER\$1LENGTH 함수](r_CHARACTER_LENGTH.md)
+ [CHARINDEX 함수](r_CHARINDEX.md)
+ [CHR 함수](r_CHR.md)
+ [COLLATE 함수](r_COLLATE.md)
+ [CONCAT 함수](r_CONCAT.md)
+ [CRC32 함수](crc32-function.md)
+ [DIFFERENCE 함수](DIFFERENCE.md)
+ [INITCAP 함수](r_INITCAP.md)
+ [LEFT 및 RIGHT 함수](r_LEFT.md)
+ [LEN 함수](r_LEN.md)
+ [LENGTH 함수](r_LENGTH.md)
+ [LOWER 함수](r_LOWER.md)
+ [LPAD 및 RPAD 함수](r_LPAD.md)
+ [ltrim 함수](r_LTRIM.md)
+ [OCTETINDEX 함수](OCTETINDEX.md)
+ [OCTET\$1LENGTH 함수](r_OCTET_LENGTH.md)
+ [POSITION 함수](r_POSITION.md)
+ [QUOTE\$1IDENT 함수](r_QUOTE_IDENT.md)
+ [QUOTE\$1LITERAL 함수](r_QUOTE_LITERAL.md)
+ [REGEXP\$1COUNT 함수](REGEXP_COUNT.md)
+ [REGEXP\$1INSTR 함수](REGEXP_INSTR.md)
+ [REGEXP\$1REPLACE 함수](REGEXP_REPLACE.md)
+ [REGEXP\$1SUBSTR 함수](REGEXP_SUBSTR.md)
+ [REPEAT 함수](r_REPEAT.md)
+ [REPLACE 함수](r_REPLACE.md)
+ [REPLICATE 함수](r_REPLICATE.md)
+ [REVERSE 함수](r_REVERSE.md)
+ [RTRIM 함수](r_RTRIM.md)
+ [SOUNDEX 함수](SOUNDEX.md)
+ [SPLIT\$1PART 함수](SPLIT_PART.md)
+ [STRPOS 함수](r_STRPOS.md)
+ [STRTOL 함수](r_STRTOL.md)
+ [SUBSTRING 함수](r_SUBSTRING.md)
+ [TEXTLEN 함수](r_TEXTLEN.md)
+ [TRANSLATE 함수](r_TRANSLATE.md)
+ [TRIM 함수](r_TRIM.md)
+ [UPPER 함수](r_UPPER.md)

문자열 함수는 문자열을, 혹은 문자열로 평가되는 표현식을 처리 및 조작합니다. 이 함수에서 *string* 인수가 리터럴 값일 때는 작은따옴표로 묶어야 합니다. 지원되는 데이터 형식은 CHAR와 VARCHAR입니다.

다음 섹션에서는 함수 이름과 구문, 그리고 지원되는 함수에 대한 설명에 대해서 살펴보겠습니다. 문자열에 대한 오프셋은 모두 1부터 시작됩니다.
<a name="string-functions-deprecated"></a>
**지원되지 않는 리더 노드 전용 함수**  
다음 문자열 함수는 리더 노드에서만 실행되기 때문에 여기에서 다루지 않습니다. 자세한 내용은 [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md) 섹션을 참조하세요.
+ GET\$1BYTE
+ SET\$1BIT
+ SET\$1BYTE
+ TO\$1ASCII

# \$1\$1(연결) 연산자
<a name="r_concat_op"></a>

`||` 기호의 양쪽으로 두 표현식을 연결하여 연결된 표현식을 반환합니다.

[CONCAT 함수](r_CONCAT.md)와 유사합니다.

**참고**  
표현식 중 하나 또는 둘 모두가 null인 경우 연결 결과는 `NULL`입니다.

## 구문
<a name="r_concat_op-synopsis"></a>

```
expression1 || expression2
```

## 인수
<a name="r_concat_op-arguments"></a>

 *expression1*   
`CHAR` 문자열, `VARCHAR` 문자열, 이진 표현식 또는 이러한 형식 중 하나로 평가되는 표현식입니다.

 *expression2*   
`CHAR` 문자열, `VARCHAR` 문자열, 이진 표현식 또는 이러한 형식 중 하나로 평가되는 표현식입니다.

## 반환 타입
<a name="r_concat_op-return-type"></a>

 문자열의 반환 형식은 입력 인수의 형식과 동일합니다. 두 개의 `VARCHAR` 형식의 문자열을 연결하면 `VARCHAR` 형식의 문자열이 반환됩니다.

## 예제
<a name="r_concat_op-example"></a>

 다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 및 VENUE 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

샘플 데이터베이스의 USERS 테이블에서 FIRSTNAME 및 LASTNAME 필드를 연결하려면 다음 예제를 사용합니다.

```
SELECT (firstname || ' ' || lastname) as fullname
FROM users
ORDER BY 1
LIMIT 10;

+-----------------+
|    fullname     |
+-----------------+
| Aaron Banks     |
| Aaron Booth     |
| Aaron Browning  |
| Aaron Burnett   |
| Aaron Casey     |
| Aaron Cash      |
| Aaron Castro    |
| Aaron Dickerson |
| Aaron Dixon     |
| Aaron Dotson    |
+-----------------+
```

 NULL 값이 포함되었을 수도 있는 열을 연결하려면 [NVL 및 COALESCE 함수](r_NVL_function.md) 표현식을 사용해야 합니다. 다음 예제에서는 NVL을 사용하여 `NULL`이 발생할 때마다 `0`을 반환합니다.

```
SELECT (venuename || ' seats ' || NVL(venueseats, 0)) as seating
FROM venue
WHERE venuestate = 'NV' or venuestate = 'NC'
ORDER BY 1
LIMIT 10;

+-------------------------------------+
|               seating               |
+-------------------------------------+
| Ballys Hotel seats 0                |
| Bank of America Stadium seats 73298 |
| Bellagio Hotel seats 0              |
| Caesars Palace seats 0              |
| Harrahs Hotel seats 0               |
| Hilton Hotel seats 0                |
| Luxor Hotel seats 0                 |
| Mandalay Bay Hotel seats 0          |
| Mirage Hotel seats 0                |
| New York New York seats 0           |
+-------------------------------------+
```

# ASCII 함수
<a name="r_ASCII"></a>

ASCII 함수는 지정한 문자열에서 첫 번째 문자의 ASCII 코드나 유니코드 코드 포인트를 반환합니다. 이 함수는 문자열이 비어 있으면 `0`을 반환합니다. 문자열이 null이면 `NULL`을 반환합니다.

## 구문
<a name="r_ASCII-synopsis"></a>

```
ASCII('string')
```

## 인수
<a name="r_ASCII-arguments"></a>

 *문자열*()   
`CHAR` 문자열 또는 `VARCHAR` 문자열입니다.

## 반환 타입
<a name="r_ASCII-return-type"></a>

 INTEGER 

## 예제
<a name="r_ASCII-examples"></a>

`NULL`을 반환하려면 다음 예제를 사용합니다. NULLIF 함수는 두 인수가 동일한 경우 `NULL`을 반환하므로 ASCII 함수의 입력 인수는 `NULL`입니다. 자세한 내용은 [NULLIF 함수](r_NULLIF_function.md) 섹션을 참조하세요.

```
SELECT ASCII(NULLIF('',''));

+-------+
| ascii |
+-------+
|  NULL |
+-------+
```

ASCII 코드 0을 반환하려면 다음 예제를 사용합니다.

```
SELECT ASCII('');

+-------+
| ascii |
+-------+
|     0 |
+-------+
```

amazon이라는 단어의 첫 글자에 대한 ASCII 코드 97을 반환하려면 다음 예제를 사용합니다.

```
SELECT ASCII('amazon');

+-------+
| ascii |
+-------+
|    97 |
+-------+
```

amazon이라는 단어의 첫 글자에 대한 ASCII 코드 65를 반환하려면 다음 예제를 사용합니다.

```
SELECT ASCII('Amazon');

+-------+
| ascii |
+-------+
|    65 |
+-------+
```

# BPCHARCMP 함수
<a name="r_BPCHARCMP"></a>

두 문자열의 값을 비교한 후 정수를 반환합니다. 문자열이 서로 동일한 경우에는 함수가 `0`을 반환합니다. 첫 번째 문자열이 알파벳 순으로 더 큰 경우에는 함수가 `1`을 반환합니다. 두 번째 문자열이 더 크면 함수가 `-1`을 반환합니다.

멀티바이트 문자일 때는 바이트 인코딩을 기준으로 비교합니다.

[BTTEXT\$1PATTERN\$1CMP 함수](r_BTTEXT_PATTERN_CMP.md)의 동의어입니다.

## 구문
<a name="r_BPCHARCMP-synopsis"></a>

```
BPCHARCMP(string1, string2)
```

## 인수
<a name="r_BPCHARCMP-arguments"></a>

 *string1*   
`CHAR` 문자열 또는 `VARCHAR` 문자열입니다.

 *string2*   
`CHAR` 문자열 또는 `VARCHAR` 문자열입니다.

## 반환 타입
<a name="r_BPCHARCMP-return-type"></a>

 INTEGER 

## 예제
<a name="r_BPCHARCMP-examples"></a>

 다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

USERS 테이블의 처음 10개 항목에 대해 사용자의 이름이 알파벳 순서로 사용자의 성보다 높은지 확인하려면 다음 예를 사용합니다. FIRSTNAME의 문자열이 LASTNAME의 문자열보다 알파벳순으로 뒤에 있는 항목의 경우 이 함수는 `1`을 반환합니다. 반대로 LASTNAME이 FIRSTNAME보다 뒤에 있으면 함수는 `-1`을 반환합니다.

```
SELECT userid, firstname, lastname, BPCHARCMP(firstname, lastname)
FROM users
ORDER BY 1, 2, 3, 4
LIMIT 10;

+--------+-----------+-----------+-----------+
| userid | firstname | lastname  | bpcharcmp |
+--------+-----------+-----------+-----------+
|      1 | Rafael    | Taylor    |        -1 |
|      2 | Vladimir  | Humphrey  |         1 |
|      3 | Lars      | Ratliff   |        -1 |
|      4 | Barry     | Roy       |        -1 |
|      5 | Reagan    | Hodge     |         1 |
|      6 | Victor    | Hernandez |         1 |
|      7 | Tamekah   | Juarez    |         1 |
|      8 | Colton    | Roy       |        -1 |
|      9 | Mufutau   | Watkins   |        -1 |
|     10 | Naida     | Calderon  |         1 |
+--------+-----------+-----------+-----------+
```

함수가 `0`을 반환하는 USERS 테이블의 모든 항목을 반환하려면 다음 예제를 사용합니다. 이 함수는 FIRSTNAME이 LASTNAME과 같으면 `0`을 반환합니다.

```
SELECT userid, firstname, lastname,
BPCHARCMP(firstname, lastname)
FROM users 
WHERE BPCHARCMP(firstname, lastname)=0
ORDER BY 1, 2, 3, 4;

+--------+-----------+----------+-----------+
| userid | firstname | lastname | bpcharcmp |
+--------+-----------+----------+-----------+
|     62 | Chase     | Chase    |         0 |
|   4008 | Whitney   | Whitney  |         0 |
|  12516 | Graham    | Graham   |         0 |
|  13570 | Harper    | Harper   |         0 |
|  16712 | Cooper    | Cooper   |         0 |
|  18359 | Chase     | Chase    |         0 |
|  27530 | Bradley   | Bradley  |         0 |
|  31204 | Harding   | Harding  |         0 |
+--------+-----------+----------+-----------+
```

# BTRIM 함수
<a name="r_BTRIM"></a>

BTRIM 함수는 선행 및 후행 공백을 제거하거나 옵션으로 지정하는 문자열과 일치하는 선행 및 후행 문자를 제거하여 문자열을 잘라냅니다.

## 구문
<a name="r_BTRIM-synopsis"></a>

```
BTRIM(string [, trim_chars ] )
```

## 인수
<a name="r_BTRIM-arguments"></a>

 *문자열*()   
잘라낼 입력 VARCHAR 문자열입니다.

 *trim\$1chars*   
일치시킬 문자가 포함된 VARCHAR 문자열입니다.

## 반환 타입
<a name="r_BTRIM-return-type"></a>

BTRIM 함수는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_BTRIM-examples"></a>

다음은 문자열 `' abc '`에서 선행 및 후행 공백을 잘라내는 예입니다.

```
select '     abc    ' as untrim, btrim('     abc    ') as trim;

untrim    | trim
----------+------
   abc    | abc
```

다음은 문자열 `'xyzaxyzbxyzcxyz'`에서 선행 및 후행 `'xyz'` 문자열을 제거하는 예입니다. 결과를 보면 선행 및 후행 `'xyz'`만 제거되었고 문자열 내부에서는 제거되지 않았습니다.

```
select 'xyzaxyzbxyzcxyz' as untrim,
btrim('xyzaxyzbxyzcxyz', 'xyz') as trim;

     untrim      |   trim
-----------------+-----------
 xyzaxyzbxyzcxyz | axyzbxyzc
```

다음 예제에서는 *trim\$1chars* 목록 `'tes'`의 모든 문자와 일치하는 문자열 `'setuphistorycassettes'`에서 선행 및 후행 부분을 제거합니다. 입력 문자열의 시작 또는 끝에서 *trim\$1chars* 목록에 없는 다른 문자 앞에 오는 모든 `t`, `e` 또는 `s`는 제거됩니다.

```
SELECT btrim('setuphistorycassettes', 'tes');

     btrim      
-----------------
 uphistoryca
```

# BTTEXT\$1PATTERN\$1CMP 함수
<a name="r_BTTEXT_PATTERN_CMP"></a>

BPCHARCMP 함수의 동의어입니다.

세부 정보는 [BPCHARCMP 함수](r_BPCHARCMP.md) 섹션을 참조하세요.

# CHAR\$1LENGTH 함수
<a name="r_CHAR_LENGTH"></a>

LEN 함수의 동의어입니다.

[LEN 함수](r_LEN.md)을(를) 참조하세요.

# CHARACTER\$1LENGTH 함수
<a name="r_CHARACTER_LENGTH"></a>

LEN 함수의 동의어입니다.

[LEN 함수](r_LEN.md)을(를) 참조하세요.

# CHARINDEX 함수
<a name="r_CHARINDEX"></a>

문자열 내에서 지정한 하위 문자열의 위치를 반환합니다.

유사한 함수는 [POSITION 함수](r_POSITION.md) 및 [STRPOS 함수](r_STRPOS.md) 섹션을 참조하세요.

## 구문
<a name="r_CHARINDEX-synopsis"></a>

```
CHARINDEX( substring, string )
```

## 인수
<a name="charindex-arguments"></a>

 *substring*   
*string* 내에서 검색할 하위 문자열입니다.

 *문자열*()   
검색할 문자열 또는 열입니다.

## 반환 타입
<a name="charindex-return-type"></a>

 INTEGER   
CHARINDEX 함수는 하위 문자열의 위치에 해당하는 `INTEGER`를 반환합니다(0이 아닌 1부터 시작). 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 문자열 내에서 하위 문자열을 찾을 수 없는 경우 CHARINDEX는 `0`을 반환합니다.

## 예제
<a name="sub-charindex-usage-notes-examples"></a>

`dog`이라는 단어 내에서 문자열 `fish`의 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT CHARINDEX('fish', 'dog');

+-----------+
| charindex |
+-----------+
|         0 |
+-----------+
```

`dogfish`이라는 단어 내에서 문자열 `fish`의 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT CHARINDEX('fish', 'dogfish');

+-----------+
| charindex |
+-----------+
|         4 |
+-----------+
```

 다음 예제에서는 TICKIT 샘플 데이터베이스의 SALES 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

SALES 테이블에서 999.00 이상의 수수료를 받는 고유 판매 거래 수를 반환하려면 다음 예제를 사용합니다. 이 명령은 커미션 값의 시작 부분에서 소수점이 4자리 이상인지 확인하여 999.00보다 큰 커미션을 계산합니다.

```
SELECT DISTINCT CHARINDEX('.', commission), COUNT (CHARINDEX('.', commission))
FROM sales 
WHERE CHARINDEX('.', commission) > 4 
GROUP BY CHARINDEX('.', commission)
ORDER BY 1,2;

+-----------+-------+
| charindex | count |
+-----------+-------+
|         5 |   629 |
+-----------+-------+
```

# CHR 함수
<a name="r_CHR"></a>

CHR 함수는 입력 파라미터에서 지정하는 ASCII 코드 포인트 값과 일치하는 문자를 반환합니다.

## 구문
<a name="r_CHR-synopsis"></a>

```
CHR(number)
```

## 인수
<a name="r_CHR-argument"></a>

 *number*   
입력 파라미터는 ASCII 코드 포인트 값을 나타내는 `INTEGER`입니다.

## 반환 타입
<a name="r_CHR-return-type"></a>

 CHAR   
ASCII 문자가 입력 값과 일치하면 `CHAR` 함수가 CHAR 문자열을 반환합니다. 입력 숫자와 ASCII 문자가 일치하지 않으면 `NULL`을 반환합니다.

## 예제
<a name="r_CHR-example"></a>

ASCII 코드 포인트 0에 해당하는 문자를 반환하려면 다음 예시를 사용합니다. 참고로 CHR 함수는 입력 `0`에 대해 `NULL`을 반환합니다.

```
SELECT CHR(0);

+-----+
| chr |
+-----+
|     |
+-----+
```

ASCII 코드 포인트 65에 해당하는 문자를 반환하려면 다음 예제를 사용합니다.

```
SELECT CHR(65);

+-----+
| chr |
+-----+
| A   |
+-----+
```

대문자 A(ASCII 코드 포인트 65)로 시작하는 고유 이벤트 이름을 반환하려면 다음 예제를 사용합니다. 다음 예제에서는 TICKIT 샘플 데이터베이스의 EVENT 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
SELECT DISTINCT eventname FROM event
WHERE SUBSTRING(eventname, 1, 1)=CHR(65) LIMIT 5;

+-----------------------+
|       eventname       |
+-----------------------+
| A Catered Affair      |
| As You Like It        |
| A Man For All Seasons |
| Alan Jackson          |
| Armando Manzanero     |
+-----------------------+
```

# COLLATE 함수
<a name="r_COLLATE"></a>

COLLATE 함수는 문자열 열 또는 표현식의 데이터 정렬을 재정의합니다.

데이터베이스 데이터 정렬을 사용하여 테이블을 생성하는 방법에 대한 자세한 내용은 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 섹션을 참조하세요.

데이터베이스 데이터 정렬을 사용하여 데이터베이스를 생성하는 방법에 대한 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 섹션을 참조하세요.

## 구문
<a name="r_COLLATE-synopsis"></a>

```
COLLATE( string, 'case_sensitive' | 'cs' | 'case_insensitive' | 'ci');
```

## 인수
<a name="r_COLLATE-argument"></a>

 *문자열*()   
재정의하려는 문자열 열 또는 표현식입니다.

 *'case\$1sensitive'* \$1 *'cs'* \$1 *'case\$1insensitive'* \$1 *'ci'*  
데이터 정렬 이름의 문자열 상수입니다. Amazon Redshift는 이 파라미터에 다음 값만 지원합니다.  
+  *case\$1sensitive* 
+  *cs* 
+  *case\$1insensitive* 
+  *ci* 
*case\$1sensitive*와 *cs*는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다. 마찬가지로 *case\$1insensitive*와 *ci*는 서로 바꿔 사용할 수 있으며 동일한 결과를 냅니다.

## 반환 타입
<a name="r_COLLATE-return-type"></a>

COLLATE 함수는 첫 번째 입력 표현식 형식에 따라 `VARCHAR`, `CHAR` 또는 `SUPER`를 반환합니다. 이 함수는 첫 번째 입력 인수의 데이터 정렬만 변경하고 출력 값은 변경하지 않습니다.

## 예제
<a name="r_COLLATE-example"></a>

T 테이블을 만들고 T 테이블의 col1을 `case_sensitive`로 정의하려면 다음 예제를 사용합니다

```
CREATE TABLE T ( col1 Varchar(20) COLLATE case_sensitive );

INSERT INTO T VALUES ('john'),('JOHN');
```

 첫 번째 쿼리를 실행하면 Amazon Redshift는 `john`만 반환합니다. COLLATE 함수가 col1에서 실행되면 데이터 정렬이 `case_insensitive`가 됩니다. 두 번째 쿼리는 `john`과 `JOHN`을 모두 반환합니다.

```
SELECT * FROM T WHERE col1 = 'john';

+------+
| col1 |
+------+
| john |
+------+

SELECT * FROM T WHERE COLLATE(col1, 'case_insensitive') = 'john';

+------+
| col1 |
+------+
| john |
| JOHN |
+------+
```

A 테이블을 만들고 A 테이블의 col1을 `case_insensitive`로 정의하려면 다음 예제를 사용합니다

```
CREATE TABLE A ( col1 Varchar(20) COLLATE case_insensitive );

INSERT INTO A VALUES ('john'),('JOHN');
```

 첫 번째 쿼리를 실행하면 Amazon Redshift는 `john`과 `JOHN`을 모두 반환합니다. COLLATE 함수가 col1에서 실행되면 데이터 정렬이 `case_sensitive`가 됩니다. 두 번째 쿼리는 `john`만 반환합니다.

```
SELECT * FROM A WHERE col1 = 'john';

+------+
| col1 |
+------+
| john |
| JOHN |
+------+

SELECT * FROM A WHERE COLLATE(col1, 'case_sensitive') = 'john';

+------+
| col1 |
+------+
| john |
+------+
```

# CONCAT 함수
<a name="r_CONCAT"></a>

CONCAT 함수는 두 표현식을 연결하고 결과 표현식을 반환합니다. 2개 이상의 표현식을 연결하려면 CONCAT 함수를 중첩시켜 사용합니다. 두 표현식 사이의 연결 연산자(`||`)는 CONCAT 함수와 동일한 결과를 반환합니다.

## 구문
<a name="r_CONCAT-synopsis"></a>

```
CONCAT ( expression1, expression2 )
```

## 인수
<a name="r_CONCAT-arguments"></a>

 *expression1*, *expression2*   
두 인수 모두 고정 길이 문자열, 가변 길이 문자열, 2진 표현식 또는 이러한 입력 중 하나로 평가되는 표현식이 될 수 있습니다.

## 반환 타입
<a name="r_CONCAT-return-type"></a>

 CONCAT는 표현식을 반환합니다. 표현식의 데이터 유형은 입력 인수와 동일합니다.

입력 표현식의 유형이 다른 경우 Amazon Redshift는 표현식 중 하나의 유형 캐스팅을 암시적으로 시도합니다. 값을 캐스팅할 수 없는 경우 오류가 반환됩니다.

## 사용 노트
<a name="r_CONCAT-usage-notes"></a>
+ CONCAT 함수와 연결 연산자 모두 표현식 중 하나 또는 둘 모두 NULL이면 결과도 NULL을 반환합니다.

## 예제
<a name="r_CONCAT-examples"></a>

다음 예에서는 문자열 리터럴 2개를 연결합니다: 

```
SELECT CONCAT('December 25, ', '2008');

concat
-------------------
December 25, 2008
(1 row)
```

다음은 CONCAT이 아닌 `||` 연산자를 사용하여 동일한 결과를 반환하는 예입니다.

```
SELECT 'December 25, '||'2008';

?column?
-------------------
December 25, 2008
(1 row)
```

다음 예에서는 다른 CONCAT 함수 내에 중첩된 CONCAT 함수를 사용하여 세 개의 문자열을 연결합니다.

```
SELECT CONCAT('Thursday, ', CONCAT('December 25, ', '2008'));

concat
-----------------------------
Thursday, December 25, 2008
(1 row)
```

NULL을 포함할 수 있는 열을 연결하려면 NULL이 발생할 경우 지정된 값을 반환하는 [NVL 및 COALESCE 함수](r_NVL_function.md)를 사용하세요. 다음은 NVL을 사용하여 NULL 값이 발견될 때마다 0을 반환하는 예입니다.

```
SELECT CONCAT(venuename, CONCAT(' seats ', NVL(venueseats, 0))) AS seating
FROM venue WHERE venuestate = 'NV' OR venuestate = 'NC'
ORDER BY 1
LIMIT 5;

seating                            
-----------------------------------
Ballys Hotel seats 0               
Bank of America Stadium seats 73298
Bellagio Hotel seats 0             
Caesars Palace seats 0             
Harrahs Hotel seats 0              
(5 rows)
```

다음은 VENUE 테이블에서 CITY 값과 STATE 값을 연결하는 쿼리입니다.

```
SELECT CONCAT(venuecity, venuestate)
FROM venue
WHERE venueseats > 75000
ORDER BY venueseats;

concat
-------------------
DenverCO
Kansas CityMO
East RutherfordNJ
LandoverMD
(4 rows)
```

다음은 CONCAT 함수를 중첩시켜 사용하는 쿼리입니다. 이 쿼리는 VENUE 테이블에서 CITY 값과 STATE 값을 연결하지만 쉼표와 공백으로 결과 문자열을 구분합니다.

```
SELECT CONCAT(CONCAT(venuecity,', '),venuestate)
FROM venue
WHERE venueseats > 75000
ORDER BY venueseats;

concat
---------------------
Denver, CO
Kansas City, MO
East Rutherford, NJ
Landover, MD
(4 rows)
```

다음 예에서는 2개의 이진 표현식을 연결합니다. 여기서 `abc`는 이진 값(`616263`의 16진수 표현)이고 `def`는 이진 값(`646566`의 16진수 표현)입니다. 결과는 이진 값의 16진수 표현으로 자동으로 표시됩니다.

```
SELECT CONCAT('abc'::VARBYTE, 'def'::VARBYTE);

concat
-------------------
616263646566
```

# CRC32 함수
<a name="crc32-function"></a>

CRC32는 오류 감지에 사용되는 함수입니다. 이 함수는 CRC32 알고리즘을 사용하여 원본 데이터와 대상 데이터 간의 변경 사항을 감지합니다. CRC32 함수는 가변 길이 문자열을 32비트 이진 시퀀스인 16진수 값을 텍스트로 표현한 8자 문자열로 변환합니다. 원본 데이터와 대상 데이터 간의 변경 사항을 감지하려면 원본 데이터에서 CRC32 함수를 사용하여 출력을 저장합니다. 그런 다음 대상 데이터에서 CRC32 함수를 사용하여 해당 출력을 원본 데이터의 출력과 비교합니다. 데이터가 수정되지 않은 경우 출력이 동일하고 데이터가 수정된 경우 출력이 달라집니다.

## 구문
<a name="crc32-function-syntax"></a>

```
CRC32(string)
```

## 인수
<a name="crc32-function-arguments"></a>

 *문자열*()   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="crc32-function-return-type"></a>

CRC32 함수는 32비트 이진 시퀀스의 16진수 값을 텍스트로 표현한 8자 문자열을 반환합니다. Amazon Redshift CRC32 함수는 CRC-32C 다항식을 기반으로 합니다.

## 예제
<a name="crc32-function-example"></a>

`Amazon Redshift` 문자열의 8비트 값을 표시하려면 다음 예제를 사용합니다.

```
SELECT CRC32('Amazon Redshift');

+----------+
|  crc32   |
+----------+
| f2726906 |
+----------+
```

# DIFFERENCE 함수
<a name="DIFFERENCE"></a>

DIFFERENCE 함수는 두 문자열의 미국 Soundex 코드를 비교합니다. 이 함수는 Soundex 코드 간에 일치하는 문자 수를 나타내는 `INTEGER`를 반환합니다.

 Soundex 코드는 4자 길이의 문자열입니다. Soundex 코드는 단어의 철자보다는 단어가 어떻게 들리는지를 나타냅니다. 예를 들어 `Smith`와 `Smyth`의 Soundex 코드는 동일합니다.

## 구문
<a name="DIFFERENCE-synopsis"></a>

```
DIFFERENCE(string1, string2)
```

## 인수
<a name="DIFFERENCE-arguments"></a>

 *string1*   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

 *string2*   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="DIFFERENCE-return-type"></a>

 INTEGER   
DIFFERENCE 함수는 두 문자열의 미국 Soundex 코드에서 일치하는 문자의 수를 세는 0\$14 사이의 `INTEGER` 값을 반환합니다. Soundex 코드는 4문자로 구성되므로 문자열의 미국 Soundex 코드 값 중 4문자가 모두 같으면 DIFFERENCE 함수는 `4`를 반환합니다. 두 문자열 중 하나가 비어 있으면 DIFFERENCE는 `0`을 반환합니다. 두 문자열 모두 유효한 문자를 포함하지 않으면 `1`을 반환합니다. DIFFERENCE 함수는 a\$1z 및 A\$1Z를 포함하여 영어 알파벳 소문자 또는 대문자 ASCII 문자만 변환합니다. DIFFERENCE는 다른 문자를 무시합니다.

## 예제
<a name="DIFFERENCE-examples"></a>

문자열 `%` 및 `@`의 Soundex 값을 비교하려면 다음 예제를 사용합니다. 두 문자열 모두 유효한 문자를 포함하지 않으므로 함수는 `1`을 반환합니다.

```
SELECT DIFFERENCE('%', '@');

+------------+
| difference |
+------------+
|          1 |
+------------+
```

`Amazon`과 빈 문자열의 Soundex 값을 비교하려면 다음 예제를 사용합니다. 이 함수는 두 문자열 중 하나가 비어 있기 때문에 `0`을 반환합니다.

```
SELECT DIFFERENCE('Amazon', '');

+------------+
| difference |
+------------+
|          0 |
+------------+
```

문자열 `Amazon` 및 `Ama`의 Soundex 값을 비교하려면 다음 예제를 사용합니다. 이 함수는 문자열의 Soundex 값 중 두 문자가 동일하므로 `2`를 반환합니다.

```
SELECT DIFFERENCE('Amazon', 'Ama');

+------------+
| difference |
+------------+
|          2 |
+------------+
```

문자열 `Amazon` 및 `+-*/%Amazon`의 Soundex 값을 비교하려면 다음 예제를 사용합니다. 이 함수는 문자열의 Soundex 값 4개 문자가 모두 동일하기 때문에 `4`를 반환합니다. 이 함수는 두 번째 문자열의 유효하지 않은 문자 `+-*/%`를 무시한다는 점에 유의하세요.

```
SELECT DIFFERENCE('Amazon', '+-*/%Amazon');

+------------+
| difference |
+------------+
|          4 |
+------------+
```

문자열 `AC/DC` 및 `Ay See Dee See`의 Soundex 값을 비교하려면 다음 예제를 사용합니다. 이 함수는 문자열의 Soundex 값 4개 문자가 모두 동일하기 때문에 `4`를 반환합니다.

```
SELECT DIFFERENCE('AC/DC', 'Ay See Dee See');

+------------+
| difference |
+------------+
|          4 |
+------------+
```

# INITCAP 함수
<a name="r_INITCAP"></a>

지정한 문자열에서 각 단어의 첫 번째 글자를 대문자로 변경합니다. INITCAP은 UTF-8 멀티바이트 문자를 지원하여 문자당 최대 4바이트까지 가능합니다.

## 구문
<a name="r_INITCAP-synopsis"></a>

```
INITCAP(string)
```

## 인수
<a name="r_INITCAP-argument"></a>

 *문자열*()   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_INITCAP-return-type"></a>

VARCHAR

## 사용 노트
<a name="r_INITCAP_usage_notes"></a>

INITCAP 함수는 문자열에 속한 각 단어의 첫 글자를 대문자로 변경하고 이후 글자는 소문자로 변경하거나 또는 남겨둡니다. 따라서 공백 문자를 제외하고 어떤 문자가 단어 구분자의 역할을 하는지 알아야 합니다. *단어 구분자* 문자는 구두점, 기호, 제어 문자 등 알파벳을 제외한 모든 문자를 가리킵니다. 다음 문자는 모두 단어 구분자입니다.

```
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 
```

그 밖에 탭, 줄 바꿈 문자, 폼 피드, 라인 피드, 캐리지 리턴 등도 단어 구분자에 속합니다.

## 예제
<a name="r_INITCAP-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 및 USERS 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATDESC 열에 있는 각 단어의 첫 글자를 대문자로 사용하려면 다음 예제를 사용합니다.

```
SELECT catid, catdesc, INITCAP(catdesc)
FROM category
ORDER BY 1, 2, 3;

+-------+--------------------------------------------+--------------------------------------------+
| catid |                  catdesc                   |                  initcap                   |
+-------+--------------------------------------------+--------------------------------------------+
|     1 | Major League Baseball                      | Major League Baseball                      |
|     2 | National Hockey League                     | National Hockey League                     |
|     3 | National Football League                   | National Football League                   |
|     4 | National Basketball Association            | National Basketball Association            |
|     5 | Major League Soccer                        | Major League Soccer                        |
|     6 | Musical theatre                            | Musical Theatre                            |
|     7 | All non-musical theatre                    | All Non-Musical Theatre                    |
|     8 | All opera and light opera                  | All Opera And Light Opera                  |
|     9 | All rock and pop music concerts            | All Rock And Pop Music Concerts            |
|    10 | All jazz singers and bands                 | All Jazz Singers And Bands                 |
|    11 | All symphony, concerto, and choir concerts | All Symphony, Concerto, And Choir Concerts |
+-------+--------------------------------------------+--------------------------------------------+
```

대문자가 단어의 첫머리가 아닐 때 INITCAP 함수가 대문자를 유지하지 않는다는 것을 보여 주려면 다음 예제를 사용합니다. 예를 들어 `MLB` 문자열은 `Mlb`가 됩니다.

```
SELECT INITCAP(catname)
FROM category
ORDER BY catname;

+-----------+
|  initcap  |
+-----------+
| Classical |
| Jazz      |
| Mlb       |
| Mls       |
| Musicals  |
| Nba       |
| Nfl       |
| Nhl       |
| Opera     |
| Plays     |
| Pop       |
+-----------+
```

공백 이외의 영숫자가 아닌 문자가 단어 구분 기호로 기능한다는 것을 보여 주려면 다음 예제를 사용합니다. 각 문자열의 여러 문자가 대문자로 표시됩니다.

```
SELECT email, INITCAP(email)
FROM users
ORDER BY userid DESC LIMIT 5;

+------------------------------------+------------------------------------+
|               email                |              initcap               |
+------------------------------------+------------------------------------+
| urna.Ut@egetdictumplacerat.edu     | Urna.Ut@Egetdictumplacerat.Edu     |
| nibh.enim@egestas.ca               | Nibh.Enim@Egestas.Ca               |
| in@Donecat.ca                      | In@Donecat.Ca                      |
| sodales@blanditviverraDonec.ca     | Sodales@Blanditviverradonec.Ca     |
| sociis.natoque.penatibus@vitae.org | Sociis.Natoque.Penatibus@Vitae.Org |
+------------------------------------+------------------------------------+
```

# LEFT 및 RIGHT 함수
<a name="r_LEFT"></a>

이 두 함수는 문자열의 가장 왼쪽 또는 가장 오른쪽에서 지정한 만큼 문자 수를 반환합니다.

반환되는 문자 수는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다.

## 구문
<a name="r_LEFT-synopsis"></a>

```
LEFT( string,  integer )

RIGHT( string,  integer )
```

## 인수
<a name="r_LEFT-arguments"></a>

 *문자열*()   
`CHAR` 문자열, `VARCHAR` 문자열 또는 `CHAR` 또는 `VARCHAR` 문자열로 평가되는 모든 표현식입니다.

 *(정수*)   
양의 정수입니다.

## 반환 타입
<a name="r_LEFT-return-type"></a>

VARCHAR

## 예제
<a name="r_LEFT-example"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 EVENT 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

이벤트 ID가 1000에서 1005 사이인 이벤트 이름에서 가장 왼쪽 5자와 가장 오른쪽 5자를 반환하려면 다음 예제를 사용합니다.

```
SELECT eventid, eventname,
LEFT(eventname,5) AS left_5,
RIGHT(eventname,5) AS right_5
FROM event
WHERE eventid BETWEEN 1000 AND 1005
ORDER BY 1;

+---------+----------------+--------+---------+
| eventid |   eventname    | left_5 | right_5 |
+---------+----------------+--------+---------+
|    1000 | Gypsy          | Gypsy  | Gypsy   |
|    1001 | Chicago        | Chica  | icago   |
|    1002 | The King and I | The K  | and I   |
|    1003 | Pal Joey       | Pal J  | Joey    |
|    1004 | Grease         | Greas  | rease   |
|    1005 | Chicago        | Chica  | icago   |
+---------+----------------+--------+---------+
```

# LEN 함수
<a name="r_LEN"></a>

지정된 문자열의 길이를 바이트 수대로 반환합니다.

## 구문
<a name="r_LEN-synopsis"></a>

LEN은 [LENGTH 함수](r_LENGTH.md), [CHAR\$1LENGTH 함수](r_CHAR_LENGTH.md), [CHARACTER\$1LENGTH 함수](r_CHARACTER_LENGTH.md) 및 [TEXTLEN 함수](r_TEXTLEN.md)의 동의어입니다.

```
LEN(expression)
```

## 인수
<a name="r_LEN-argument"></a>

 *expression*   
`CHAR` 문자열, `VARCHAR` 문자열, `VARBYTE` 표현식 또는 암시적으로 `CHAR`, `VARCHAR` 또는 `VARBYTE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_LEN-return-type"></a>

 INTEGER   
LEN 함수는 입력 문자열의 문자 수를 나타내는 정수를 반환합니다.  
입력 문자열이 문자열인 경우 LEN 함수는 바이트 수가 아닌 멀티바이트 문자열의 실제 문자 수를 반환합니다. 예를 들어 `VARCHAR(12)` 열에 4바이트 중국 문자 3개가 저장되어야 한다고 가정했을 때 LEN 함수는 동일한 문자열에서 `3`을 반환합니다. 문자열의 길이가 몇 바이트인지 알아보려면 [OCTET\$1LENGTH](r_OCTET_LENGTH.md) 함수를 쓰세요.

## 사용 노트
<a name="r_LEN_usage_notes"></a>

**표현식이 `CHAR` 문자열인 경우 후행 공백은 계산되지 않습니다.

**표현식이 `VARCHAR` 문자열인 경우 후행 공백이 계산됩니다.

## 예제
<a name="r_LEN-example"></a>

`français` 문자열의 바이트 수와 문자 수를 반환하려면 다음 예제를 사용합니다.

```
SELECT OCTET_LENGTH('français'), 
LEN('français');

+--------------+-----+
| octet_length | len |
+--------------+-----+
|            9 |   8 |
+--------------+-----+
```

OCTET\$1LENGTH 함수를 사용하지 않고 `français` 문자열에 포함된 바이트 수와 문자 수를 반환하려면 다음 예제를 사용합니다. 자세한 내용은 [CAST 함수](r_CAST_function.md)을 참조하세요.

```
SELECT LEN(CAST('français' AS VARBYTE)) as bytes, LEN('français');

+-------+-----+
| bytes | len |
+-------+-----+
|     9 |   8 |
+-------+-----+
```

후행 공백이 없는 문자열 `cat`, 후행 공백이 3개인 `cat `, 길이 6의 `CHAR`로 캐스팅된 후행 공백이 3개인 `cat `, 길이 6의 `VARCHAR`로 캐스팅된 후행 공백이 3개인 `cat `에 포함된 문자 수를 반환하려면 다음 예제를 사용합니다. 이 함수는 `CHAR` 문자열의 경우 후행 공백을 계산하지 않지만 `VARCHAR` 문자열의 경우 후행 공백을 계산합니다.

```
SELECT LEN('cat'), LEN('cat   '), LEN(CAST('cat   ' AS CHAR(6))) AS len_char, LEN(CAST('cat   ' AS VARCHAR(6))) AS len_varchar;

+-----+-----+----------+-------------+
| len | len | len_char | len_varchar |
+-----+-----+----------+-------------+
|   3 |   6 |        3 |           6 |
+-----+-----+----------+-------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 VENUE 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

VENUE 테이블에서 가장 긴 10개 장소 이름을 반환하려면 다음 예제를 사용합니다.

```
SELECT venuename, LEN(venuename)
FROM venue
ORDER BY 2 DESC, 1
LIMIT 10;

+-----------------------------------------+-----+
|                venuename                | len |
+-----------------------------------------+-----+
| Saratoga Springs Performing Arts Center |  39 |
| Lincoln Center for the Performing Arts  |  38 |
| Nassau Veterans Memorial Coliseum       |  33 |
| Jacksonville Municipal Stadium          |  30 |
| Rangers BallPark in Arlington           |  29 |
| University of Phoenix Stadium           |  29 |
| Circle in the Square Theatre            |  28 |
| Hubert H. Humphrey Metrodome            |  28 |
| Oriole Park at Camden Yards             |  27 |
| Dick's Sporting Goods Park              |  26 |
+-----------------------------------------+-----+
```

# LENGTH 함수
<a name="r_LENGTH"></a>

LEN 함수의 동의어입니다.

[LEN 함수](r_LEN.md)을(를) 참조하세요.

# LOWER 함수
<a name="r_LOWER"></a>

문자열을 소문자로 변환합니다. LOWER는 UTF-8 멀티바이트 문자를 지원하여 문자당 최대 4바이트까지 가능합니다.

## 구문
<a name="r_LOWER-synopsis"></a>

```
LOWER(string)
```

## 인수
<a name="r_LOWER-argument"></a>

 *문자열*()   
`VARCHAR` 문자열 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_LOWER-return-type"></a>

 문자열   
LOWER 함수는 입력 문자열과 데이터 형식이 동일한 문자열을 반환합니다. 예를 들어 입력이 `CHAR` 문자열인 경우 함수는 `CHAR` 문자열을 반환합니다.

## 예제
<a name="r_LOWER-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATNAME 열의 `VARCHAR` 문자열을 소문자로 변환하려면 다음 예제를 사용합니다.

```
SELECT catname, LOWER(catname) FROM category ORDER BY 1,2;

+-----------+-----------+
|  catname  |   lower   |
+-----------+-----------+
| Classical | classical |
| Jazz      | jazz      |
| MLB       | mlb       |
| MLS       | mls       |
| Musicals  | musicals  |
| NBA       | nba       |
| NFL       | nfl       |
| NHL       | nhl       |
| Opera     | opera     |
| Plays     | plays     |
| Pop       | pop       |
+-----------+-----------+
```

# LPAD 및 RPAD 함수
<a name="r_LPAD"></a>

이 두 함수는 지정한 길이에 따라 문자열에 문자를 추가 또는 첨부합니다.

## 구문
<a name="r_LPAD-synopsis"></a>

```
LPAD(string1, length, [ string2 ])
```

```
RPAD(string1, length, [ string2 ])
```

## 인수
<a name="r_LPAD-arguments"></a>

 *string1*   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

 *length*   
함수의 결과 길이를 정의하는 정수입니다. 문자열의 길이는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. *string1*이 지정한 길이보다 길면 오른쪽에서 절사됩니다. **length가 0이거나 음수면 함수 결과로 빈 문자열이 반환됩니다.

 *string2*   
(선택) **string1에 추가 또는 첨부되는 1개 이상의 문자입니다. 이 인수를 지정하지 않으면 공백이 사용됩니다.

## 반환 타입
<a name="r_LPAD-return-type"></a>

VARCHAR

## 예제
<a name="r_LPAD-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 EVENT 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

지정된 이벤트 이름 집합을 20자로 자르고 더 짧은 이름 앞에 공백을 추가하려면 다음 예제를 사용합니다.

```
SELECT LPAD(eventname, 20) FROM event
WHERE eventid BETWEEN 1 AND 5 ORDER BY 1;

+---------------------+
|         lpad        |
+---------------------+
|              Salome |
|        Il Trovatore |
|       Boris Godunov |
|     Gotterdammerung |
|La Cenerentola (Cind |
+-----------------------+
```

동일한 이벤트 이름 집합을 20자로 줄이되 더 짧은 이름에 `0123456789`을 추가하려면 다음 예제를 사용합니다.

```
SELECT RPAD(eventname, 20,'0123456789') FROM event
WHERE eventid BETWEEN 1 AND 5 ORDER BY 1;

+----------------------+
|         rpad         |
+----------------------+
| Boris Godunov0123456 |
| Gotterdammerung01234 |
| Il Trovatore01234567 |
| La Cenerentola (Cind |
| Salome01234567890123 |
+----------------------+
```

# ltrim 함수
<a name="r_LTRIM"></a>

문자열의 시작 부분부터 문자를 잘라냅니다. 잘라낸 문자 목록에서 문자만 포함하는 가장 긴 문자열을 제거합니다. 잘라내기 문자가 입력 문자열에 나타나지 않으면 잘라내기가 완료된 것입니다.

## 구문
<a name="r_LTRIM-synopsis"></a>

```
LTRIM( string [, trim_chars] )
```

## 인수
<a name="r_LTRIM-arguments"></a>

 *문자열*()   
잘라낼 문자열 열, 표현식 또는 문자열 리터럴입니다.

 *trim\$1chars*   
*문자열*의 처음부터 잘라낼 문자를 나타내는 문자열 열, 표현식 또는 문자열 리터럴입니다. 지정하지 않으면 공백이 잘라내기 문자로 사용됩니다.

## 반환 타입
<a name="r_LTRIM-return-type"></a>

LTRIM 함수는 입력 *문자열*(CHAR 또는 VARCHAR)과 데이터 유형이 동일한 문자열을 반환합니다.

## 예제
<a name="r_LTRIM-example"></a>

다음은 `listime` 열에서 연도를 잘라내는 예입니다. 문자열 리터럴 `'2008-'`의 잘라내기 문자는 왼쪽부터 잘라낼 문자를 나타냅니다. 잘라내기 문자 `'028-'`을 사용하는 경우에도 동일한 결과를 얻을 수 있습니다.

```
select listid, listtime, ltrim(listtime, '2008-')
from listing
order by 1, 2, 3
limit 10;            

listid |      listtime       |     ltrim
-------+---------------------+----------------
     1 | 2008-01-24 06:43:29 | 1-24 06:43:29
     2 | 2008-03-05 12:25:29 | 3-05 12:25:29
     3 | 2008-11-01 07:35:33 | 11-01 07:35:33
     4 | 2008-05-24 01:18:37 | 5-24 01:18:37
     5 | 2008-05-17 02:29:11 | 5-17 02:29:11
     6 | 2008-08-15 02:08:13 | 15 02:08:13
     7 | 2008-11-15 09:38:15 | 11-15 09:38:15
     8 | 2008-11-09 05:07:30 | 11-09 05:07:30
     9 | 2008-09-09 08:03:36 | 9-09 08:03:36
    10 | 2008-06-17 09:44:54 | 6-17 09:44:54
```

LTRIM은 *trim\$1chars*의 문자가 *string*의 첫 문자이면 모두 제거합니다. 다음은 'C', 'D', 'G' 문자가 VARCHAR 열인 VENUENAME의 첫 문자일 때 각 문자를 잘라내는 예입니다.

```
select venueid, venuename, ltrim(venuename, 'CDG')
from venue
where venuename like '%Park'
order by 2
limit 7;             

venueid | venuename                  | btrim                    
--------+----------------------------+--------------------------
    121 | ATT Park                   | ATT Park                
    109 | Citizens Bank Park         | itizens Bank Park        
    102 | Comerica Park              | omerica Park             
      9 | Dick's Sporting Goods Park | ick's Sporting Goods Park
     97 | Fenway Park                | Fenway Park              
    112 | Great American Ball Park   | reat American Ball Park  
    114 | Miller Park                | Miller Park
```

다음 예제에서는 `venueid` 열에서 검색된 잘라내기 문자 `2`를 사용합니다.

```
select ltrim('2008-01-24 06:43:29', venueid) 
from venue where venueid=2;              

ltrim
------------------
008-01-24 06:43:29
```

다음 예제에서는 `2`가 `'0'` 잘라내기 문자 앞에서 발견되었기 대문에 어떤 문자도 잘라내지 않습니다.

```
select ltrim('2008-01-24 06:43:29', '0');              

ltrim
-------------------
2008-01-24 06:43:29
```

다음 예제에서는 기본 공백 잘라내기 문자를 사용하여 문자열의 시작 부분부터 두 개의 공백을 잘라냅니다.

```
select ltrim('  2008-01-24 06:43:29');              

ltrim
-------------------
2008-01-24 06:43:29
```

# OCTETINDEX 함수
<a name="OCTETINDEX"></a>

OCTETINDEX 함수는 문자열 내의 하위 문자열 위치를 바이트 수로 반환합니다.

## 구문
<a name="OCTETINDEX-synopsis"></a>

```
OCTETINDEX(substring, string)
```

## 인수
<a name="OCTETINDEX-arguments"></a>

 *substring*   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

 *문자열*()   
`CHAR` 문자열, `VARCHAR` 문자열 또는 암시적으로 `CHAR` 또는 `VARCHAR` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="OCTETINDEX-return-type"></a>

 INTEGER   
OCTETINDEX 함수는 *문자열* 내 *하위 문자열*의 위치에 해당하는 `INTEGER` 값을 바이트 수로 반환하며, 여기서 *문자열*의 첫 번째 문자는 1로 계산됩니다. **문자열에 멀티바이트 문자가 포함되어 있지 않으면 결과는 CHARINDEX 함수의 결과와 같습니다. **문자열에 **하위 문자열이 포함되어 있지 않으면 함수는 `0`을 반환하고 **하위 문자열이 비어 있으면 함수는 `1`을 반환합니다.

## 예제
<a name="OCTETINDEX-examples"></a>

`q` 문자열에서 하위 문자열 `Amazon Redshift`의 위치를 반환하려면 다음 예제를 사용합니다. 이 예제에서는 **하위 문자열이 **문자열에 없으므로 `0`을 반환합니다.

```
SELECT OCTETINDEX('q', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          0 |
+------------+
```

문자열 `Amazon Redshift`에서 비어 있는 하위 문자열의 위치를 반환하려면 다음 예제를 사용합니다. 이 예에서는 **하위 문자열이 비어 있으므로 `1`을 반환합니다.

```
SELECT OCTETINDEX('', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          1 |
+------------+
```

`Redshift` 문자열에서 하위 문자열 `Amazon Redshift`의 위치를 반환하려면 다음 예제를 사용합니다. 이 예제에서는 **하위 문자열이 **문자열의 8번째 바이트에서 시작하므로 `8`을 반환합니다.

```
SELECT OCTETINDEX('Redshift', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          8 |
+------------+
```

`Redshift` 문자열에서 하위 문자열 `Amazon Redshift`의 위치를 반환하려면 다음 예제를 사용합니다. 이 예제에서는 **문자열의 처음 6자가 더블바이트 문자이므로 `21`을 반환합니다.

```
SELECT OCTETINDEX('Redshift', 'Άμαζον Amazon Redshift');

+------------+
| octetindex |
+------------+
|         21 |
+------------+
```

# OCTET\$1LENGTH 함수
<a name="r_OCTET_LENGTH"></a>

지정된 문자열의 길이를 바이트 수대로 반환합니다.

## 구문
<a name="r_OCTET_LENGTH-synopsis"></a>

```
OCTET_LENGTH(expression)
```

## 인수
<a name="r_OCTET_LENGTH-argument"></a>

 *expression*   
`CHAR` 문자열, `VARCHAR` 문자열, `VARBYTE` 표현식 또는 암시적으로 `CHAR`, `VARCHAR` 또는 `VARBYTE` 형식으로 평가되는 표현식입니다.

## 반환 타입
<a name="r_OCTET_LENGTH-return-type"></a>

 INTEGER   
OCTET\$1LENGTH 함수는 입력 문자열의 바이트 수를 나타내는 정수를 반환합니다.  
입력 문자열이 문자열인 경우 [LEN](r_LEN.md) 함수는 바이트 수가 아닌 멀티바이트 문자열의 실제 문자 수를 반환합니다. 예를 들어 `VARCHAR(12)` 열에 4바이트 중국 문자 3개가 저장되어야 한다고 가정했을 때 OCTET\$1LENGTH 함수는 해당 문자열에 대해 `12`를 반환하고 LEN 함수는 동일한 문자열에 대해 `3`을 반환합니다.

## 사용 노트
<a name="r_OCTET_LENGTH_usage_notes"></a>

**표현식이 `CHAR` 문자열인 경우 함수는 `CHAR` 문자열의 길이를 반환합니다. 예를 들어 `CHAR(6)` 입력의 출력은 `CHAR(6)`입니다.

**표현식이 `VARCHAR` 문자열인 경우 후행 공백이 계산됩니다.

## 예제
<a name="r_OCTET_LENGTH-example"></a>

후행 공백 3개가 있는 문자열 `francais`를 `CHAR` 및 `VARCHAR` 형식으로 캐스팅할 때 바이트 수를 반환하려면 다음 예제를 사용합니다. 자세한 내용은 [CAST 함수](r_CAST_function.md)을 참조하세요.

```
SELECT OCTET_LENGTH(CAST('francais   ' AS CHAR(15))) AS octet_length_char, OCTET_LENGTH(CAST('francais   ' AS VARCHAR(15))) AS octet_length_varchar;

+-------------------+----------------------+
| octet_length_char | octet_length_varchar |
+-------------------+----------------------+
|                15 |                   11 |
+-------------------+----------------------+
```

`français` 문자열의 바이트 수와 문자 수를 반환하려면 다음 예제를 사용합니다.

```
SELECT OCTET_LENGTH('français'), LEN('français');

+--------------+-----+
| octet_length | len |
+--------------+-----+
|            9 |   8 |
+--------------+-----+
```

문자열 `français`를 `VARBYTE`로 캐스팅할 때 바이트 수를 반환하려면 다음 예제를 사용합니다.

```
SELECT OCTET_LENGTH(CAST('français' AS VARBYTE));

+--------------+
| octet_length |
+--------------+
|            9 |
+--------------+
```

# POSITION 함수
<a name="r_POSITION"></a>

문자열 내에서 지정한 하위 문자열의 위치를 반환합니다.

유사한 함수는 [CHARINDEX 함수](r_CHARINDEX.md) 및 [STRPOS 함수](r_STRPOS.md) 섹션을 참조하세요.

## 구문
<a name="position-synopsis"></a>

```
POSITION(substring IN string )
```

## 인수
<a name="r_POSITION-arguments"></a>

 *substring*   
*string* 내에서 검색할 하위 문자열입니다.

 *문자열*()   
검색할 문자열 또는 열입니다.

## 반환 타입
<a name="position-return-type"></a>

POSITION 함수는 하위 문자열의 위치에 해당하는 `INTEGER`를 반환합니다(0이 아닌 1부터 시작). 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 문자열 내에서 하위 문자열이 발견되지 않으면 POSITION이 `0`을 반환합니다.

## 예제
<a name="sub-r_POSITION_usage_notes-examples"></a>

`dog`이라는 단어 내에서 문자열 `fish`의 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT POSITION('fish' IN 'dog');

+-----------+
|  position |
+-----------+
|         0 |
+-----------+
```

`dogfish`이라는 단어 내에서 문자열 `fish`의 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT POSITION('fish' IN 'dogfish');

+-----------+
|  position |
+-----------+
|         4 |
+-----------+
```

 다음 예제에서는 TICKIT 샘플 데이터베이스의 SALES 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

SALES 테이블에서 999.00 이상의 수수료를 받는 고유 판매 거래 수를 반환하려면 다음 예제를 사용합니다. 이 명령은 커미션 값의 시작 부분에서 소수점이 4자리 이상인지 확인하여 999.00보다 큰 커미션을 계산합니다.

```
SELECT DISTINCT POSITION('.' IN commission), COUNT (POSITION('.' IN commission))
FROM sales 
WHERE POSITION('.' IN commission) > 4 
GROUP BY POSITION('.' IN commission)
ORDER BY 1,2;

+-----------+-------+
|  position | count |
+-----------+-------+
|         5 |   629 |
+-----------+-------+
```

# QUOTE\$1IDENT 함수
<a name="r_QUOTE_IDENT"></a>

QUOTE\$1IDENT 함수는 지정된 문자열을 선행 큰따옴표와 후행 큰따옴표가 있는 문자열로 반환합니다. 함수 출력은 SQL 문에서 식별자로 사용할 수 있습니다. 함수는 포함된 큰 따옴표를 적절하게 두 배로 늘립니다.

QUOTE\$1IDENT는 문자열에 식별자가 아닌 문자가 포함되어 있거나 그렇지 않으면 소문자로 변환될 때 유효한 식별자를 생성하는 데 필요한 경우에만 큰따옴표를 추가합니다. 항상 작은 따옴표로 묶인 문자열을 반환하려면 [QUOTE\$1LITERAL](r_QUOTE_LITERAL.md)을 사용합니다.

## 구문
<a name="r_QUOTE_IDENT-synopsis"></a>

```
QUOTE_IDENT(string)
```

## 인수
<a name="r_QUOTE_IDENT-argument"></a>

 *문자열*()   
`CHAR` 또는 `VARCHAR` 문자열입니다.

## 반환 타입
<a name="r_QUOTE_IDENT-return-type"></a>

QUOTE\$1IDENT 함수는 입력 **문자열과 동일한 형식의 문자열을 반환합니다.

## 예제
<a name="r_QUOTE_IDENT-example"></a>

큰따옴표로 묶은 문자열 `"CAT"`을 반환하려면 다음 예제를 사용합니다.

```
SELECT QUOTE_IDENT('"CAT"');

+-------------+
| quote_ident |
+-------------+
| """CAT"""   |
+-------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

따옴표로 묶인 CATNAME 열을 반환하려면 다음 예제를 사용합니다.

```
SELECT catid, QUOTE_IDENT(catname)
FROM category
ORDER BY 1,2;

+-------+-------------+
| catid | quote_ident |
+-------+-------------+
|     1 | "MLB"       |
|     2 | "NHL"       |
|     3 | "NFL"       |
|     4 | "NBA"       |
|     5 | "MLS"       |
|     6 | "Musicals"  |
|     7 | "Plays"     |
|     8 | "Opera"     |
|     9 | "Pop"       |
|    10 | "Jazz"      |
|    11 | "Classical" |
+-------+-------------+
```

# QUOTE\$1LITERAL 함수
<a name="r_QUOTE_LITERAL"></a>

QUOTE\$1LITERAL 함수는 지정한 문자열을 SQL 문에서 문자열 리터럴로 사용할 수 있도록 작은 따옴표로 묶인 문자열로 반환합니다. 입력 파라미터가 숫자라고 해도 QUOTE\$1LITERAL은 이를 문자열로 처리합니다. 작은따옴표와 백슬래시 모두 되풀이하여 두 번 사용됩니다.

## 구문
<a name="r_QUOTE_LITERAL-synopsis"></a>

```
QUOTE_LITERAL(string)
```

## 인수
<a name="r_QUOTE_LITERAL-argument"></a>

 *문자열*()   
`CHAR` 또는 `VARCHAR` 문자열입니다.

## 반환 타입
<a name="r_QUOTE_LITERAL-return-type"></a>

QUOTE\$1LITERAL 함수는 입력 문자열(`CHAR` 또는 `VARCHAR`)과 데이터 형식이 동일한 **문자열을 반환합니다.

## 예제
<a name="r_QUOTE_LITERAL-example"></a>

작은 따옴표로 묶은 문자열 `''CAT''`을 반환하려면 다음 예제를 사용합니다.

```
SELECT QUOTE_LITERAL('''CAT''');

+---------------+
| quote_literal |
+---------------+
| '''CAT'''     |
+---------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 CATNAME 열을 작은 따옴표로 묶어서 반환하는 예입니다.

```
SELECT catid, QUOTE_LITERAL(catname)
FROM category
ORDER BY 1,2;

+-------+---------------+
| catid | quote_literal |
+-------+---------------+
|     1 | 'MLB'         |
|     2 | 'NHL'         |
|     3 | 'NFL'         |
|     4 | 'NBA'         |
|     5 | 'MLS'         |
|     6 | 'Musicals'    |
|     7 | 'Plays'       |
|     8 | 'Opera'       |
|     9 | 'Pop'         |
|    10 | 'Jazz'        |
|    11 | 'Classical'   |
+-------+---------------+
```

다음은 CATID 열을 작은 따옴표로 묶어서 반환하는 예입니다.

```
SELECT QUOTE_LITERAL(catid), catname
FROM category
ORDER BY 1,2;

+---------------+-----------+
| quote_literal |  catname  |
+---------------+-----------+
| '1'           | MLB       |
| '10'          | Jazz      |
| '11'          | Classical |
| '2'           | NHL       |
| '3'           | NFL       |
| '4'           | NBA       |
| '5'           | MLS       |
| '6'           | Musicals  |
| '7'           | Plays     |
| '8'           | Opera     |
| '9'           | Pop       |
+---------------+-----------+
```

# REGEXP\$1COUNT 함수
<a name="REGEXP_COUNT"></a>

문자열에서 정규 표현식 패턴을 검색한 후 해당 패턴 발생 횟수를 나타내는 정수를 반환합니다. 일치하는 결과가 발견되지 않으면 함수가 `0`을 반환합니다. 정규 표현식에 관한 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션 및 Wikipedia의 [정규 표현식](https://en.wikipedia.org/wiki/Regular_expression)을 참조하세요.

## 구문
<a name="REGEXP_COUNT-synopsis"></a>

```
REGEXP_COUNT( source_string, pattern [, position [, parameters ] ] )
```

## 인수
<a name="REGEXP_COUNT-arguments"></a>

 *source\$1string*   
`CHAR` 또는 `VARCHAR` 문자열입니다.

 *pattern*   
정규 표현식 패턴을 나타내는 UTF-8 문자열 리터럴입니다. 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션을 참조하세요.

 *position*   
(선택) 검색을 시작할 **source\$1string 내 위치를 나타내는 양수 `INTEGER`입니다. 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 기본값은 `1`입니다. **position이 `1`보다 작으면 검색이 **source\$1string의 첫 문자부터 시작됩니다. **position이 **source\$1string의 문자 수보다 크면 결과는 `0`이 됩니다.

 *parameters*   
(선택) 함수가 패턴과 일치하는 방법을 나타내는 하나 이상의 문자열 리터럴입니다. 가능한 값은 다음과 같습니다.  
+ c - 대/소문자를 구분하여 일치시킵니다. 기본값은 대/소문자 구분 일치를 사용하는 것입니다.
+ i - 대/소문자를 구분하지 않고 일치시킵니다.
+ p – PCRE(Perl Compatible Regular Expression) 방언으로 패턴을 해석합니다. PCRE에 관한 자세한 내용은 Wikipedia의 [펄 호환 정규 표현식](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)을 참조하세요.

## 반환 타입
<a name="REGEXP_COUNT-return-type"></a>

INTEGER

## 예제
<a name="REGEXP_COUNT-examples"></a>

3자 시퀀스가 발생하는 횟수를 계산하려면 다음 예제를 사용합니다.

```
SELECT REGEXP_COUNT('abcdefghijklmnopqrstuvwxyz', '[a-z]{3}');

+--------------+
| regexp_count |
+--------------+
|            8 |
+--------------+
```

대/소문자를 구분하지 않는 일치를 사용하여 문자열 `FOX`의 발생 횟수를 계산하려면 다음 예제를 사용합니다.

```
SELECT REGEXP_COUNT('the fox', 'FOX', 1, 'i');

+--------------+
| regexp_count |
+--------------+
|            1 |
+--------------+
```

PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾으려면 다음 예제를 사용합니다. 이 예에서는 `?=` 연산자를 사용하는데, 이 연산자는 PCRE에서 특정 앞을 내다보는 의미를 갖습니다. 이 예에서는 대/소문자를 구분하여 일치하는 단어의 발생 횟수를 계산합니다.

```
SELECT REGEXP_COUNT('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 'p');

+--------------+
| regexp_count |
+--------------+
|            2 |
+--------------+
```

PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾으려면 다음 예제를 사용합니다. PCRE에서 특정한 의미를 지닌 `?=` 연산자가 사용됩니다. 이 예는 이러한 단어의 발생 횟수를 계산하지만 대/소문자를 구분하지 않는 일치를 사용한다는 점에서 이전 예와 다릅니다.

```
SELECT REGEXP_COUNT('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 'ip');

+--------------+
| regexp_count |
+--------------+
|            3 |
+--------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

최상위 도메인 이름이 `org` 또는 `edu`인 횟수를 계산하려면 다음 예제를 사용합니다.

```
SELECT email, REGEXP_COUNT(email,'@[^.]*\.(org|edu)') FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------+
|                     email                     | regexp_count |
+-----------------------------------------------+--------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu |            1 |
| Suspendisse.tristique@nonnisiAenean.edu       |            1 |
| amet.faucibus.ut@condimentumegetvolutpat.ca   |            0 |
| sed@lacusUtnec.ca                             |            0 |
+-----------------------------------------------+--------------+
```

# REGEXP\$1INSTR 함수
<a name="REGEXP_INSTR"></a>

문자열에서 정규 표현식 패턴을 검색하여 일치하는 하위 문자열의 시작 위치 또는 종료 위치를 나타내는 정수를 반환합니다. 일치하는 결과가 발견되지 않으면 함수가 `0`을 반환합니다. REGEXP\$1INSTR은 [POSITION](r_POSITION.md) 함수와 비슷하지만 문자열에서 정규 표현식 패턴을 검색할 수 있습니다. 정규 표현식에 관한 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션 및 Wikipedia의 [정규 표현식](https://en.wikipedia.org/wiki/Regular_expression)을 참조하세요.

## 구문
<a name="REGEXP_INSTR-synopsis"></a>

```
REGEXP_INSTR( source_string, pattern [, position [, occurrence] [, option [, parameters ] ] ] ] )
```

## 인수
<a name="REGEXP_INSTR-arguments"></a>

 *source\$1string*   
열 이름 같이 검색할 문자열 표현식입니다.

 *pattern*   
정규 표현식 패턴을 나타내는 UTF-8 문자열 리터럴입니다. 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션을 참조하세요.

 *position*   
(선택) 검색을 시작할 **source\$1string 내 위치를 나타내는 양수 `INTEGER`입니다. 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 기본값은 `1`입니다. **position이 `1`보다 작으면 검색이 **source\$1string의 첫 문자부터 시작됩니다. **position이 **source\$1string의 문자 수보다 크면 결과는 `0`이 됩니다.

 *발생*   
(선택) 사용할 패턴 발생을 나타내는 양의 `INTEGER`수입니다. REGEXP\$1INSTR은 첫 번째 일치 항목 `occurrence-1`을 건너뜁니다. 기본값은 `1`입니다. **occurrence가 `1`보다 작거나 **source\$1string에 있는 문자 수보다 클 경우 검색이 무시되고 결과가 `0`이 됩니다.

 *옵션*   
(선택) 일치하는 항목의 첫 번째 문자 위치(`0`)를 반환할지 일치하는 항목의 끝 다음에 나오는 첫 번째 문자의 위치(`1`)를 반환할지 여부를 나타내는 값입니다. 0이 아닌 값은 `1`과 같습니다. 기본값은 `0`입니다.

 *parameters*   
(선택) 함수가 패턴과 일치하는 방법을 나타내는 하나 이상의 문자열 리터럴입니다. 가능한 값은 다음과 같습니다.  
+ c - 대/소문자를 구분하여 일치시킵니다. 기본값은 대/소문자 구분 일치를 사용하는 것입니다.
+ i - 대/소문자를 구분하지 않고 일치시킵니다.
+ e - 하위 표현식을 사용하여 하위 문자열을 추출합니다.

  *패턴*에 하위 표현식이 포함되어 있을 경우 REGEXP\$1INSTR은 *패턴*의 첫 번째 하위 표현식을 사용하여 하위 문자열과 일치시킵니다. REGEXP\$1INSTR은 첫 번째 하위 표현식만 고려하며 추가 하위 표현식은 무시됩니다. 패턴에 하위 표현식이 없으면 REGEXP\$1INSTR이 'e' 파라미터를 무시합니다.
+ p – PCRE(Perl Compatible Regular Expression) 방언으로 패턴을 해석합니다. PCRE에 관한 자세한 내용은 Wikipedia의 [펄 호환 정규 표현식](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)을 참조하세요.

## 반환 타입
<a name="REGEXP_INSTR-return-type"></a>

Integer

## 예제
<a name="REGEXP_INSTR-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

도메인 이름을 시작하는 `@` 문자를 검색하고 첫 번째 일치 항목의 시작 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT email, REGEXP_INSTR(email, '@[^.]*')
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------+
|                     email                     | regexp_instr |
+-----------------------------------------------+--------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu |           21 |
| Suspendisse.tristique@nonnisiAenean.edu       |           22 |
| amet.faucibus.ut@condimentumegetvolutpat.ca   |           17 |
| sed@lacusUtnec.ca                             |            4 |
+-----------------------------------------------+--------------+
```

`Center`라는 단어의 변형을 검색하고 첫 번째 일치 항목의 시작 위치를 반환하려면 다음 예제를 사용합니다.

```
SELECT venuename, REGEXP_INSTR(venuename,'[cC]ent(er|re)$')
FROM venue
WHERE REGEXP_INSTR(venuename,'[cC]ent(er|re)$') > 0
ORDER BY venueid LIMIT 4;

+-----------------------+--------------+
|       venuename       | regexp_instr |
+-----------------------+--------------+
| The Home Depot Center |           16 |
| Izod Center           |            6 |
| Wachovia Center       |           10 |
| Air Canada Centre     |           12 |
+-----------------------+--------------+
```

대소문자를 구분하지 않는 일치 논리를 사용하여 문자열 `FOX`의 첫 번째 발생 위치를 찾으려면 다음 예제를 사용합니다.

```
SELECT REGEXP_INSTR('the fox', 'FOX', 1, 1, 0, 'i');

+--------------+
| regexp_instr |
+--------------+
|            5 |
+--------------+
```

PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾으려면 다음 예제를 사용합니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 이 예에서는 두 번째 단어의 시작 위치를 찾습니다.

```
SELECT REGEXP_INSTR('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'p');

+--------------+
| regexp_instr |
+--------------+
|           21 |
+--------------+
```

PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾으려면 다음 예제를 사용합니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 이 예는 두 번째 단어의 시작 위치를 찾지만 대/소문자를 구분하지 않는 일치를 사용한다는 점에서 이전 예와 다릅니다.

```
SELECT REGEXP_INSTR('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'ip');

+--------------+
| regexp_instr |
+--------------+
|           15 |
+--------------+
```

# REGEXP\$1REPLACE 함수
<a name="REGEXP_REPLACE"></a>

문자열에서 정규 표현식 패턴을 검색한 후 발견되는 모든 패턴을 지정한 문자열로 변경합니다. REGEXP\$1REPLACE는 [REPLACE 함수](r_REPLACE.md)과 비슷하지만 문자열에서 정규 표현식 패턴을 검색할 수 있습니다. 정규 표현식에 관한 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션 및 Wikipedia의 [정규 표현식](https://en.wikipedia.org/wiki/Regular_expression)을 참조하세요.

REGEXP\$1REPLACE는 [TRANSLATE 함수](r_TRANSLATE.md) 및 [REPLACE 함수](r_REPLACE.md)과 비슷합니다. 단, TRANSLATE는 단일 문자를 여러 차례 변경하고, REPLACE는 전체 문자열 하나를 다른 문자열로 변경하는 반면 REGEXP\$1REPLACE는 문자열에서 정규 표현식 패턴을 검색할 수 있습니다.

## 구문
<a name="REGEXP_REPLACE-synopsis"></a>

```
REGEXP_REPLACE( source_string, pattern [, replace_string [ , position [, parameters ] ] ] )
```

## 인수
<a name="REGEXP_REPLACE-arguments"></a>

 *source\$1string*   
검색할 열 이름과 같은 `CHAR` 또는 `VARCHAR` 문자열 표현식입니다.

 *pattern*   
정규 표현식 패턴을 나타내는 UTF-8 문자열 리터럴입니다. 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션을 참조하세요.

*replace\$1string*  
(선택) 발견되는 패턴을 각각 변경할 `CHAR` 또는 `VARCHAR` 문자열 표현식(열 이름 등)입니다. 기본값은 빈 문자열입니다( "" ).

 *position*   
(선택) **source\$1string 내에서 검색을 시작할 위치를 나타내는 양의 정수입니다. 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 기본값은 `1`입니다. **position이 `1`보다 작으면 검색이 **source\$1string의 첫 문자부터 시작됩니다. *position*이 *source\$1string*의 문자 수보다 크면 결과는 *source\$1string*이 됩니다.

 *parameters*   
(선택) 함수가 패턴과 일치하는 방법을 나타내는 하나 이상의 문자열 리터럴입니다. 가능한 값은 다음과 같습니다.  
+ c - 대/소문자를 구분하여 일치시킵니다. 기본값은 대/소문자 구분 일치를 사용하는 것입니다.
+ i - 대/소문자를 구분하지 않고 일치시킵니다.
+ p – PCRE(Perl Compatible Regular Expression) 방언으로 패턴을 해석합니다. PCRE에 관한 자세한 내용은 Wikipedia의 [펄 호환 정규 표현식](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)을 참조하세요.

## 반환 타입
<a name="REGEXP_REPLACE-return-type"></a>

VARCHAR

**pattern 또는 **replace\$1string이 `NULL`이면 결과도 `NULL`이 됩니다.

## 예제
<a name="REGEXP_REPLACE-examples"></a>

대소문자를 구분하지 않는 일치를 사용하여 값 `quick brown fox` 내에서 문자열 `FOX`를 모두 바꾸려면 다음 예제를 사용합니다.

```
SELECT REGEXP_REPLACE('the fox', 'FOX', 'quick brown fox', 1, 'i');

+---------------------+
|   regexp_replace    |
+---------------------+
| the quick brown fox |
+---------------------+
```

다음 예에서는 PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾습니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 해당 단어가 나타날 때마다 값 `[hidden]`으로 바꾸려면 다음 예제를 사용합니다.

```
SELECT REGEXP_REPLACE('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', '[hidden]', 1, 'p');

+-------------------------------+
|        regexp_replace         |
+-------------------------------+
| [hidden] plain A1234 [hidden] |
+-------------------------------+
```

다음 예에서는 PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾습니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 대소문자를 구분하지 않는 일치를 사용한다는 점에서 이전 예제와 다르지만 이러한 단어의 각 발생을 `[hidden]` 값으로 바꾸려면 다음 예제를 사용합니다.

```
SELECT REGEXP_REPLACE('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', '[hidden]', 1, 'ip');

+----------------------------------+
|          regexp_replace          |
+----------------------------------+
| [hidden] plain [hidden] [hidden] |
+----------------------------------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

이메일 주소에서 `@` 및 도메인 주소를 삭제하려면 다음 예제를 사용합니다.

```
SELECT email, REGEXP_REPLACE(email, '@.*\\.(org|gov|com|edu|ca)$')
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+-----------------------+
|                     email                     |    regexp_replace     |
+-----------------------------------------------+-----------------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu | Etiam.laoreet.libero  |
| Suspendisse.tristique@nonnisiAenean.edu       | Suspendisse.tristique |
| amet.faucibus.ut@condimentumegetvolutpat.ca   | amet.faucibus.ut      |
| sed@lacusUtnec.ca                             | sed                   |
+-----------------------------------------------+-----------------------+
```

이메일 주소의 도메인 이름을 값 `internal.company.com`으로 바꾸려면 다음 예제를 사용합니다.

```
SELECT email, REGEXP_REPLACE(email, '@.*\\.[[:alpha:]]{2,3}','@internal.company.com') 
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------------------------------------+
|                     email                     |               regexp_replace               |
+-----------------------------------------------+--------------------------------------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu | Etiam.laoreet.libero@internal.company.com  |
| Suspendisse.tristique@nonnisiAenean.edu       | Suspendisse.tristique@internal.company.com |
| amet.faucibus.ut@condimentumegetvolutpat.ca   | amet.faucibus.ut@internal.company.com      |
| sed@lacusUtnec.ca                             | sed@internal.company.com                   |
+-----------------------------------------------+--------------------------------------------+
```

# REGEXP\$1SUBSTR 함수
<a name="REGEXP_SUBSTR"></a>

문자열에서 정규 표현식 패턴을 검색하여 문자를 반환합니다. REGEXP\$1SUBSTR은 [SUBSTRING 함수](r_SUBSTRING.md) 함수와 비슷하지만 문자열에서 정규 표현식 패턴을 검색할 수 있습니다. 함수에서 정규 표현식이 문자열의 어떤 문자와도 일치하지 않는 경우 빈 문자열이 반환됩니다. 정규 표현식에 관한 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션 및 Wikipedia의 [정규 표현식](https://en.wikipedia.org/wiki/Regular_expression)을 참조하세요.

## 구문
<a name="REGEXP_SUBSTR-synopsis"></a>

```
REGEXP_SUBSTR( source_string, pattern [, position [, occurrence [, parameters ] ] ] )
```

## 인수
<a name="REGEXP_SUBSTR-arguments"></a>

 *source\$1string*   
검색할 문자열 표현식입니다.

 *pattern*   
정규 표현식 패턴을 나타내는 UTF-8 문자열 리터럴입니다. 자세한 내용은 [POSIX 연산자](pattern-matching-conditions-posix.md) 섹션을 참조하세요.

 *position*   
*source\$1string* 내에서 검색을 시작할 위치를 나타내는 양의 정수입니다. 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 기본값은 1입니다. *position*이 1보다 작으면 검색이 *source\$1string*의 첫 문자부터 시작됩니다. *position*이 *source\$1string*의 문자 수보다 크면 결과는 빈 문자열("")이 됩니다.

 *발생*   
사용할 패턴 발생을 나타내는 양의 정수입니다. REGEXP\$1SUBSTR은 첫 번째 *발생*에서 1을 뺀 개수의 일치하는 항목을 건너뜁니다. 기본값은 1입니다. *발생*이 1보다 작거나 *source\$1string*에 있는 문자 수보다 클 경우 검색이 무시되고 빈 결과가 반환됩니다.

 *parameters*   
함수가 패턴과 일치하는 방법을 나타내는 하나 이상의 문자열 리터럴입니다. 가능한 값은 다음과 같습니다.  
+ c - 대/소문자를 구분하여 일치시킵니다. 기본값은 대/소문자 구분 일치를 사용하는 것입니다.
+ i - 대/소문자를 구분하지 않고 일치시킵니다.
+ e - 하위 표현식을 사용하여 하위 문자열을 추출합니다.

   *패턴*에 하위 표현식이 포함되어 있을 경우 REGEXP\$1SUBSTR은 *패턴*의 첫 번째 하위 표현식을 사용하여 하위 문자열과 일치시킵니다. 하위 표현식은 괄호로 묶인 패턴 내 표현식입니다. 예를 들어 `'This is a (\\w+)'` 패턴은 첫 번째 표현식과 뒤에 단어가 오는 `'This is a '` 문자열을 일치시킵니다. `e` 매개 변수가 있는 REGEXP\$1SUBSTR은 패턴**을 반환하는 대신 하위 표현식 내의 문자열만 반환합니다.

  REGEXP\$1SUBSTR은 첫 번째 하위 표현식만 고려하며 추가 하위 표현식은 무시됩니다. 패턴에 하위 표현식이 없으면 REGEXP\$1SUBSTR이 'e' 파라미터를 무시합니다.
+ p – PCRE(Perl Compatible Regular Expression) 방언으로 패턴을 해석합니다. PCRE에 관한 자세한 내용은 Wikipedia의 [펄 호환 정규 표현식](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)을 참조하세요.

## 반환 타입
<a name="REGEXP_SUBSTR-return-type"></a>

VARCHAR

## 예제
<a name="REGEXP_SUBSTR-examples"></a>

다음은 @ 문자와 도메인 확장자 사이의 이메일 주소 구간을 반환하는 예입니다. 쿼리된 `users` 데이터는 Amazon Redshift 샘플 데이터에서 가져온 것입니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
SELECT email, regexp_substr(email,'@[^.]*')
FROM users
ORDER BY userid LIMIT 4;

                     email                     |      regexp_substr
-----------------------------------------------+--------------------------
 Suspendisse.tristique@nonnisiAenean.edu       | @nonnisiAenean
 amet.faucibus.ut@condimentumegetvolutpat.ca   | @condimentumegetvolutpat
 sed@lacusUtnec.ca                             | @lacusUtnec
 Cum@accumsan.com                              | @accumsan
```

다음 예에서는 대/소문자를 구분하지 않는 일치를 사용하여 문자열 `FOX`의 첫 번째 발생에 해당하는 입력 부분을 반환합니다.

```
SELECT regexp_substr('the fox', 'FOX', 1, 1, 'i');

 regexp_substr
---------------
 fox
```

다음 예에서는 대/소문자를 구분하지 않는 일치를 사용하여 문자열 `FOX`의 두 번째 발생에 해당하는 입력 부분을 반환합니다. 두 번째 발생이 없기 때문에 결과는 비어 있음(Null이 아님, 길이 0)입니다.

```
SELECT regexp_substr('the fox', 'FOX', 1, 2, 'i');

 regexp_substr
---------------
```

다음 예제에서는 소문자로 시작하는 입력의 첫 번째 부분을 반환합니다. 이는 `c` 파라미터가 없는 동일한 SELECT 문과 기능적으로 동일합니다.

```
SELECT regexp_substr('THE SECRET CODE IS THE LOWERCASE PART OF 1931abc0EZ.', '[a-z]+', 1, 1, 'c');

 regexp_substr
---------------
 abc
```

다음 예에서는 PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾습니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 이 예에서는 두 번째 단어에 해당하는 입력 부분을 반환합니다.

```
SELECT regexp_substr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 'p');

 regexp_substr
---------------
 a1234
```

다음 예에서는 PCRE 방언으로 작성된 패턴을 사용하여 하나 이상의 숫자와 하나의 소문자가 포함된 단어를 찾습니다. PCRE에서 특정 미리 보기 의미가 있는 `?=` 연산자가 사용됩니다. 이 예는 두 번째 단어에 해당하는 입력 부분을 반환하지만 대/소문자를 구분하지 않는 일치를 사용한다는 점에서 이전 예와 다릅니다.

```
SELECT regexp_substr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 'ip');

 regexp_substr
---------------
 A1234
```

다음 예에서는 하위 표현식을 사용하여 `'this is a (\\w+)'` 패턴과 일치하는 두 번째 문자열을 찾습니다. 괄호를 친 하위 표현식을 반환합니다.

```
SELECT regexp_substr(
               'This is a cat, this is a dog. This is a mouse.',
               'this is a (\\w+)', 1, 2, 'ie');
           
 regexp_substr
---------------
 dog
```

# REPEAT 함수
<a name="r_REPEAT"></a>

문자열을 지정한 횟수만큼 반복합니다. 입력 파라미터가 숫자라고 해도 REPEAT는 이를 문자열로 처리합니다.

[REPLICATE 함수](r_REPLICATE.md)의 동의어입니다.

## 구문
<a name="r_REPEAT-synopsis"></a>

```
REPEAT(string, integer)
```

## 인수
<a name="r_REPEAT-arguments"></a>

 *문자열*()   
첫 번째 입력 파라미터는 반복할 문자열입니다.

 *(정수*)   
두 번째 파라미터는 문자열을 반복할 횟수를 나타내는 `INTEGER`입니다.

## 반환 타입
<a name="r_REPEAT-return-type"></a>

VARCHAR

## 예제
<a name="r_REPEAT-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATEGORY 테이블에서 CATID 열의 값을 세 번 반복하려면 다음 예제를 사용합니다.

```
SELECT catid, REPEAT(catid,3)
FROM category
ORDER BY 1,2;

+-------+--------+
| catid | repeat |
+-------+--------+
|     1 |    111 |
|     2 |    222 |
|     3 |    333 |
|     4 |    444 |
|     5 |    555 |
|     6 |    666 |
|     7 |    777 |
|     8 |    888 |
|     9 |    999 |
|    10 | 101010 |
|    11 | 111111 |
+-------+--------+
```

다음 예제에서는 최대 16,000,000바이트의 문자열을 생성하는 방법을 보여줍니다.

```
SELECT 
    LEN(REPEAT('X', 5000000)) AS five_million_bytes,
    LEN(REPEAT('Y', 16000000)) AS sixteen_million_bytes;

 five_million_bytes  | sixteen_million_bytes
----------+-----------
 5000000  | 16000000
```

# REPLACE 함수
<a name="r_REPLACE"></a>

기존 문자열에서 발견되는 모든 문자 집합을 다른 지정 문자로 변경합니다.

REPLACE는 [TRANSLATE 함수](r_TRANSLATE.md) 및 [REGEXP\$1REPLACE 함수](REGEXP_REPLACE.md)과 비슷합니다. 단, TRANSLATE는 단일 문자를 여러 차례 변경하고, REGEXP\$1REPLACE는 문자열에서 정규 표현식 패턴을 검색하는 반면 REPLACE는 전체 문자열 하나를 다른 문자열로 변경합니다.

## 구문
<a name="r_REPLACE-synopsis"></a>

```
REPLACE(string, old_chars, new_chars)
```

## 인수
<a name="r_REPLACE-arguments"></a>

 *문자열*()   
검색할 `CHAR` 또는 `VARCHAR` 문자열입니다.

 *old\$1chars*   
대체할 `CHAR` 또는 `VARCHAR` 문자열입니다.

 *new\$1chars*   
**old\$1string을 변경할 새로운 `CHAR` 또는 `VARCHAR` 문자열입니다.

## 반환 타입
<a name="r_REPLACE-return-type"></a>

VARCHAR  
**old\$1chars 또는 **new\$1chars가 `NULL`이면 결과도 `NULL`이 됩니다.

## 예제
<a name="r_REPLACE-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATGROUP 필드에서 문자열 `Shows`를 `Theatre`로 변환하려면 다음 예제를 사용합니다.

```
SELECT catid, catgroup, REPLACE(catgroup, 'Shows', 'Theatre')
FROM category
ORDER BY 1,2,3;

+-------+----------+----------+
| catid | catgroup | replace  |
+-------+----------+----------+
|     1 | Sports   | Sports   |
|     2 | Sports   | Sports   |
|     3 | Sports   | Sports   |
|     4 | Sports   | Sports   |
|     5 | Sports   | Sports   |
|     6 | Shows    | Theatre  |
|     7 | Shows    | Theatre  |
|     8 | Shows    | Theatre  |
|     9 | Concerts | Concerts |
|    10 | Concerts | Concerts |
|    11 | Concerts | Concerts |
+-------+----------+----------+
```

# REPLICATE 함수
<a name="r_REPLICATE"></a>

REPEAT 함수의 동의어입니다.

[REPEAT 함수](r_REPEAT.md) 섹션을 참조하세요.

# REVERSE 함수
<a name="r_REVERSE"></a>

REVERSE 함수는 문자열에 대해 실행되며, 문자를 역순으로 반환합니다. 예를 들어, `reverse('abcde')`는 `edcba`를 반환합니다. 이 함수는 문자 데이터 형식 외에 숫자나 날짜 데이터 형식에서도 실행되지만 대부분은 문자열에서 실용적인 값을 갖습니다.

## 구문
<a name="r_REVERSE-synopsis"></a>

```
REVERSE( expression )
```

## 인수
<a name="r_REVERSE-argument"></a>

 *expression*   
문자, 날짜, 타임스탬프, 숫자 데이터 형식 등 문자 반전의 대상이 되는 표현식입니다. 모든 표현식은 묵시적으로 `VARCHAR` 문자열로 변환됩니다. `CHAR` 문자열의 후행 공백 입력은 무시됩니다.

## 반환 타입
<a name="r_REVERSE-return-type"></a>

VARCHAR

## 예제
<a name="r_REVERSE-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 및 SALES 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

USERS 테이블에서 5개의 고유한 도시 이름과 그에 해당하는 반전된 이름을 선택하려면 다음 예제를 사용합니다.

```
SELECT DISTINCT city AS cityname, REVERSE(cityname)
FROM users 
ORDER BY city LIMIT 5;

+----------+----------+
| cityname | reverse  |
+----------+----------+
| Aberdeen | needrebA |
| Abilene  | enelibA  |
| Ada      | adA      |
| Agat     | tagA     |
| Agawam   | mawagA   |
+----------+----------+
```

문자 문자열로 캐스팅된 5개의 판매 ID와 해당 반전된 ID를 선택하려면 다음 예제를 사용합니다.

```
SELECT salesid, REVERSE(salesid)
FROM sales 
ORDER BY salesid DESC LIMIT 5;

+---------+---------+
| salesid | reverse |
+---------+---------+
|  172456 |  654271 |
|  172455 |  554271 |
|  172454 |  454271 |
|  172453 |  354271 |
|  172452 |  254271 |
+---------+---------+
```

# RTRIM 함수
<a name="r_RTRIM"></a>

RTRIM 함수는 문자열 끝부터 지정된 문자 집합을 잘라냅니다. 잘라낸 문자 목록에서 문자만 포함하는 가장 긴 문자열을 제거합니다. 잘라내기 문자가 입력 문자열에 나타나지 않으면 잘라내기가 완료된 것입니다.

## 구문
<a name="r_RTRIM-synopsis"></a>

```
RTRIM( string, trim_chars )
```

## 인수
<a name="r_RTRIM-arguments"></a>

 *문자열*()   
잘라낼 문자열 열, 표현식 또는 문자열 리터럴입니다.

 *trim\$1chars*   
*문자열*의 끝부터 잘라낼 문자를 나타내는 문자열 열, 표현식 또는 문자열 리터럴입니다. 지정하지 않으면 공백이 잘라내기 문자로 사용됩니다.

## 반환 타입
<a name="r_RTRIM-return-type"></a>

*string* 인수와 동일한 데이터 형식의 문자열입니다.

## 예제
<a name="r_RTRIM-example"></a>

다음은 문자열 `' abc '`에서 선행 및 후행 공백을 잘라내는 예입니다.

```
select '     abc    ' as untrim, rtrim('     abc    ') as trim;

untrim    | trim
----------+------
   abc    |    abc
```

다음은 문자열 `'xyzaxyzbxyzcxyz'`에서 후행 `'xyz'` 문자열을 제거하는 예입니다. 결과를 보면 후행하는 `'xyz'`만 제거되었고 문자열 내부에서는 제거되지 않았습니다.

```
select 'xyzaxyzbxyzcxyz' as untrim,
rtrim('xyzaxyzbxyzcxyz', 'xyz') as trim;

     untrim      |   trim
-----------------+-----------
 xyzaxyzbxyzcxyz | xyzaxyzbxyzc
```

다음 예제에서는 *trim\$1chars* 목록 `'tes'`의 모든 문자와 일치하는 문자열 `'setuphistorycassettes'`에서 후행 부분을 제거합니다. 입력 문자열의 끝에서 *trim\$1chars* 목록에 없는 다른 문자 앞에 오는 모든 `t`, `e` 또는 `s`는 제거됩니다.

```
SELECT rtrim('setuphistorycassettes', 'tes');

     rtrim      
-----------------
 setuphistoryca
```

다음은 VENUENAME의 끝에서 있는 경우에 한해 문자 'Park'를 잘라내는 예입니다.

```
select venueid, venuename, rtrim(venuename, 'Park')
from venue
order by 1, 2, 3
limit 10;

venueid |         venuename          |          rtrim
--------+----------------------------+-------------------------
      1 | Toyota Park                | Toyota
      2 | Columbus Crew Stadium      | Columbus Crew Stadium
      3 | RFK Stadium                | RFK Stadium
      4 | CommunityAmerica Ballpark  | CommunityAmerica Ballp
      5 | Gillette Stadium           | Gillette Stadium
      6 | New York Giants Stadium    | New York Giants Stadium
      7 | BMO Field                  | BMO Field
      8 | The Home Depot Center      | The Home Depot Cente
      9 | Dick's Sporting Goods Park | Dick's Sporting Goods
     10 | Pizza Hut Park             | Pizza Hut
```

위 예를 보면 `P`, `a`, `r` 또는 `k`가 VENUENAME의 끝에 있을 경우 RTRIM이 각 문자를 모두 제거한 것을 알 수 있습니다.

# SOUNDEX 함수
<a name="SOUNDEX"></a>

SOUNDEX 함수는 입력 문자열의 첫 글자와 지정한 문자열의 영어 발음을 나타내는 소리의 3자리 인코딩으로 구성된 미국 Soundex 값을 반환합니다. 예를 들어 `Smith` 및 `Smyth`의 Soundex 코드는 동일합니다.

## 구문
<a name="SOUNDEX-synopsis"></a>

```
SOUNDEX(string)
```

## 인수
<a name="SOUNDEX-arguments"></a>

 *문자열*()   
American Soundex 코드 값으로 변환하려는 `CHAR` 또는 `VARCHAR` 문자열을 지정합니다.

## 반환 타입
<a name="SOUNDEX-return-type"></a>

VARCHAR(4)

## 사용 노트
<a name="r_SOUNDEX_usage_notes"></a>

SOUNDEX 함수는 a\$1z 및 A\$1Z를 포함하여 영어 알파벳 소문자와 대문자 ASCII 문자만 변환합니다. SOUNDEX는 다른 문자를 무시합니다. SOUNDEX는 공백으로 구분된 여러 단어의 문자열에 대해 단일 Soundex 값을 반환합니다.

```
SELECT SOUNDEX('AWS Amazon');
            
+---------+
| soundex |
+---------+
| A252    |
+---------+
```

SOUNDEX는 입력 문자열에 영어가 포함되지 않은 경우 빈 문자열을 반환합니다.

```
SELECT SOUNDEX('+-*/%');

+---------+
| soundex |
+---------+
|         |
+---------+
```

## 예제
<a name="SOUNDEX-examples"></a>

`Amazon`에 대한 Soundex 값을 반환하려면 다음 예제를 사용합니다.

```
SELECT SOUNDEX('Amazon');

+---------+
| soundex |
+---------+
| A525    |
+---------+
```

`smith` 및 `smyth`에 대한 Soundex 값을 반환하려면 다음 예제를 사용합니다. Soundex 값은 동일합니다.

```
SELECT SOUNDEX('smith'), SOUNDEX('smyth');

+-------+-------+
| smith | smyth |
+-------+-------+
| S530  | S530  |
+-------+-------+
```

# SPLIT\$1PART 함수
<a name="SPLIT_PART"></a>

지정 구분자를 기준으로 문자열을 분할한 후 지정된 위치에 해당하는 부분을 반환합니다.

## 구문
<a name="SPLIT_PART-synopsis"></a>

```
SPLIT_PART(string, delimiter, position)
```

## 인수
<a name="SPLIT_PART-arguments"></a>

 *문자열*()   
분할할 문자열 열, 표현식 또는 문자열 리터럴입니다. 문자열은 CHAR 또는 VARCHAR가 될 수 있습니다.

 *delimiter*   
입력 *문자열*의 섹션을 나타내는 구분자 문자열입니다.  
*delimiter*가 리터럴이면 작은따옴표로 묶어야 합니다.

 *position*   
반환할 *문자열* 구간의 위치입니다(1부터 시작). 반드시 0보다 큰 정수이어야 합니다. *position*이 문자열 구간의 수보다 크면 SPLIT\$1PART가 빈 문자열을 반환합니다. *string*에서 *delimiter*를 찾을 수 없는 경우 반환된 값에는 전체 *string* 또는 빈 값이 될 수 있는 지정된 부분의 내용이 포함됩니다.

## 반환 타입
<a name="SPLIT_PART-return-type"></a>

*string* 파라미터와 동일한 CHAR 또는 VARCHAR 문자열입니다.

## 예제
<a name="SPLIT_PART-examples"></a>

다음 예제에서는 `$` 구분 기호를 사용하여 문자열 리터럴을 여러 부분으로 분할하고 두 번째 부분을 반환합니다.

```
select split_part('abc$def$ghi','$',2)

split_part
----------
def
```

다음 예제에서는 `$` 구분 기호를 사용하여 문자열 리터럴을 여러 부분으로 분할합니다. `4` 부분을 찾을 수 없기 때문에 빈 문자열이 반환됩니다.

```
select split_part('abc$def$ghi','$',4)

split_part
----------
```

다음 예제에서는 `#` 구분 기호를 사용하여 문자열 리터럴을 여러 부분으로 분할합니다. 이 구분 기호를 찾을 수 없기 때문에 첫 번째 부분인 전체 문자열이 반환됩니다.

```
select split_part('abc$def$ghi','#',1)

split_part
------------
abc$def$ghi
```

다음은 타임스탬프 필드인 LISTTIME을 년, 월, 일 요소로 분할하는 예입니다.

```
select listtime, split_part(listtime,'-',1) as year,
split_part(listtime,'-',2) as month, 
split_part(split_part(listtime,'-',3),' ',1) as day 
from listing limit 5;

      listtime       | year | month | day
---------------------+------+-------+------
 2008-03-05 12:25:29 | 2008 | 03    | 05
 2008-09-09 08:03:36 | 2008 | 09    | 09
 2008-09-26 05:43:12 | 2008 | 09    | 26
 2008-10-04 02:00:30 | 2008 | 10    | 04
 2008-01-06 08:33:11 | 2008 | 01    | 06
```

다음은 LISTTIME 타임스탬프 필드를 선택하고, `'-'` 문자를 기준으로 필드를 분할하여 월(LISTTIME 문자열의 두 번째 구간)을 가져온 다음 각 월의 항목 수를 계산하는 예입니다.

```
select split_part(listtime,'-',2) as month, count(*)
from listing
group by split_part(listtime,'-',2)
order by 1, 2;

 month | count
-------+-------
    01 | 18543
    02 | 16620
    03 | 17594
    04 | 16822
    05 | 17618
    06 | 17158
    07 | 17626
    08 | 17881
    09 | 17378
    10 | 17756
    11 | 12912
    12 | 4589
```

# STRPOS 함수
<a name="r_STRPOS"></a>

지정한 문자열 내에서 하위 문자열의 위치를 반환합니다.

유사한 함수는 [CHARINDEX 함수](r_CHARINDEX.md) 및 [POSITION 함수](r_POSITION.md) 섹션을 참조하세요.

## 구문
<a name="r_STRPOS-synopsis"></a>

```
STRPOS(string, substring )
```

## 인수
<a name="r_STRPOS-arguments"></a>

 *문자열*()   
첫 번째 입력 파라미터는 검색 대상인 `CHAR` 또는 `VARCHAR` 문자열입니다.

 *substring*   
두 번째 파라미터는 *string* 내에서 검색할 하위 문자열입니다.

## 반환 타입
<a name="r_STRPOS-return-type"></a>

INTEGER  
STRPOS 함수는 **하위 문자열의 위치에 해당하는 `INTEGER`를 반환합니다(0이 아닌 1부터 시작). 이 위치는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다.

## 사용 노트
<a name="r_STRPOS_usage_notes"></a>

**문자열 내에서 **하위 문자열을 찾을 수 없는 경우 STRPOS는 `0`을 반환합니다.

```
SELECT STRPOS('dogfish', 'fist');

+--------+
| strpos |
+--------+
|      0 |
+--------+
```

## 예제
<a name="r_STRPOS-examples"></a>

`dogfish` 내에서 `fish`의 위치를 표시하려면 다음 예제를 사용합니다.

```
SELECT STRPOS('dogfish', 'fish');

+--------+
| strpos |
+--------+
|      4 |
+--------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 SALES 테이블 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

SALES 테이블에서 COMMISSION이 999.00을 초과하는 판매 거래 수를 반환하려면 다음 예제를 사용합니다.

```
SELECT DISTINCT STRPOS(commission, '.'),
COUNT (STRPOS(commission, '.'))
FROM sales
WHERE STRPOS(commission, '.') > 4
GROUP BY STRPOS(commission, '.')
ORDER BY 1, 2;

+--------+-------+
| strpos | count |
+--------+-------+
|      5 |   629 |
+--------+-------+
```

# STRTOL 함수
<a name="r_STRTOL"></a>

지정한 밑의 문자열 표현식을 등가의 정수 값으로 변환합니다. 변환된 값은 부호화 64비트 범위 이내가 되어야 합니다.

## 구문
<a name="r_STRTOL-syntax"></a>

```
STRTOL(num_string, base)
```

## 인수
<a name="r_STRTOL-arguments"></a>

 *num\$1string*   
변환할 숫자의 문자열 표현식입니다. **num\$1string이 빈 문자열(`''`)이거나, 혹은 null 문자(`'\0'`)로 시작되면 변환되는 값은 `0`입니다. **num\$1string이 NULL 값을 포함한 열이면 STRTOL이 `NULL`을 반환합니다. 문자열은 크기의 제한 없이 공백으로 시작할 수 있으며, 그 뒤에 더하기 '`+`' 또는 빼기 '`-`' 기호를 옵션으로 추가하여 양수 또는 음수를 나타냅니다. 기본값은 '`+`'입니다. 예를 들어 *base*가 `16`이라고 가정하면 문자열은 '`0x`'로 시작할 수 있습니다.

*base*  
2에서 36 사이의 `INTEGER`입니다.

## 반환 타입
<a name="r_STRTOL-return-type"></a>

BIGINT  
**num\$1string이 null이면 함수는 `NULL`을 반환합니다.

## 예제
<a name="r_STRTOL-examples"></a>

문자열과 기본값 쌍을 정수로 변환하려면 다음 예제를 사용합니다.

```
SELECT STRTOL('0xf',16);

+--------+
| strtol |
+--------+
|     15 |
+--------+

SELECT STRTOL('abcd1234',16);

+------------+
|   strtol   |
+------------+
| 2882343476 |
+------------+

SELECT STRTOL('1234567', 10);

+---------+
| strtol  |
+---------+
| 1234567 |
+---------+

SELECT STRTOL('1234567', 8);

+--------+
| strtol |
+--------+
| 342391 |
+--------+

SELECT STRTOL('110101', 2);

+--------+
| strtol |
+--------+
|     53 |
+--------+

SELECT STRTOL('\0', 2);

+--------+
| strtol |
+--------+
|      0 |
+--------+
```

# SUBSTRING 함수
<a name="r_SUBSTRING"></a>

지정된 시작 위치를 기반으로 문자열의 하위 집합을 반환합니다.

입력이 문자열인 경우 추출된 문자의 시작 위치와 수는 바이트가 아닌 문자를 기준으로 하므로 멀티바이트 문자는 단일 문자로 계산됩니다. 입력이 이진 표현식인 경우 시작 위치와 추출된 하위 문자열은 바이트를 기반으로 합니다. 음의 길이는 지정할 수 없지만 음의 시작 위치는 지정 가능합니다.

## 구문
<a name="r_SUBSTRING-synopsis"></a>

```
SUBSTRING(character_string FROM start_position [ FOR number_characters ] )
```

```
SUBSTRING(character_string, start_position, number_characters )
```

```
SUBSTRING(binary_expression, start_byte, number_bytes )
```

```
SUBSTRING(binary_expression, start_byte )
```

## 인수
<a name="r_SUBSTRING-arguments"></a>

 *character\$1string*   
검색 대상의 문자열입니다. 문자가 아닌 데이터 형식도 문자열로 처리됩니다.

 *start\$1position*   
문자열 내에서 추출을 시작할 위치이며, 1부터 시작됩니다. *start\$1position*은 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 이 수는 음의 값이 될 수 있습니다.

 *number\$1characters*   
추출할 문자 수(하위 문자열의 길이)입니다. *number\$1characters*는 바이트가 아닌 문자 수를 기준으로 하기 때문에 멀티바이트 문자도 단일 문자로 계산됩니다. 이 수는 음의 값이 될 수 없습니다.

 *binary\$1expression*   
검색할 데이터 유형 VARBYTE의 binary\$1expression입니다.

 *start\$1byte*   
1에서 시작하여 추출을 시작할 이진 표현식 내의 위치입니다. 이 수는 음의 값이 될 수 있습니다.

 *number\$1bytes*   
추출할 바이트 수, 즉 하위 문자열의 길이입니다. 이 수는 음의 값이 될 수 없습니다.

## 반환 타입
<a name="r_SUBSTRING-return-type"></a>

입력에 따라 VARCHAR 또는 VARBYTE입니다.

## 사용 관련 참고 사항
<a name="r_SUBSTRING_usage_notes"></a>

다음은 **start\$1position 및 **number\$1characters를 사용하여 문자열의 다양한 위치에서 하위 문자열을 추출하는 방법에 대한 몇 가지 예입니다.

다음은 6번째 문자부터 4자의 문자열을 반환하는 예입니다.

```
select substring('caterpillar',6,4);
substring
-----------
pill
(1 row)
```

*start\$1position* \$1 *number\$1characters*가 *문자열*의 길이를 초과하면, SUBSTRING이 *start\$1position*부터 문자열 끝까지 하위 문자열을 반환합니다. 예: 

```
select substring('caterpillar',6,8);
substring
-----------
pillar
(1 row)
```

`start_position`이 0 또는 음수인 경우에는 SUBSTRING 함수가 문자열의 첫 번째 문자부터 `start_position` \$1 `number_characters` -1의 길이를 갖는 하위 문자열을 반환합니다. 예:

```
select substring('caterpillar',-2,6);
substring
-----------
cat
(1 row)
```

`start_position` \$1 `number_characters` -1이 0보다 작거나 같으면 SUBSTRING이 빈 문자열을 반환합니다. 예:

```
select substring('caterpillar',-5,4);
substring
-----------

(1 row)
```

## 예제
<a name="r_SUBSTRING-examples"></a>

다음은 LISTING 테이블의 LISTTIME 문자열에서 월을 반환하는 예입니다.

```
select listid, listtime,
substring(listtime, 6, 2) as month
from listing
order by 1, 2, 3
limit 10;

 listid |      listtime       | month
--------+---------------------+-------
      1 | 2008-01-24 06:43:29 | 01
      2 | 2008-03-05 12:25:29 | 03
      3 | 2008-11-01 07:35:33 | 11
      4 | 2008-05-24 01:18:37 | 05
      5 | 2008-05-17 02:29:11 | 05
      6 | 2008-08-15 02:08:13 | 08
      7 | 2008-11-15 09:38:15 | 11
      8 | 2008-11-09 05:07:30 | 11
      9 | 2008-09-09 08:03:36 | 09
     10 | 2008-06-17 09:44:54 | 06
(10 rows)
```

다음은 위와 동일하지만 FROM...FOR 옵션을 사용하는 예입니다.

```
select listid, listtime,
substring(listtime from 6 for 2) as month
from listing
order by 1, 2, 3
limit 10;

 listid |      listtime       | month
--------+---------------------+-------
      1 | 2008-01-24 06:43:29 | 01
      2 | 2008-03-05 12:25:29 | 03
      3 | 2008-11-01 07:35:33 | 11
      4 | 2008-05-24 01:18:37 | 05
      5 | 2008-05-17 02:29:11 | 05
      6 | 2008-08-15 02:08:13 | 08
      7 | 2008-11-15 09:38:15 | 11
      8 | 2008-11-09 05:07:30 | 11
      9 | 2008-09-09 08:03:36 | 09
     10 | 2008-06-17 09:44:54 | 06
(10 rows)
```

멀티바이트 문자가 포함되었을 수도 있는 문자열에서는 접두사를 예측적으로 추출할 때 SUBSTRING 함수를 사용할 수 없습니다. 그 이유는 문자 수가 아닌 바이트 수를 기준으로 멀티바이트 문자열의 길이를 지정해야 하기 때문입니다. 바이트 길이를 기준으로 문자열의 시작 세그먼트를 추출하려면 문자열을 VARCHAR(*byte\$1length*)로 변환하여 절사할 수 있습니다. 여기에서 *byte\$1length*는 반드시 필요한 길이입니다. 다음은 문자열 `'Fourscore and seven'`에서 첫 5바이트를 추출하는 예입니다.

```
select cast('Fourscore and seven' as varchar(5));

varchar
-------
Fours
```

다음 예에서는 이진 값 `abc`의 음수 시작 위치를 보여줍니다. 시작 위치가 -3이므로 이진 값의 시작 부분에서 하위 문자열이 추출됩니다. 결과는 이진 하위 문자열의 16진수 표현으로 자동으로 표시됩니다.

```
select substring('abc'::varbyte, -3);

 substring
-----------
 616263
```

다음 예에서는 이진 값 `abc`의 시작 위치에 대해 1을 보여줍니다. 길이가 지정되지 않았기 때문에 문자열은 문자열의 시작 위치에서 끝까지 추출됩니다. 결과는 이진 하위 문자열의 16진수 표현으로 자동으로 표시됩니다.

```
select substring('abc'::varbyte, 1);

 substring
-----------
 616263
```

다음 예에서는 이진 값 `abc`의 시작 위치에 대해 3을 보여줍니다. 길이가 지정되지 않았기 때문에 문자열은 문자열의 시작 위치에서 끝까지 추출됩니다. 결과는 이진 하위 문자열의 16진수 표현으로 자동으로 표시됩니다.

```
select substring('abc'::varbyte, 3);

 substring
-----------
 63
```

다음 예에서는 이진 값 `abc`의 시작 위치에 대해 2를 보여줍니다. 문자열은 시작 위치에서 위치 10까지 추출되지만 문자열의 끝은 위치 3에 있습니다. 결과는 이진 하위 문자열의 16진수 표현으로 자동으로 표시됩니다.

```
select substring('abc'::varbyte, 2, 10);

 substring
-----------
 6263
```

다음 예에서는 이진 값 `abc`의 시작 위치에 대해 2를 보여줍니다. 문자열은 1바이트의 시작 위치에서 추출됩니다. 결과는 이진 하위 문자열의 16진수 표현으로 자동으로 표시됩니다.

```
select substring('abc'::varbyte, 2, 1);

 substring
-----------
 62
```

다음 예에서는 입력 문자열 `Silva, Ana`의 마지막 공백 뒤에 나타나는 첫 번째 이름 `Ana`를 반환합니다.

```
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))

 reverse
-----------
 Ana
```

# TEXTLEN 함수
<a name="r_TEXTLEN"></a>

LEN 함수의 동의어입니다.

[LEN 함수](r_LEN.md) 섹션을 참조하세요.

# TRANSLATE 함수
<a name="r_TRANSLATE"></a>

임의의 표현식에서 발견되는 모든 지정 문자를 지정한 대체 문자로 변경합니다. 기존 문자는 *characters\$1to\$1replace*의 문자 위치와 *characters\$1to\$1substitute* 인수에 따라 변환 문자로 매핑됩니다. *characters\$1to\$1replace* 인수에서 지정하는 문자 수가 *characters\$1to\$1substitute* 인수에서 지정하는 문자 수보다 많으면 *characters\$1to\$1replace* 인수의 추가 문자가 반환 값에서 생략됩니다.

TRANSLATE는 [REPLACE 함수](r_REPLACE.md) 및 [REGEXP\$1REPLACE 함수](REGEXP_REPLACE.md)과 비슷합니다. 단, REPLACE는 전체 문자열 하나를 다른 문자열로 변경하고, REGEXP\$1REPLACE는 문자열에서 정규 표현식 패턴을 검색하는 반면 TRANSLATE는 단일 문자를 여러 차례 변경합니다.

인수가 NULL이면 반환되는 값도 `NULL`입니다.

## 구문
<a name="r_TRANSLATE-synopsis"></a>

```
TRANSLATE( expression, characters_to_replace, characters_to_substitute )
```

## 인수
<a name="r_TRANSLATE-arguments"></a>

 * expression*   
변환 대상인 표현식입니다.

 *characters\$1to\$1replace*   
변경 대상인 문자가 포함된 문자열입니다.

 *characters\$1to\$1substitute*   
대체할 문자가 포함된 문자열입니다.

## 반환 타입
<a name="r_TRANSLATE-return-type"></a>

VARCHAR

## 예제
<a name="r_TRANSLATE-examples"></a>

문자열에서 여러 문자를 바꾸려면 다음 예제를 사용합니다.

```
SELECT TRANSLATE('mint tea', 'inea', 'osin');

+-----------+
| translate |
+-----------+
| most tin  |
+-----------+
```

다음 예제에서는 TICKIT 샘플 데이터베이스의 USERS 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

열의 모든 값에 대해 at 기호(@)를 마침표로 바꾸려면 다음 예제를 사용합니다.

```
SELECT email, TRANSLATE(email, '@', '.') as obfuscated_email
FROM users LIMIT 10;

+---------------------------------------+---------------------------------------+
|                 email                 |           obfuscated_email            |
+---------------------------------------+---------------------------------------+
| Cum@accumsan.com                      | Cum.accumsan.com                      |
| lorem.ipsum@Vestibulumante.com        | lorem.ipsum.Vestibulumante.com        |
| non.justo.Proin@ametconsectetuer.edu  | non.justo.Proin.ametconsectetuer.edu  |
| non.ante.bibendum@porttitortellus.org | non.ante.bibendum.porttitortellus.org |
| eros@blanditatnisi.org                | eros.blanditatnisi.org                |
| augue@Donec.ca                        | augue.Donec.ca                        |
| cursus@pedeacurna.edu                 | cursus.pedeacurna.edu                 |
| at@Duis.com                           | at.Duis.com                           |
| quam@facilisisvitaeorci.ca            | quam.facilisisvitaeorci.ca            |
| mi.lorem@nunc.edu                     | mi.lorem.nunc.edu                     |
+---------------------------------------+---------------------------------------+
```

 열의 모든 값에 대해 공백을 밑줄로 바꾸고 마침표를 제거하려면 다음 예제를 사용합니다.

```
SELECT city, TRANSLATE(city, ' .', '_') 
FROM users
WHERE city LIKE 'Sain%' OR city LIKE 'St%'
GROUP BY city
ORDER BY city;

+----------------+---------------+
|      city      |   translate   |
+----------------+---------------+
| Saint Albans   | Saint_Albans  |
| Saint Cloud    | Saint_Cloud   |
| Saint Joseph   | Saint_Joseph  |
| Saint Louis    | Saint_Louis   |
| Saint Paul     | Saint_Paul    |
| St. George     | St_George     |
| St. Marys      | St_Marys      |
| St. Petersburg | St_Petersburg |
| Stafford       | Stafford      |
| Stamford       | Stamford      |
| Stanton        | Stanton       |
| Starkville     | Starkville    |
| Statesboro     | Statesboro    |
| Staunton       | Staunton      |
| Steubenville   | Steubenville  |
| Stevens Point  | Stevens_Point |
| Stillwater     | Stillwater    |
| Stockton       | Stockton      |
| Sturgis        | Sturgis       |
+----------------+---------------+
```

# TRIM 함수
<a name="r_TRIM"></a>

공백 또는 지정된 문자로 문자열을 자릅니다.

## 구문
<a name="r_TRIM-synopsis"></a>

```
TRIM( [ BOTH | LEADING | TRAILING ] [trim_chars FROM ] string )
```

## 인수
<a name="r_TRIM-arguments"></a>

 BOTH \$1 LEADING \$1 TRAILING   
(선택 사항) 문자를 잘라낼 위치를 지정합니다. 선행 및 후행 문자를 모두 제거하려면 BOTH를 사용하고, 선행 문자만 제거하려면 LEADING을 사용하며, 후행 문자만 제거하려면 TRAILING을 사용합니다. 이 파라미터를 생략하면 선행 및 후행 문자가 모두 잘립니다.

 *trim\$1chars*   
(옵션) 문자열에서 잘라낼 문자입니다. 이 파라미터를 생략하면 공백이 잘립니다.

 *문자열*()   
자르기 대상이 되는 문자열입니다.

## 반환 타입
<a name="r_TRIM-return-type"></a>

TRIM 함수는 `VARCHAR` 또는 `CHAR` 문자열을 반환합니다. TRIM 함수를 SQL 명령과 함께 사용하면 Amazon Redshift가 함수 결과를 묵시적으로 `VARCHAR`로 변환합니다. 하지만 SQL 함수의 SELECT 목록에서 TRIM 함수를 사용할 경우에는 Amazon Redshift가 함수 결과를 묵시적으로 변환하지 못하기 때문에 데이터 형식의 불일치 오류를 피하려면 명시적으로 변환해야만 합니다. 명시적 변환에 대한 자세한 내용은 [CAST 함수](r_CAST_function.md) 및 [CONVERT 함수](r_CONVERT_function.md) 함수 섹션을 참조하세요.

## 예제
<a name="r_TRIM-example"></a>

문자열 ` dog `에서 선행 및 후행 공백을 잘라내려면 다음 예제를 사용합니다.

```
SELECT TRIM('    dog    ');

+-------+
| btrim |
+-------+
| dog   |
+-------+
```

문자열 ` dog `에서 선행 및 후행 공백을 잘라내려면 다음 예제를 사용합니다.

```
SELECT TRIM(BOTH FROM '    dog    ');

+-------+
| btrim |
+-------+
| dog   |
+-------+
```

문자열 `"dog"`에서 선행 큰따옴표를 제거하려면 다음 예제를 사용합니다.

```
SELECT TRIM(LEADING '"' FROM'"dog"');

+-------+
| ltrim |
+-------+
| dog"  |
+-------+
```

문자열 `"dog"`에서 후행 큰따옴표를 제거하려면 다음 예제를 사용합니다.

```
SELECT TRIM(TRAILING '"' FROM'"dog"');

+-------+
| rtrim |
+-------+
| "dog  |
+-------+
```

TRIM은 **trim\$1chars의 문자가 **string의 첫 문자 또는 끝 문자이면 모두 제거합니다. 다음 예제에서는 `VARCHAR`열인 VENUENAME의 시작 또는 끝에 나타나는 문자 'C', 'D' 및 'G'를 잘라냅니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
SELECT venueid, venuename, TRIM('CDG' FROM venuename)
FROM venue
WHERE venuename LIKE '%Park'
ORDER BY 2
LIMIT 7;

+---------+----------------------------+---------------------------+
| venueid |         venuename          |           btrim           |
+---------+----------------------------+---------------------------+
|     121 | AT&T Park                  | AT&T Park                 |
|     109 | Citizens Bank Park         | itizens Bank Park         |
|     102 | Comerica Park              | omerica Park              |
|       9 | Dick's Sporting Goods Park | ick's Sporting Goods Park |
|      97 | Fenway Park                | Fenway Park               |
|     112 | Great American Ball Park   | reat American Ball Park   |
|     114 | Miller Park                | Miller Park               |
+---------+----------------------------+---------------------------+
```

# UPPER 함수
<a name="r_UPPER"></a>

문자열을 소문자로 변환합니다. UPPER는 UTF-8 멀티바이트 문자를 지원하여 문자당 최대 4바이트까지 가능합니다.

## 구문
<a name="r_UPPER-synopsis"></a>

```
UPPER(string)
```

## 인수
<a name="r_UPPER-arguments"></a>

 *문자열*()   
입력 파라미터는 `VARCHAR` 문자열 또는 `VARCHAR`로 암시적으로 변환될 수 있는 `CHAR`와 같은 기타 데이터 형식입니다.

## 반환 타입
<a name="r_UPPER-return-type"></a>

UPPER 함수는 입력 문자열과 데이터 형식이 동일한 문자열을 반환합니다. 예를 들어 입력이 `VARCHAR` 문자열인 경우 함수는 `VARCHAR` 문자열을 반환합니다.

## 예제
<a name="r_UPPER-examples"></a>

다음 예제에서는 TICKIT 샘플 데이터베이스의 CATEGORY 테이블에 있는 데이터를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

CATNAME 필드를 대문자로 변환하려면 다음을 사용합니다.

```
SELECT catname, UPPER(catname) 
FROM category 
ORDER BY 1,2;

+-----------+-----------+
|  catname  |   upper   |
+-----------+-----------+
| Classical | CLASSICAL |
| Jazz      | JAZZ      |
| MLB       | MLB       |
| MLS       | MLS       |
| Musicals  | MUSICALS  |
| NBA       | NBA       |
| NFL       | NFL       |
| NHL       | NHL       |
| Opera     | OPERA     |
| Plays     | PLAYS     |
| Pop       | POP       |
+-----------+-----------+
```

# SUPER 형식 정보 함수
<a name="c_Type_Info_Functions"></a>

다음에서 Amazon Redshift가 `SUPER` 데이터 형식의 입력에서 동적 정보를 파생하도록 지원하는 SQL용 형식 정보 함수에 대한 설명을 찾아볼 수 있습니다.

**Topics**
+ [DECIMAL\$1PRECISION 함수](r_decimal_precision.md)
+ [DECIMAL\$1SCALE 함수](r_decimal_scale.md)
+ [IS\$1ARRAY 함수](r_is_array.md)
+ [IS\$1BIGINT 함수](r_is_bigint.md)
+ [IS\$1BOOLEAN 함수](r_is_boolean.md)
+ [IS\$1CHAR 함수](r_is_char.md)
+ [IS\$1DECIMAL 함수](r_is_decimal.md)
+ [IS\$1FLOAT 함수](r_is_float.md)
+ [IS\$1INTEGER 함수](r_is_integer.md)
+ [IS\$1OBJECT 함수](r_is_object.md)
+ [IS\$1SCALAR 함수](r_is_scalar.md)
+ [IS\$1SMALLINT 함수](r_is_smallint.md)
+ [IS\$1VARCHAR 함수](r_is_varchar.md)
+ [JSON\$1SIZE 함수](r_json_size.md)
+ [JSON\$1TYPEOF 함수](r_json_typeof.md)
+ [SIZE](r_SIZE.md)

# DECIMAL\$1PRECISION 함수
<a name="r_decimal_precision"></a>

저장할 최대 총 소수점 이하 자릿수의 전체 자릿수를 확인합니다. 이 숫자에는 소수점의 왼쪽 및 오른쪽 숫자가 모두 포함됩니다. 전체 자릿수 범위는 1\$138이며 기본값은 38입니다.

## 구문
<a name="r_decimal_precision-synopsis"></a>

```
DECIMAL_PRECISION(super_expression)
```

## 인수
<a name="r_decimal_precision-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_decimal_precision-returns"></a>

`INTEGER`

## 예제
<a name="r_decimal_precision_example"></a>

테이블 t에 DECIMAL\$1PRECISION 함수를 적용하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (3.14159);

SELECT DECIMAL_PRECISION(s) FROM t;

+-------------------+
| decimal_precision |
+-------------------+
|                 6 |
+-------------------+
```

# DECIMAL\$1SCALE 함수
<a name="r_decimal_scale"></a>

소수점 오른쪽에 저장할 소수점 이하 자릿수를 확인합니다. 소수 자릿수 범위는 0\$1전체 자릿수이며 기본값은 0입니다.

## 구문
<a name="r_decimal_scale-synopsis"></a>

```
DECIMAL_SCALE(super_expression)
```

## 인수
<a name="r_decimal_scale-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_decimal_scale-returns"></a>

`INTEGER`

## 예제
<a name="r_decimal_scale_example"></a>

테이블 t에 DECIMAL\$1SCALE 함수를 적용하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (3.14159);

SELECT DECIMAL_SCALE(s) FROM t;

+---------------+
| decimal_scale |
+---------------+
|             5 |
+---------------+
```

# IS\$1ARRAY 함수
<a name="r_is_array"></a>

변수가 배열인지 확인합니다. 변수가 배열인 경우 함수는 `true`를 반환합니다. 함수에 빈 배열도 포함됩니다. 그렇지 않으면 함수는 null을 포함한 다른 모든 값에 대해 `false`를 반환합니다.

## 구문
<a name="r_is_array-synopsis"></a>

```
IS_ARRAY(super_expression)
```

## 인수
<a name="r_is_array-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_array-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_array_example"></a>

IS\$1ARRAY 함수를 사용하여 `[1,2]`가 배열인지 확인하려면 다음 예제를 사용합니다.

```
SELECT IS_ARRAY(JSON_PARSE('[1,2]'));

+----------+
| is_array |
+----------+
| true     |
+----------+
```

# IS\$1BIGINT 함수
<a name="r_is_bigint"></a>

값이 `BIGINT`인지 여부를 확인합니다. IS\$1BIGINT 함수는 64비트 범위에서 소수 자릿수 0의 숫자에 대해 `true`를 반환합니다. 그렇지 않으면 함수는 null 및 부동 소수점 숫자를 포함한 다른 모든 값에 대해 `false`를 반환합니다.

IS\$1BIGINT 함수는 IS\$1INTEGER의 상위 집합입니다.

## 구문
<a name="r_is_bigint-synopsis"></a>

```
IS_BIGINT(super_expression)
```

## 인수
<a name="r_is_bigint-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_bigint-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_bigint_example"></a>

IS\$1BIGINT 함수를 사용하여 `5`가 `BIGINT`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_BIGINT(s) FROM t;

+---+-----------+
| s | is_bigint |
+---+-----------+
| 5 | true      |
+---+-----------+
```

# IS\$1BOOLEAN 함수
<a name="r_is_boolean"></a>

값이 `BOOLEAN`인지 여부를 확인합니다. IS\$1BOOLEAN 함수는 상수 JSON 부울에 대해 `true`를 반환합니다. 이 함수는 null을 포함한 다른 모든 값에 대해 `false`를 반환합니다.

## 구문
<a name="r_is_boolean-synopsis"></a>

```
IS_BOOLEAN(super_expression)
```

## 인수
<a name="r_is_boolean-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_boolean-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_boolean_example"></a>

IS\$1BOOLEAN 함수를 사용하여 `TRUE`가 `BOOLEAN`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (TRUE);

SELECT s, IS_BOOLEAN(s) FROM t;

+------+------------+
|  s   | is_boolean |
+------+------------+
| true | true       |
+------+------------+
```

# IS\$1CHAR 함수
<a name="r_is_char"></a>

값이 `CHAR`인지 여부를 확인합니다. IS\$1CHAR 함수는 ASCII 문자만 있는 문자열에 대해 `true`를 반환합니다. CHAR 형식은 ASCII 형식의 문자만 저장할 수 있기 때문입니다. 이 함수는 다른 모든 값에 대해 `false`를 반환합니다.

## 구문
<a name="r_is_char-synopsis"></a>

```
IS_CHAR(super_expression)
```

## 인수
<a name="r_is_char-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_char-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_char_example"></a>

IS\$1CHAR 함수를 사용하여 `t`가 `CHAR`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES ('t');

SELECT s, IS_CHAR(s) FROM t;

+-----+---------+
|  s  | is_char |
+-----+---------+
| "t" | true    |
+-----+---------+
```

# IS\$1DECIMAL 함수
<a name="r_is_decimal"></a>

값이 `DECIMAL`인지 여부를 확인합니다. IS\$1DECIMAL 함수는 부동 소수점이 아닌 숫자에 대해 `true`를 반환합니다. 이 함수는 null을 포함한 다른 모든 값에 대해 `false`를 반환합니다.

IS\$1DECIMAL 함수는 IS\$1BIGINT의 상위 집합입니다.

## 구문
<a name="r_is_decimal-synopsis"></a>

```
IS_DECIMAL(super_expression)
```

## 인수
<a name="r_is_decimal-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_decimal-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_decimal_example"></a>

IS\$1DECIMAL 함수를 사용하여 `1.22`가 `DECIMAL`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (1.22);

SELECT s, IS_DECIMAL(s) FROM t;

+------+------------+
|  s   | is_decimal |
+------+------------+
| 1.22 | true       |
+------+------------+
```

# IS\$1FLOAT 함수
<a name="r_is_float"></a>

값이 부동 소수점 숫자인지 확인합니다. IS\$1FLOAT 함수는 부동 소수점 숫자(`FLOAT4` 및 `FLOAT8`)에 대해 `true`를 반환합니다. 이 함수는 다른 모든 값에 대해 `false`를 반환합니다.

IS\$1DECIMAL 집합과 IS\$1FLOAT 집합은 분리되어 있습니다.

## 구문
<a name="r_is_float-synopsis"></a>

```
IS_FLOAT(super_expression)
```

## 인수
<a name="r_is_float-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_float-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_float_example"></a>

IS\$1FLOAT 함수를 사용하여 `2.22::FLOAT`가 `FLOAT`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES(2.22::FLOAT);

SELECT s, IS_FLOAT(s) FROM t;

+---------+----------+
|    s    | is_float |
+---------+----------+
| 2.22e+0 | true     |
+---------+----------+
```

# IS\$1INTEGER 함수
<a name="r_is_integer"></a>

32비트 범위에서 소수 자릿수 0의 숫자에 대해 `true`를 반환하고 다른 모든 숫자(null 및 부동 소수점 숫자 포함)에 대해 `false`를 반환합니다.

IS\$1INTEGER 함수는 IS\$1SMALLINT 함수의 상위 집합입니다.

## 구문
<a name="r_is_integer-synopsis"></a>

```
IS_INTEGER(super_expression)
```

## 인수
<a name="r_is_integer-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_integer-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_integer_example"></a>

IS\$1INTEGER 함수를 사용하여 `5`가 `INTEGER`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_INTEGER(s) FROM t;

+---+------------+
| s | is_integer |
+---+------------+
| 5 | true       |
+---+------------+
```

# IS\$1OBJECT 함수
<a name="r_is_object"></a>

변수가 객체인지 확인합니다. IS\$1OBJECT 함수는 빈 객체를 포함한 객체에 대해 `true`를 반환합니다. 이 함수는 null을 포함한 다른 모든 값에 대해 `false`를 반환합니다.

## 구문
<a name="r_is_object-synopsis"></a>

```
IS_OBJECT(super_expression)
```

## 인수
<a name="r_is_object-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_object-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_object_example"></a>

IS\$1OBJECT 함수를 사용하여 `{"name": "Joe"}`가 객체인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s super);

INSERT INTO t VALUES (JSON_PARSE('{"name": "Joe"}'));

SELECT s, IS_OBJECT(s) FROM t;

+----------------+-----------+
|       s        | is_object |
+----------------+-----------+
| {"name":"Joe"} | true      |
+----------------+-----------+
```

# IS\$1SCALAR 함수
<a name="r_is_scalar"></a>

변수가 스칼라인지 확인합니다. IS\$1SCALAR 함수는 배열이나 객체가 아닌 모든 값에 대해 `true`를 반환합니다. 이 함수는 null을 포함한 다른 모든 값에 대해 `false`를 반환합니다.

IS\$1ARRAY, IS\$1OBJECT 및 IS\$1SCALAR 집합은 null을 제외한 모든 값을 포함합니다.

## 구문
<a name="r_is_scalar-synopsis"></a>

```
IS_SCALAR(super_expression)
```

## 인수
<a name="r_is_scalar-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_scalar-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_scalar_example"></a>

IS\$1SCALAR 함수를 사용하여 `{"name": "Joe"}`가 스칼라인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (JSON_PARSE('{"name": "Joe"}'));

SELECT s, IS_SCALAR(s.name) FROM t;

+----------------+-----------+
|       s        | is_scalar |
+----------------+-----------+
| {"name":"Joe"} | true      |
+----------------+-----------+
```

# IS\$1SMALLINT 함수
<a name="r_is_smallint"></a>

변수가 `SMALLINT`인지 확인합니다. IS\$1SMALLINT 함수는 16비트 범위에서 소수 자릿수 0의 숫자에 대해 `true`를 반환합니다. 함수는 null 및 부동 소수점 숫자를 포함한 다른 값에 대해 `false`를 반환합니다.

## 구문
<a name="r_is_smallint-synopsis"></a>

```
IS_SMALLINT(super_expression)
```

## 인수
<a name="r_is_smallint-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환
<a name="r_is_smallint-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_smallint_example"></a>

IS\$1SMALLINT 함수를 사용하여 `5`가 `SMALLINT`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_SMALLINT(s) FROM t;

+---+-------------+
| s | is_smallint |
+---+-------------+
| 5 | true        |
+---+-------------+
```

# IS\$1VARCHAR 함수
<a name="r_is_varchar"></a>

변수가 `VARCHAR`인지 확인합니다. IS\$1VARCHAR 함수는 모든 문자열에 대해 `true`를 반환합니다. 이 함수는 다른 모든 값에 대해 `false`를 반환합니다.

IS\$1VARCHAR 함수는 IS\$1CHAR 함수의 상위 집합입니다.

## 구문
<a name="r_is_varchar-synopsis"></a>

```
IS_VARCHAR(super_expression)
```

## 인수
<a name="r_is_varchar-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_is_varchar-returns"></a>

`BOOLEAN`

## 예제
<a name="r_is_varchar_example"></a>

IS\$1VARCHAR 함수를 사용하여 `abc`가 `VARCHAR`인지 확인하려면 다음 예제를 사용합니다.

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES ('abc');

SELECT s, IS_VARCHAR(s) FROM t;

+-------+------------+
|   s   | is_varchar |
+-------+------------+
| "abc" | true       |
+-------+------------+
```

# JSON\$1SIZE 함수
<a name="r_json_size"></a>

JSON\$1SIZE 함수는 문자열로 직렬화되는 경우 지정된 `SUPER` 표현식의 바이트 수를 반환합니다.

## 구문
<a name="r_json_size-synopsis"></a>

```
JSON_SIZE(super_expression)
```

## 인수
<a name="r_json_size-arguments"></a>

*super\$1expression*  
`SUPER` 상수 또는 표현식입니다.

## 반환 타입
<a name="r_json_size-returns"></a>

`INTEGER`  
JSON\$1SIZE 함수는 입력 문자열의 바이트 수를 나타내는 `INTEGER`를 반환합니다. 이 값은 문자 수와 다릅니다. 예를 들어 검은색 점인 UTF-8 문자 ⬤는 1자이긴 하지만 크기는 3바이트입니다.

## 사용 노트
<a name="r_json_size-usage_notes"></a>

JSON\$1SIZE(x)는 OCTET\$1LENGTH(JSON\$1SERIALIZE)와 기능적으로 동일합니다. 그러나 제공된 `SUPER` 표현식이 시스템이 직렬화될 때의 `VARCHAR` 제한을 초과할 경우 JSON\$1SERIALIZE에서 오류를 반환합니다. JSON\$1SIZE에는 이러한 제한이 없습니다.

## 예제
<a name="r_json_size_example"></a>

문자열로 직렬화된 `SUPER` 값의 길이를 반환하려면 다음 예제를 사용합니다.

```
SELECT JSON_SIZE(JSON_PARSE('[10001,10002,"⬤"]'));

+-----------+
| json_size |
+-----------+
|        19 |
+-----------+
```

제공된 `SUPER` 표현식은 17자이지만, ⬤은 3바이트 문자이므로 JSON\$1SIZE는 `19`를 반환합니다.

# JSON\$1TYPEOF 함수
<a name="r_json_typeof"></a>

JSON\$1TYPEOF 스칼라 함수는 `SUPER` 값의 동적 형식에 따라 부울, 숫자, 문자열, 객체, 배열 또는 null 값이 있는 `VARCHAR`를 반환합니다.

## 구문
<a name="r_json_typeof-synopsis"></a>

```
JSON_TYPEOF(super_expression)
```

## 인수
<a name="r_json_typeof-arguments"></a>

*super\$1expression*  
`SUPER` 표현식 또는 열입니다.

## 반환 타입
<a name="r_json_typeof-returns"></a>

`VARCHAR`

## 예제
<a name="r_json_typeof_example"></a>

JSON\$1TYPEOF 함수를 사용하여 `[1,2]` 배열의 JSON 형식을 확인하려면 다음 예제를 사용합니다.

```
SELECT JSON_TYPEOF(ARRAY(1,2));

+-------------+
| json_typeof |
+-------------+
| array       |
+-------------+
```

JSON\$1TYPEOF 함수를 사용하여 `{"name":"Joe"}` 객체의 JSON 형식을 확인하려면 다음 예제를 사용합니다.

```
SELECT JSON_TYPEOF(JSON_PARSE('{"name":"Joe"}'));

+-------------+
| json_typeof |
+-------------+
| object      |
+-------------+
```

# SIZE
<a name="r_SIZE"></a>

 `SUPER` 형식 상수 또는 표현식의 이진 메모리 내 크기를 `INTEGER`로 반환합니다.

## 구문
<a name="r_SIZE-synopsis"></a>

```
SIZE(super_expression)
```

## 인수
<a name="r_SIZE-parameters"></a>

*super\$1expression*  
 `SUPER` 형식 상수 또는 표현식입니다.

## 반환 타입
<a name="r_SIZE-returns"></a>

`INTEGER`

## 예제
<a name="r_SIZE-examples"></a>

 SIZE를 사용하여 여러 `SUPER` 형식 표현식의 메모리 내 크기를 가져오려면 다음 예제를 사용합니다.

```
CREATE TABLE test_super_size(a SUPER);
            
INSERT INTO test_super_size 
VALUES
  (null),
  (TRUE),
  (JSON_PARSE('[0,1,2,3]')),
  (JSON_PARSE('{"a":0,"b":1,"c":2,"d":3}'))
;

SELECT a, SIZE(a) 
FROM test_super_size 
ORDER BY 2, 1;

+---------------------------+------+
|             a             | size |
+---------------------------+------+
| true                      |    4 |
| NULL                      |    4 |
| [0,1,2,3]                 |   23 |
| {"a":0,"b":1,"c":2,"d":3} |   52 |
+---------------------------+------+
```

# VARBYTE 함수 및 연산자
<a name="varbyte-functions"></a>

VARBYTE 데이터 유형을 지원하는 Amazon Redshift 함수 및 연산자는 다음과 같습니다.
+ [VARBYTE 연산자](r_VARBYTE_OPERATORS.md)
+ [FROM\$1HEX](r_FROM_HEX.md)
+ [FROM\$1VARBYTE](r_FROM_VARBYTE.md)
+ [GETBIT](r_GETBIT.md)
+ [TO\$1HEX](r_TO_HEX.md)
+ [TO\$1VARBYTE](r_TO_VARBYTE.md)
+ [CONCAT](r_CONCAT.md)
+ [LEN](r_LEN.md)
+ [LENGTH 함수](r_LENGTH.md)
+ [OCTET\$1LENGTH](r_OCTET_LENGTH.md)
+ [SUBSTRING 함수](r_SUBSTRING.md)

# VARBYTE 연산자
<a name="r_VARBYTE_OPERATORS"></a>

 다음 표에는 VARBYTE 연산자가 나열되어 있습니다. 연산자는 데이터 유형 VARBYTE의 이진 값으로 작동합니다. 입력이 하나 또는 둘 다 null이면 결과는 null입니다.

## 지원되는 연산자
<a name="r_VARBYTE_OPERATORS-supported-operators"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_VARBYTE_OPERATORS.html)

## 예시
<a name="r_VARBYTE_OPERATORS-examples"></a>

다음 예에서 `'a'::VARBYTE`의 값은 `61`이고 `'b'::VARBYTE`의 값은 `62`입니다. `::`는 문자열을 `VARBYTE` 데이터 형식으로 캐스팅합니다. 데이터 형식 캐스팅에 대한 자세한 내용은 [CAST](r_CAST_function.md) 단원을 참조하세요.

`<` 연산자를 사용하여 `'a'`가 `'b'`보다 작은지 비교하려면 다음 예제를 사용합니다.

```
SELECT 'a'::VARBYTE < 'b'::VARBYTE AS less_than;
               
+-----------+
| less_than |
+-----------+
| true      |
+-----------+
```

`=` 연산자를 사용하여 `'a'`가 `'b'`랑 같은지 비교하려면 다음 예제를 사용합니다.

```
SELECT 'a'::VARBYTE = 'b'::VARBYTE AS equal;
               
+-------+
| equal |
+-------+
| false |
+-------+
```

`||` 연산자를 사용하여 두 이진 값을 연결하려면 다음 예제를 사용합니다.

```
SELECT 'a'::VARBYTE || 'b'::VARBYTE AS concat;
               
+--------+
| concat |
+--------+
|   6162 |
+--------+
```

`+` 연산자를 사용하여 두 이진 값을 연결하려면 다음 예제를 사용합니다.

```
SELECT 'a'::VARBYTE + 'b'::VARBYTE AS concat;
               
+--------+
| concat |
+--------+
|   6162 |
+--------+
```

FROM\$1VARBYTE 함수를 사용하여 입력 이진 값의 각 비트를 무효화하려면 다음 예제를 사용합니다. 문자열 '`'a'`는 `01100001`로 평가됩니다. 자세한 내용은 [FROM\$1VARBYTE](r_FROM_VARBYTE.md) 단원을 참조하십시오.

```
SELECT FROM_VARBYTE(~'a'::VARBYTE, 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     10011110 |
+--------------+
```

두 입력 이진 값에 `&` 연산자를 적용하려면 다음 예제를 사용합니다. 문자열 `'a'`는 `01100001`로 평가되고 `'b'`는 `01100010`로 평가됩니다.

```
SELECT FROM_VARBYTE('a'::VARBYTE & 'b'::VARBYTE, 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     01100000 |
+--------------+
```

# FROM\$1HEX 함수
<a name="r_FROM_HEX"></a>

FROM\$1HEX는 16진수를 2진수 값으로 변환합니다.

## 구문
<a name="r_FROM_HEX-synopsis"></a>

```
FROM_HEX(hex_string)
```

## 인수
<a name="r_FROM_HEX-arguments"></a>

 *hex\$1string*   
변환할 데이터 형식 `VARCHAR` 또는 `TEXT`의 16진수 문자열입니다. 형식은 리터럴 값이 되어야 합니다.

## 반환 타입
<a name="r_FROM_HEX-return-type"></a>

`VARBYTE`

## 예시
<a name="r_FROM_HEX-examples"></a>

`'6162'`의 16진수 표현을 이진 값으로 변환하려면 다음 예제를 사용합니다. 결과는 이진 값의 16진수 표현으로 자동으로 표시됩니다.

```
SELECT FROM_HEX('6162');
               
+----------+
| from_hex |
+----------+
|     6162 |
+----------+
```

# FROM\$1VARBYTE 함수
<a name="r_FROM_VARBYTE"></a>

FROM\$1VARBYTE는 이진 값을 지정된 형식의 문자열로 변환합니다.

## 구문
<a name="r_FROM_VARBYTE-synopsis"></a>

```
FROM_VARBYTE(binary_value, format)
```

## 인수
<a name="r_FROM_VARBYTE-arguments"></a>

 *binary\$1value*   
데이터 형식 `VARBYTE`의 이진 값입니다.

 *format*   
반환된 문자열의 형식입니다. 대/소문자를 구분하지 않는 유효한 값은 `hex`, `binary`, `utf8`(`utf-8` 및 `utf_8`도 가능함) 및 `base64`입니다.

## 반환 타입
<a name="r_FROM_VARBYTE-return-type"></a>

`VARCHAR`

## 예시
<a name="r_FROM_VARBYTE-examples"></a>

이진 값 `'ab'`를 16진수로 변환하려면 다음 예제를 사용합니다.

```
SELECT FROM_VARBYTE('ab', 'hex');
               
+--------------+
| from_varbyte |
+--------------+
|         6162 |
+--------------+
```

`'4d'`의 이진 표현을 반환하려면 다음 예제를 사용합니다. `'4d'`의 이진 표현은 문자열 `01001101`입니다.

```
SELECT FROM_VARBYTE(FROM_HEX('4d'), 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     01001101 |
+--------------+
```

# GETBIT 함수
<a name="r_GETBIT"></a>

GETBIT는 지정된 인덱스에서 이진 값의 비트 값을 반환합니다.

## 구문
<a name="r_GETBIT-synopsis"></a>

```
GETBIT(binary_value, index)
```

## 인수
<a name="r_GETBIT-arguments"></a>

 *binary\$1value*   
데이터 형식 `VARBYTE`의 이진 값입니다.

 *인덱스를 구축하고 배포할 것입니다*   
반환되는 이진 값의 비트 인덱스 번호입니다. 이진 값은 맨 오른쪽 비트(최하위 비트)에서 맨 왼쪽 비트(최상위 비트)로 인덱싱되는 0부터 시작하는 비트 배열입니다.

## 반환 타입
<a name="r_GETBIT-return-type"></a>

`INTEGER`

## 예시
<a name="r_GETBIT-examples"></a>

이진 값 `from_hex('4d')`의 인덱스 `2`에 있는 비트를 반환하려면 다음 예제를 사용합니다. `'4d'`의 이진 표현은 `01001101`입니다.

```
SELECT GETBIT(FROM_HEX('4d'), 2);
               
+--------+
| getbit |
+--------+
|      1 |
+--------+
```

`from_hex('4d')`가 반환하는 이진 값의 8개 인덱스 위치에서 비트를 반환하려면 다음 예제를 사용합니다. `'4d'`의 이진 표현은 `01001101`입니다.

```
SELECT GETBIT(FROM_HEX('4d'), 7), GETBIT(FROM_HEX('4d'), 6),
  GETBIT(FROM_HEX('4d'), 5), GETBIT(FROM_HEX('4d'), 4),
  GETBIT(FROM_HEX('4d'), 3), GETBIT(FROM_HEX('4d'), 2),
  GETBIT(FROM_HEX('4d'), 1), GETBIT(FROM_HEX('4d'), 0);
               
+--------+--------+--------+--------+--------+--------+--------+--------+
| getbit | getbit | getbit | getbit | getbit | getbit | getbit | getbit |
+--------+--------+--------+--------+--------+--------+--------+--------+
|      0 |      1 |      0 |      0 |      1 |      1 |      0 |      1 |
+--------+--------+--------+--------+--------+--------+--------+--------+
```

# TO\$1HEX 함수
<a name="r_TO_HEX"></a>

TO\$1HEX는 숫자 또는 이진 값을 16진수 표현으로 변환합니다.

## 구문
<a name="r_TO_HEX-synopsis"></a>

```
TO_HEX(value)
```

## 인수
<a name="r_TO_HEX-arguments"></a>

 *USD 상당*   
변환할 숫자 또는 이진 값(`VARBYTE`)입니다.

## 반환 타입
<a name="r_TO_HEX-return-type"></a>

`VARCHAR`

## 예시
<a name="r_TO_HEX-examples"></a>

숫자를 16진수 표현으로 변환하려면 다음 예제를 사용합니다.

```
SELECT TO_HEX(2147676847);
               
+----------+
|  to_hex  |
+----------+
| 8002f2af |
+----------+
```

`'abc'`의 `VARBYTE` 표현을 16진수로 변환하려면 다음 예제를 사용합니다.

```
SELECT TO_HEX('abc'::VARBYTE);
               
+--------+
| to_hex |
+--------+
| 616263 |
+--------+
```

테이블을 만들려면 16진수에 `'abc'`의 `VARBYTE` 표현을 삽입하고 값이 있는 열을 선택하면 됩니다. 다음 예제를 사용합니다.

```
CREATE TABLE t (vc VARCHAR);
INSERT INTO t SELECT TO_HEX('abc'::VARBYTE);
SELECT vc FROM t;
 
+--------+
|   vc   |
+--------+
| 616263 |
+--------+
```

`VARBYTE` 값을 `VARCHAR`로 캐스팅할 때 형식이 UTF-8임을 표시하려면 다음 예제를 사용합니다.

```
CREATE TABLE t (vc VARCHAR);
INSERT INTO t SELECT 'abc'::VARBYTE::VARCHAR;

SELECT vc FROM t;

+-----+
| vc  |
+-----+
| abc |
+-----+
```

# TO\$1VARBYTE 함수
<a name="r_TO_VARBYTE"></a>

TO\$1VARBYTE는 지정된 형식의 문자열을 이진 값으로 변환합니다.

## 구문
<a name="r_TO_VARBYTE-synopsis"></a>

```
TO_VARBYTE(string, format)
```

## 인수
<a name="r_TO_VARBYTE-arguments"></a>

 *string*   
`CHAR` 또는 `VARCHAR` 문자열입니다.

 *format*   
입력 문자열의 형식입니다. 대/소문자를 구분하지 않는 유효한 값은 `hex`, `binary`, `utf8`(`utf-8` 및 `utf_8`도 가능함) 및 `base64`입니다.

## 반환 타입
<a name="r_TO_VARBYTE-return-type"></a>

`VARBYTE`

## 예시
<a name="r_TO_VARBYTE-examples"></a>

16진수 `6162`를 이진 값으로 변환하려면 다음 예제를 사용합니다. 결과는 이진 값의 16진수 표현으로 자동으로 표시됩니다.

```
SELECT TO_VARBYTE('6162', 'hex');
               
+------------+
| to_varbyte |
+------------+
|       6162 |
+------------+
```

`4d`의 이진 표현을 반환하려면 다음 예제를 사용합니다. '4d'의 이진 표현은 `01001101`입니다.

```
SELECT TO_VARBYTE('01001101', 'binary');
               
+------------+
| to_varbyte |
+------------+
|         4d |
+------------+
```

UTF-8의 문자열 `'a'`를 이진 값으로 변환하려면 다음 예제를 사용합니다. 결과는 이진 값의 16진수 표현으로 자동으로 표시됩니다.

```
SELECT TO_VARBYTE('a', 'utf8');
               
+------------+
| to_varbyte |
+------------+
|         61 |
+------------+
```

16진수 문자열 `'4'`를 이진 값으로 변환하려면 다음 예제를 사용합니다. 16진수 문자열 길이가 홀수이면 `0`이 앞에 추가되어 유효한 16진수를 구성합니다.

```
SELECT TO_VARBYTE('4', 'hex');
               
+------------+
| to_varbyte |
+------------+
|         04 |
+------------+
```

# 윈도우 함수
<a name="c_Window_functions"></a>

창 함수를 사용하면 사용자가 분석 비즈니스 쿼리를 보다 효율적으로 생성할 수 있습니다. 창 함수는 결과 집합의 파티션, 즉 "창"에서 실행되어 해당 창에 속하는 모든 행에 대한 값을 반환합니다. 이와는 반대로 창이 없는 함수는 결과 집합의 모든 행에 대해 계산을 실행합니다. 그 밖에도 결과 행을 집계하는 그룹 함수와 달리 창 함수에서는 테이블 표현식의 모든 행이 그대로 유지됩니다.

 반환 값은 해당 창에 속한 행 집합의 값을 사용하여 계산됩니다. 창은 테이블의 각 행마다 추가 속성을 계산하는 데 사용되는 행 집합을 정의합니다. 창은 창 명세(OVER 절)를 사용하여 정의되며, 다음과 같이 세 가지 주요 개념을 근거로 합니다.
+  *창 파티션* - 행 그룹을 형성합니다(PARTITION 절).
+  *창 순서 지정* - 각 파티션의 행 순서 또는 시퀀스를 정의합니다(ORDER BY 절).
+  *창 프레임* - 행 집합을 제한하기 위해 각 행마다 정의됩니다(ROWS 명세).

창 함수는 최종 ORDER BY 절을 제외하고 쿼리에서 실행되는 마지막 연산 집합입니다. 창 함수를 처리할 때는 그 전에 모든 조인을 비롯한 WHERE, GROUP BY 및 HAVING 절까지 모두 완료됩니다. 따라서 창 함수는 선택 목록 또는 ORDER BY 절에만 나타날 수 있습니다. 다른 프레임 절이 있는 단일 쿼리 내에서 여러 윈도 함수를 사용할 수 있습니다. CASE 등의 다른 스칼라 표현식에서 윈도 함수를 사용할 수도 있습니다.

창 함수는 중첩할 수 없습니다. 예를 들어 [SUM](r_SUM.md) 집계 함수는 [SUM](r_WF_SUM.md) 창 함수 내에 표시될 수 있지만 창 함수 SUM은 다른 창 함수 SUM 내에 표시될 수 없습니다. 창 함수가 다른 창 함수에 중첩되어 있으므로 다음 사항이 지원되지 않습니다.

```
SELECT SUM(SUM(selectcol) OVER (PARTITION BY ordercol)) OVER (Partition by ordercol) FROM t;
```

## 창 함수 구문 요약
<a name="r_Window_function_synopsis"></a>

Window 함수는 다음과 같은 표준 구문을 따릅니다.

```
function (expression) OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list [ frame_clause ] ] )
```

 여기서 *함수*는 이 섹션에서 설명하는 함수 중 하나입니다.

*expr\$1list*는 다음과 같습니다.

```
expression | column_name [, expr_list ]
```

 *order\$1list*는 다음과 같습니다.

```
expression | column_name [ ASC | DESC ] 
[ NULLS FIRST | NULLS LAST ]
[, order_list ]
```

 *frame\$1clause*는 다음과 같습니다.

```
ROWS
{ UNBOUNDED PRECEDING | unsigned_value PRECEDING | CURRENT ROW } |

{ BETWEEN
{ UNBOUNDED PRECEDING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW}
AND
{ UNBOUNDED FOLLOWING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW }}
```

### 인수
<a name="r_Window_function_synopsis-arguments"></a>

 * 함수*   
창 함수 자세한 내용은 각 함수에 대한 설명을 참조하세요.

OVER   
창 명세를 정의하는 절입니다. OVER 절은 창 함수에서 필수 인수로서 창 함수와 다른 SQL 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
(옵션) PARTITION BY 절은 결과 집합을 여러 파티션으로 분할한다는 점에서 GROUP BY 절과 매우 유사합니다. 파티션 절이 존재하는 경우에는 함수가 각 파티션의 행에 대해 계산됩니다. 반대로 파티션 절을 지정하지 않으면 전체 테이블이 단일 파티션으로 구성되어 함수가 해당하는 전체 테이블에 대해서 계산됩니다.  
DENSE\$1RANK, NTILE, RANK, ROW\$1NUMBER 같은 순위 함수에서는 결과 집합의 모든 행을 전역적으로 비교해야 합니다. 이때 PARTITION BY 절을 사용하면 쿼리 옵티마이저가 워크로드를 파티션에 따라 다수의 조각으로 분산시키기 때문에 각 집계를 병렬 방식으로 실행할 수 있습니다. PARTITION BY 절을 사용하지 않으면 단일 조각에서 직렬 방식으로 집계를 실행해야 하기 때문에 특히 대용량의 클러스터에서는 성능에 매우 부정적인 영향을 끼치게 됩니다.  
Amazon Redshift는 PARTITION BY 절에서 문자열 리터럴을 지원하지 않습니다.

ORDER BY *order\$1list*   
(옵션) 윈도 함수는 ORDER BY의 순서 명세에 따라 정렬된 각 파티션의 행에 적용됩니다. 이 ORDER BY 절은 *frame\$1clause*의 ORDER BY 절과 구분되어 전혀 관련이 없습니다. 이러한 ORDER BY 절은 PARTITION BY 절 없이도 사용할 수 있습니다.  
순위 함수에서는 ORDER BY 절이 순위 값의 기준을 식별하는 역할을 합니다. 집계 함수에서는 각 프레임에 대한 집계 함수 계산 이전에 파티션 행의 순서를 지정해야 합니다. 윈도 함수 형식에 대한 자세한 내용은 [윈도우 함수](#c_Window_functions) 섹션을 참조하세요.  
order list에는 열 식별자, 또는 열 식별자로 평가되는 표현식이 필요합니다. 열 이름 대신에 상수나 상수 표현식을 사용할 수도 없습니다.  
NULLS 값은 자체 그룹으로 처리되어 NULLS FIRST 또는 NULLS LAST 옵션에 따라 정렬 후 순위가 결정됩니다. 기본적으로 NULL 값은 ASC 순서에서는 마지막에 정렬 후 순위가 결정되며, DESC 순서에서는 처음에 정렬 후 순위가 결정됩니다.  
Amazon Redshift는 ORDER BY 절에서 문자열 리터럴을 지원하지 않습니다.  
 ORDER BY 절을 생략하면 행의 순서는 비확정적입니다.  
Amazon Redshift와 같은 병렬 시스템에서는 ORDER BY 절이 데이터의 전체 순서를 고유하게 지정하지 않으면 행의 순서는 비확정적입니다. 다시 말해 ORDER BY 표현식에서 중복 값이 산출되면(부분 순서 지정) Amazon Redshift를 실행할 때마다 해당하는 행의 반환 순서가 달라질 수 있습니다. 그러면 창 함수 역시 예상하지 못하거나 일관적이지 못한 결과를 반환하게 됩니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](#r_Examples_order_by_WF) 섹션을 참조하세요.

 *column\$1name*   
파티션으로 분할하거나 순서를 지정할 때 기준이 되는 열의 이름입니다.

ASC \$1 DESC   
표현식의 정렬 순서를 정의하는 옵션으로서 각각 다음과 같은 의미를 갖습니다.  
+ ASC: 오름차순(예: 숫자 값의 경우 낮은 값에서 높은 값 순, 문자열의 경우 'A'에서 'Z'의 순. 지정된 옵션이 없는 경우에는 데이터가 기본적으로 오름차순으로 정렬됩니다.
+ DESC: 내림차순(숫자 값의 경우 높은 값에서 낮은 값 순, 문자열의 경우 'Z'에서 'A'의 순).

NULLS FIRST \$1 NULLS LAST  
NULLS의 순서를 NULL 값 이외의 값 이전에 결정할지, 혹은 이후에 결정할지 지정하는 옵션입니다. 기본적으로 ASC 순서에서는 마지막에 정렬 후 순위가 결정되며, DESC 순서에서는 처음에 정렬 후 순위가 결정됩니다.

 *frame\$1clause*   
집계 함수에서 프레임 절은 ORDER BY를 사용하여 함수의 창에 포함되는 행 집합을 추가적으로 정제하는 역할을 합니다. 이를 통해 순서가 지정된 결과 내에 행 집합을 추가하거나 제거할 수 있습니다. ROWS 키워드와 관련 지정자로 구성됩니다.  
프레임 절은 순위 함수에 적용되지 않습니다. 또한 집계 함수의 OVER 절에 ORDER BY 절이 사용되지 않는 경우 프레임 절이 필요하지 않습니다. 집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다.  
ORDER BY 절을 지정하지 않으면 묵시적 프레임이 무제한이기 때문에 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING과 다름 없습니다.

ROWS  
이 절은 현재 행에서 물리적 오프셋을 지정하여 창 프레임을 정의합니다.  
이 절은 현재 창 또는 파티션에서 현재 행의 값이 결합되는 행을 지정합니다. 행의 위치는 인수를 사용하여 지정하며, 현재 행 앞 또는 뒤가 될 수 있습니다. 모든 창 프레임에서 기준점은 현재 행입니다. 각 행은 창 프레임이 파티션에서 밀려 앞으로 이동하면서 번갈아 현재 행이 됩니다.  
프레임은 다음과 같이 현재 행까지 포함하여 단일 행 집합이 되거나,  

```
{UNBOUNDED PRECEDING | offset PRECEDING | CURRENT ROW}
```
혹은 다음과 같이 두 경계 사이의 행 집합이 될 수도 있습니다.  

```
BETWEEN
{ UNBOUNDED PRECEDING | offset { PRECEDING | FOLLOWING } | CURRENT ROW }
AND
{ UNBOUNDED FOLLOWING | offset { PRECEDING | FOLLOWING } | CURRENT ROW }
```
UNBOUNDED PRECEDING은 파티션의 첫 행에서 창이 시작된다는 것을 나타내고, *offset* PRECEDING은 오프셋 값에 해당하는 행의 수만큼 현재 행 앞에서 창이 시작된다는 것을 나타냅니다. 기본값은 UNBOUNDED PRECEDING입니다.  
CURRENT ROW는 창이 현재 행에서 시작하거나 끝난다는 것을 나타냅니다.  
UNBOUNDED FOLLOWING은 파티션의 마지막 행에서 창이 끝나는 것을 나타내고, *offset* FOLLOWING은 오프셋 값에 해당하는 행의 수만큼 현재 행 뒤에서 창이 끝난다는 것을 나타냅니다.  
*offset*은 현재 행 앞 또는 뒤로 물리적인 행의 수를 의미합니다. 이 경우에는 *offset*이 양의 숫자 값으로 평가되는 상수여야 합니다. 예를 들어 5 FOLLOWING일 때는 현재 행 뒤로 5개 행을 지나 프레임이 종료됩니다.  
BETWEEN을 지정하지 않으면 묵시적이지만 프레임 경계가 현재 행으로 결정됩니다. 예를 들어 `ROWS 5 PRECEDING`은 `ROWS BETWEEN 5 PRECEDING AND CURRENT ROW`와 같습니다. 또한 `ROWS UNBOUNDED FOLLOWING`은 `ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING`과 같습니다.  
시작 경계가 종료 경계보다 크게 프레임을 지정할 수는 없습니다. 예를 들어 다음과 같은 프레임은 지정할 수 없습니다.  

```
between 5 following and 5 preceding
between current row and 2 preceding
between 3 following and current row
```

## 창 함수 데이터에 대한 고유 순서 지정
<a name="r_Examples_order_by_WF"></a>

윈도 함수의 ORDER BY 절이 데이터의 전체 순서를 고유하게 지정하지 않으면 행의 순서는 비확정적입니다. 다시 말해 ORDER BY 표현식에서 중복 값이 산출되면(부분 순서 지정) 여러 차례 실행할 때마다 해당 행의 반환 순서가 달라질 수 있습니다. 이 경우 윈도 함수 역시 예상하지 못하거나 일관적이지 못한 결과를 반환하게 됩니다.

예를 들어 다음 쿼리는 여러 실행에 대해 다른 결과를 반환합니다. 이러한 다른 결과는 `order by dateid`가 SUM 윈도 함수 데이터의 고유한 순서를 생성하지 않기 때문에 발생합니다.

```
select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid |   sumpaid
--------+-----------+-------------
1827 |   1730.00 |     1730.00
1827 |    708.00 |     2438.00
1827 |    234.00 |     2672.00
...

select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid |   sumpaid
--------+-----------+-------------
1827 |    234.00 |      234.00
1827 |    472.00 |      706.00
1827 |    347.00 |     1053.00
...
```

 이 경우에는 두 번째 ORDER BY 열을 윈도 함수에 추가하여 문제를 해결할 수 있습니다.

```
select dateid, pricepaid,
sum(pricepaid) over(order by dateid, pricepaid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid | sumpaid
--------+-----------+---------
1827 |    234.00 |  234.00
1827 |    337.00 |  571.00
1827 |    347.00 |  918.00
...
```

## 지원되는 함수
<a name="r_Window_function_supported"></a>

Amazon Redshift는 집계와 순위, 두 가지 형식의 윈도 함수를 지원합니다.

다음은 지원되는 집계 함수입니다.
+ [AVG 창 함수](r_WF_AVG.md)
+ [COUNT 창 함수](r_WF_COUNT.md)
+ [CUME\$1DIST 창 함수](r_WF_CUME_DIST.md)
+ [DENSE\$1RANK 창 함수](r_WF_DENSE_RANK.md)
+ [FIRST\$1VALUE 창 함수](r_WF_first_value.md)
+ [LAG 창 함수](r_WF_LAG.md) 
+ [LAST\$1VALUE 창 함수](r_WF_last_value.md)
+ [LEAD 창 함수](r_WF_LEAD.md) 
+ [LISTAGG 창 함수](r_WF_LISTAGG.md) 
+ [MAX 창 함수](r_WF_MAX.md) 
+ [MEDIAN 창 함수](r_WF_MEDIAN.md) 
+ [MIN 창 함수](r_WF_MIN.md) 
+ [NTH\$1VALUE 창 함수](r_WF_NTH.md) 
+ [PERCENTILE\$1CONT 창 함수](r_WF_PERCENTILE_CONT.md)
+ [PERCENTILE\$1DISC 창 함수](r_WF_PERCENTILE_DISC.md)
+ [RATIO\$1TO\$1REPORT 창 함수](r_WF_RATIO_TO_REPORT.md)
+ [STDDEV\$1SAMP 및 STDDEV\$1POP 창 함수](r_WF_STDDEV.md)(STDDEV\$1SAMP 및 STDDEV는 동의어) 
+ [SUM 창 함수](r_WF_SUM.md) 
+ [VAR\$1SAMP 및 VAR\$1POP 창 함수](r_WF_VARIANCE.md)(VAR\$1SAMP와 VARIANCE는 동의어)

다음은 지원되는 순위 함수입니다.
+ [DENSE\$1RANK 창 함수](r_WF_DENSE_RANK.md) 
+ [NTILE 창 함수](r_WF_NTILE.md) 
+ [PERCENT\$1RANK 창 함수](r_WF_PERCENT_RANK.md)
+ [RANK 창 함수](r_WF_RANK.md) 
+ [ROW\$1NUMBER 창 함수](r_WF_ROW_NUMBER.md)

## 창 함수 예제를 위한 샘플 테이블
<a name="r_Window_function_example"></a>

각 함수 설명과 함께 특정 창 함수 예제를 찾을 수도 있습니다. 일부 예는 다음과 같은 11개의 행이 포함된 WINSALES라는 테이블을 사용합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_Window_functions.html)

다음은 WINSALES 샘플 테이블을 생성하여 채우는 스크립트입니다.

```
CREATE TABLE winsales(
  salesid int,
  dateid date,
  sellerid int,
  buyerid char(10),
  qty int,
  qty_shipped int);

INSERT INTO winsales VALUES
  (30001, '8/2/2003', 3, 'b', 10, 10),
  (10001, '12/24/2003', 1, 'c', 10, 10),
  (10005, '12/24/2003', 1, 'a', 30, null),	
  (40001, '1/9/2004', 4, 'a', 40, null),	
  (10006, '1/18/2004', 1, 'c', 10, null),	
  (20001, '2/12/2004', 2, 'b', 20, 20),
  (40005, '2/12/2004', 4, 'a', 10, 10),
  (20002, '2/16/2004', 2, 'c', 20, 20),
  (30003, '4/18/2004', 3, 'b', 15, null),
  (30004, '4/18/2004', 3, 'b', 20, null),	
  (30007, '9/7/2004', 3, 'c', 30, null);
```

# AVG 창 함수
<a name="r_WF_AVG"></a>

 AVG 창 함수는 입력 표현식 값의 평균(산술 평균)을 반환합니다. AVG 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_WF_AVG-synopsis"></a>

```
AVG ( [ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 인수
<a name="r_WF_AVG-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 행의 수를 계산합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 AVG 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="c_Supported_data_types_wf_avg"></a>

AVG 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION입니다.

AVG 함수에서 지원되는 반환 형식은 다음과 같습니다.
+ SMALLINT 또는 INTEGER 인수일 때 BIGINT
+ BIGINT 인수일 때 NUMERIC
+ 부동 소수점 인수일 때 DOUBLE PRECISION

## 예제
<a name="r_WF_AVG-examples"></a>

다음 예에서는 날짜를 기준으로 판매된 수량의 이동 평균을 계산한 후 날짜 ID와 판매 ID에 따라 결과 순서를 지정합니다.

```
select salesid, dateid, sellerid, qty,
avg(qty) over
(order by dateid, salesid rows unbounded preceding) as avg
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | avg
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  10
10005 | 2003-12-24 |        1 |  30 |  16
40001 | 2004-01-09 |        4 |  40 |  22
10006 | 2004-01-18 |        1 |  10 |  20
20001 | 2004-02-12 |        2 |  20 |  20
40005 | 2004-02-12 |        4 |  10 |  18
20002 | 2004-02-16 |        2 |  20 |  18
30003 | 2004-04-18 |        3 |  15 |  18
30004 | 2004-04-18 |        3 |  20 |  18
30007 | 2004-09-07 |        3 |  30 |  19
(11 rows)
```

 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

# COUNT 창 함수
<a name="r_WF_COUNT"></a>

 COUNT 창 함수는 표현식에서 정의하는 행의 수를 계산합니다.

COUNT 함수는 2가지 변형이 있습니다. COUNT(\$1)는 NULL 값의 유무에 상관없이 대상 테이블에서 모든 행의 수를 계산합니다. COUNT(expression)는 특정 열 또는 표현식에서 NULL을 제외한 값이 포함된 행의 수를 계산합니다.

## 구문
<a name="r_WF_COUNT-synopsis"></a>

```
COUNT ( * | [ ALL ] expression) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 인수
<a name="r_WF_COUNT-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지한 채 행의 수를 계산합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 COUNT 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="c_Supported_data_types_wf_count"></a>

COUNT 함수는 모든 인수 데이터 형식을 지원합니다.

COUNT 함수에서 지원되는 반환 형식은 BIGINT입니다.

## 예제
<a name="r_WF_COUNT-examples"></a>

 다음 예에서는 데이터 윈도의 시작부터 판매 ID, 수량 및 모든 행의 수를 보여줍니다.

```
select salesid, qty,
count(*) over (order by salesid rows unbounded preceding) as count
from winsales
order by salesid;

salesid | qty | count
---------+-----+-----
10001 |  10 |   1
10005 |  30 |   2
10006 |  10 |   3
20001 |  20 |   4
20002 |  20 |   5
30001 |  10 |   6
30003 |  15 |   7
30004 |  20 |   8
30007 |  30 |   9
40001 |  40 |   10
40005 |  10 |   11
(11 rows)
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 데이터 윈도의 시작부터 판매 ID, 수량 및 null이 아닌 행의 수를 보여줍니다. WINSALES 테이블의 QTY\$1SHIPPED 열에는 일부 NULL이 포함되어 있습니다.

```
select salesid, qty, qty_shipped,
count(qty_shipped)
over (order by salesid rows unbounded preceding) as count
from winsales
order by salesid;

salesid | qty | qty_shipped | count
---------+-----+-------------+-------
10001 |  10 |          10 |   1
10005 |  30 |             |   1
10006 |  10 |             |   1
20001 |  20 |          20 |   2
20002 |  20 |          20 |   3
30001 |  10 |          10 |   4
30003 |  15 |             |   4
30004 |  20 |             |   4
30007 |  30 |             |   4
40001 |  40 |             |   4
40005 |  10 |          10 |   5
(11 rows)
```

# CUME\$1DIST 창 함수
<a name="r_WF_CUME_DIST"></a>

창 또는 파티션에 속하는 값의 누적 분포를 계산합니다. 오름차순을 가정했을 때 누적 분포는 다음과 같은 공식으로 결정됩니다.

`count of rows with values <= x / count of rows in the window or partition`

여기에서 *x*는 ORDER BY 절에서 지정하는 열의 현재 행 값과 동일합니다. 다음은 위와 같은 공식의 사용을 나타내는 데이터 세트입니다.

```
Row#	Value	  Calculation    CUME_DIST
1        2500	   (1)/(5)	   0.2
2        2600	   (2)/(5)	   0.4
3        2800	   (3)/(5)	   0.6
4        2900	   (4)/(5)	   0.8
5        3100	   (5)/(5)	   1.0
```

반환 값의 범위는 0부터 1까지입니다(1 포함).

## 구문
<a name="r_WF_CUME_DIST-synopsis"></a>

```
CUME_DIST ()
OVER ( 
[ PARTITION BY partition_expression ] 
[ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_CUME_DIST-arguments"></a>

OVER  
창 파티션을 지정하는 절입니다. OVER 절에는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *partition\$1expression*   
선택 사항입니다. OVER 절에서 각 그룹의 레코드 범위를 설정하는 표현식입니다.

ORDER BY *order\$1list*   
누적 분포를 계산하기 위한 표현식입니다. 이 표현식은 숫자 데이터 형식을 갖거나, 혹은 묵시적으로 1로 변환될 수 있어야 합니다. 즉 ORDER BY가 생략되면 모든 행의 반환 값은 1입니다.  
ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="r_WF_CUME_DIST-returns"></a>

FLOAT8

## 예제
<a name="r_WF_CUME_DIST-examples"></a>

다음은 각 판매자의 수량 누적 분포를 계산하는 예입니다.

```
select sellerid, qty, cume_dist() 
over (partition by sellerid order by qty) 
from winsales;

sellerid   qty	   cume_dist
--------------------------------------------------
1         10.00	   0.33
1         10.64	   0.67
1         30.37	   1
3         10.04	   0.25
3         15.15	   0.5
3         20.75	   0.75
3         30.55	   1
2         20.09	   0.5
2         20.12	   1
4         10.12	   0.5
4         40.23	   1
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

# DENSE\$1RANK 창 함수
<a name="r_WF_DENSE_RANK"></a>

DENSE\$1RANK 창 함수는 OVER 절의 ORDER BY 표현식을 기준으로 값 그룹에 속한 값의 순위를 결정합니다. PARTITION BY 절(옵션)이 존재하면 각 행 그룹의 순위가 재설정됩니다. 순위 기준 값이 같은 행은 순위도 동일하게 결정됩니다. DENSE\$1RANK 함수는 한 가지 측면에서 RANK와 다릅니다. 즉 2개 이상의 행에서 순위가 동일하면 순위 값의 순서에서도 빈 자리가 없습니다. 예를 들어 두 행의 순위가 `1`로 결정되면 다음 순위는 `2`입니다.

순위 함수에서는 동일한 쿼리라고 해도 PARTITION BY 절과 ORDER BY 절을 다르게 사용할 수 있습니다.

## 구문
<a name="r_WF_DENSE_RANK-synopsis"></a>

```
DENSE_RANK() OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_DENSE_RANK-arguments"></a>

( )   
함수에 인수가 없지만 빈 괄호가 필요합니다.

OVER   
DENSE\$1RANK 함수의 창 절입니다.

PARTITION BY *expr\$1list*   
(선택) 창을 정의하는 하나 이상의 표현식입니다.

ORDER BY *order\$1list*   
(선택) 순위 값의 기준이 되는 표현식입니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다. 즉 ORDER BY가 생략되면 모든 행의 반환 값은 `1`입니다.  
ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="c_Supported_data_types_wf_dense_rank"></a>

`BIGINT`

## 예제
<a name="r_WF_DENSE_RANK-examples"></a>

다음 예제에서는 창 함수에 대한 샘플 테이블을 사용합니다. 자세한 내용은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 판매 수량으로 테이블을 정렬하고 각 행에 밀집 순위와 정규 순위를 모두 할당합니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.

```
SELECT salesid, qty,
DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk,
RANK() OVER(ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY 2,1;

+---------+-----+-------+-----+
| salesid | qty | d_rnk | rnk |
+---------+-----+-------+-----+
|   10001 |  10 |     5 |   8 |
|   10006 |  10 |     5 |   8 |
|   30001 |  10 |     5 |   8 |
|   40005 |  10 |     5 |   8 |
|   30003 |  15 |     4 |   7 |
|   20001 |  20 |     3 |   4 |
|   20002 |  20 |     3 |   4 |
|   30004 |  20 |     3 |   4 |
|   10005 |  30 |     2 |   2 |
|   30007 |  30 |     2 |   2 |
|   40001 |  40 |     1 |   1 |
+---------+-----+-------+-----+
```

동일한 쿼리에서 DENSE\$1RANK와 RANK 함수를 함께 사용하여 같은 행 집합에 할당되는 순위의 차이를 기록합니다.

다음 예제에서는 sellerid를 기준으로 테이블을 분할하고, 각 분할을 수량별로 정렬하고, 각 행에 고밀도 순위를 할당합니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.

```
SELECT salesid, sellerid, qty,
DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk
FROM winsales
ORDER BY 2,3,1;

+---------+----------+-----+-------+
| salesid | sellerid | qty | d_rnk |
+---------+----------+-----+-------+
|   10001 |        1 |  10 |     2 |
|   10006 |        1 |  10 |     2 |
|   10005 |        1 |  30 |     1 |
|   20001 |        2 |  20 |     1 |
|   20002 |        2 |  20 |     1 |
|   30001 |        3 |  10 |     4 |
|   30003 |        3 |  15 |     3 |
|   30004 |        3 |  20 |     2 |
|   30007 |        3 |  30 |     1 |
|   40005 |        4 |  10 |     2 |
|   40001 |        4 |  40 |     1 |
+---------+----------+-----+-------+
```

마지막 예제를 성공적으로 사용하려면 다음 명령을 사용하여 WINSALES 테이블에 행을 삽입합니다. 이 행은 다른 행과 동일한 buyerid, sellerid 및 qtysold를 가집니다. 이렇게 하면 마지막 예제에서 두 행이 동점이 되므로 DENSE\$1RANK와 RANK 함수의 차이점이 표시됩니다.

```
INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);
```

다음 예제에서는 buyerid 및 sellerid를 기준으로 테이블을 분할하고, 각 분할을 수량별로 정렬하고, 각 행에 밀도 순위와 일반 순위를 모두 할당합니다. 결과는 창 함수가 적용된 후 정렬됩니다.

```
SELECT salesid, sellerid, qty, buyerid,
DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk,
RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY rnk;

+---------+----------+-----+---------+-------+-----+
| salesid | sellerid | qty | buyerid | d_rnk | rnk |
+---------+----------+-----+---------+-------+-----+
|   20001 |        2 |  20 | b       |     1 |   1 |
|   30007 |        3 |  30 | c       |     1 |   1 |
|   10006 |        1 |  10 | c       |     1 |   1 |
|   10005 |        1 |  30 | a       |     1 |   1 |
|   20002 |        2 |  20 | c       |     1 |   1 |
|   30009 |        3 |  20 | b       |     1 |   1 |
|   40001 |        4 |  40 | a       |     1 |   1 |
|   30004 |        3 |  20 | b       |     1 |   1 |
|   10001 |        1 |  10 | c       |     1 |   1 |
|   40005 |        4 |  10 | a       |     2 |   2 |
|   30003 |        3 |  15 | b       |     2 |   3 |
|   30001 |        3 |  10 | b       |     3 |   4 |
+---------+----------+-----+---------+-------+-----+
```

# FIRST\$1VALUE 창 함수
<a name="r_WF_first_value"></a>

 행 집합의 순서가 지정되었다고 가정할 때 FIRST VALUE 함수는 창 프레임의 첫 번째 행과 관련하여 지정된 표현식의 값을 반환합니다.

프레임의 마지막 행 선택에 대한 자세한 내용은 [LAST\$1VALUE 창 함수](r_WF_last_value.md) 섹션을 참조하세요.

## 구문
<a name="r_WF_first_value-synopsis"></a>

```
FIRST_VALUE( expression )[ IGNORE NULLS | RESPECT NULLS ]
OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 인수
<a name="r_WF_first_value-arguments"></a>

 * expression*   
 함수가 실행되는 대상 열 또는 표현식입니다.

IGNORE NULLS   
FIRST\$1VALUE에서 이 옵션을 사용하면 프레임에서 NULL이 아닌 첫 번째 값을 반환합니다(또는 모든 값이 NULL이면 NULL을 반환합니다).

RESPECT NULLS   
 Amazon Redshift에서 사용할 행을 결정할 때 null 값을 포함시켜야 한다는 것을 의미합니다. RESPECT NULLS는 IGNORE NULLS를 지정하지 않은 경우 기본적으로 지원됩니다.

OVER   
함수에서 창 절을 삽입합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY 절을 지정하지 않으면 ORDER BY가 전체 테이블을 정렬합니다. ORDER BY 절을 지정하면 *frame\$1clause* 역시 지정해야 합니다.  
FIRST\$1VALUE 함수의 결과는 데이터 순서에 따라 결정됩니다. 다음과 같은 경우 함수 결과는 비확정적입니다.  
+ ORDER BY 절이 지정되지 않고 파티션에 다른 표현식 값 2개가 포함된 경우 
+ 표현식이 ORDER BY 목록에서는 동일한 값이지만 다른 값으로 평가되는 경우 

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis)을(를) 참조하세요.

## 반환 타입
<a name="c_Supported_data_types_wf_first_value"></a>

이 두 함수는 기본 Amazon Redshift 데이터 형식을 사용하는 표현식을 지원합니다. 반환 형식은 *expression* 데이터 형식과 동일합니다.

## 예제
<a name="r_WF_first_value-examples"></a>

다음 예시에서는 샘플 TICKIT 데이터의 VENUE 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 VENUE 테이블에서 각 장소의 좌석 수용 능력을 반환하는 예로서 함수 결과의 순서(내림차순)는 좌석 수용 능력에 따라 지정됩니다. FIRST\$1VALUE 함수는 프레임에서 첫 번째 행에 해당하는 장소의 이름을 선택할 때 사용됩니다. 이 경우에는 좌석 수가 가장 많은 행이 여기에 해당합니다. 결과가 주를 기준으로 분할되어 있으므로 VENUESTATE 값이 바뀌면 첫 번째 값도 새롭게 선택됩니다. 여기에서는 창 프레임의 경계가 없기 때문에 각 파티션의 행마다 선택되는 첫 번째 값이 동일합니다.

California를 예로 들면, `Qualcomm Stadium`의 좌석 수(`70561`)가 가장 높기 때문에 이 장소의 이름이 `CA` 파티션의 모든 행에 대한 첫 번째 값에 해당합니다.

```
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |           venuename            |         first_value
-----------+------------+--------------------------------+------------------------------
CA         |      70561 | Qualcomm Stadium               | Qualcomm Stadium
CA         |      69843 | Monster Park                   | Qualcomm Stadium
CA         |      63026 | McAfee Coliseum                | Qualcomm Stadium
CA         |      56000 | Dodger Stadium                 | Qualcomm Stadium
CA         |      45050 | Angel Stadium of Anaheim       | Qualcomm Stadium
CA         |      42445 | PETCO Park                     | Qualcomm Stadium
CA         |      41503 | AT&T Park                      | Qualcomm Stadium
CA         |      22000 | Shoreline Amphitheatre         | Qualcomm Stadium
CO         |      76125 | INVESCO Field                  | INVESCO Field
CO         |      50445 | Coors Field                    | INVESCO Field
DC         |      41888 | Nationals Park                 | Nationals Park
FL         |      74916 | Dolphin Stadium                | Dolphin Stadium
FL         |      73800 | Jacksonville Municipal Stadium | Dolphin Stadium
FL         |      65647 | Raymond James Stadium          | Dolphin Stadium
FL         |      36048 | Tropicana Field                | Dolphin Stadium
...
```

다음은 IGNORE NULLS 옵션을 사용하는 예로서 새로운 행을 VENUE 테이블에 추가합니다.

```
insert into venue values(2000,null,'Stanford','CA',90000);
```

위의 새로운 행에서는 VENUENAME 열에 NULL 값이 포함되어 있습니다. 이제 이번 섹션 앞에서 실행했던 FIRST\$1VALUE 쿼리를 반복합니다.

```
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |         venuename          | first_value
-----------+------------+----------------------------+-------------
CA         |      90000 | NULL                       | NULL
CA         |      70561 | Qualcomm Stadium           | NULL
CA         |      69843 | Monster Park               | NULL
...
```

새로운 행의 VENUESEATS 값(`90000`)이 가장 높지만 VENUENAME이 NULL 값이기 때문에 FIRST\$1VALUE 함수는 `CA` 파티션에 대해 NULL을 반환합니다. 이렇게 함수 평가에서 행을 무시하려면 IGNORE NULLS 옵션을 아래와 같이 함수 인수에 추가하면 됩니다.

```
select venuestate, venueseats, venuename,
first_value(venuename) ignore nulls
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venuestate='CA')
order by venuestate;

venuestate | venueseats |         venuename          |   first_value
------------+------------+----------------------------+------------------
CA         |      90000 | NULL                       | Qualcomm Stadium
CA         |      70561 | Qualcomm Stadium           | Qualcomm Stadium
CA         |      69843 | Monster Park               | Qualcomm Stadium
...
```

# LAG 창 함수
<a name="r_WF_LAG"></a>

 LAG 창 함수는 파티션에서 현재 행 위(앞)의 지정 오프셋에 위치한 행의 값을 반환합니다.

## 구문
<a name="r_WF_LAG-synopsis"></a>

```
LAG (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
```

## 인수
<a name="r_WF_LAG-arguments"></a>

 *value\$1expr*   
 함수가 실행되는 대상 열 또는 표현식입니다.

 *offset*   
 현재 행 앞으로 값을 반환할 행이 위치한 수를 지정하는 파라미터(옵션)입니다. 이 오프셋은 상수 정수 혹은 정수로 평가되는 표현식이 될 수 있습니다. 오프셋을 지정하지 않으면 Amazon Redshift가 기본값으로 `1`을 사용합니다. 오프셋이 `0`이면 현재 행을 나타냅니다.

IGNORE NULLS   
Amazon Redshift에서 사용할 행을 결정할 때 null 값을 건너뛰어야 한는 것을 의미하는 명세(옵션)입니다. IGNORE NULLS를 지정하지 않으면 NULL 값이 포함됩니다.  
NVL 또는 COALESCE 표현식을 사용하여 NULL 값을 다른 값으로 변경할 수도 있습니다. 자세한 내용은 [NVL 및 COALESCE 함수](r_NVL_function.md) 섹션을 참조하세요.

RESPECT NULLS   
 Amazon Redshift에서 사용할 행을 결정할 때 null 값을 포함시켜야 한다는 것을 의미합니다. RESPECT NULLS는 IGNORE NULLS를 지정하지 않은 경우 기본적으로 지원됩니다.

OVER   
창 파티션 및 순서를 지정합니다. OVER 절에는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *window\$1partition*   
OVER 절에서 각 그룹의 레코드 범위를 설정하는 인수(옵션)입니다.

ORDER BY *window\$1ordering*   
각 파티션의 행을 정렬합니다.

LAG 윈도 함수는 Amazon Redshift 데이터 형식을 모두 사용하는 표현식을 지원합니다. 반환 형식은 *value\$1expr* 형식과 동일합니다.

## 예제
<a name="r_WF_LAG-examples"></a>

 다음은 구매자 ID가 3인 구매자에게 팔린 티켓 수량과 구매자 3이 티켓을 구입한 시간을 나타내는 예입니다. 쿼리가 구매자 3의 각 판매 수량을 이전 판매 수량과 비교할 수 있도록 각 판매 수량에 대한 이전 판매 수량을 반환합니다. 2008년 1월 16일 이전에는 구매 기록이 없기 때문에 이전 판매 수량의 첫 번째 값은 NULL입니다.

```
select buyerid, saletime, qtysold,
lag(qtysold,1) over (order by buyerid, saletime) as prev_qtysold
from sales where buyerid = 3 order by buyerid, saletime;

buyerid |      saletime       | qtysold | prev_qtysold
---------+---------------------+---------+--------------
3 | 2008-01-16 01:06:09 |       1 |
3 | 2008-01-28 02:10:01 |       1 |            1
3 | 2008-03-12 10:39:53 |       1 |            1
3 | 2008-03-13 02:56:07 |       1 |            1
3 | 2008-03-29 08:21:39 |       2 |            1
3 | 2008-04-27 02:39:01 |       1 |            2
3 | 2008-08-16 07:04:37 |       2 |            1
3 | 2008-08-22 11:45:26 |       2 |            2
3 | 2008-09-12 09:11:25 |       1 |            2
3 | 2008-10-01 06:22:37 |       1 |            1
3 | 2008-10-20 01:55:51 |       2 |            1
3 | 2008-10-28 01:30:40 |       1 |            2
(12 rows)
```

# LAST\$1VALUE 창 함수
<a name="r_WF_last_value"></a>

 행 집합의 순서가 지정되었다고 가정할 때 LAST VALUE 함수는 프레임의 마지막 행과 관련하여 표현식의 값을 반환합니다.

프레임의 첫 번째 행 선택에 대한 자세한 내용은 [FIRST\$1VALUE 창 함수](r_WF_first_value.md) 섹션을 참조하세요.

## 구문
<a name="r_WF_last_value-synopsis"></a>

```
LAST_VALUE( expression )[ IGNORE NULLS | RESPECT NULLS ]
OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 인수
<a name="r_WF_last_value-arguments"></a>

 * expression*   
 함수가 실행되는 대상 열 또는 표현식입니다.

IGNORE NULLS   
프레임에서 NULL이 아닌 마지막 값을 반환합니다(또는 모든 값이 NULL이면 NULL을 반환합니다).

RESPECT NULLS   
Amazon Redshift에서 사용할 행을 결정할 때 null 값을 포함시켜야 한다는 것을 의미합니다. RESPECT NULLS는 IGNORE NULLS를 지정하지 않은 경우 기본적으로 지원됩니다.

OVER   
함수에서 창 절을 삽입합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY 절을 지정하지 않으면 ORDER BY가 전체 테이블을 정렬합니다. ORDER BY 절을 지정하면 *frame\$1clause* 역시 지정해야 합니다.  
결과는 데이터 순서에 따라 달라집니다. 다음과 같은 경우 함수 결과는 비확정적입니다.  
+ ORDER BY 절이 지정되지 않고 파티션에 다른 표현식 값 2개가 포함된 경우 
+ 표현식이 ORDER BY 목록에서는 동일한 값이지만 다른 값으로 평가되는 경우 

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis)을(를) 참조하세요.

## 반환 타입
<a name="c_Supported_data_types_wf_last_value"></a>

이 두 함수는 기본 Amazon Redshift 데이터 형식을 사용하는 표현식을 지원합니다. 반환 형식은 *expression* 데이터 형식과 동일합니다.

## 예제
<a name="r_WF_last_value-examples"></a>

다음 예시에서는 샘플 TICKIT 데이터의 VENUE 테이블을 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

다음은 VENUE 테이블에서 각 장소의 좌석 수용 능력을 반환하는 예로서 함수 결과의 순서(내림차순)는 좌석 수용 능력에 따라 지정됩니다. LAST\$1VALUE 함수는 프레임에서 마지막 행에 해당하는 장소의 이름을 선택할 때 사용됩니다. 이 경우에는 좌석 수가 가장 적은 행이 여기에 해당합니다. 결과가 주를 기준으로 분할되어 있으므로 VENUESTATE 값이 바뀌면 마지막 값도 새롭게 선택됩니다. 여기에서는 창 프레임의 경계가 없기 때문에 각 파티션의 행마다 선택되는 마지막 값이 동일합니다.

California를 보면, 파티션의 모든 행에 대해서 좌석 수(`Shoreline Amphitheatre`)가 가장 적은 `22000`가 반환됩니다.

```
select venuestate, venueseats, venuename,
last_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |           venuename            |          last_value
-----------+------------+--------------------------------+------------------------------
CA         |      70561 | Qualcomm Stadium               | Shoreline Amphitheatre
CA         |      69843 | Monster Park                   | Shoreline Amphitheatre
CA         |      63026 | McAfee Coliseum                | Shoreline Amphitheatre
CA         |      56000 | Dodger Stadium                 | Shoreline Amphitheatre
CA         |      45050 | Angel Stadium of Anaheim       | Shoreline Amphitheatre
CA         |      42445 | PETCO Park                     | Shoreline Amphitheatre
CA         |      41503 | AT&T Park                      | Shoreline Amphitheatre
CA         |      22000 | Shoreline Amphitheatre         | Shoreline Amphitheatre
CO         |      76125 | INVESCO Field                  | Coors Field
CO         |      50445 | Coors Field                    | Coors Field
DC         |      41888 | Nationals Park                 | Nationals Park
FL         |      74916 | Dolphin Stadium                | Tropicana Field
FL         |      73800 | Jacksonville Municipal Stadium | Tropicana Field
FL         |      65647 | Raymond James Stadium          | Tropicana Field
FL         |      36048 | Tropicana Field                | Tropicana Field
...
```

# LEAD 창 함수
<a name="r_WF_LEAD"></a>

 LEAD 창 함수는 파티션에서 현재 행 아래(뒤)의 지정 오프셋에 위치한 행의 값을 반환합니다.

## 구문
<a name="r_WF_LEAD-synopsis"></a>

```
LEAD (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
```

## 인수
<a name="r_WF_LEAD-arguments"></a>

 *value\$1expr*   
함수가 실행되는 대상 열 또는 표현식입니다.

 *offset*   
 현재 행 아래로 값을 반환할 행이 위치한 수를 지정하는 파라미터(옵션)입니다. 이 오프셋은 상수 정수 혹은 정수로 평가되는 표현식이 될 수 있습니다. 오프셋을 지정하지 않으면 Amazon Redshift가 기본값으로 `1`을 사용합니다. 오프셋이 `0`이면 현재 행을 나타냅니다.

IGNORE NULLS   
Amazon Redshift에서 사용할 행을 결정할 때 null 값을 건너뛰어야 한는 것을 의미하는 명세(옵션)입니다. IGNORE NULLS를 지정하지 않으면 NULL 값이 포함됩니다.  
NVL 또는 COALESCE 표현식을 사용하여 NULL 값을 다른 값으로 변경할 수도 있습니다. 자세한 내용은 [NVL 및 COALESCE 함수](r_NVL_function.md) 섹션을 참조하세요.

RESPECT NULLS   
 Amazon Redshift에서 사용할 행을 결정할 때 null 값을 포함시켜야 한다는 것을 의미합니다. RESPECT NULLS는 IGNORE NULLS를 지정하지 않은 경우 기본적으로 지원됩니다.

OVER   
창 파티션 및 순서를 지정합니다. OVER 절에는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *window\$1partition*   
OVER 절에서 각 그룹의 레코드 범위를 설정하는 인수(옵션)입니다.

ORDER BY *window\$1ordering*   
각 파티션의 행을 정렬합니다.

LEAD 윈도 함수는 Amazon Redshift 데이터 형식을 모두 사용하는 표현식을 지원합니다. 반환 형식은 *value\$1expr* 형식과 동일합니다.

## 예제
<a name="r_WF_LEAD-examples"></a>

 다음은 SALES 테이블의 이벤트에 대해 2008년 1월 1일과 동년 1월 2일에 판매된 티켓 수수료와 후속 티켓 판매 수수료를 나타낸 예입니다. 다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
SELECT eventid, commission, saletime, LEAD(commission, 1) over ( ORDER BY saletime ) AS next_comm
FROM sales
WHERE saletime BETWEEN '2008-01-09 00:00:00' AND '2008-01-10 12:59:59'
LIMIT 10;

+---------+------------+---------------------+-----------+
| eventid | commission |      saletime       | next_comm |
+---------+------------+---------------------+-----------+
|    1664 |       13.2 | 2008-01-09 01:00:21 |      69.6 |
|     184 |       69.6 | 2008-01-09 01:00:36 |     116.1 |
|    6870 |      116.1 | 2008-01-09 01:02:37 |      11.1 |
|    3718 |       11.1 | 2008-01-09 01:05:19 |     205.5 |
|    6772 |      205.5 | 2008-01-09 01:14:04 |      38.4 |
|    3074 |       38.4 | 2008-01-09 01:26:50 |     209.4 |
|    5254 |      209.4 | 2008-01-09 01:29:16 |      26.4 |
|    3724 |       26.4 | 2008-01-09 01:40:09 |      57.6 |
|    5303 |       57.6 | 2008-01-09 01:40:21 |      51.6 |
|    3678 |       51.6 | 2008-01-09 01:42:54 |      43.8 |
+---------+------------+---------------------+-----------+
```

 다음 예제에서는 SALES 테이블에 있는 이벤트의 커미션과 동일한 이벤트의 후속 티켓 판매에 대해 지불한 커미션의 최대 차이를 보여줍니다. 이 예에서는 GROUP BY 절과 함께 LEAD를 사용하는 방법을 보여줍니다. 집계 절에서는 창 함수를 사용할 수 없으므로 이 예제에서는 하위 쿼리를 사용합니다. 다음 예제에서는 TICKIT 샘플 데이터베이스를 사용합니다. 자세한 내용은 [샘플 데이터베이스](c_sampledb.md) 섹션을 참조하세요.

```
SELECT eventid, eventname, max(next_comm_diff) as max_commission_difference
FROM
(
    SELECT sales.eventid, eventname, commission - LEAD(commission, 1) over (ORDER BY sales.eventid, saletime) AS next_comm_diff
    FROM sales JOIN event ON sales.eventid = event.eventid
)
GROUP BY eventid, eventname
ORDER BY eventid

LIMIT 10

| eventid | eventname                   | max_commission_difference |
+---------+-----------------------------+---------------------------+
| 1       | Gotterdammerung             | 7.95                      |
| 2       | Boris Godunov               | 227.85                    |
| 3       | Salome                      | 1350.9                    |
| 4       | La Cenerentola (Cinderella) | 790.05                    |
| 5       | Il Trovatore                | 214.05                    |
| 6       | L Elisir d Amore            | 510.9                     |
| 7       | Doctor Atomic               | 180.6                     |
| 9       | The Fly                     | 147                       |
| 10      | Rigoletto                   | 186.6                     |
+---------+-----------------------------+---------------------------+
```

# LISTAGG 창 함수
<a name="r_WF_LISTAGG"></a>

LISTAGG 창 함수는 ORDER BY 표현식에 따라 쿼리 내 각 그룹의 행 순서를 지정한 다음, 값을 연결하여 문자열 하나로 만듭니다.

## 구문
<a name="r_WF_LISTAGG-synopsis"></a>

```
LISTAGG( [DISTINCT] expression [, 'delimiter' ] ) 
[ WITHIN GROUP (ORDER BY order_list) ] 
OVER ( [PARTITION BY partition_expression] )
```

## 인수
<a name="r_WF_LISTAGG-arguments"></a>

DISTINCT  
(선택 사항) 연결하기 전에 지정된 표현식에서 중복 값을 없애는 절입니다. 후행 공백은 무시되므로 문자열 `'a'`와 `'a '`를 중복으로 간주합니다. LISTAGG는 발생한 첫 번째 값을 사용합니다. 자세한 내용은 [후행 공백의 중요성](r_Character_types.md#r_Character_types-significance-of-trailing-blanks) 섹션을 참조하세요.

  


*aggregate\$1expression*   
 집계할 값을 제공하는 모든 유효 표현식(열 이름 등)입니다. NULL 값과 빈 문자열은 무시됩니다.

 *delimiter*   
(선택 사항) 연결된 값을 구분하는 문자열 상수입니다. 기본값은 NULL입니다.

 WITHIN GROUP (ORDER BY *order\$1list*)   
(선택 사항) 집계된 값의 정렬 순서를 지정하는 절입니다. ORDER BY 절에서 고유한 순서를 지정한 경우에 한해 확정적입니다. 기본값은 모든 행을 집계한 후 단일 값을 반환하는 것입니다.

 OVER   
 창 파티션을 지정하는 절입니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

 PARTITION BY *partition\$1expression*   
(선택 사항) OVER 절에서 각 그룹의 레코드 범위를 설정합니다.

## 반환 형식
<a name="r_WF_LISTAGG-data-types"></a>

결과 집합이 16,000,000바이트보다 클 경우에는 LISTAGG가 다음과 같은 오류를 반환합니다.

```
Invalid operation: Result size exceeds LISTAGG limit
```

## 예제
<a name="r_WF_LISTAGG-examples"></a>

아래 예들에서는 WINSALES 테이블을 사용합니다. 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음은 판매자 ID에 따라 순서를 지정하여 판매자 ID 목록을 반환하는 예입니다.

```
select listagg(sellerid) 
within group (order by sellerid)
over() from winsales;

  listagg
------------
 11122333344
...
...
 11122333344
 11122333344
   (11 rows)
```

다음은 날짜에 따라 순서를 지정하여 구매자 B의 판매자 ID 목록을 반환하는 예입니다.

```
select listagg(sellerid) 
within group (order by dateid)
over () as seller
from winsales
where buyerid = 'b' ;

  seller
---------
    3233
    3233
    3233
    3233
```

다음은 구매자 B의 판매 날짜 목록을 쉼표로 구분하여 반환하는 예입니다.

```
select listagg(dateid,',') 
within group (order by sellerid desc,salesid asc)
over () as dates
from winsales
where buyerid  = 'b';

             dates                                      
-------------------------------------------
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
```

다음 예에서는 DISTINCT를 사용하여 구매자 B의 고유한 판매 날짜 목록을 반환합니다.

```
select listagg(distinct dateid,',') 
within group (order by sellerid desc,salesid asc)
over () as dates
from winsales
where buyerid  = 'b';

           dates
--------------------------------
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
```

다음은 각 구매자 ID마다 판매 ID 목록을 쉼표로 구분하여 반환하는 예입니다.

```
select buyerid, 
listagg(salesid,',')
within group (order by salesid)
over (partition by buyerid) as sales_id
from winsales
order by buyerid;

+---------+-------------------------+
| buyerid |        sales_id         |
+---------+-------------------------+
| a       | 10005,40001,40005       |
| a       | 10005,40001,40005       |
| a       | 10005,40001,40005       |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
+---------+-------------------------+
```

다음 예제에서는 최대 16,000,000바이트의 연결된 결과를 사용한 LISTAGG 지원을 보여줍니다.

```
CREATE TABLE large_data (
    id INT,
    content VARCHAR(65535)
);

INSERT INTO large_data VALUES 
    (1, REPEAT('A', 65535)),
    (2, REPEAT('B', 65535)),
    (3, REPEAT('C', 65535));

SELECT LEN(LISTAGG(content, ',') WITHIN GROUP (ORDER BY id)) AS total_length
FROM large_data;

 total_length
--------------
       196607
```

# MAX 창 함수
<a name="r_WF_MAX"></a>

 MAX 창 함수는 입력 표현식의 최댓값을 반환합니다. MAX 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_WF_MAX-synopsis"></a>

```
MAX ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 인수
<a name="r_WF_MAX-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
 집계 함수의 창 절을 지정하는 절입니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 MAX 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="r_WF_MAX-data-types"></a>

입력값으로 모든 데이터 형식을 지원합니다. *expression*과 동일한 데이터 형식을 반환합니다.

## 예제
<a name="r_WF_MAX-examples"></a>

다음 예에서는 데이터 윈도의 시작부터 판매 ID, 수량 및 최대 수량을 보여줍니다.

```
select salesid, qty,
max(qty) over (order by salesid rows unbounded preceding) as max
from winsales
order by salesid;

salesid | qty | max
---------+-----+-----
10001 |  10 |  10
10005 |  30 |  30
10006 |  10 |  30
20001 |  20 |  30
20002 |  20 |  30
30001 |  10 |  30
30003 |  15 |  30
30004 |  20 |  30
30007 |  30 |  30
40001 |  40 |  40
40005 |  10 |  40
(11 rows)
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 제한적 프레임 내에서 판매 ID, 수량 및 최대 수량을 보여줍니다.

```
select salesid, qty,
max(qty) over (order by salesid rows between 2 preceding and 1 preceding) as max
from winsales
order by salesid;

salesid | qty | max
---------+-----+-----
10001 |  10 |
10005 |  30 |  10
10006 |  10 |  30
20001 |  20 |  30
20002 |  20 |  20
30001 |  10 |  20
30003 |  15 |  20
30004 |  20 |  15
30007 |  30 |  20
40001 |  40 |  30
40005 |  10 |  40
(11 rows)
```

# MEDIAN 창 함수
<a name="r_WF_MEDIAN"></a>

창 또는 파티션에서 값의 범위에 대한 중간 값을 계산합니다. 범위 내 NULL 값은 무시됩니다.

MEDIAN은 연속 분포 모델을 가정하는 역분포 함수입니다.

## 구문
<a name="r_WF_MEDIAN-synopsis"></a>

```
MEDIAN ( median_expression )
OVER ( [ PARTITION BY partition_expression ] )
```

## 인수
<a name="r_WF_MEDIAN-arguments"></a>

 *median\$1expression*   
중간을 결정할 값을 제공하는 표현식(열 이름 등)입니다. 이 표현식은 숫자 또는 날짜/시간 데이터 형식을 갖거나, 혹은 묵시적으로 1로 변환될 수 있어야 합니다.

OVER   
창 파티션을 지정하는 절입니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *partition\$1expression*   
선택 사항입니다. OVER 절에서 각 그룹의 레코드 범위를 설정하는 표현식입니다.

## 데이터 타입
<a name="r_WF_MEDIAN-data-types"></a>

반환 형식은 *median\$1expression*의 형식에 따라 결정됩니다. 다음 표는 각 *median\$1expression* 데이터 형식에 따른 반환 형식을 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_WF_MEDIAN.html)

## 사용 노트
<a name="r_WF_MEDIAN-data-usage-notes"></a>

*median\$1expression* 인수가 최대 정밀도가 38자리로 정의된 DECIMAL 데이터 형식인 경우에는 MEDIAN이 부정확한 결과 또는 오류를 반환합니다. MEDIAN 함수의 반환 값이 38자리를 초과하면 정밀도가 손실될 수도 있기 때문에 알맞은 자리 수로 결과가 잘립니다. 보간 도중 중간 결과가 최대 정밀도를 초과하면 수치 오버플로우가 발생하고 함수는 오류를 반환합니다. 이러한 상황을 방지하려면 정밀도가 낮은 데이터 형식을 사용하거나, 혹은 *median\$1expression* 인수를 낮은 정밀도로 변환합니다.

예를 들어 DECIMAL 인수가 포함된 SUM 함수는 38자리의 기본 정밀도를 반환합니다. 함수 결과의 비율은 인수 비율과 동일합니다. 따라서 예를 들어 DECIMAL(5,2) 열의 SUM은 DECIMAL(38,2) 데이터 형식을 반환합니다.

다음은 MEDIAN 함수의 *median\$1expression* 인수에 SUM 함수를 사용한 예입니다. PRICEPAID 열의 데이터 형식이 DECIMAL(8,2)이므로 SUM 함수는 DECIMAL(38,2)을 반환합니다.

```
select salesid, sum(pricepaid), median(sum(pricepaid)) 
over() from sales where salesid < 10 group by salesid;
```

잠재적 정밀도 손실이나 오버플로우 오류를 방지하려면 다음 예와 같이 함수 결과를 정밀도가 낮은 DECIMAL 데이터 형식으로 변환하는 것이 좋습니다.

```
select salesid, sum(pricepaid), median(sum(pricepaid)::decimal(30,2)) 
over() from sales where salesid < 10 group by salesid;
```

## 예제
<a name="r_WF_MEDIAN-examples"></a>

 다음은 각 판매자의 중간 판매 수량을 계산하는 예입니다.

```
select sellerid, qty, median(qty) 
over (partition by sellerid) 
from winsales
order by sellerid;


sellerid	qty	median
---------------------------
1		10	10.0
1		10	10.0
1		30	10.0
2		20	20.0
2		20	20.0
3		10	17.5
3		15	17.5
3		20	17.5
3		30	17.5
4		10	25.0
4		40	25.0
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

# MIN 창 함수
<a name="r_WF_MIN"></a>

 MIN 창 함수는 입력 표현식의 최솟값을 반환합니다. MIN 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_WF_MIN-synopsis"></a>

```
MIN ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 인수
<a name="r_WF_MIN-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 MIN 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="r_WF_MIN-data-types"></a>

입력값으로 모든 데이터 형식을 지원합니다. *expression*과 동일한 데이터 형식을 반환합니다.

## 예제
<a name="r_WF_MIN-examples"></a>

다음 예에서는 데이터 윈도의 시작부터 판매 ID, 수량 및 최소 수량을 보여줍니다.

```
select salesid, qty,
min(qty) over
(order by salesid rows unbounded preceding)
from winsales
order by salesid;

salesid | qty | min
---------+-----+-----
10001 |  10 |  10
10005 |  30 |  10
10006 |  10 |  10
20001 |  20 |  10
20002 |  20 |  10
30001 |  10 |  10
30003 |  15 |  10
30004 |  20 |  10
30007 |  30 |  10
40001 |  40 |  10
40005 |  10 |  10
(11 rows)
```

 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 제한적 프레임 내에서 판매 ID, 수량 및 최소 수량을 보여줍니다.

```
select salesid, qty,
min(qty) over
(order by salesid rows between 2 preceding and 1 preceding) as min
from winsales
order by salesid;

salesid | qty | min
---------+-----+-----
10001 |  10 |
10005 |  30 |  10
10006 |  10 |  10
20001 |  20 |  10
20002 |  20 |  10
30001 |  10 |  20
30003 |  15 |  10
30004 |  20 |  10
30007 |  30 |  15
40001 |  40 |  20
40005 |  10 |  30
(11 rows)
```

# NTH\$1VALUE 창 함수
<a name="r_WF_NTH"></a>

 NTH\$1VALUE 창 함수는 창의 첫 번째 행과 관련하여 창 프레임에서 지정된 행의 표현식 값을 반환합니다.

## 구문
<a name="r_WF_NTH-synopsis"></a>

```
NTH_VALUE (expr, offset)
[ IGNORE NULLS | RESPECT NULLS ]
OVER
( [ PARTITION BY window_partition ]
[ ORDER BY window_ordering 
                        frame_clause ] )
```

## 인수
<a name="r_WF_NTH-arguments"></a>

 *\$1 expr*   
 함수가 실행되는 대상 열 또는 표현식입니다.

 *offset*   
 창에서 표현식을 반환할 첫 번째 행에 대한 행 번호를 결정합니다. *offset*은 상수 또는 0보다 큰 양의 정수이어야 하는 표현식이 될 수 있습니다.

IGNORE NULLS   
Amazon Redshift에서 사용할 행을 결정할 때 null 값을 건너뛰어야 한는 것을 의미하는 명세(옵션)입니다. IGNORE NULLS를 지정하지 않으면 NULL 값이 포함됩니다.

RESPECT NULLS   
 Amazon Redshift에서 사용할 행을 결정할 때 null 값을 포함시켜야 한다는 것을 의미합니다. RESPECT NULLS는 IGNORE NULLS를 지정하지 않은 경우 기본적으로 지원됩니다.

OVER   
창 파티션, 순서 및 창 프레임을 지정합니다.

PARTITION BY *window\$1partition*   
OVER 절에서 각 그룹의 레코드 범위를 설정합니다.

ORDER BY *window\$1ordering*   
각 파티션의 행을 정렬합니다. ORDER BY를 생략하면 기본 프레임은 파티션에 속한 모든 행으로 구성됩니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

NTH\$1VALUE 윈도 함수는 Amazon Redshift 데이터 형식을 모두 사용하는 표현식을 지원합니다. 반환 형식은 *expr* 형식과 동일합니다.

## 예제
<a name="r_WF_NTH-examples"></a>

다음은 California, Florida 및 New York 주에서 세 번째로 가장 큰 장소의 좌석 수를 동일한 주에서 나머지 장소의 좌석 수와 비교하는 예입니다.

```
select venuestate, venuename, venueseats,
nth_value(venueseats, 3)
ignore nulls
over(partition by venuestate order by venueseats desc
rows between unbounded preceding and unbounded following)
as third_most_seats
from (select * from venue where venueseats > 0 and
venuestate in('CA', 'FL', 'NY'))
order by venuestate;

venuestate |           venuename            | venueseats | third_most_seats
------------+--------------------------------+------------+------------------
CA         | Qualcomm Stadium               |      70561 |            63026
CA         | Monster Park                   |      69843 |            63026
CA         | McAfee Coliseum                |      63026 |            63026
CA         | Dodger Stadium                 |      56000 |            63026
CA         | Angel Stadium of Anaheim       |      45050 |            63026
CA         | PETCO Park                     |      42445 |            63026
CA         | AT&T Park                      |      41503 |            63026
CA         | Shoreline Amphitheatre         |      22000 |            63026
FL         | Dolphin Stadium                |      74916 |            65647
FL         | Jacksonville Municipal Stadium |      73800 |            65647
FL         | Raymond James Stadium          |      65647 |            65647
FL         | Tropicana Field                |      36048 |            65647
NY         | Ralph Wilson Stadium           |      73967 |            20000
NY         | Yankee Stadium                 |      52325 |            20000
NY         | Madison Square Garden          |      20000 |            20000
(15 rows)
```

# NTILE 창 함수
<a name="r_WF_NTILE"></a>

 NTILE 창 함수는 파티션에서 순서가 지정된 행을 최대한 같은 크기의 순위 그룹 수로 지정 분할한 후 임의의 행이 해당하는 그룹을 반환합니다.

## 구문
<a name="r_WF_NTILE-synopsis"></a>

```
NTILE (expr)
OVER ( 
[ PARTITION BY expression_list ] 
[ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_NTILE-arguments"></a>

 *\$1 expr*   
순위 그룹 수이며, 각 파티션마다 0보다 큰 양의 정수가 되어야 합니다. *expr* 인수가 NULL 값을 허용해서는 안 됩니다.

OVER   
 창 파티션 및 순서를 지정하는 절입니다. OVER 절에는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *window\$1partition*   
선택 사항입니다. OVER 절에서 각 그룹의 레코드 범위입니다.

ORDER BY *window\$1ordering*   
선택 사항입니다. 각 파티션의 행을 정렬하는 표현식입니다. ORDER BY 절을 생략할 경우 순위 결정 방식은 동일합니다.  
ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="r_WF_NTILE-return-type"></a>

BIGINT

## 예제
<a name="r_WF_NTILE-examples"></a>

 다음은 2008년 8월 26일 Hamlet 공연 티켓 가격을 4개 순위 그룹으로 구분하는 예입니다. 결과 집합에서는 17개 행이 1순위부터 4순위까지 거의 균일하게 분할됩니다.

```
select eventname, caldate, pricepaid, ntile(4)
over(order by pricepaid desc) from sales, event, date
where sales.eventid=event.eventid and event.dateid=date.dateid and eventname='Hamlet'
and caldate='2008-08-26'
order by 4;

eventname |  caldate   | pricepaid | ntile
-----------+------------+-----------+-------
Hamlet    | 2008-08-26 |   1883.00 |     1
Hamlet    | 2008-08-26 |   1065.00 |     1
Hamlet    | 2008-08-26 |    589.00 |     1
Hamlet    | 2008-08-26 |    530.00 |     1
Hamlet    | 2008-08-26 |    472.00 |     1
Hamlet    | 2008-08-26 |    460.00 |     2
Hamlet    | 2008-08-26 |    355.00 |     2
Hamlet    | 2008-08-26 |    334.00 |     2
Hamlet    | 2008-08-26 |    296.00 |     2
Hamlet    | 2008-08-26 |    230.00 |     3
Hamlet    | 2008-08-26 |    216.00 |     3
Hamlet    | 2008-08-26 |    212.00 |     3
Hamlet    | 2008-08-26 |    106.00 |     3
Hamlet    | 2008-08-26 |    100.00 |     4
Hamlet    | 2008-08-26 |     94.00 |     4
Hamlet    | 2008-08-26 |     53.00 |     4
Hamlet    | 2008-08-26 |     25.00 |     4
(17 rows)
```

# PERCENT\$1RANK 창 함수
<a name="r_WF_PERCENT_RANK"></a>

임의의 행의 백분율 순위를 계산합니다. 백분율 순위를 구하는 공식은 다음과 같습니다.

`(x - 1) / (the number of rows in the window or partition - 1)`

여기에서 *x*는 현재 행의 순위입니다. 다음은 위와 같은 공식의 사용을 나타내는 데이터 세트입니다.

```
Row#	Value	Rank	Calculation	PERCENT_RANK
1	15	1	(1-1)/(7-1)	0.0000
2	20	2	(2-1)/(7-1)	0.1666
3	20	2	(2-1)/(7-1)	0.1666
4	20	2	(2-1)/(7-1)	0.1666
5	30	5	(5-1)/(7-1)	0.6666
6	30	5	(5-1)/(7-1)	0.6666
7	40	7	(7-1)/(7-1)	1.0000
```

반환 값의 범위는 0부터 1까지입니다(0과 1 포함). 모든 집합에서 첫 번째 행은 PERCENT\$1RANK가 0입니다.

## 구문
<a name="r_WF_PERCENT_RANK-synopsis"></a>

```
PERCENT_RANK ()
OVER ( 
[ PARTITION BY partition_expression ] 
[ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_PERCENT_RANK-arguments"></a>

( )   
함수에 인수가 없지만 빈 괄호가 필요합니다.

OVER  
창 파티션을 지정하는 절입니다. OVER 절에는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *partition\$1expression*   
선택 사항입니다. OVER 절에서 각 그룹의 레코드 범위를 설정하는 표현식입니다.

ORDER BY *order\$1list*   
선택 사항입니다. 백분율 순위를 계산하기 위한 표현식입니다. 이 표현식은 숫자 데이터 형식을 갖거나, 혹은 묵시적으로 1로 변환될 수 있어야 합니다. 즉 ORDER BY가 생략되면 모든 행의 반환 값은 0입니다.  
ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="r_WF_PERCENT_RANK-return-type"></a>

FLOAT8

## 예제
<a name="r_WF_PERCENT_RANK-examples"></a>

다음은 각 판매자의 판매 수량에 대한 백분율 순위를 계산하는 예입니다.

```
select sellerid, qty, percent_rank() 
over (partition by sellerid order by qty) 
from winsales;

sellerid	qty		percent_rank
----------------------------------------
1		10.00		0.0
1		10.64		0.5
1		30.37		1.0
3		10.04		0.0
3		15.15		0.33
3		20.75		0.67
3		30.55		1.0
2		20.09		0.0
2		20.12		1.0
4		10.12		0.0
4		40.23		1.0
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

# PERCENTILE\$1CONT 창 함수
<a name="r_WF_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT는 연속 분포 모델을 가정하는 역분포 함수입니다. 백분위 값과 정렬 명세를 가지며, 정렬 명세와 관련하여 지정된 백분위 값에 해당하는 보간 값을 반환합니다.

PERCENTILE\$1CONT는 순서가 지정된 값 사이의 선형 보간을 계산합니다. 이 함수는 집계 그룹에서 백분위 값`(P)`과 NULL을 제외한 행들의 번호`(N)`를 사용하여 정렬 명세에 따라 행의 순서를 지정한 후 행 번호를 계산합니다. 행 번호`(RN)`를 계산하는 공식은 `RN = (1+ (P*(N-1))`입니다. 이 집계 함수의 최종 결과는 행 번호가 `CRN = CEILING(RN)`과 `FRN = FLOOR(RN)`인 행의 값 사이 선형 보간을 통해 계산됩니다.

최종 결과는 다음과 같습니다.

`(CRN = FRN = RN)`일 때 결과는 `(value of expression from row at RN)`입니다.

그렇지 않다면 다음 결과가 표시됩니다.

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

PARTITION 절은 OVER 절에서만 지정할 수 있습니다. 각 행마다 PARTITION을 지정하면 PERCENTILE\$1CONT가 임의의 파티션에 속한 값 집합 중에서 지정한 백분위에 해당하는 값을 반환합니다.

## 구문
<a name="r_WF_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT ( percentile )
WITHIN GROUP (ORDER BY expr)
OVER (  [ PARTITION BY expr_list ]  )
```

## 인수
<a name="r_WF_PERCENTILE_CONT-arguments"></a>

 *(백분위수*)   
0과 1 사이의 숫자 상수입니다. 이 계산에서 Null 값은 무시됩니다.

WITHIN GROUP (ORDER BY *expr*)   
숫자 또는 날짜/시간 값을 지정하여 백분위를 정렬 및 계산합니다.

OVER   
창 파티션을 지정합니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *expr*   
OVER 절에서 각 그룹의 레코드 범위를 설정하는 인수(옵션)입니다.

## 반환 형식
<a name="r_WF_PERCENTILE_CONT-returns"></a>

반환 형식은 WITHIN GROUP 절에서 ORDER BY 표현식의 데이터 형식에 따라 결정됩니다. 다음 표는 ORDER BY 표현식의 데이터 형식에 따른 반환 형식을 나타낸 것입니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/r_WF_PERCENTILE_CONT.html)

## 사용 노트
<a name="r_WF_PERCENTILE_CONT-usage-notes"></a>

ORDER BY 표현식이 최대 정밀도가 38자리로 정의된 DECIMAL 데이터 형식인 경우에는 PERCENTILE\$1CONT가 부정확한 결과 또는 오류를 반환합니다. PERCENTILE\$1CONT 함수의 반환 값이 38자리를 초과하면 정밀도가 손실될 수도 있기 때문에 알맞은 자리 수로 결과가 잘립니다. 보간 도중 중간 결과가 최대 정밀도를 초과하면 수치 오버플로우가 발생하고 함수는 오류를 반환합니다. 이러한 상황을 방지하려면 정밀도가 낮은 데이터 형식을 사용하거나, 혹은 ORDER BY 표현식을 낮은 정밀도로 변환합니다.

예를 들어 DECIMAL 인수가 포함된 SUM 함수는 38자리의 기본 정밀도를 반환합니다. 함수 결과의 비율은 인수 비율과 동일합니다. 따라서 예를 들어 DECIMAL(5,2) 열의 SUM은 DECIMAL(38,2) 데이터 형식을 반환합니다.

다음은 PERCENTILE\$1CONT 함수의 ORDER BY 절에서 SUM 함수를 사용한 예입니다. PRICEPAID 열의 데이터 형식이 DECIMAL(8,2)이므로 SUM 함수는 DECIMAL(38,2)을 반환합니다.

```
select salesid, sum(pricepaid), percentile_cont(0.6) 
within group (order by sum(pricepaid) desc) over()
from sales where salesid < 10 group by salesid;
```

잠재적 정밀도 손실이나 오버플로우 오류를 방지하려면 다음 예와 같이 함수 결과를 정밀도가 낮은 DECIMAL 데이터 형식으로 변환하는 것이 좋습니다.

```
select salesid, sum(pricepaid), percentile_cont(0.6) 
within group (order by sum(pricepaid)::decimal(30,2) desc) over()
from sales where salesid < 10 group by salesid;
```

## 예제
<a name="r_WF_PERCENTILE_CONT-examples"></a>

아래 예들에서는 WINSALES 테이블을 사용합니다. 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

```
select sellerid, qty, percentile_cont(0.5) 
within group (order by qty) 
over() as median from winsales;

 sellerid | qty | median 
----------+-----+--------
        1 |  10 |   20.0
        1 |  10 |   20.0
        3 |  10 |   20.0
        4 |  10 |   20.0
        3 |  15 |   20.0
        2 |  20 |   20.0
        3 |  20 |   20.0
        2 |  20 |   20.0
        3 |  30 |   20.0
        1 |  30 |   20.0
        4 |  40 |   20.0
(11 rows)
```

```
select sellerid, qty, percentile_cont(0.5) 
within group (order by qty) 
over(partition by sellerid) as median from winsales;

 sellerid | qty | median 
----------+-----+--------
        2 |  20 |   20.0
        2 |  20 |   20.0
        4 |  10 |   25.0
        4 |  40 |   25.0
        1 |  10 |   10.0
        1 |  10 |   10.0
        1 |  30 |   10.0
        3 |  10 |   17.5
        3 |  15 |   17.5
        3 |  20 |   17.5
        3 |  30 |   17.5
(11 rows)
```

다음은 Washington 주에 거주하는 판매자의 티켓 판매에 대한 PERCENTILE\$1CONT와 PERCENTILE\$1DISC를 계산하는 예입니다.

```
SELECT sellerid, state, sum(qtysold*pricepaid) sales, 
percentile_cont(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over(),
percentile_disc(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over()
from sales s, users u 
where s.sellerid = u.userid and state = 'WA' and sellerid < 1000
group by sellerid, state;

 sellerid | state |  sales  | percentile_cont | percentile_disc
----------+-------+---------+-----------------+-----------------
      127 | WA    | 6076.00 |         2044.20 |         1531.00
      787 | WA    | 6035.00 |         2044.20 |         1531.00
      381 | WA    | 5881.00 |         2044.20 |         1531.00
      777 | WA    | 2814.00 |         2044.20 |         1531.00
       33 | WA    | 1531.00 |         2044.20 |         1531.00
      800 | WA    | 1476.00 |         2044.20 |         1531.00
        1 | WA    | 1177.00 |         2044.20 |         1531.00
(7 rows)
```

# PERCENTILE\$1DISC 창 함수
<a name="r_WF_PERCENTILE_DISC"></a>

PERCENTILE\$1DISC는 이산 분포 모델을 가정하는 역분포 함수로서 백분위 값과 정렬 명세를 가지며, 지정된 집합에서 요소를 반환합니다.

임의의 백분위 값을 P라고 할 때, PERCENTILE\$1DISC는 ORDER BY 절의 표현식 값을 정렬한 후 동일한 정렬 명세와 관련하여 가장 작지만 P보다는 크거나 같은 누적 분포 값을 반환합니다.

PARTITION 절은 OVER 절에서만 지정할 수 있습니다.

## 구문
<a name="r_WF_PERCENTILE_DISC-synopsis"></a>

```
PERCENTILE_DISC ( percentile )
WITHIN GROUP (ORDER BY expr)
OVER (  [ PARTITION BY expr_list ]  )
```

## 인수
<a name="r_WF_PERCENTILE_DISC-arguments"></a>

 *(백분위수*)   
0과 1 사이의 숫자 상수입니다. 이 계산에서 Null 값은 무시됩니다.

WITHIN GROUP (ORDER BY *expr*)   
숫자 또는 날짜/시간 값을 지정하여 백분위를 정렬 및 계산합니다.

OVER   
창 파티션을 지정합니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *expr*   
OVER 절에서 각 그룹의 레코드 범위를 설정하는 인수(옵션)입니다.

## 반환 형식
<a name="r_WF_PERCENTILE_DISC-returns"></a>

WITHIN GROUP 절의 ORDER BY 표현식과 동일한 데이터 형식

## 예제
<a name="r_WF_PERCENTILE_DISC-examples"></a>

아래 예에서는 WINSALES 테이블을 사용합니다. 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

```
SELECT sellerid, qty, PERCENTILE_DISC(0.5) 
WITHIN GROUP (ORDER BY qty) 
OVER() AS MEDIAN FROM winsales;

+----------+-----+--------+
| sellerid | qty | median |
+----------+-----+--------+
| 3        | 10  | 20     |
| 1        | 10  | 20     |
| 1        | 10  | 20     |
| 4        | 10  | 20     |
| 3        | 15  | 20     |
| 2        | 20  | 20     |
| 2        | 20  | 20     |
| 3        | 20  | 20     |
| 1        | 30  | 20     |
| 3        | 30  | 20     |
| 4        | 40  | 20     |
+----------+-----+--------+

SELECT sellerid, qty, PERCENTILE_DISC(0.5) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS MEDIAN FROM winsales;

+----------+-----+--------+
| sellerid | qty | median |
+----------+-----+--------+
| 4        | 10  | 10     |
| 4        | 40  | 10     |
| 3        | 10  | 15     |
| 3        | 15  | 15     |
| 3        | 20  | 15     |
| 3        | 30  | 15     |
| 2        | 20  | 20     |
| 2        | 20  | 20     |
| 1        | 10  | 10     |
| 1        | 10  | 10     |
| 1        | 30  | 10     |
+----------+-----+--------+
```

판매자 ID별로 구분한 수량에 대한 PERCENTILE\$1DISC(0.25) 및 PERCENTILE\$1DISC(0.75)를 찾으려면 다음 예를 사용하세요.

```
SELECT sellerid, qty, PERCENTILE_DISC(0.25) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS quartile1 FROM winsales;

+----------+-----+-----------+
| sellerid | qty | quartile1 |
+----------+-----+-----------+
| 4        | 10  | 10        |
| 4        | 40  | 10        |
| 2        | 20  | 20        |
| 2        | 20  | 20        |
| 3        | 10  | 10        |
| 3        | 15  | 10        |
| 3        | 20  | 10        |
| 3        | 30  | 10        |
| 1        | 10  | 10        |
| 1        | 10  | 10        |
| 1        | 30  | 10        |
+----------+-----+-----------+

SELECT sellerid, qty, PERCENTILE_DISC(0.75) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS quartile3 FROM winsales;

+----------+-----+-----------+
| sellerid | qty | quartile3 |
+----------+-----+-----------+
| 3        | 10  | 20        |
| 3        | 15  | 20        |
| 3        | 20  | 20        |
| 3        | 30  | 20        |
| 4        | 10  | 40        |
| 4        | 40  | 40        |
| 2        | 20  | 20        |
| 2        | 20  | 20        |
| 1        | 10  | 30        |
| 1        | 10  | 30        |
| 1        | 30  | 30        |
+----------+-----+-----------+
```

# RANK 창 함수
<a name="r_WF_RANK"></a>

 RANK 창 함수는 OVER 절의 ORDER BY 표현식을 기준으로 값 그룹에 속한 값의 순위를 결정합니다. PARTITION BY 절(옵션)이 존재하면 각 행 그룹의 순위가 재설정됩니다. 순위 기준 값이 같은 행은 순위도 동일하게 결정됩니다. Amazon Redshift는 순위가 동일한 행의 수를 동일한 순위에 추가하여 다음 순위를 계산하기 때문에 순위가 연속된 수가 아닐 수도 있습니다. 예를 들어 두 행의 순위가 1로 결정되면 다음 순위는 3입니다.

 RANK는 한 가지 측면에서 [DENSE\$1RANK 창 함수](r_WF_DENSE_RANK.md)와 다릅니다. 즉 DENSE\$1RANK에서는 2개 이상의 행에서 순위가 동일하면 순위 값의 순서에서도 빈 자리가 없습니다. 예를 들어 두 행의 순위가 1로 결정되면 다음 순위는 2입니다.

순위 함수에서는 동일한 쿼리라고 해도 PARTITION BY 절과 ORDER BY 절을 다르게 사용할 수 있습니다.

## 구문
<a name="r_WF_RANK-synopsis"></a>

```
RANK () OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_RANK-arguments"></a>

( )   
함수에 인수가 없지만 빈 괄호가 필요합니다.

OVER   
RANK 함수의 창 절입니다.

PARTITION BY *expr\$1list*   
선택 사항입니다. 창을 정의하는 하나 이상의 표현식입니다.

ORDER BY *order\$1list*   
선택 사항입니다. 순위 값의 기준이 되는 열을 정의합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다. 즉 ORDER BY가 생략되면 모든 행의 반환 값은 1입니다.  
ORDER BY에서 고유한 순서를 지정하지 않으면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="c_Supported_data_types_wf_rank"></a>

INTEGER

## 예제
<a name="r_WF_RANK-examples"></a>

다음 예에서는 판매 수량에 따라 테이블의 순서(기본 오름차순)를 지정한 후 각 행마다 순위를 할당합니다. 순위 값 1은 가장 높은 순위의 값입니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다: 

```
select salesid, qty,
rank() over (order by qty) as rnk
from winsales
order by 2,1;

salesid | qty | rnk
--------+-----+-----
10001 |  10 |  1
10006 |  10 |  1
30001 |  10 |  1
40005 |  10 |  1
30003 |  15 |  5
20001 |  20 |  6
20002 |  20 |  6
30004 |  20 |  6
10005 |  30 |  9
30007 |  30 |  9
40001 |  40 |  11
(11 rows)
```

이번 예에서는 외부 ORDER BY 절에 열 2와 1이 포함되어 Amazon Redshift가 쿼리를 실행할 때마다 일관적으로 정렬된 결과를 반환할 수 있습니다. 예를 들어 판매 ID가 10001과 10006인 행은 QTY 및 RNK 값이 동일합니다. 이때 열 1에 따라 최종 결과 집합의 순서를 지정하면 10001 행이 항상 10006 행보다 앞에 위치할 수 있습니다. 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 창 함수(`order by qty desc`)의 순서가 반전됩니다. 여기에서는 최고 순위 값이 가장 큰 QTY 값에 적용됩니다.

```
select salesid, qty,
rank() over (order by qty desc) as rank
from winsales
order by 2,1;

 salesid | qty | rank
---------+-----+-----
   10001 |  10 |   8
   10006 |  10 |   8
   30001 |  10 |   8
   40005 |  10 |   8
   30003 |  15 |   7
   20001 |  20 |   4
   20002 |  20 |   4
   30004 |  20 |   4
   10005 |  30 |   2
   30007 |  30 |   2
   40001 |  40 |   1
(11 rows)
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 SELLERID를 기준으로 테이블을 분할하여 수량에 따라 각 파티션의 순서(내림차순)를 지정한 후 순위를 각 행에 할당합니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.

```
select salesid, sellerid, qty, rank() over
(partition by sellerid
order by qty desc) as rank
from winsales
order by 2,3,1;

salesid | sellerid | qty | rank
--------+----------+-----+-----
  10001 |        1 |  10 |  2
  10006 |        1 |  10 |  2
  10005 |        1 |  30 |  1
  20001 |        2 |  20 |  1
  20002 |        2 |  20 |  1
  30001 |        3 |  10 |  4
  30003 |        3 |  15 |  3
  30004 |        3 |  20 |  2
  30007 |        3 |  30 |  1
  40005 |        4 |  10 |  2
  40001 |        4 |  40 |  1
(11 rows)
```

# RATIO\$1TO\$1REPORT 창 함수
<a name="r_WF_RATIO_TO_REPORT"></a>

창 또는 파티션에서 값의 합에 대한 임의의 값 비율을 계산합니다. 값의 비율을 구하는 공식은 다음과 같습니다.

`value of `*ratio\$1expression* `argument for the current row / sum of` *ratio\$1expression* `argument for the window or partition`

다음은 위와 같은 공식의 사용을 나타내는 데이터 세트입니다.

```
Row#	Value	Calculation	RATIO_TO_REPORT
1	2500	(2500)/(13900)	0.1798
2	2600	(2600)/(13900)	0.1870
3	2800	(2800)/(13900)	0.2014
4	2900	(2900)/(13900)	0.2086
5	3100	(3100)/(13900)	0.2230
```

반환 값의 범위는 0부터 1까지입니다(0과 1 포함). *ratio\$1expression*이 NULL이면 반환 값은 `NULL`입니다. *partition\$1expression*의 값이 고유한 경우 함수는 해당 값에 대해 `1`을 반환합니다.

## 구문
<a name="r_WF_RATIO_TO_REPORT-synopsis"></a>

```
RATIO_TO_REPORT ( ratio_expression )
OVER ( [ PARTITION BY partition_expression ] )
```

## 인수
<a name="r_WF_RATIO_TO_REPORT-arguments"></a>

*ratio\$1expression*   
비율을 결정할 값을 제공하는 표현식(열 이름 등)입니다. 이 표현식은 숫자 데이터 형식을 갖거나, 혹은 묵시적으로 1로 변환될 수 있어야 합니다.  
그 외에 다른 분석 함수는 *ratio\$1expression*에서 사용할 수 없습니다.

OVER  
창 파티션을 지정하는 절입니다. OVER 절에는 창 순서 또는 창 프레임 명세가 포함될 수 없습니다.

PARTITION BY *partition\$1expression*   
선택 사항입니다. OVER 절에서 각 그룹의 레코드 범위를 설정하는 표현식입니다.

## 반환 타입
<a name="r_WF_RATIO_TO_REPORT-return-type"></a>

FLOAT8

## 예제
<a name="r_WF_RATIO_TO_REPORT-examples"></a>

아래 예에서는 WINSALES 테이블을 사용합니다. WINSALES 테이블 생성 방법에 대한 자세한 내용은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 모든 셀러 수량의 합계에 대한 셀러 수량의 각 행의 보고서 대비 비율 값을 계산합니다.

```
select sellerid, qty, ratio_to_report(qty) 
over()
from winsales
order by sellerid;

sellerid  qty    ratio_to_report
--------------------------------------
1         30     0.13953488372093023	
1         10     0.046511627906976744	
1         10     0.046511627906976744	
2         20     0.09302325581395349	
2         20     0.09302325581395349	
3         30     0.13953488372093023	
3         20     0.09302325581395349	
3         15     0.06976744186046512	
3         10     0.046511627906976744	
4         10     0.046511627906976744	
4         40     0.18604651162790697
```

다음은 파티션별로 각 판매자의 판매 수량에 대한 비율을 계산하는 예입니다.

```
select sellerid, qty, ratio_to_report(qty) 
over(partition by sellerid) 
from winsales;

sellerid   qty    ratio_to_report
-------------------------------------------
2          20     0.5	
2          20     0.5	
4          40     0.8	
4          10     0.2	
1          10     0.2	
1          30     0.6	
1          10     0.2	
3          10     0.13333333333333333	
3          15     0.2	
3          20     0.26666666666666666	
3          30     0.4
```

# ROW\$1NUMBER 창 함수
<a name="r_WF_ROW_NUMBER"></a>

OVER 절의 ORDER BY 표현식을 기준으로 행 그룹 내에서 1부터 현재 행의 서수를 할당합니다. PARTITION BY 절(옵션)이 존재하면 각 행 그룹의 서수가 재설정됩니다. ORDER BY 표현식 값이 동일한 행이라고 해도 비확정적으로 다른 행 번호를 받습니다.

## 구문
<a name="r_WF_ROW_NUMBER-synopsis"></a>

```
ROW_NUMBER() OVER(
  [ PARTITION BY expr_list ]
  [ ORDER BY order_list ]
)
```

## 인수
<a name="r_WF_ROW_NUMBER-arguments"></a>

( )   
함수에 인수가 없지만 빈 괄호가 필요합니다.

OVER   
ROW\$1NUMBER 함수에 대한 창 함수 절입니다.

PARTITION BY *expr\$1list*   
선택 사항입니다. 결과를 행 집합으로 나누는 하나 이상의 열 표현식입니다.

ORDER BY *order\$1list*   
선택 사항입니다. 집합 내 행의 순서를 정의하는 하나 이상의 열 표현식입니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.  
ORDER BY가 고유한 순서를 지정하지 않거나 생략되면 행의 순서는 비확정적입니다. 자세한 내용은 [창 함수 데이터에 대한 고유 순서 지정](c_Window_functions.md#r_Examples_order_by_WF) 섹션을 참조하세요.

## 반환 타입
<a name="c_Supported_data_types_r_WF_ROW_NUMBER"></a>

BIGINT

## 예제
<a name="r_WF_ROW_NUMBER-examples"></a>

다음 예제에서는 `WINSALES` 테이블을 사용합니다. `WINSALES` 테이블에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예제에서는 테이블을 QTY(오름차순)로 정렬한 다음 각 행에 행 번호를 할당합니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.

```
SELECT salesid, sellerid, qty, 
ROW_NUMBER() OVER(
   ORDER BY qty ASC) AS row
FROM winsales
ORDER BY 4,1;

salesid   sellerid   qty   row
---------+----------+-----+-----
   30001 |        3 |  10 |   1	
   10001 |        1 |  10 |   2	
   10006 |        1 |  10 |   3
   40005 |        4 |  10 |   4
   30003 |        3 |  15 |   5
   20001 |        2 |  20 |   6
   20002 |        2 |  20 |   7
   30004 |        3 |  20 |   8
   10005 |        1 |  30 |   9
   30007 |        3 |  30 |  10
   40001 |        4 |  40 |  11
```

다음은 SELLERID를 기준으로 테이블을 분할하여 수량에 따라 각 파티션의 순서(오름차순)를 지정한 후 행 번호를 각 행에 할당하는 예입니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.

```
SELECT salesid, sellerid, qty, 
ROW_NUMBER() OVER(
  PARTITION BY sellerid
  ORDER BY qty ASC) AS row_by_seller
FROM winsales
ORDER BY 2,4;

 salesid | sellerid | qty | row_by_seller
---------+----------+-----+-----
   10001 |        1 |  10 |   1
   10006 |        1 |  10 |   2
   10005 |        1 |  30 |   3
   20001 |        2 |  20 |   1
   20002 |        2 |  20 |   2
   30001 |        3 |  10 |   1
   30003 |        3 |  15 |   2
   30004 |        3 |  20 |   3
   30007 |        3 |  30 |   4
   40005 |        4 |  10 |   1
   40001 |        4 |  40 |   2
```

다음 예제에서는 선택 절을 사용하지 않을 때의 결과를 보여줍니다.

```
SELECT salesid, sellerid, qty, ROW_NUMBER() OVER() AS row
FROM winsales
ORDER BY 4,1;

salesid   sellerid   qty   row
---------+----------+-----+-----
   30001 |        3 |  10 |   1	
   10001 |        1 |  10 |   2	
   10005 |        1 |  30 |   3
   40001 |        4 |  40 |   4
   10006 |        1 |  10 |   5
   20001 |        2 |  20 |   6
   40005 |        4 |  10 |   7
   20002 |        2 |  20 |   8
   30003 |        3 |  15 |   9
   30004 |        3 |  20 |  10
   30007 |        3 |  30 |  11
```

# STDDEV\$1SAMP 및 STDDEV\$1POP 창 함수
<a name="r_WF_STDDEV"></a>

STDDEV\$1SAMP 및 STDDEV\$1POP 창 함수는 숫자 값(정수, 소수 또는 부동 소수점) 집합의 표본 표준 편차와 모 표준 편차를 반환합니다. 또한 [STDDEV\$1SAMP 및 STDDEV\$1POP 함수](r_STDDEV_functions.md) 섹션도 참조하세요.

STDDEV\$1SAMP와 STDDEV는 동일한 함수이기 때문에 동의어나 마찬가지입니다.

## 구문
<a name="r_WF_STDDEV-synopsis"></a>

```
STDDEV_SAMP | STDDEV | STDDEV_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 인수
<a name="r_WF_STDDEV-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="c_Supported_data_types_wf_stddev"></a>

STDDEV 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION입니다.

표현식의 데이터 형식과 상관없이 STDDEV 함수의 반환 형식은 배정밀도 숫자입니다.

## 예제
<a name="r_wf_stddev-examples"></a>

다음은 STDDEV\$1POP 및 VAR\$1POP 함수를 창 함수로 사용하는 방법을 나타낸 예입니다. 쿼리가 SALES 테이블의 PRICEPAID 값에 대한 모 분산과 모 표준 편차를 계산합니다.

```
select salesid, dateid, pricepaid,
round(stddev_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as stddevpop,
round(var_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as varpop
from sales
order by 2,1;

salesid | dateid | pricepaid | stddevpop | varpop
--------+--------+-----------+-----------+---------
  33095 |   1827 |    234.00 |         0 |       0
  65082 |   1827 |    472.00 |       119 |   14161
  88268 |   1827 |    836.00 |       248 |   61283
  97197 |   1827 |    708.00 |       230 |   53019
 110328 |   1827 |    347.00 |       223 |   49845
 110917 |   1827 |    337.00 |       215 |   46159
 150314 |   1827 |    688.00 |       211 |   44414
 157751 |   1827 |   1730.00 |       447 |  199679
 165890 |   1827 |   4192.00 |      1185 | 1403323
...
```

표본 표준 편차 및 분산 함수 역시 같은 방식으로 사용할 수 있습니다.

# SUM 창 함수
<a name="r_WF_SUM"></a>

 SUM 창 함수는 입력 열 또는 표현식 값의 합을 반환합니다. SUM 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.

## 구문
<a name="r_WF_SUM-synopsis"></a>

```
SUM ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 인수
<a name="r_WF_SUM-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 SUM 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="c_Supported_data_types_wf_sum"></a>

SUM 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION입니다.

SUM 함수에서 지원되는 반환 형식은 다음과 같습니다.
+ SMALLINT 또는 INTEGER 인수일 때 BIGINT
+ BIGINT 인수일 때 NUMERIC
+ 부동 소수점 인수일 때 DOUBLE PRECISION

## 예제
<a name="r_WF_SUM-examples"></a>

다음 예에서는 날짜 및 판매 ID에 따라 순서가 지정된 판매 수량의 누적(롤링) 합을 생성합니다.

```
select salesid, dateid, sellerid, qty,
sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  20
10005 | 2003-12-24 |        1 |  30 |  50
40001 | 2004-01-09 |        4 |  40 |  90
10006 | 2004-01-18 |        1 |  10 | 100
20001 | 2004-02-12 |        2 |  20 | 120
40005 | 2004-02-12 |        4 |  10 | 130
20002 | 2004-02-16 |        2 |  20 | 150
30003 | 2004-04-18 |        3 |  15 | 165
30004 | 2004-04-18 |        3 |  20 | 185
30007 | 2004-09-07 |        3 |  30 | 215
(11 rows)
```

 요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 날짜별 판매 수량에 대한 누적(롤링) 합을 생성하고 판매자 ID를 기준으로 그 결과를 분할한 다음 파티션 내에서 날짜 및 판매 ID에 따라 결과의 순서를 지정합니다.

```
select salesid, dateid, sellerid, qty,
sum(qty) over (partition by sellerid
order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  10
10005 | 2003-12-24 |        1 |  30 |  40
40001 | 2004-01-09 |        4 |  40 |  40
10006 | 2004-01-18 |        1 |  10 |  50
20001 | 2004-02-12 |        2 |  20 |  20
40005 | 2004-02-12 |        4 |  10 |  50
20002 | 2004-02-16 |        2 |  20 |  40
30003 | 2004-04-18 |        3 |  15 |  25
30004 | 2004-04-18 |        3 |  20 |  45
30007 | 2004-09-07 |        3 |  30 |  75
(11 rows)
```

다음 예에서는 결과 집합의 모든 행에 SELLERID 및 SALESID 열을 기준으로 순서대로 번호를 지정합니다.

```
select salesid, sellerid, qty,
sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;

salesid | sellerid |  qty | rownum
--------+----------+------+--------
10001 |        1 |   10 |     1
10005 |        1 |   30 |     2
10006 |        1 |   10 |     3
20001 |        2 |   20 |     4
20002 |        2 |   20 |     5
30001 |        3 |   10 |     6
30003 |        3 |   15 |     7
30004 |        3 |   20 |     8
30007 |        3 |   30 |     9
40001 |        4 |   40 |    10
40005 |        4 |   10 |    11
(11 rows)
```

요청 데이터에 대한 설명은 [창 함수 예제를 위한 샘플 테이블](c_Window_functions.md#r_Window_function_example) 섹션을 참조하세요.

다음 예에서는 결과 집합의 모든 행에 순차적으로 번호를 매기고, 결과를 SELLERID로 분할하고, 파티션 내에서 SELLERID 및 SALESID로 결과를 정렬합니다.

```
select salesid, sellerid, qty,
sum(1) over (partition by sellerid
order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;

salesid | sellerid | qty | rownum
---------+----------+-----+--------
10001 |        1 |  10 |      1
10005 |        1 |  30 |      2
10006 |        1 |  10 |      3
20001 |        2 |  20 |      1
20002 |        2 |  20 |      2
30001 |        3 |  10 |      1
30003 |        3 |  15 |      2
30004 |        3 |  20 |      3
30007 |        3 |  30 |      4
40001 |        4 |  40 |      1
40005 |        4 |  10 |      2
(11 rows)
```

# VAR\$1SAMP 및 VAR\$1POP 창 함수
<a name="r_WF_VARIANCE"></a>

 VAR\$1SAMP 및 VAR\$1POP 창 함수는 숫자 값(정수, 소수 또는 부동 소수점) 집합의 표본 분산과 모 분산을 반환합니다. 또한 [VAR\$1SAMP 및 VAR\$1POP 함수](r_VARIANCE_functions.md) 섹션도 참조하세요.

VAR\$1SAMP 및 VARIANCE는 동일한 함수이기 때문에 동의어나 마찬가지입니다.

## 구문
<a name="r_WF_VARIANCE-synopsis"></a>

```
VAR_SAMP | VARIANCE | VAR_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 인수
<a name="r_WF_VARIANCE-arguments"></a>

 * expression*   
함수가 실행되는 대상 열 또는 표현식입니다.

ALL   
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.

OVER   
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.

PARTITION BY *expr\$1list*   
하나 이상의 표현식과 관련하여 함수의 창을 정의합니다.

ORDER BY *order\$1list*   
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.

 *frame\$1clause*   
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. [창 함수 구문 요약](c_Window_functions.md#r_Window_function_synopsis) 섹션을 참조하세요.

## 데이터 타입
<a name="c_Supported_data_types_wf_variance"></a>

VARIANCE 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION입니다.

표현식의 데이터 형식과 상관없이 VARIANCE 함수의 반환 형식은 배정밀도 숫자입니다.

# 시스템 관리 함수
<a name="r_System_administration_functions"></a>

**Topics**
+ [CHANGE\$1QUERY\$1PRIORITY](r_CHANGE_QUERY_PRIORITY.md)
+ [CHANGE\$1SESSION\$1PRIORITY](r_CHANGE_SESSION_PRIORITY.md)
+ [CHANGE\$1USER\$1PRIORITY](r_CHANGE_USER_PRIORITY.md)
+ [CURRENT\$1SETTING](r_CURRENT_SETTING.md)
+ [PG\$1CANCEL\$1BACKEND](PG_CANCEL_BACKEND.md)
+ [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md)
+ [REBOOT\$1CLUSTER](r_REBOOT_CLUSTER.md)
+ [SET\$1CONFIG](r_SET_CONFIG.md)

Amazon Redshift는 여러 시스템 관리 함수를 지원합니다.

# CHANGE\$1QUERY\$1PRIORITY
<a name="r_CHANGE_QUERY_PRIORITY"></a>

CHANGE\$1QUERY\$1PRIORITY를 통해 수퍼유저는 워크로드 관리(WLM)에서 실행 또는 대기 중인 쿼리의 우선 순위를 수정할 수 있습니다.

이 기능을 통해 수퍼유저는 시스템 내 모든 쿼리의 우선 순위를 즉시 변경할 수 있습니다. 하나의 쿼리, 사용자 또는 세션만 `CRITICAL` 우선 순위로 실행할 수 있습니다.

## 구문
<a name="r_CHANGE_QUERY_PRIORITY-synopsis"></a>

```
CHANGE_QUERY_PRIORITY(query_id, priority)
```

## 인수
<a name="r_CHANGE_QUERY_PRIORITY-argument"></a>

 *query\$1id*   
우선 순위가 변경된 쿼리의 쿼리 식별자입니다. `INTEGER` 값이 필요합니다.

 *priority*   
쿼리에 지정할 새로운 우선 순위입니다. 이 인수는 값이`CRITICAL`, `HIGHEST`, `HIGH`, `NORMAL`, `LOW` 또는 `LOWEST`인 문자열이어야 합니다.

## 반환 유형
<a name="r_CHANGE_QUERY_PRIORITY-return-type"></a>

없음

## 예제
<a name="r_CHANGE_QUERY_PRIORITY-example"></a>

STV\$1WLM\$1QUERY\$1STATE 시스템 테이블에 있는 `query_priority` 열을 표시하려면 다음 예제를 사용합니다.

```
SELECT query, service_class, query_priority, state 
FROM stv_wlm_query_state WHERE service_class = 101;

+-------+---------------+----------------+---------+
| query | service_class | query_priority |  state  |
+-------+---------------+----------------+---------+
|  1076 |           101 | Lowest         | Running |
|  1075 |           101 | Lowest         | Running |
+-------+---------------+----------------+---------+
```

우선 순위를 `CRITICAL`로 변경하기 위해 `change_query_priority` 함수를 실행한 슈퍼유저가 얻은 결과를 표시하려면 다음 예제를 사용합니다.

```
SELECT CHANGE_QUERY_PRIORITY(1076, 'Critical');
            
+-------------------------------------------------------------------------------+
|                             change_query_priority                             |
+-------------------------------------------------------------------------------+
| Succeeded to change query priority. Priority changed from Lowest to Critical. |
+-------------------------------------------------------------------------------+
```

# CHANGE\$1SESSION\$1PRIORITY
<a name="r_CHANGE_SESSION_PRIORITY"></a>

CHANGE\$1SESSION\$1PRIORITY를 통해 수퍼유저는 시스템 내 모든 세션의 우선 순위를 즉시 변경할 수 있습니다. 하나의 세션, 사용자 또는 쿼리만 `CRITICAL` 우선 순위로 실행할 수 있습니다.

## 구문
<a name="r_CHANGE_SESSION_PRIORITY-synopsis"></a>

```
CHANGE_SESSION_PRIORITY(pid, priority)
```

## 인수
<a name="r_CHANGE_SESSION_PRIORITY-argument"></a>

 *pid*   
우선 순위가 변경된 세션의 프로세스 식별자입니다. `-1` 값은 현재 세션을 참조합니다. `INTEGER` 값이 필요합니다.

 *priority*   
세션에 지정할 새로운 우선 순위입니다. 이 인수는 값이`CRITICAL`, `HIGHEST`, `HIGH`, `NORMAL`, `LOW` 또는 `LOWEST`인 문자열이어야 합니다.

## 반환 타입
<a name="r_CHANGE_SESSION_PRIORITY-return-type"></a>

없음

## 예제
<a name="r_CHANGE_SESSION_PRIORITY-example"></a>

현재 세션을 처리하는 서버 프로세스의 프로세스 식별자를 반환하려면 다음 예제를 사용합니다.

```
SELECT pg_backend_pid();
               
+----------------+
| pg_backend_pid |
+----------------+
|          30311 |
+----------------+
```

이 예제에서는 현재 세션의 우선 순위는 `LOWEST`로 변경됩니다.

```
SELECT CHANGE_SESSION_PRIORITY(30311, 'Lowest');
               
+---------------------------------------------------------------------------------------+
|                                change_session_priority                                |
+---------------------------------------------------------------------------------------+
| Succeeded to change session priority. Changed session (pid:30311) priority to lowest. |
+---------------------------------------------------------------------------------------+
```

이 예제에서는 현재 세션의 우선 순위는 `HIGH`로 변경됩니다.

```
SELECT CHANGE_SESSION_PRIORITY(-1, 'High');

+-------------------------------------------------------------------------------------------------+
|                                     change_session_priority                                     |
+-------------------------------------------------------------------------------------------------+
| Succeeded to change session priority. Changed session (pid:30311) priority from lowest to high. |
+-------------------------------------------------------------------------------------------------+
```

세션 우선 순위를 변경하는 저장 프로시저를 만들려면 다음 예제를 사용합니다. 이 저장 프로시저를 실행할 수 있는 권한은 데이터베이스 사용자 `test_user`에게 부여됩니다.

```
CREATE OR REPLACE PROCEDURE sp_priority_low(pid IN int, result OUT varchar)
AS $$
BEGIN
  SELECT CHANGE_SESSION_PRIORITY(pid, 'low') into result;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
GRANT EXECUTE ON PROCEDURE sp_priority_low(int) TO test_user;
```

그러면 `test_user`라는 이름의 데이터베이스 사용자는 해당 프로시저를 호출합니다.

```
CALL sp_priority_low(pg_backend_pid()); 

+------------------------------------------------------+
|                        result                        |
+------------------------------------------------------+
| Success. Change session (pid:13155) priority to low. |
+------------------------------------------------------+
```

# CHANGE\$1USER\$1PRIORITY
<a name="r_CHANGE_USER_PRIORITY"></a>

CHANGE\$1QUERY\$1PRIORITY를 통해 수퍼유저는 사용자가 발행한, 워크로드 관리(WLM)에서 실행 또는 대기 중인 모든 쿼리의 우선 순위를 수정할 수 있습니다. 하나의 사용자, 세션 또는 쿼리만 `CRITICAL` 우선 순위로 실행할 수 있습니다.

## 구문
<a name="r_CHANGE_USER_PRIORITY-synopsis"></a>

```
CHANGE_USER_PRIORITY(user_name, priority)
```

## 인수
<a name="r_CHANGE_USER_PRIORITY-argument"></a>

 *user\$1name*   
쿼리 우선 순위가 변경된 데이터베이스 사용자 이름입니다.

 *priority*   
`user_name`이 발행한 모든 쿼리에 지정할 새로운 우선 순위입니다. 이 인수는 값이 `CRITICAL`, `HIGHEST`, `HIGH`, `NORMAL`, `LOW`, `LOWEST` 또는 `RESET`인 문자열이어야 합니다. 수퍼유저만 우선 순위를 `CRITICAL`로 변경할 수 있습니다. 우선 순위를 `RESET`으로 변경하면 `user_name`에 대한 우선 순위 설정이 제거됩니다.

## 반환 타입
<a name="r_CHANGE_USER_PRIORITY-return-type"></a>

없음

## 예제
<a name="r_CHANGE_USER_PRIORITY-example"></a>

사용자 `analysis_user`에 대한 우선 순위를 `LOWEST`로 변경하려면 다음 예제를 사용합니다.

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'lowest');

+-------------------------------------------------------------------------------------+
|                                change_user_priority                                 |
+-------------------------------------------------------------------------------------+
| Succeeded to change user priority. Changed user (analysis_user) priority to lowest. |
+-------------------------------------------------------------------------------------+
```

우선 순위를 `LOW`로 변경하려면 다음 예제를 사용합니다.

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'low');

+----------------------------------------------------------------------------------------------+
|                                     change_user_priority                                     |
+----------------------------------------------------------------------------------------------+
| Succeeded to change user priority. Changed user (analysis_user) priority from Lowest to low. |
+----------------------------------------------------------------------------------------------+
```

우선 순위를 재설정하려면 다음 예제를 사용합니다.

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'reset');

+-------------------------------------------------------+
|                 change_user_priority                  |
+-------------------------------------------------------+
| Succeeded to reset priority for user (analysis_user). |
+-------------------------------------------------------+
```

# CURRENT\$1SETTING
<a name="r_CURRENT_SETTING"></a>

 CURRENT\$1SETTING은 지정한 구성 파라미터의 현재 값을 반환합니다.

이 함수는 [SHOW](r_SHOW.md) 명령과 동일합니다.

## 구문
<a name="r_CURRENT_SETTING-synopsis"></a>

```
current_setting('parameter')
```

다음 문은 지정한 세션 컨텍스트 변수의 현재 값을 반환합니다.

```
current_setting('variable_name')
current_setting('variable_name'[, error_if_undefined])
```

## 인수
<a name="r_CURRENT_SETTING-argument"></a>

 *파라미터*   
설정할 파라미터 값. 구성 파라미터 목록은 [구성 참조](cm_chap_ConfigurationRef.md) 섹션을 참조하세요.

 *variable\$1name *   
표시할 변수의 이름입니다. 세션 컨텍스트 변수의 문자열 상수여야 합니다.

 *error\$1if\$1undefined*   
(선택) 변수 이름이 없는 경우 동작을 지정하는 선택적 부울 값입니다. error\$1if\$1undefined가 기본값인 `TRUE`로 설정되면 Amazon Redshift에서 오류가 발생합니다. error\$1if\$1undefined가 `FALSE`로 설정되면 Amazon Redshift에서 `NULL`이 반환됩니다. Amazon Redshift는 세션 컨텍스트 변수에 대해서만 **error\$1if\$1undefined 파라미터를 지원합니다. 입력이 구성 파라미터인 경우에는 사용할 수 없습니다.

## 반환 타입
<a name="r_CURRENT_SETTING-return-type"></a>

`CHAR` 또는 `VARCHAR` 문자열을 반환합니다.

## 예제
<a name="r_CURRENT_SETTING-example"></a>

`query_group` 파라미터의 현재 설정을 반환하려면 다음 예제를 사용합니다.

```
SELECT CURRENT_SETTING('query_group');

+-----------------+
| current_setting |
+-----------------+
| unset           |
+-----------------+
```

`app_context.user_id` 변수의 현재 설정을 반환하려면 다음 예제를 사용합니다.

```
SELECT CURRENT_SETTING('app_context.user_id', FALSE);
```

# PG\$1CANCEL\$1BACKEND
<a name="PG_CANCEL_BACKEND"></a>

쿼리를 취소합니다. PG\$1CANCEL\$1BACKEND는 기능 면에서 [CANCEL](r_CANCEL.md) 명령과 동일합니다. 사용자가 현재 실행하고 있는 쿼리를 취소할 수 있습니다. 수퍼유저는 어떠한 쿼리든 취소할 수 있습니다.

## 구문
<a name="PG_CANCEL_BACKEND-synopsis"></a>

```
pg_cancel_backend( pid )
```

## 인수
<a name="PG_CANCEL_BACKEND-arguments"></a>

 *pid*   
취소할 쿼리의 프로세스 ID(PID)입니다. 쿼리 ID를 지정해서는 쿼리를 취소할 수 없습니다. 반드시 쿼리의 프로세스 ID를 지정해야 합니다. `INTEGER` 값이 필요합니다.

## 반환 타입
<a name="PG_CANCEL_BACKEND-return-type"></a>

없음

## 사용 노트
<a name="PG_CANCEL_BACKEND-usage-notes"></a>

다수의 세션에서 동일한 테이블에 대해 쿼리를 실행하면서 잠금 현상이 발생하는 경우에는 [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) 함수를 사용해 세션 중 하나를 종료할 수 있습니다. 그러면 종료된 세션에서 실행 중이던 트랜잭션이 모든 잠금을 강제로 해제하여 트랜잭션을 롤백시킵니다. PG\$1\$1LOCKS 카탈로그 테이블에 대해 쿼리를 실행하여 현재 잠금 상태를 확인합니다. 쿼리가 트랜잭션 블록(BEGIN ... END) 내부여서 취소할 수 없는 경우에는 PG\$1TERMINATE\$1BACKEND 함수를 사용하여 쿼리가 실행 중인 세션을 종료할 수 있습니다.

## 예제
<a name="PG_CANCEL_BACKEND-example"></a>

현재 실행 중인 쿼리를 취소하려면 먼저 취소하려는 쿼리에 대한 프로세스 ID를 검색하세요. 현재 실행 중인 모든 쿼리의 프로세스 ID를 확인하려면 다음 명령을 실행합니다.

```
SELECT pid, TRIM(starttime) AS start, 
duration, TRIM(user_name) AS user,
SUBSTRING(query,1,40) AS querytxt
FROM stv_recents
WHERE status = 'Running';

+-----+------------------------+----------+--------+-----------------------------+
| pid |       starttime        | duration |  user  |          querytxt           |
+-----+------------------------+----------+--------+-----------------------------+
| 802 | 2013-10-14 09:19:03.55 |      132 | dwuser | select venuename from venue |
| 834 | 2013-10-14 08:33:49.47 |  1250414 | dwuser | select * from listing;      |
| 964 | 2013-10-14 08:30:43.29 |   326179 | dwuser | select sellerid from sales  |
+-----+------------------------+----------+--------+-----------------------------+
```

프로세스 ID 802로 쿼리를 취소하려면 다음 예제를 사용합니다.

```
SELECT PG_CANCEL_BACKEND(802);
```

# PG\$1TERMINATE\$1BACKEND
<a name="PG_TERMINATE_BACKEND"></a>

세션을 종료합니다. 사용자가 소유하고 있는 세션을 종료할 수 있으며, 그 밖에 수퍼유저라면 모든 세션을 종료할 수 있습니다.

## 구문
<a name="PG_TERMINATE_BACKEND-synopsis"></a>

```
pg_terminate_backend( pid )
```

## 인수
<a name="PG_TERMINATE_BACKEND-arguments"></a>

*pid*  
종료할 세션의 프로세스 ID입니다. `INTEGER` 값이 필요합니다.

## 반환 타입
<a name="PG_TERMINATE_BACKEND-return-type"></a>

없음

## 사용 노트
<a name="PG_TERMINATE_BACKEND-usage-notes"></a>

 동시 접속 제한에 가깝게 도달하면 PG\$1TERMINATE\$1BACKEND를 사용하여 유휴 세션을 종료하고 접속할 수 있는 여유 세션을 확보할 수 있습니다. 자세한 내용은 [Amazon Redshift의 제한](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)을 참조하세요.

다수의 세션에서 동일한 테이블에 대해 쿼리를 실행하면서 잠금 현상이 발생하는 경우에는 PG\$1TERMINATE\$1BACKEND 함수를 사용해 세션 중 하나를 종료할 수 있습니다. 그러면 종료된 세션에서 실행 중이던 트랜잭션이 모든 잠금을 강제로 해제하여 트랜잭션을 롤백시킵니다. PG\$1LOCKS 카탈로그 테이블에 대해 쿼리를 실행하여 현재 잠금 상태를 확인합니다.

쿼리가 트랜잭션 블록(BEGIN … END) 내부에 있지 않으면 [CANCEL](r_CANCEL.md) 명령 또는 [PG\$1CANCEL\$1BACKEND](PG_CANCEL_BACKEND.md) 함수를 사용해 쿼리를 취소할 수 있습니다.

## 예제
<a name="PG_TERMINATE_BACKEND-example"></a>

SVV\$1TRANSACTIONS 테이블에 대해 쿼리를 실행하여 현재 트랜잭션에 적용되어 있는 모든 잠금을 표시하려면 다음 예제를 사용합니다.

```
SELECT * FROM svv_transactions;

+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
| txn_owner | txn_db |  xid  | pid  |      txn_start      |    lock_mode    | lockable_object_type | relation | granted |
+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |    51940 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |    52000 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |   108623 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | ExclusiveLock   | transactionid        |          | true    |
+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
```

잠금이 설정된 세션을 종료하려면 다음 예제를 사용합니다.

```
SELECT PG_TERMINATE_BACKEND(8585); 
```

# REBOOT\$1CLUSTER
<a name="r_REBOOT_CLUSTER"></a>

클러스터에 대한 연결을 닫지 않고 Amazon Redshift 클러스터를 재부팅합니다. 이 명령을 실행하려면 데이터베이스 슈퍼 사용자여야 합니다.

이 소프트 재부팅이 완료된 후 Amazon Redshift 클러스터는 사용자 애플리케이션에 오류를 반환하고 사용자 애플리케이션은 소프트 재부팅으로 인해 중단된 트랜잭션이나 쿼리를 다시 제출해야 합니다.

## 구문
<a name="r_REBOOT_CLUSTER-synopsis"></a>

```
SELECT REBOOT_CLUSTER();
```

# SET\$1CONFIG
<a name="r_SET_CONFIG"></a>

구성 파라미터를 새로운 값으로 설정합니다.

 이 함수는 SQL의 SET 명령과 동일합니다.

## 구문
<a name="r_SET_CONFIG-synopsis"></a>

```
SET_CONFIG('parameter', 'new_value' , is_local)
```

다음 문은 세션 컨텍스트 변수를 새로운 설정으로 설정합니다.

```
set_config('variable_name', 'new_value' , is_local)
```

## 인수
<a name="r_SET_CONFIG-parameters"></a>

 *파라미터*   
설정할 파라미터입니다.

 *variable\$1name*   
설정할 변수의 이름입니다.

 *새 값*   
파라미터의 새 값입니다.

 *is\$1local*   
true이면 파라미터 값이 현재 트랜잭션에만 적용됩니다. 유효 값은 `true` 또는 `1`과 `false` 또는 `0`입니다.

## 반환 타입
<a name="r_SET_CONFIG-return-type"></a>

`CHAR` 또는 `VARCHAR` 문자열을 반환합니다.

## 예제
<a name="r_SET_CONFIG-examples"></a>

현재 트랜잭션에서만 `query_group` 파리미터 값을 `test`로 설정하려면 다음 예제를 사용합니다.

```
SELECT SET_CONFIG('query_group', 'test', true);

+------------+
| set_config |
+------------+
| test       |
+------------+
```

세션 컨텍스트 변수를 설정하려면 다음 예제를 사용합니다.

```
SELECT SET_CONFIG(‘app.username’, ‘cuddy’, FALSE);
```

# 시스템 정보 함수
<a name="r_System_information_functions"></a>

Amazon Redshift는 다양한 시스템 정보 함수를 지원합니다.

**Topics**
+ [CURRENT\$1AWS\$1ACCOUNT](r_CURRENT_AWS_ACCOUNT.md)
+ [CURRENT\$1DATABASE](r_CURRENT_DATABASE.md)
+ [CURRENT\$1NAMESPACE](r_CURRENT_NAMESPACE.md)
+ [CURRENT\$1SCHEMA](r_CURRENT_SCHEMA.md)
+ [CURRENT\$1SCHEMAS](r_CURRENT_SCHEMAS.md)
+ [CURRENT\$1SESSION\$1ARN](r_CURRENT_SESSION_ARN.md)
+ [CURRENT\$1USER](r_CURRENT_USER.md)
+ [CURRENT\$1USER\$1ID](r_CURRENT_USER_ID.md)
+ [DEFAULT\$1IAM\$1ROLE](r_DEFAULT_IAM_ROLE.md)
+ [GET\$1MOUNTED\$1ROLE](GET_MOUNTED_ROLE.md)
+ [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md)
+ [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md)
+ [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md)
+ [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md)
+ [LAST\$1USER\$1QUERY\$1ID](LAST_USER_QUERY_ID.md)
+ [PG\$1BACKEND\$1PID](PG_BACKEND_PID.md)
+ [PG\$1GET\$1COLS](PG_GET_COLS.md)
+ [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md)
+ [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md)
+ [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md)
+ [PG\$1GET\$1SESSION\$1ROLES](PG_GET_SESSION_ROLES.md)
+ [PG\$1LAST\$1COPY\$1COUNT](PG_LAST_COPY_COUNT.md)
+ [PG\$1LAST\$1COPY\$1ID](PG_LAST_COPY_ID.md)
+ [PG\$1LAST\$1UNLOAD\$1ID](PG_LAST_UNLOAD_ID.md)
+ [PG\$1LAST\$1QUERY\$1ID](PG_LAST_QUERY_ID.md)
+ [PG\$1LAST\$1UNLOAD\$1COUNT](PG_LAST_UNLOAD_COUNT.md)
+ [SLICE\$1NUM 함수](r_SLICE_NUM.md)
+ [USER](r_USER.md)
+ [ROLE\$1IS\$1MEMBER\$1OF](r_ROLE_IS_MEMBER_OF.md)
+ [USER\$1IS\$1MEMBER\$1OF](r_USER_IS_MEMBER_OF.md)
+ [version](r_VERSION.md)

# CURRENT\$1AWS\$1ACCOUNT
<a name="r_CURRENT_AWS_ACCOUNT"></a>

쿼리를 제출한 Amazon Redshift 클러스터와 연결된 AWS 계정을 반환합니다.

## 구문
<a name="r_CURRENT_AWS_ACCOUNT-synopsis"></a>

```
current_aws_account
```

## 반환 타입
<a name="r_CURRENT_AWS_ACCOUNT-return-type"></a>

정수를 반환합니다.

## 예제
<a name="r_CURRENT_AWS_ACCOUNT-example"></a>

다음은 현재 데이터베이스 이름을 반환하는 쿼리입니다.

```
select user, current_aws_account; 
current_user | current_account
-------------+--------------- 
dwuser       | 987654321

(1 row)
```

# CURRENT\$1DATABASE
<a name="r_CURRENT_DATABASE"></a>

현재 연결 중인 데이터베이스 이름을 반환합니다.

## 구문
<a name="r_CURRENT_DATABASE-synopsis"></a>

```
current_database()
```

## 반환 타입
<a name="r_CURRENT_DATABASE-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_CURRENT_DATABASE-example"></a>

다음은 현재 데이터베이스 이름을 반환하는 쿼리입니다.

```
select current_database();

current_database
------------------
tickit
(1 row)
```

# CURRENT\$1NAMESPACE
<a name="r_CURRENT_NAMESPACE"></a>

현재 Amazon Redshift 클러스터의 클러스터 네임스페이스를 반환합니다. Amazon Redshift 클러스터 네임스페이스는 Amazon Redshift 클러스터의 고유 ID입니다.

## 구문
<a name="r_CURRENT_NAMESPACE-synopsis"></a>

```
current_namespace
```

## 반환 타입
<a name="r_CURRENT_NAMESPACE-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_CURRENT_NAMESPACE-example"></a>

다음은 현재 네임스페이스 이름을 반환하는 쿼리입니다.

```
select user, current_namespace; 
current_user | current_namespace
-------------+-------------------------------------
dwuser       | 86b5169f-01dc-4a6f-9fbb-e2e24359e9a8

(1 row)
```

# CURRENT\$1SCHEMA
<a name="r_CURRENT_SCHEMA"></a>

검색 경로 앞에 있는 스키마 이름을 반환합니다. 이 스키마는 모든 테이블에, 또는 대상 스키마를 지정하지 않고 생성되는 다른 이름의 객체에 사용됩니다.

## 구문
<a name="r_CURRENT_SCHEMA-synopsis"></a>

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다.

```
current_schema()
```

## 반환 타입
<a name="r_CURRENT_SCHEMA-return-type"></a>

CURRENT\$1SCHEMA는 CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_CURRENT_SCHEMA-examples"></a>

다음은 현재 스키마를 반환하는 쿼리입니다.

```
select current_schema();

current_schema
----------------
public
(1 row)
```

# CURRENT\$1SCHEMAS
<a name="r_CURRENT_SCHEMAS"></a>

현재 검색 경로에서 모든 스키마의 이름 배열을 반환합니다. 현재 검색 경로는 search\$1path 파라미터에서 정의합니다.

## 구문
<a name="r_CURRENT_SCHEMAS-synopsis"></a>

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다.

```
current_schemas(include_implicit)
```

## 인수
<a name="r_CURRENT_SCHEMAS-argument"></a>

 *include\$1implicit*   
true이면 검색 경로에 묵시적으로 포함된 시스템 스키마까지 모두 추가하도록 지정합니다. 유효한 값은 `true` 및 `false`입니다. 일반적으로 `true`일 때는 현재 스키마 외에 `pg_catalog` 스키마까지 반환합니다.

## 반환 타입
<a name="r_CURRENT_SCHEMAS-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_CURRENT_SCHEMAS-examples"></a>

다음은 현재 검색 경로에서 묵시적으로 포함된 시스템 스키마를 제외하고 스키마 이름을 반환하는 예입니다.

```
select current_schemas(false);

current_schemas
-----------------
{public}
(1 row)
```

다음은 현재 검색 경로에서 묵시적으로 포함된 시스템 스키마까지 추가하여 스키마 이름을 반환하는 예입니다.

```
select current_schemas(true);

current_schemas
---------------------
{pg_catalog,public}
(1 row)
```

# CURRENT\$1SESSION\$1ARN
<a name="r_CURRENT_SESSION_ARN"></a>

현재 권한이 부여된 글로벌 사용자의 ARN을 반환합니다. 글로벌 사용자는 Redshift 계정, 클러스터, Serverless 작업 그룹에서 동일한 자격 증명으로 존재합니다. 글로벌 사용자는 IAM Identity Center를 통해 로그인하거나 IAM 기반 세션 인증을 통해 로그인합니다. 데이터 레이크 사용자는 글로벌 AWS 사용자입니다.

이 기능은 일반적으로 다중 언어 AWS Glue 뷰를 사용하는 상황에서 사용됩니다. IAM Identity Center 및 Redshift를 사용한 자격 증명 관리에 대한 자세한 내용은 [Redshift를 IAM Identity Center와 연결하여 사용자에게 Single Sign-On 경험을 제공합니다](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)를 참조하세요. 다중 언어 Glue 뷰에 대한 자세한 내용은 [AWS Glue 데이터 카탈로그에서 뷰 생성](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)을 참조하세요.

## 구문
<a name="r_CURRENT_SESSION_ARN-synopsis"></a>

```
current_session_arn()
```

## 반환 타입
<a name="r_CURRENT_SESSION_ARN-return-type"></a>

전역적으로 인증된 사용자의 VARCHAR 문자열 또는 null 값을 반환합니다.

## 사용 노트
<a name="r_CURRENT_SESSION_ARN-usage"></a>

로컬 사용자는 지원되지 않으며 null 응답이 반환됩니다.

## 예제
<a name="r_CURRENT_SESSION_ARN-example"></a>

다음은 현재 세션 ARN 이름을 반환하는 쿼리입니다.

```
SELECT current_session_arn();

current_session_arn
--------------
arn:aws:iam::123456789012:user/user
(1 row)
```

# CURRENT\$1USER
<a name="r_CURRENT_USER"></a>

검사 권한에 따라 데이터베이스의 현재 "유효" 사용자 이름을 반환합니다. 일반적으로 이 사용자 이름은 세션 사용자와 동일하지만 경우에 따라 수퍼유저에 의해 변경될 수 있습니다.

**참고**  
CURRENT\$1USER를 호출할 때는 후행 괄호를 사용하지 마세요.

## 구문
<a name="r_CURRENT_USER-synopsis"></a>

```
current_user
```

## 반환 타입
<a name="r_CURRENT_USER-return-type"></a>

CURRENT\$1USER는 NAME 데이터 유형을 반환하며 CHAR 또는 VARCHAR 문자열로 캐스팅할 수 있습니다.

## 사용 노트
<a name="r_CURRENT_USER-usage"></a>

CREATE\$1PROCEDURE 명령의 SECURITY DEFINER 옵션을 사용하여 저장 프로시저를 생성한 경우, 저장 프로시저 내에서 CURRENT\$1USER 함수를 호출하면 Amazon Redshift는 저장 프로시저 소유자의 사용자 이름을 반환합니다.

## 예제
<a name="r_CURRENT_USER-example"></a>

다음은 현재 데이터베이스 사용자의 이름을 반환하는 쿼리입니다.

```
select current_user;

current_user
--------------
dwuser
(1 row)
```

# CURRENT\$1USER\$1ID
<a name="r_CURRENT_USER_ID"></a>

현재 세션에 로그인되어 있는 Amazon Redshift 사용자의 고유 식별자를 반환합니다.

## 구문
<a name="r_CURRENT_USER_ID-synopsis"></a>

```
CURRENT_USER_ID
```

## 반환 타입
<a name="r_CURRENT_USER_ID-return-type"></a>

CURRENT\$1USER\$1ID 함수는 정수를 반환합니다.

## 예제
<a name="r_CURRENT_USER_ID-examples"></a>

다음은 이 세션의 현재 사용자 이름 및 ID를 반환하는 예입니다.

```
select user, current_user_id;

 current_user | current_user_id
--------------+-----------------
   dwuser     |               1
(1 row)
```

# DEFAULT\$1IAM\$1ROLE
<a name="r_DEFAULT_IAM_ROLE"></a>

현재 Amazon Redshift 클러스터와 연결된 기본 IAM 역할을 반환합니다. 연결된 기본 IAM 역할이 없는 경우 함수는 없음을 반환합니다.

## 구문
<a name="r_DEFAULT_IAM_ROLE-synopsis"></a>

```
select default_iam_role();
```

## 반환 타입
<a name="r_DEFAULT_IAM_ROLE-return-type"></a>

VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_DEFAULT_IAM_ROLE-example"></a>

다음 예에서는 현재 지정된 Amazon Redshift 클러스터와 연결된 기본 IAM 역할을 반환합니다.

```
select default_iam_role();
              default_iam_role
-----------------------------------------------
 arn:aws:iam::123456789012:role/myRedshiftRole
(1 row)
```

# GET\$1MOUNTED\$1ROLE
<a name="GET_MOUNTED_ROLE"></a>

 다중 언어 AWS Glue 뷰의 일부로 호출하면 Lake Formation 스키마 또는 데이터베이스를 마운트하는 데 사용되는 IAM 역할을 반환할 수 있습니다. 다중 언어란 SQL이 Amazon EMR 및 Redshift와 같은 여러 쿼리 엔진에서 지원된다는 의미입니다. 다중 언어 Glue 뷰에 대한 자세한 내용은 [AWS Glue 데이터 카탈로그에서 뷰 생성](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)을 참조하세요.



## 구문
<a name="GET_MOUNTED_ROLE-synopsis"></a>

```
get_mounted_role()
```

## 반환 타입
<a name="GET_MOUNTED_ROLE-return-type"></a>

VARCHAR 문자열 또는 null 값을 반환합니다.

## 사용 노트
<a name="GET_MOUNTED_ROLE-usage"></a>

이 함수는 외부 Lake Formation 뷰 이외의 모든 사용 사례에 대해 null을 반환합니다.

## 예제
<a name="GET_MOUNTED_ROLE-example"></a>

다음 쿼리는 Lake Formation 리소스를 마운트할 자격 증명을 반환합니다.

```
CREATE EXTERNAL PROTECTED VIEW external_schema.remote_view AS 
SELECT mycol, get_mounted_role() FROM external_schema.remote_table;

mycol | get_mounted_role
----------------------------
1       arn:aws:iam::123456789012:role/salesrole
(1 row)
```

# HAS\$1ASSUMEROLE\$1PRIVILEGE
<a name="r_HAS_ASSUMEROLE_PRIVILEGE"></a>

지정된 사용자가 지정된 명령을 실행할 권한이 있는 지정된 IAM 역할을 가지고 있으면 Boolean `true`(`t`)를 반환합니다. 사용자가 지정된 명령을 실행할 권한이 있는 지정된 IAM 역할을 가지고 있지 않으면 함수가 `false`(`f`)를 반환합니다. 권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 구문
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-synopsis"></a>

```
has_assumerole_privilege( [ user, ] iam_role_arn, cmd_type)
```

## 인수
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-arguments"></a>

 *user*   
IAM 역할 권한을 확인할 사용자의 이름입니다. 기본적으로 현재 사용자를 검사합니다. 슈퍼 사용자와 사용자가 이 함수를 사용할 수 있습니다. 그러나 사용자는 자신의 권한만 볼 수 있습니다.

 *iam\$1role\$1arn*   
명령 권한이 부여된 IAM 역할입니다.

 *cmd\$1type*   
액세스 권한이 부여된 명령입니다. 유효한 값은 다음과 같습니다.  
+ COPY
+ UNLOAD
+ EXTERNAL FUNCTION
+ CREATE MODEL

## 반환 타입
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-return-type"></a>

BOOLEAN

## 예제
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-example"></a>

다음 쿼리는 사용자 `reg_user1`이 COPY 명령을 실행할 수 있는 `Redshift-S3-Read` 역할에 대한 권한을 가지고 있는지 확인합니다.

```
select has_assumerole_privilege('reg_user1', 'arn:aws:iam::123456789012:role/Redshift-S3-Read', 'copy');
```

```
has_assumerole_privilege
------------------------
true
(1 row)
```

# HAS\$1DATABASE\$1PRIVILEGE
<a name="r_HAS_DATABASE_PRIVILEGE"></a>

사용자가 지정한 데이터베이스에 대한 특정 권한을 가지고 있으면 `true`를 반환합니다. 권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 구문
<a name="r_HAS_DATABASE_PRIVILEGE-synopsis"></a>

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다.

```
has_database_privilege( [ user, ] database, privilege)
```

## 인수
<a name="r_HAS_DATABASE_PRIVILEGE-arguments"></a>

 *user*   
데이터베이스 권한 유무를 확인할 사용자의 이름입니다. 기본적으로 현재 사용자를 검사합니다.

 *데이터베이스*\$1   
권한과 연결되어 있는 데이터베이스입니다.

 *privilege*   
확인할 권한입니다. 유효한 값은 다음과 같습니다.  
+ CREATE
+ 객체
+ TEMP

## 반환 타입
<a name="r_HAS_DATABASE_PRIVILEGE-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_HAS_DATABASE_PRIVILEGE-example"></a>

다음은 GUEST 사용자가 TICKIT 데이터베이스에 대한 TEMP 권한을 가지고 있는지 확인하는 쿼리입니다.

```
select has_database_privilege('guest', 'tickit', 'temp');

has_database_privilege
------------------------
true
(1 row)
```

# HAS\$1SCHEMA\$1PRIVILEGE
<a name="r_HAS_SCHEMA_PRIVILEGE"></a>

사용자가 지정한 스키마에 대한 특정 권한을 가지고 있으면 `true`를 반환합니다. 권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

## 구문
<a name="r_HAS_SCHEMA_PRIVILEGE-synopsis"></a>

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다.

```
has_schema_privilege( [ user, ] schema, privilege)
```

## 인수
<a name="r_HAS_SCHEMA_PRIVILEGE-arguments"></a>

 *user*   
스키마 권한 유무를 확인할 사용자 이름입니다. 기본적으로 현재 사용자를 검사합니다.

 *스키마*   
권한과 연결되어 있는 스키마입니다.

 *privilege*   
확인할 권한입니다. 유효한 값은 다음과 같습니다.  
+ CREATE
+ 객체
+ ALTER
+ DROP

## 반환 타입
<a name="r_HAS_SCHEMA_PRIVILEGE-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_HAS_SCHEMA_PRIVILEGE-example"></a>

다음은 GUEST 사용자가 PUBLIC 스키마에 대한 CREATE 권한을 가지고 있는지 확인하는 쿼리입니다.

```
select has_schema_privilege('guest', 'public', 'create');

has_schema_privilege
----------------------
true
(1 row)
```

# HAS\$1TABLE\$1PRIVILEGE
<a name="r_HAS_TABLE_PRIVILEGE"></a>

사용자에게 지정된 테이블에 대한 지정된 권한이 있으면 `true`을 반환하고 그렇지 않으면 `false`을 반환합니다.

## 구문
<a name="r_HAS_TABLE_PRIVILEGE-synopsis"></a>

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다. 권한에 대한 자세한 내용은 [GRANT](r_GRANT.md) 섹션을 참조하세요.

```
has_table_privilege( [ user, ] table, privilege)
```

## 인수
<a name="r_HAS_TABLE_PRIVILEGE-arguments"></a>

 *user*   
테이블 권한 유무를 확인할 사용자 이름입니다. 기본적으로 현재 사용자를 검사합니다.

 *테이블*\$1   
권한과 연결되어 있는 테이블입니다.

 *privilege*   
검사할 권한입니다. 유효한 값은 다음과 같습니다.  
+ SELECT
+ INSERT
+ UPDATE
+ DELETE
+ DROP
+ REFERENCES

## 반환 타입
<a name="r_HAS_TABLE_PRIVILEGE-return-type"></a>

BOOLEAN

## 예제
<a name="r_HAS_TABLE_PRIVILEGE-examples"></a>

다음은 GUEST 사용자가 LISTING 테이블에 대한 SELECT 권한을 가지고 있지 않은지 확인하는 쿼리입니다.

```
select has_table_privilege('guest', 'listing', 'select');

has_table_privilege
---------------------
false
```

다음 쿼리는 pg\$1tables 및 pg\$1user 카탈로그 테이블의 출력을 사용하여 선택, 삽입, 업데이트 및 삭제를 비롯한 테이블 권한을 나열합니다. 이는 샘플일 뿐입니다. 데이터베이스에서 스키마 이름과 테이블 이름을 지정해야 할 수 있습니다. 자세한 내용은 [카탈로그 테이블 쿼리](c_join_PG.md) 섹션을 참조하세요.

```
SELECT 
     tablename
     ,usename
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'select') AS sel
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'insert') AS ins
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'update') AS upd
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'delete') AS del
FROM
(SELECT * from pg_tables
WHERE schemaname = 'public' and tablename in ('event','listing')) as tables
,(SELECT * FROM pg_user) AS users;

tablename | usename   |  sel   |  ins  |  upd  | del
----------+-----------+--------+-------+-------+-------
event     |  john     |  true  | true  | true  | true	
event     |  sally    |  false | false | false | false	
event     |  elsa     |  false | false | false | false	
listing   |  john     |  true  | true  | true  | true	
listing   |  sally    |  false | false | false | false	
listing   |  elsa     |  false | false | false | false
```

이전 쿼리에는 교차 조인도 포함됩니다. 자세한 내용은 [JOIN 예](r_Join_examples.md) 섹션을 참조하세요. `public` 스키마에 없는 테이블을 쿼리하려면 쿼리하기 전에 WHERE 절에서 `schemaname` 조건을 제거하고 다음 예제를 사용합니다.

```
SET SEARCH_PATH to 'schema_name';
```

# LAST\$1USER\$1QUERY\$1ID
<a name="LAST_USER_QUERY_ID"></a>

현재 세션에서 가장 최근에 완료된 사용자 쿼리의 쿼리 ID를 반환합니다. 현재 세션에서 쿼리가 실행되지 않았다면 last\$1user\$1query\$1id가 -1을 반환합니다. 이 함수는 리더 노드에서만 실행되는 쿼리에 대해서는 쿼리 ID를 반환하지 않습니다. 자세한 내용은 [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md) 섹션을 참조하세요.

## 구문
<a name="LAST_USER_QUERY_ID-synopsis"></a>

```
last_user_query_id()
```

## 반환 타입
<a name="LAST_USER_QUERY_ID-return-type"></a>

정수를 반환합니다.

## 예제
<a name="LAST_USER_QUERY_ID-example"></a>

다음 쿼리는 현재 세션에서 사용자가 실행하여 완료된 마지막 쿼리의 ID를 반환합니다.

```
select last_user_query_id();
```

결과는 다음과 같습니다.

```
last_user_query_id
-----------------------
    5437
(1 row)
```

다음 쿼리는 현재 세션에서 사용자가 실행하여 가장 최근에 완료된 쿼리의 쿼리 ID 및 텍스트를 반환합니다.

```
select query_id, query_text from sys_query_history where query_id = last_user_query_id();
```

결과는 다음과 같습니다.

```
 query_id, query_text
---------+-------------------------------------------------------------------------------------------------------------
 5556975 | select last_user_query_id() limit 100 --RequestID=<unique request ID>; TraceID=<unique trace ID>
```

# PG\$1BACKEND\$1PID
<a name="PG_BACKEND_PID"></a>

현재 세션을 처리하고 있는 서버 프로세스의 프로세스 ID(PID)를 반환합니다.

**참고**  
PID는 전역적 고유성이 없으므로 시간이 지난 뒤에도 재사용할 수 있습니다.

## 구문
<a name="PG_BACKEND_PID-synopsis"></a>

```
pg_backend_pid()
```

## 반환 타입
<a name="PG_BACKEND_PID-return-type"></a>

정수를 반환합니다.

## 예제
<a name="PG_BACKEND_PID-example"></a>

PG\$1BACKEND\$1PID와 로그 테이블의 상관관계를 통해 현재 세션에 대한 정보를 가져올 수 있습니다. 예를 들어 다음은 현재 세션에서 완료된 쿼리에 대해 쿼리 ID와 쿼리 텍스트 일부를 반환하는 쿼리입니다.

```
select query, substring(text,1,40)
from stl_querytext
where pid =  PG_BACKEND_PID()
order by query desc;

 query |                substring
-------+------------------------------------------
 14831 | select query, substring(text,1,40) from
 14827 | select query, substring(path,0,80) as pa
 14826 | copy category from 's3://dw-tickit/manif
 14825 | Count rows in target table
 14824 | unload ('select * from category') to 's3
(5 rows)
```

PG\$1BACKEND\$1PID와 다음 로그 테이블에 있는 pid 열의 상관관계를 살펴볼 수 있습니다(괄호 안은 예외임).
+ [STL\$1CONNECTION\$1LOG](r_STL_CONNECTION_LOG.md)
+ [STL\$1DDLTEXT](r_STL_DDLTEXT.md)
+ [STL\$1ERROR](r_STL_ERROR.md)
+ [STL\$1QUERY](r_STL_QUERY.md)
+ [STL\$1QUERYTEXT](r_STL_QUERYTEXT.md)
+ [STL\$1SESSIONS](r_STL_SESSIONS.md) (포함)
+ [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md)
+ [STL\$1UTILITYTEXT](r_STL_UTILITYTEXT.md)
+ [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md)
+ [STV\$1INFLIGHT](r_STV_INFLIGHT.md)
+ [STV\$1LOCKS](r_STV_LOCKS.md)(lock\$1owner\$1pid)
+ [STV\$1RECENTS](r_STV_RECENTS.md)(process\$1id)

# PG\$1GET\$1COLS
<a name="PG_GET_COLS"></a>

테이블 또는 보기 정의에 대한 열 메타데이터를 반환합니다.

## 구문
<a name="PG_GET_COLS-synopsis"></a>

```
pg_get_cols('name')
```

## 인수
<a name="PG_GET_COLS-arguments"></a>

 * 이름*   
Amazon Redshift 테이블 또는 뷰의 이름입니다. 자세한 내용은 [이름 및 식별자](r_names.md) 섹션을 참조하세요.

## 반환 타입
<a name="PG_GET_COLS-return-type"></a>

VARCHAR 

## 사용 노트
<a name="PG_GET_COLS-usage-notes"></a>

PG\$1GET\$1COLS 함수는 테이블 또는 보기 정의에 있는 각 열에 대해 하나의 행을 반환합니다. 행에는 스키마 이름, 관계 이름, 열 이름, 데이터 형식 및 열 번호가 있는 쉼표로 분리된 목록이 포함되어 있습니다. SQL 결과의 형식 지정은 사용된 SQL 클라이언트에 따라 달라집니다.

## 예제
<a name="PG_GET_COLS-example"></a>

다음 예제는 연결된 데이터베이스 `dev`에서 사용자가 만든 스키마 `public`에 이름이 지정된 `SALES_VW` 뷰와 스키마 `mytickit1`에 이름이 지정된 `sales` 테이블 테이블에 대한 결과를 반환합니다.

다음 예는 `SALES_VW`라는 뷰에 대한 열 메타데이터를 반환합니다.

```
select pg_get_cols('sales_vw');

pg_get_cols                                                
-----------------------------------------------------------
(public,sales_vw,salesid,integer,1)                        
(public,sales_vw,listid,integer,2)                         
(public,sales_vw,sellerid,integer,3)                       
(public,sales_vw,buyerid,integer,4)                        
(public,sales_vw,eventid,integer,5)                        
(public,sales_vw,dateid,smallint,6)                        
(public,sales_vw,qtysold,smallint,7)                       
(public,sales_vw,pricepaid,"numeric(8,2)",8)               
(public,sales_vw,commission,"numeric(8,2)",9)              
(public,sales_vw,saletime,"timestamp without time zone",10)
```

다음 예는 테이블 형식의 `SALES_VW` 뷰에 대한 열 메타데이터를 반환합니다.

```
select * from pg_get_cols('sales_vw') 
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);

view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
public      | sales_vw  | salesid    | integer                     |       1
public      | sales_vw  | listid     | integer                     |       2
public      | sales_vw  | sellerid   | integer                     |       3
public      | sales_vw  | buyerid    | integer                     |       4
public      | sales_vw  | eventid    | integer                     |       5
public      | sales_vw  | dateid     | smallint                    |       6
public      | sales_vw  | qtysold    | smallint                    |       7
public      | sales_vw  | pricepaid  | numeric(8,2)                |       8
public      | sales_vw  | commission | numeric(8,2)                |       9
public      | sales_vw  | saletime   | timestamp without time zone |      10
```

다음 예는 테이블 형식의 `SALES` 스키마 `mytickit1`에 있는 테이블의 열 메타데이터를 반환합니다.

```
select * from pg_get_cols('"mytickit1"."sales"') 
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);

view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
mytickit1   | sales     | salesid    | integer                     |       1
mytickit1   | sales     | listid     | integer                     |       2
mytickit1   | sales     | sellerid   | integer                     |       3
mytickit1   | sales     | buyerid    | integer                     |       4
mytickit1   | sales     | eventid    | integer                     |       5
mytickit1   | sales     | dateid     | smallint                    |       6
mytickit1   | sales     | qtysold    | smallint                    |       7
mytickit1   | sales     | pricepaid  | numeric(8,2)                |       8
mytickit1   | sales     | commission | numeric(8,2)                |       9
mytickit1   | sales     | saletime   | timestamp without time zone |      10
```

# PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE
<a name="PG_GET_GRANTEE_BY_IAMROLE"></a>

지정된 IAM 역할이 부여된 모든 사용자와 그룹을 반환합니다.

## 구문
<a name="PG_GET_GRANTEE_BY_IAMROLE-synopsis"></a>

```
pg_get_grantee_by_iam_role('iam_role_arn')
```

## 인수
<a name="PG_GET_GRANTEE_BY_IAMROLE-arguments"></a>

 *iam\$1role\$1arn*   
이 역할이 부여된 사용자와 그룹을 반환할 IAM 역할입니다.

## 반환 타입
<a name="PG_GET_GRANTEE_BY_IAMROLE-return-type"></a>

VARCHAR 

## 사용 노트
<a name="PG_GET_GRANTEE_BY_IAMROLE-usage-notes"></a>

PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE 함수는 각 사용자 또는 그룹에 대해 하나의 행을 반환합니다. 각 행에는 피부여자 이름, 피부여자 유형 및 부여된 권한이 포함됩니다. 피부여자 유형에 가능한 값은 퍼블릭의 경우 `p`, 사용자의 경우 `u`, 그룹의 경우 `g`입니다.

슈퍼 사용자만 이 함수를 사용할 수 있습니다.

## 예제
<a name="PG_GET_GRANTEE_BY_IAMROLE-example"></a>

다음 예는 `group1` 및 `reg_user1`에게 IAM 역할 `Redshift-S3-Write`가 부여되었음을 나타냅니다. `group_1`의 사용자는 COPY 작업에 대해서만 역할을 지정할 수 있고, 사용자 `reg_user1`은 UNLOAD 작업을 수행하는 역할만 지정할 수 있습니다.

```
select pg_get_grantee_by_iam_role('arn:aws:iam::123456789012:role/Redshift-S3-Write');
```

```
  pg_get_grantee_by_iam_role
-----------------------------
 (group_1,g,COPY)
 (reg_user1,u,UNLOAD)
```

PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE 함수의 다음 예는 결과 형식을 테이블로 지정합니다.

```
select grantee, grantee_type, cmd_type FROM pg_get_grantee_by_iam_role('arn:aws:iam::123456789012:role/Redshift-S3-Write') res_grantee(grantee text, grantee_type text, cmd_type text) ORDER BY 1,2,3;
```

```
  grantee  | grantee_type | cmd_type
-----------+--------------+----------
 group_1   | g            | COPY
 reg_user1 | u            | UNLOAD
```

# PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER
<a name="PG_GET_IAM_ROLE_BY_USER"></a>

사용자에게 부여된 모든 IAM 역할 및 명령 권한을 반환합니다.

## 구문
<a name="PG_GET_IAM_ROLE_BY_USER-synopsis"></a>

```
pg_get_iam_role_by_user('name')
```

## 인수
<a name="PG_GET_IAM_ROLE_BY_USER-arguments"></a>

 * 이름*   
IAM 역할을 반환할 사용자의 이름입니다.

## 반환 타입
<a name="PG_GET_IAM_ROLE_BY_USER-return-type"></a>

VARCHAR 

## 사용 노트
<a name="PG_GET_IAM_ROLE_BY_USER-usage-notes"></a>

PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER 함수는 각 역할 및 명령 권한 집합에 대해 하나의 행을 반환합니다. 행에는 사용자 이름, IAM 역할 및 명령이 들어 있는 쉼표로 분리된 목록이 있습니다.

결과에서 값 `default`는 사용자가 표시된 명령을 수행하기 위해 사용 가능한 역할을 지정할 수 있음을 나타냅니다.

슈퍼 사용자만 이 함수를 사용할 수 있습니다.

## 예제
<a name="PG_GET_IAM_ROLE_BY_USER-example"></a>

다음 예는 사용자 `reg_user1`이 COPY 작업을 수행하기 위해 사용 가능한 IAM 역할을 지정할 수 있음을 나타냅니다. 사용자는 UNLOAD 작업에 대해 `Redshift-S3-Write` 역할을 지정할 수도 있습니다.

```
select pg_get_iam_role_by_user('reg_user1');
```

```
                             pg_get_iam_role_by_user
---------------------------------------------------------------------------------
 (reg_user1,default,COPY)
 (reg_user1,arn:aws:iam::123456789012:role/Redshift-S3-Write,COPY|UNLOAD)
```

PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER 함수의 다음 예는 결과 형식을 테이블로 지정합니다.

```
select username, iam_role, cmd FROM pg_get_iam_role_by_user('reg_user1') res_iam_role(username text, iam_role text, cmd text);
```

```
 username  |                    iam_role                     | cmd
-----------+-------------------------------------------------+------
 reg_user1 | default                                         | None
 reg_user1 | arn:aws:iam::123456789012:role/Redshift-S3-Read | COPY
```

# PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS
<a name="PG_GET_LATE_BINDING_VIEW_COLS"></a>

데이터베이스에 있는 모든 Late Binding 보기에 대한 열 메타데이터를 반환합니다. 자세한 내용은 [Late Binding 보기](r_CREATE_VIEW.md#r_CREATE_VIEW_late-binding-views) 섹션을 참조하세요.

## 구문
<a name="PG_GET_LATE_BINDING_VIEW_COLS-synopsis"></a>

```
pg_get_late_binding_view_cols()
```

## 반환 타입
<a name="PG_GET_LATE_BINDING_VIEW_COLS-return-type"></a>

VARCHAR 

## 사용 노트
<a name="PG_GET_LATE_BINDING_VIEW_COLS-usage-notes"></a>

`PG_GET_LATE_BINDING_VIEW_COLS` 함수는 Late Binding 보기에 있는 각 열에 대해 하나의 행을 반환합니다. 행에는 스키마 이름, 관계 이름, 열 이름, 데이터 형식 및 열 번호가 있는 쉼표로 분리된 목록이 포함되어 있습니다.

## 예제
<a name="PG_GET_LATE_BINDING_VIEW_COLS-example"></a>

다음 예는 모든 Late Binding 보기에 대한 열 메타데이터를 반환합니다.

```
select pg_get_late_binding_view_cols();

pg_get_late_binding_view_cols                               
------------------------------------------------------------
(public,myevent,eventname,"character varying(200)",1)       
(public,sales_lbv,salesid,integer,1)                        
(public,sales_lbv,listid,integer,2)                         
(public,sales_lbv,sellerid,integer,3)                       
(public,sales_lbv,buyerid,integer,4)                        
(public,sales_lbv,eventid,integer,5)                        
(public,sales_lbv,dateid,smallint,6)                        
(public,sales_lbv,qtysold,smallint,7)                       
(public,sales_lbv,pricepaid,"numeric(8,2)",8)               
(public,sales_lbv,commission,"numeric(8,2)",9)              
(public,sales_lbv,saletime,"timestamp without time zone",10)
(public,event_lbv,eventid,integer,1)                        
(public,event_lbv,venueid,smallint,2)                       
(public,event_lbv,catid,smallint,3)                         
(public,event_lbv,dateid,smallint,4)                        
(public,event_lbv,eventname,"character varying(200)",5)     
(public,event_lbv,starttime,"timestamp without time zone",6)
```

다음 예는 테이블 형식의 모든 Late Binding 보기에 대한 열 메타데이터를 반환합니다.

```
select * from pg_get_late_binding_view_cols() cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);
view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
public      | sales_lbv | salesid    | integer                     |       1
public      | sales_lbv | listid     | integer                     |       2
public      | sales_lbv | sellerid   | integer                     |       3
public      | sales_lbv | buyerid    | integer                     |       4
public      | sales_lbv | eventid    | integer                     |       5
public      | sales_lbv | dateid     | smallint                    |       6
public      | sales_lbv | qtysold    | smallint                    |       7
public      | sales_lbv | pricepaid  | numeric(8,2)                |       8
public      | sales_lbv | commission | numeric(8,2)                |       9
public      | sales_lbv | saletime   | timestamp without time zone |      10
public      | event_lbv | eventid    | integer                     |       1
public      | event_lbv | venueid    | smallint                    |       2
public      | event_lbv | catid      | smallint                    |       3
public      | event_lbv | dateid     | smallint                    |       4
public      | event_lbv | eventname  | character varying(200)      |       5
public      | event_lbv | starttime  | timestamp without time zone |       6
```

# PG\$1GET\$1SESSION\$1ROLES
<a name="PG_GET_SESSION_ROLES"></a>

현재 로그인한 사용자의 세션 역할을 반환합니다. 사용자의 세션 역할은 로그인한 사용자에 대해 ID 제공업체(iDP)가 정의한 그룹입니다. 예를 들어 [Microsoft Azure Active Directory(Azure AD)](https://azure.microsoft.com/en-us/services/active-directory/)와 같은 ID 제공업체(idP)는 사용자 로그인 프로세스 중에 사용자의 신원을 확인하고 사용자가 속한 모든 외부 그룹을 제공합니다. 이러한 외부 그룹은 Amazon Redshift 역할로 변환되며 현재 세션 중에 사용할 수 있습니다. 이러한 역할을 세션 역할이라고 합니다. 관리자는 다른 Amazon Redshift 역할과 유사하게 세션 역할에 권한을 부여할 수 있습니다. 역할 사용에 대한 자세한 내용은 [역할 기반 액세스 제어(RBAC)](t_Roles.md)를 참조하세요. ID 제공업체(iDP)로 ID를 관리하는 방법에 대한 자세한 내용은 **Amazon Redshift 관리 가이드에서 [Amazon Redshift용 기본 IdP(ID 공급자) 페더레이션](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)을 참조하세요

Amazon Redshift 카탈로그에 정의된 역할을 보려면 [SVV\$1ROLES](r_SVV_ROLES.md) 시스템 뷰를 쿼리합니다.

## 구문
<a name="PG_GET_LATE_BINDING_VIEW_COLS-synopsis"></a>

```
pg_get_session_roles()
```

## 반환 타입
<a name="PG_GET_SESSION_ROLES-return-type"></a>

두 개의 값으로 구성된 행 집합입니다. 첫 번째 값은 콜론(:)으로 구분된 두 부분으로 구성되며, 이 두 부분에는 `idp-namespace:role-name`이 포함되어 있습니다. `idp-namespace`는 ID 제공업체(iDP)의 네임스페이스입니다. `role-name`은 ID 제공업체(iDP)의 외부 그룹 이름입니다. 두 번째 값에는 역할 식별자인 `role-id`가 포함됩니다.

## 사용 노트
<a name="PG_GET_SESSION_ROLES-usage-notes"></a>

`PG_GET_SESSION_ROLES` 함수는 반환된 각 세션 역할에 대해 하나의 행을 반환합니다.

## 예제
<a name="PG_GET_SESSION_ROLES-example"></a>

다음 예에서는 Azure Active Directory IdP에서 각 역할에 대해 하나의 행을 반환합니다. 반환된 열은 열 `name` 및 `roleid`를 사용하여 `sess_roles`로 캐스팅됩니다. 각 `name`은 Azure Active Directory 네임스페이스와 Azure Active Directory의 그룹 이름으로 구성됩니다.

```
SELECT * FROM pg_get_session_roles() AS sess_roles(name name, roleid integer);

name                  roleid
--------------------------------
my_aad:test_group_1   106204
my_aad:test_group_2   106205
my_aad:test_group_3   106206
my_aad:test_group_4   106207
my_aad:test_group_5   106208
```

다음 예제에서는 현재 로그인한 IAM 사용자가 멤버인 각 IAM 그룹에 대해 하나의 행을 반환합니다. 반환된 열은 열 `name` 및 `roleid`를 사용하여 `sess_roles`로 캐스팅됩니다. 각 `name`은 IAM 네임스페이스 및 IAM 그룹 이름으로 구성됩니다.

```
SELECT * FROM pg_get_session_roles() AS sess_roles(name name, roleid integer);

name                  roleid
--------------------------------
IAM:myGroup           110332
```

# PG\$1LAST\$1COPY\$1COUNT
<a name="PG_LAST_COPY_COUNT"></a>

현재 세션에서 마지막 COPY 명령으로 로드된 행의 수를 반환합니다. PG\$1LAST\$1COPY\$1COUNT는 마지막 COPY ID로 업데이트됩니다. 이 ID는 비록 로드가 중단되었더라도 로드 프로세스를 시작한 마지막 COPY의 쿼리 ID이기도 합니다. 쿼리 ID와 COPY ID는 COPY 명령이 로드 프로세스를 시작할 때 업데이트됩니다.

구문 오류 또는 부족한 권한으로 인해 COPY 명령이 중단되면 COPY ID는 업데이트되지 않으며, PG\$1LAST\$1COPY\$1COUNT가 이전 COPY 수를 반환합니다. 현재 세션에서 COPY 명령이 실행되지 않았거나, 혹은 마지막 COPY가 로드 도중 중단되면 PG\$1LAST\$1COPY\$1COUNT가 0을 반환합니다. 자세한 내용은 [PG\$1LAST\$1COPY\$1ID](PG_LAST_COPY_ID.md) 섹션을 참조하세요.

## 구문
<a name="PG_LAST_COPY_COUNT-synopsis"></a>

```
pg_last_copy_count()
```

## 반환 타입
<a name="PG_LAST_COPY_COUNT-return-type"></a>

BIGINT를 반환합니다.

## 예제
<a name="PG_LAST_COPY_COUNT-example"></a>

다음은 현재 세션에서 마지막 COPY 명령으로 로드된 행의 수를 반환하는 쿼리입니다.

```
select pg_last_copy_count();

pg_last_copy_count
--------------------
             192497
(1 row)
```

# PG\$1LAST\$1COPY\$1ID
<a name="PG_LAST_COPY_ID"></a>

현재 세션에서 가장 최근에 완료된 COPY 명령의 쿼리 ID를 반환합니다. 현재 세션에서 COPY 명령이 실행되지 않았다면 PG\$1LAST\$1COPY\$1ID가 -1을 반환합니다.

 PG\$1LAST\$1COPY\$1ID 값은 COPY 명령이 로드 프로세스를 시작할 때 업데이트됩니다. 잘못된 로드 데이터로 인해 COPY 명령이 중단되더라도 COPY ID는 업데이트됩니다. 따라서 STL\$1LOAD\$1ERRORS 테이블에 대한 쿼리를 실행할 때 PG\$1LAST\$1COPY\$1ID를 사용할 수 있습니다. 단, COPY 트랜잭션이 롤백되면 COPY ID는 업데이트되지 않습니다.

로그 프로세스가 시작되기 전에 구문 오류, 액세스 오류, 잘못된 자격 증명, 부족한 권한 등으로 인한 오류가 발생하여 COPY 명령이 중단되면 COPY ID가 업데이트되지 않습니다. 성공적으로 연결된 후 데이터 로드 이전에 시작되는 압축 분석 단계에서 COPY 명령이 중단되어도 COPY ID가 업데이트되지 않습니다.

## 구문
<a name="PG_LAST_COPY_ID-synopsis"></a>

```
pg_last_copy_id()
```

## 반환 타입
<a name="PG_LAST_COPY_ID-return-type"></a>

정수를 반환합니다.

## 예제
<a name="PG_LAST_COPY_ID-example"></a>

다음은 현재 세션에서 마지막 COPY 명령의 쿼리 ID를 반환하는 쿼리입니다.

```
select pg_last_copy_id();

pg_last_copy_id
---------------
          5437
(1 row)
```

다음은 STL\$1LOAD\$1ERRORS를 STL\$1LOADERROR\$1DETAIL로 조인하여 현재 세션에서 가장 최근 로드 도중 발생한 오류 정보를 표시하는 쿼리입니다.

```
select d.query, substring(d.filename,14,20), 
d.line_number as line, 
substring(d.value,1,16) as value,
substring(le.err_reason,1,48) as err_reason
from stl_loaderror_detail d, stl_load_errors le
where d.query = le.query
and d.query = pg_last_copy_id(); 

 query |    substring      | line |  value   |                    err_reason
-------+-------------------+------+----------+-------------------------------------------------
    558| allusers_pipe.txt |  251 | 251      | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | ZRU29FGR | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | Kaitlin  | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | Walter   | String contains invalid or unsupported UTF8 code
```

# PG\$1LAST\$1UNLOAD\$1ID
<a name="PG_LAST_UNLOAD_ID"></a>

현재 세션에서 가장 최근에 완료된 UNLOAD 명령의 쿼리 ID를 반환합니다. 현재 세션에서 UNLOAD 명령이 실행되지 않았다면 PG\$1LAST\$1UNLOAD\$1ID가 -1을 반환합니다.

 PG\$1LAST\$1UNLOAD\$1ID 값은 UNLOAD 명령이 로드 프로세스를 시작할 때 업데이트됩니다. 잘못된 로드 데이터로 인해 UNLOAD 명령이 중단되더라도 UNLOAD ID가 업데이트됩니다. 따라서 추가 조사에 UNLOAD ID를 사용할 수 있습니다. 단, UNLOAD 트랜잭션이 롤백되면 UNLOAD ID는 업데이트되지 않습니다.

로그 프로세스가 시작되기 전에 구문 오류, 액세스 오류, 잘못된 자격 증명, 부족한 권한 등으로 인한 오류가 발생하여 UNLOAD 명령이 중단되면 UNLOAD ID가 업데이트되지 않습니다.

## 구문
<a name="PG_LAST_UNLOAD_ID-synopsis"></a>

```
PG_LAST_UNLOAD_ID()
```

## 반환 타입
<a name="PG_LAST_UNLOAD_ID-return-type"></a>

정수를 반환합니다.

## 예제
<a name="PG_LAST_UNLOAD_ID-example"></a>

다음은 현재 세션에서 마지막 UNLOAD 명령의 쿼리 ID를 반환하는 쿼리입니다.

```
select PG_LAST_UNLOAD_ID();

PG_LAST_UNLOAD_ID
---------------
          5437
(1 row)
```

# PG\$1LAST\$1QUERY\$1ID
<a name="PG_LAST_QUERY_ID"></a>

현재 세션에서 가장 최근에 완료된 쿼리의 쿼리 ID를 반환합니다. 현재 세션에서 쿼리가 실행되지 않았다면 PG\$1LAST\$1QUERY\$1ID가 -1을 반환합니다. PG\$1LAST\$1QUERY\$1ID는 리더 노드에서만 실행되는 쿼리에 대해서는 쿼리 ID를 반환하지 않습니다. 자세한 내용은 [리더 노드 전용 함수](c_SQL_functions_leader_node_only.md) 섹션을 참조하세요.

## 구문
<a name="PG_LAST_QUERY_ID-synopsis"></a>

```
pg_last_query_id()
```

## 반환 타입
<a name="PG_LAST_QUERY_ID-return-type"></a>

정수를 반환합니다.

## 예제
<a name="PG_LAST_QUERY_ID-example"></a>

다음은 현재 세션에서 완료된 마지막 쿼리의 ID를 반환하는 쿼리입니다.

```
select pg_last_query_id();
```

결과는 다음과 같습니다.

```
pg_last_query_id
----------------
           5437
(1 row)
```

다음은 현재 세션에서 가장 최근에 완료된 쿼리의 쿼리 ID 및 텍스트를 반환하는 쿼리입니다.

```
select query, trim(querytxt) as sqlquery
from stl_query
where query = pg_last_query_id();
```

결과는 다음과 같습니다.

```
query | sqlquery
------+--------------------------------------------------
 5437 | select name, loadtime from stl_file_scan where loadtime > 1000000;
(1 rows)
```

# PG\$1LAST\$1UNLOAD\$1COUNT
<a name="PG_LAST_UNLOAD_COUNT"></a>

현재 세션에서 완료된 마지막 UNLOAD 명령에 의해 언로드된 행 수를 반환합니다. PG\$1LAST\$1UNLOAD\$1COUNT는 작업이 중단되었더라도 마지막 UNLOAD의 쿼리 ID로 업데이트됩니다. 쿼리 ID는 UNLOAD 완료 시 업데이트됩니다. 구문 오류 또는 부족한 권한으로 인해 UNLOAD 명령이 중단되면 PG\$1LAST\$1UNLOAD\$1COUNT가 이전 UNLOAD 수를 반환합니다. 현재 세션에서 UNLOAD 명령이 완료되지 않았거나, 혹은 마지막 UNLOAD가 언로드 작업 도중 중단되면 PG\$1LAST\$1UNLOAD\$1COUNT가 0을 반환합니다.

## 구문
<a name="PG_LAST_UNLOAD_COUNT-synopsis"></a>

```
pg_last_unload_count()
```

## 반환 타입
<a name="PG_LAST_UNLOAD_COUNT-return-type"></a>

BIGINT를 반환합니다.

## 예제
<a name="PG_LAST_UNLOAD_COUNT-example"></a>

다음은 현재 세션에서 마지막 UNLOAD 명령으로 언로드된 행의 수를 반환하는 쿼리입니다.

```
select pg_last_unload_count();

pg_last_unload_count
--------------------
             192497
(1 row)
```

# SLICE\$1NUM 함수
<a name="r_SLICE_NUM"></a>

클러스터에서 행 데이터가 위치한 조각 번호에 해당하는 정수를 반환합니다. SLICE\$1NUM은 파라미터가 없습니다.

## 구문
<a name="r_SLICE_NUM-syntax"></a>

```
SLICE_NUM()
```

## 반환 타입
<a name="r_SLICE_NUM-return-type"></a>

SLICE\$1NUM 함수는 정수를 반환합니다.

## 예제
<a name="r_SLICE_NUM-examples"></a>

다음은 EVENTS 테이블에서 처음 10개 EVENT 행의 데이터가 포함된 조각을 표시하는 예입니다.

```
select distinct eventid, slice_num() from event order by eventid limit 10;

 eventid | slice_num
---------+-----------
       1 |         1
       2 |         2
       3 |         3
       4 |         0
       5 |         1
       6 |         2
       7 |         3
       8 |         0
       9 |         1
      10 |         2
(10 rows)
```

다음은 코드(10000)를 반환하는 예로서 FROM 문을 제외한 쿼리가 리더 노드에서 실행되는 것을 나타냅니다.

```
select slice_num();
slice_num
-----------
10000
(1 row)
```

# USER
<a name="r_USER"></a>

CURRENT\$1USER의 동의어입니다. [CURRENT\$1USER](r_CURRENT_USER.md)을(를) 참조하세요.

# ROLE\$1IS\$1MEMBER\$1OF
<a name="r_ROLE_IS_MEMBER_OF"></a>

역할이 다른 역할의 멤버인 경우 true를 반환합니다. 슈퍼 사용자는 모든 역할의 멤버십을 확인할 수 있습니다. ACCESS SYSTEM TABLE 권한이 있는 일반 사용자는 모든 사용자의 멤버십을 확인할 수 있습니다. 그렇지 않으면 일반 사용자는 액세스 권한을 가지고 있는 역할만 확인할 수 있습니다. 제공된 역할이 없거나 현재 사용자가 역할에 액세스할 수 없는 경우 Amazon Redshift에 오류가 발생합니다.

**데이터 공유 고려 사항**

소비자 클러스터가 뷰, RLS 정책 또는 DDM 정책과 같이 이 함수를 참조하는 공유 객체를 쿼리하면 함수는 소비자 클러스터의 보안 컨텍스트를 사용하여 평가합니다. 소비자의 로컬 사용자, 역할 및 그룹 멤버십에 따라 생산자 클러스터에 정의된 결과가 아닌 결과가 결정됩니다. 생산자에 구현된 것과 동일한 권한 컨텍스트를 적용하려는 경우 해당 역할 이름, 그룹 이름 및 사용자 멤버십이 소비자 클러스터에 존재하고 생산자의 역할과 일치하는지 확인합니다.

## 구문
<a name="r_ROLE_IS_MEMBER_OF-synopsis"></a>

```
role_is_member_of( role_name,  granted_role_name)
```

## 인수
<a name="r_ROLE_IS_MEMBER_OF-arguments"></a>

 *role\$1name*   
역할의 이름.

 *granted\$1role\$1name*   
부여된 역할의 이름.

## 반환 타입
<a name="r_ROLE_IS_MEMBER_OF-return-type"></a>

BOOLEAN을 반환합니다.

## 예제
<a name="r_ROLE_IS_MEMBER_OF-example"></a>

다음 쿼리는 역할이 role1 또는 role2의 구성원이 아님을 확인합니다.

```
SELECT role_is_member_of('role1', 'role2');

 role_is_member_of
-------------------
             False
```

# USER\$1IS\$1MEMBER\$1OF
<a name="r_USER_IS_MEMBER_OF"></a>

**중요**  
2026년 2월 16일부터 Amazon Redshift는 데이터 공유를 통해 소비자 사용자, 역할 또는 그룹 정보에 액세스하는 `user_is_member_of` 및 관련 함수의 사용을 더 이상 지원하지 않습니다.

사용자가 역할이나 그룹의 구성원인 경우 true를 반환합니다. 슈퍼 사용자는 모든 사용자의 멤버십을 확인할 수 있습니다. sys:secadmin 또는 sys:superuser 역할의 멤버인 일반 사용자는 모든 사용자의 멤버십을 확인할 수 있습니다. 그렇지 않으면 일반 사용자는 자신만 확인할 수 있습니다. 제공된 자격 증명이 없거나 현재 사용자가 역할에 액세스할 수 없는 경우 Amazon Redshift는 오류를 전송합니다.

**데이터 공유 고려 사항**

소비자 클러스터가 뷰, RLS 정책 또는 DDM 정책과 같이 이 함수를 참조하는 공유 객체를 쿼리하면 함수는 소비자 클러스터의 보안 컨텍스트를 사용하여 평가합니다. 소비자의 로컬 사용자, 역할 및 그룹 멤버십에 따라 생산자 클러스터에 정의된 결과가 아닌 결과가 결정됩니다. 생산자에 구현된 것과 동일한 권한 컨텍스트를 적용하려는 경우 해당 역할 이름, 그룹 이름 및 사용자 멤버십이 소비자 클러스터에 존재하고 생산자의 역할과 일치하는지 확인합니다.

## 구문
<a name="r_USER_IS_MEMBER_OF-synopsis"></a>

```
user_is_member_of( user_name,  role_name | group_name)
```

## 인수
<a name="r_USER_IS_MEMBER_OF-arguments"></a>

 *user\$1name*   
사용자의 이름입니다.

 *role\$1name*   
역할의 이름.

 *group\$1name*   
그룹 이름입니다.

## 반환 타입
<a name="r_USER_IS_MEMBER_OF-return-type"></a>

BOOLEAN을 반환합니다.

## 예제
<a name="r_USER_IS_MEMBER_OF-example"></a>

다음 쿼리는 사용자가 role1의 멤버가 아니라는 것을 확인하는 쿼리입니다.

```
SELECT user_is_member_of('reguser', 'role1');

 user_is_member_of
-------------------
           False
```

# version
<a name="r_VERSION"></a>

 VERSION 함수는 현재 설치된 릴리스에 대한 정보와 함께 마지막에 특정 Amazon Redshift 버전 정보를 반환합니다.

**참고**  
CURRENT\$1SCHEMA는 리더 노드 함수이기 때문에 사용자 생성 테이블, STL 또는 STV 시스템 테이블, SVV 또는 SVL 시스템 뷰를 참조하는 경우에는 오류를 반환합니다.

## 구문
<a name="r_VERSION-synopsis"></a>

```
VERSION()
```

## 반환 타입
<a name="r_VERSION-return-type"></a>

CHAR 또는 VARCHAR 문자열을 반환합니다.

## 예제
<a name="r_VERSION-examples"></a>

다음 예제에서는 현재 클러스터의 클러스터 버전 정보를 보여줍니다.

```
select version();
```

```
 version
 ------------------------------------------------------------------------------------------------------------------------               
 PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.12103
```

여기서 `1.0.12103`은 클러스터 버전 번호입니다.

**참고**  
클러스터가 최신 클러스터 버전으로 업데이트되도록 설정하려면 [유지 관리 기간](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-maintenance-windows)을 조정합니다.

# 예약어
<a name="r_pg_keywords"></a>

다음은 Amazon Redshift 예약어 목록입니다. 이러한 예약어는 구분된 식별자(큰따옴표)와 함께 사용할 수 있습니다.

**참고**  
START 및 CONNECT는 예약어가 아니지만, 쿼리에서 START 및 CONNECT를 테이블 별칭으로 사용하는 경우에는 런타임 시 오류가 발생하지 않도록 구분된 식별자 또는 AS를 사용하세요.

자세한 내용은 [이름 및 식별자](r_names.md) 단원을 참조하십시오.

```
AES128
AES256
ALL
ALLOWOVERWRITE
ANALYSE
ANALYZE
AND
ANY
ARRAY
AS
ASC
AUTHORIZATION
AZ64
BACKUP
BETWEEN
BINARY
BLANKSASNULL
BOTH
BYTEDICT
BZIP2
CASE
CAST
CHECK
COLLATE
COLUMN
CONSTRAINT
CREATE
CREDENTIALS
CROSS
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
CURRENT_USER_ID
DEFAULT
DEFERRABLE
DEFLATE
DEFRAG
DELTA
DELTA32K
DESC
DISABLE
DISTINCT
DO
ELSE
EMPTYASNULL
ENABLE
ENCODE
ENCRYPT     
ENCRYPTION
END
EXCEPT
EXPLICIT
FALSE
FOR
FOREIGN
FREEZE
FROM
FULL
GLOBALDICT256
GLOBALDICT64K
GRANT
GROUP
GZIP
HAVING
IDENTITY
IGNORE
ILIKE
IN
INITIALLY
INNER
INTERSECT
INTERVAL
INTO
IS
ISNULL
JOIN
LEADING
LEFT
LIKE
LIMIT
LOCALTIME
LOCALTIMESTAMP
LUN
LUNS
LZO
LZOP
MINUS
MOSTLY16
MOSTLY32
MOSTLY8
NATURAL
NEW
NOT
NOTNULL
NULL
NULLS
OFF
OFFLINE
OFFSET
OID
OLD
ON
ONLY
OPEN
OR
ORDER
OUTER
OVERLAPS
PARALLEL
PARTITION
PERCENT
PERMISSIONS
PIVOT
PLACING
PRIMARY
RAW
READRATIO
RECOVER
REFERENCES
REJECTLOG
RESORT
RESPECT
RESTORE
RIGHT
SELECT
SESSION_USER
SIMILAR
SNAPSHOT 
SOME
SYSDATE
SYSTEM
TABLE
TAG
TDES
TEXT255
TEXT32K
THEN
TIMESTAMP
TO
TOP
TRAILING
TRUE
TRUNCATECOLUMNS
UNION
UNIQUE
UNNEST
UNPIVOT
USER
USING
VERBOSE
WALLET
WHEN
WHERE
WITH
WITHOUT
```