

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon QLDB PartiQL 참조
<a name="ql-reference"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB는 [PartiQL](https://partiql.org/) 쿼리 언어의 *하위 집합*을 지원합니다. 다음 항목에서는 PartiQL의 QLDB 구현을 설명합니다.

**참고**  
QLDB는 일부 PartiQL 작업을 지원하지 않습니다.
QLDB의 모든 PartiQL 문에는 [Amazon QLDB 할당량 및 제한](limits.md#limits.fixed)에 정의된 대로 트랜잭션 한도가 적용됩니다.
이 참조는 QLDB 콘솔 또는 QLDB 쉘에서 수동으로 실행하는 PartiQL 문의 기본 구문과 사용 예제를 제공합니다. QLDB 드라이버를 사용하여 유사한 명령문을 프로그래밍 방식으로 실행하는 방법을 보여주는 코드 예제는 [드라이버 시작하기](getting-started-driver.md)의 자습서를 참조하세요.

**Topics**
+ [PartiQL이란?](#ql-reference.what-is)
+ [Amazon QLDB의 PartiQL](#ql-reference.in-qldb)
+ [QLDB의 PartiQL 빠른 팁](#ql-reference.tips)
+ [PartiQL 참조 규칙](ql-reference.conventions.md)
+ [데이터 타입](ql-reference.data-types.md)
+ [QLDB 문서](ql-reference.docs.md)
+ [PartiQL을 사용하여 Ion 쿼리하기](ql-reference.query.md)
+ [PartiQL 명령](ql-reference.statements.md)
+ [PartiQL 함수](ql-functions.md)
+ [PartiQL 저장 프로시저](ql-stored-procedures.md)
+ [PartiQL 연산자](ql-operators.md)
+ [예약어](ql-reference.reserved.md)
+ [Amazon Ion 참조](ion.md)

## PartiQL이란?
<a name="ql-reference.what-is"></a>

*PartiQL*은 구조화 데이터, 반구조화 데이터 및 중첩 데이터를 포함하는 여러 데이터 저장소에 걸쳐 SQL 호환 쿼리 액세스를 제공합니다. Amazon 내에서 널리 사용되고 있으며 이제 QLDB를 AWS 서비스포함한 많은의 일부로 사용할 수 있습니다.

PartiQL 사양과 핵심 쿼리 언어에 대한 자습서는 [PartiQL 설명서](https://partiql.org/docs.html)를 참조하세요.

PartiQL은 [SQL-92](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 버전을 확장하여 Amazon Ion 데이터 형식의 문서를 지원합니다. Amazon Ion에 대한 자세한 내용은 [Amazon QLDB의 Amazon Ion 데이터 형식 참조](ion.md) 섹션을 참조하세요.

## Amazon QLDB의 PartiQL
<a name="ql-reference.in-qldb"></a>

QLDB에서 PartiQL 쿼리를 실행하려면 다음 중 하나를 사용할 수 있습니다.
+ for *QLDB의 PartiQL 편집기* AWS Management Console 
+ 명령줄 QLDB 쉘
+ 프로그래밍 방식으로 쿼리를 실행하는 AWS 제공된 QLDB 드라이버

이러한 메서드를 사용하여 QLDB에 액세스하는 방법에 대한 자세한 내용은 [Amazon QLDB 액세스](accessing.md) 섹션을 참조하세요.

특정 테이블에서 각 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md)을 참조하세요.

## QLDB의 PartiQL 빠른 팁
<a name="ql-reference.tips"></a>

다음은 QLDB에서 PartiQL을 사용하기 위한 팁과 모범 사례를 간략하게 요약한 것입니다.
+ **동시성 및 트랜잭션 제한 이해** - `SELECT` 쿼리를 포함한 모든 명령문은 30초의 트랜잭션 시간 제한을 포함하여 [OCC(Optimistic Concurrency Control)](concurrency.md) 충돌 및 [트랜잭션 제한](limits.md#limits.fixed)의 영향을 받습니다.
+ **인덱스 사용** - 카디널리티가 높은 인덱스를 사용하고 대상 쿼리를 실행하여 명령문을 최적화하고 전체 테이블 스캔을 방지합니다. 자세한 내용은 [쿼리 성능 최적화](working.optimize.md) 섹션을 참조하세요.
+ **동등 조건자 사용** - 인덱싱된 조회에는 *동등* 연산자(`=` 또는 `IN`)가 필요합니다. 부등 연산자(`<`, `>`, `LIKE`, `BETWEEN`)는 인덱싱된 조회에 적합하지 않으며 테이블 전체를 스캔해야 합니다.
+ **내부 조인만 사용** - QLDB는 내부 조인만 지원합니다. 가장 좋은 방법은 조인하려는 각 테이블에 대해 인덱싱된 필드를 조인하는 것입니다. 조인 기준과 동등 조건자 모두에 대해 높은 카디널리티 인덱스를 선택하세요.

# Amazon QLDB PartiQL 참조 규칙
<a name="ql-reference.conventions"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

이번 섹션에서는 *Amazon QLDB PartiQL 참조*에서 설명한 PartiQL 명령, 함수 및 표현식의 구문을 작성하는 데 사용되는 규칙에 대해 설명합니다. 이러한 규칙을 PartiQL 쿼리 언어 자체의 [구문 및 시맨틱](ql-reference.query.md#ql-reference.query.syntax)과 혼동하지 마세요.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/qldb/latest/developerguide/ql-reference.conventions.html)

# Amazon QLDB의 데이터 유형
<a name="ql-reference.data-types"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB는 문서를 [Amazon Ion](ion.md) 형식으로 저장합니다. Amazon Ion은 JSON의 상위 집합인 데이터 직렬화 형식(텍스트 형식과 이진 인코딩 형식 모두)입니다. 다음 표는 QLDB 문서에서 사용할 수 있는 Ion 데이터 유형을 나열합니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/qldb/latest/developerguide/ql-reference.data-types.html)

전체 설명 및 값 형식 세부 정보가 포함된 Ion 코어 데이터 유형의 전체 목록은 Amazon GitHub 사이트의 [Ion 사양 문서](http://amzn.github.io/ion-docs/docs/spec.html)를 참조하세요.

# Amazon QLDB 문서
<a name="ql-reference.docs"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB는 데이터 레코드를 문서로 저장합니다. 문서는 테이블에 삽입되는 [Amazon Ion](ion.md) `struct` 객체입니다. Ion 사양은 [Amazon Ion GitHub](http://amzn.github.io/ion-docs/docs/spec.html) 사이트를 참조하세요.

**Topics**
+ [Ion 문서 구조](#ql-reference.docs.ion)
+ [PartiQL-Ion 유형 매핑](#ql-reference.docs.types)
+ [문서 ID](#ql-reference.docs.id)

## Ion 문서 구조
<a name="ql-reference.docs.ion"></a>

JSON과 마찬가지로 QLDB 문서는 다음과 같은 구조의 이름-값 쌍으로 구성됩니다.

```
{
  name1: value1,
  name2: value2,
  name3: value3,
  ...
  nameN: valueN
}
```

이름은 심볼 토큰이며 값에는 제한이 없습니다. 각 이름-값 쌍을 *필드*라고 합니다. 필드 값은 컨테이너 유형(중첩 구조체, 목록, 구조체 목록)을 비롯한 모든 Ion [데이터 타입](ql-reference.data-types.md)이 될 수 있습니다.

또한 JSON과 마찬가지로 `struct`는 중괄호(`{...}`)로 표시되고 `list`는 대괄호(`[...]`)로 표시됩니다. 다음 예제는 [Amazon QLDB 콘솔 시작하기](getting-started.md)의 표본 데이터에서 다양한 유형의 값이 포함된 문서입니다.

```
{
    VIN: "1N4AL11D75C109151",
    LicensePlateNumber: "LEWISR261LL",
    State: "WA",
    City: "Seattle",
    PendingPenaltyTicketAmount: 90.25,
    ValidFrom: 2017-08-21T,
    ValidTo: 2020-05-11T,
    Owners: {
        PrimaryOwner: { PersonId: "294jJ3YUoH1IEEm8GSabOs" },
        SecondaryOwners: [{ PersonId: "5Ufgdlnj06gF5CWcOIu64s" }]
    }
}
```

**중요**  
Ion에서 큰따옴표는 문자열 값을 나타내고 따옴표가 없는 기호는 필드 이름을 나타냅니다. 그러나 PartiQL에서 작은따옴표는 문자열과 필드 이름을 모두 나타냅니다.  
이러한 구문 차이로 인해 PartiQL 쿼리 언어는 SQL 호환성을 유지하고 Amazon Ion 데이터 형식은 JSON 호환성을 유지할 수 있습니다. QLDB에서 PartiQL의 구문 및 시맨틱에 대한 자세한 내용은 [PartiQL을 사용하여 Ion 쿼리하기](ql-reference.query.md) 섹션을 참조하세요.

## PartiQL-Ion 유형 매핑
<a name="ql-reference.docs.types"></a>

QLDB에서 PartiQL은 SQL의 유형 시스템을 확장하여 Ion 데이터 모델을 포괄합니다. 이 매핑은 다음과 같이 설명됩니다.
+ SQL 스칼라 유형은 해당 Ion 유형에 의해 적용됩니다. 예시:
  + `CHAR` 및 `VARCHAR`는 Ion `string` 유형에 매핑되는 유니코드 시퀀스입니다.
  + `NUMBER`는 Ion `decimal` 유형에 매핑됩니다.
+ Ion의 `struct` 타입은 전통적으로 테이블 *행*을 나타내는 SQL 튜플과 동일합니다.
  + 그러나 콘텐츠가 열려 있고 스키마가 없는 경우 SQL 튜플의 순서가 지정된 특성(예: `SELECT *` 출력 순서)에 의존하는 쿼리는 지원되지 않습니다.
+ `NULL` 외에도 PartiQL에는 `MISSING` 유형이 있습니다. 이는 `NULL`의 전문화로 필드가 부족함을 나타냅니다. Ion `struct` 필드가 희소할 수 있으므로 이 유형이 필요합니다.

## 문서 ID
<a name="ql-reference.docs.id"></a>

QLDB는 테이블에 삽입하는 각 문서에 *문서 ID*를 할당합니다. 모든 시스템 할당 ID는 Base62로 인코딩된 문자열(예: `3Qv67yjXEwB9SjmvkuG6Cp`)로 표시되는 범용 고유 식별자(UUID)입니다. 자세한 내용은 [Amazon QLDB의 고유 ID](working.unique-id.md)을 참조하세요.

각 문서 *개정*은 문서 ID와 0으로 시작하는 버전 번호의 조합으로 고유하게 식별됩니다.

문서 ID 및 버전 필드는 문서의 메타데이터에 포함되며, *커밋된 보기*(테이블의 시스템 정의 뷰)에서 쿼리할 수 있습니다. QLDB 뷰에 대한 자세한 내용은 [핵심 개념](ledger-structure.md) 섹션을 참조하세요. 메타데이터에 대해 자세히 알아보려면 [문서 메타데이터 쿼리](working.metadata.md) 섹션을 참조하세요.

# Amazon QLDB에서 PartiQL을 사용한 Ion 쿼리
<a name="ql-reference.query"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 데이터를 쿼리할 때는 PartiQL 형식으로 명령문을 작성하지만 QLDB는 Amazon Ion 형식으로 결과를 반환합니다. PartiQL은 SQL과 호환되도록 고안된 반면, Ion은 JSON의 확장입니다. 이로 인해 쿼리 명령문의 데이터를 표기하는 방식과 쿼리 결과가 표시되는 방식 간에 구문상의 차이가 발생합니다.

이 섹션에서는 [QLDB 콘솔](console_QLDB.md) 또는 [QLDB 쉘](data-shell.md)을 사용하여 PartiQL 문을 수동으로 실행하기 위한 기본 구문과 의미를 설명합니다.

**작은 정보**  
프로그래밍 방식으로 PartiQL 쿼리를 실행하는 경우 가장 좋은 방법은 매개 변수가 있는 명령문을 사용하는 것입니다. 명령문에서 물음표(`?`)를 바인드 변수 자리 표시자로 사용하면 이러한 구문 규칙을 피할 수 있습니다. 또한 이 방법이 더 안전하고 효율적입니다.  
자세한 내용은 *드라이버 시작하기*에서 다음 자습서를 참조하세요.  
Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
.NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

**Topics**
+ [구문 및 시맨틱](#ql-reference.query.syntax)
+ [백틱 표기법](#ql-reference.query.backtick)
+ [경로 탐색](#ql-reference.query.pathing)
+ [별칭](#ql-reference.query.aliasing)
+ [PartiQL 사양](#ql-reference.query.spec)

## 구문 및 시맨틱
<a name="ql-reference.query.syntax"></a>

QLDB 콘솔 또는 QLDB 쉘을 사용하여 Ion 데이터를 쿼리하는 경우 PartiQL의 기본 구문과 시맨틱은 다음과 같습니다.

**대소문자 구분**  
필드 이름, 테이블 이름, 원장 이름을 비롯한 모든 QLDB 시스템 개체 이름은 대소문자를 구분합니다.

**문자열 값**  
Ion에서 큰따옴표(`"..."`)는 [문자열](https://amzn.github.io/ion-docs/docs/spec.html#string)을 나타냅니다.  
PartiQL에서 작은따옴표(`'...'`)는 문자열을 나타냅니다.

**기호 및 식별자**  
Ion에서 작은따옴표(`'...'`)는 [기호](https://amzn.github.io/ion-docs/docs/spec.html#symbol)를 나타냅니다. Ion에서 *식별자*라고 하는 기호 중 일부는 따옴표가 없는 텍스트로 표시됩니다.  
PartiQL에서 큰따옴표(`"..."`)는 따옴표로 묶인 PartiQL 식별자(예: 테이블 이름으로 사용되는 [예약어](ql-reference.reserved.md))를 나타냅니다. 따옴표가 없는 텍스트는 예약어가 아닌 테이블 이름과 같은 일반 PartiQL 식별자를 나타냅니다.

**Ion 리터럴**  
모든 Ion 리터럴은 PartiQL 문에서 백틱(``...``)으로 표시할 수 있습니다.

**필드 이름**  
Ion 필드 이름은 대소문자를 구분합니다. PartiQL을 사용하면 DML 문에서 필드 이름을 작은따옴표로 표시할 수 있습니다. 이는 PartiQL의 `cast` 함수를 사용하여 심볼을 정의하는 것에 대한 간단한 대안입니다. 또한 백틱을 사용하여 리터럴 Ion 심볼을 나타내는 것보다 직관적입니다.

### Literal
<a name="ql-reference.query.literals"></a>

PartiQL 쿼리 언어의 리터럴은 다음과 같이 Ion 데이터 유형에 해당합니다.

**Scalar**  
해당하는 경우 [PartiQL-Ion 유형 매핑](ql-reference.docs.md#ql-reference.docs.types) 섹션에 설명된 대로 SQL 구문을 따르세요. 예시:  
+ `5`
+ `'foo'`
+ `null`

**Struct**  
다양한 형식 및 기타 데이터 모델에서 튜플 또는 객체라고도 합니다.  
중괄호(`{...}`)로 표시되며 `struct` 요소는 쉼표로 구분됩니다.  
+ `{ 'id' : 3, 'arr': [1, 2] }`

**List**  
배열이라고도 합니다.  
대괄호(`[...]`)로 표시되며 목록 요소는 쉼표로 구분됩니다.  
+ `[ 1, 'foo' ]`

**Bag**  
PartiQL의 순서가 지정되지 않은 컬렉션입니다.  
양각 괄호(`<<...>>`)로 표시되며, 백 요소는 쉼표로 구분됩니다. QLDB에서는 테이블을 백으로 생각할 수 있습니다. 하지만 백은 테이블의 문서 내에 중첩될 수 없습니다.  
+ `<< 1, 'foo' >>`

### 예제
<a name="ql-reference.query.example"></a>

다음은 다양한 Ion 유형을 사용하는 `INSERT` 문 구문의 예입니다.

```
INSERT INTO VehicleRegistration VALUE
{
    'VIN' : 'KM8SRDHF6EU074761', --string
    'RegNum' : 1722, --integer
    'State' : 'WA',
    'City' : 'Kent',
    'PendingPenaltyTicketAmount' : 130.75, --decimal
    'Owners' : { --nested struct
        'PrimaryOwner' : { 'PersonId': '294jJ3YUoH1IEEm8GSabOs' },
        'SecondaryOwners' : [ --list of structs
            { 'PersonId' : '1nmeDdLo3AhGswBtyM1eYh' },
            { 'PersonId': 'IN7MvYtUjkp1GMZu0F6CG9' }
        ]
    },
    'ValidFromDate' : `2017-09-14T`, --Ion timestamp literal with day precision
    'ValidToDate' : `2020-06-25T`
}
```

## 백틱 표기법
<a name="ql-reference.query.backtick"></a>

PartiQL은 모든 Ion 데이터 유형을 완벽하게 지원하므로 백틱을 사용하지 않고도 어떤 명령문이든 작성할 수 있습니다. 하지만 이 Ion 리터럴 구문을 사용하면 명령문을 더 명확하고 간결하게 만들 수 있는 경우도 있습니다.

예를 들어, Ion 타임스탬프와 기호 값이 있는 문서를 삽입하려면 순수 PartiQL 구문만 사용하여 다음 명령문을 작성할 수 있습니다.

```
INSERT INTO myTable VALUE
{
    'myTimestamp': to_timestamp('2019-09-04T'),
    'mySymbol': cast('foo' as symbol)
}
```

이는 매우 장황하므로 대신 백틱을 사용하여 문을 단순화할 수 있습니다.

```
INSERT INTO myTable VALUE
{
    'myTimestamp': `2019-09-04T`,
    'mySymbol': `foo`
}
```

전체 구조를 백틱으로 묶어 키 입력을 몇 번 더 줄일 수도 있습니다.

```
INSERT INTO myTable VALUE
`{
    myTimestamp: 2019-09-04T,
    mySymbol: foo
}`
```

**중요**  
문자열과 기호는 PartiQL에서 서로 다른 클래스입니다. 즉, 텍스트가 같더라도 동일하지는 않습니다. 예를 들어, 다음 PartiQL 식은 다른 Ion 값으로 평가됩니다.  

```
'foo'
```

```
`foo`
```

## 경로 탐색
<a name="ql-reference.query.pathing"></a>

DML(데이터 조작 언어) 또는 쿼리 문을 작성할 때 경로 단계를 사용하여 중첩 구조 내의 필드에 액세스할 수 있습니다. PartiQL은 상위 구조의 필드 이름에 액세스하는 데 사용할 수 있는 점 표기법을 지원합니다. 다음 예제에서는 상위 `Vehicle`의 `Model` 필드에 액세스합니다.

```
Vehicle.Model
```

목록의 특정 요소에 접근하려면 대괄호 연산자를 사용하여 0으로 시작하는 서수를 표시할 수 있습니다. 다음 예제에서는 서수 `2`를 사용하여 `SecondaryOwners` 요소에 액세스합니다. 즉, 이 요소가 목록의 세 번째 요소입니다.

```
SecondaryOwners[2]
```

## 별칭
<a name="ql-reference.query.aliasing"></a>

QLDB는 개방형 콘텐츠 및 스키마를 지원합니다. 따라서 명령문의 특정 필드에 액세스할 때 기대하는 결과를 얻을 수 있는 가장 좋은 방법은 별칭을 사용하는 것입니다. 예를 들어 명시적 별칭을 지정하지 않으면 시스템은 `FROM` 소스에 대해 암시적 별칭을 생성합니다.

```
SELECT VIN FROM Vehicle
--is rewritten to
SELECT Vehicle.VIN FROM Vehicle AS Vehicle
```

하지만 필드 이름 충돌로 인한 결과는 예측할 수 없습니다. `VIN`로 이름이 지정된 다른 필드가 문서 내 중첩된 구조에 있는 경우 이 쿼리에서 반환되는 `VIN` 값을 보면 놀라울 수 있습니다. 가장 좋은 방법은 다음 문을 대신 작성하는 것입니다. 이 쿼리는 `v`를 `Vehicle` 테이블 범위의 별칭으로 선언합니다. `AS` 키워드는 선택 사항입니다.

```
SELECT v.VIN FROM Vehicle [ AS ] v
```

별칭은 문서 내 중첩된 컬렉션에 경로를 지정할 때 특히 유용합니다. 예를 들어, 다음 명령문은 `o`를 컬렉션 `VehicleRegistration.Owners` 범위의 별칭으로 선언합니다.

```
SELECT o.SecondaryOwners
FROM VehicleRegistration AS r, @r.Owners AS o
```

여기서 이 `@` 문자는 엄밀히 따지자면 선택 사항입니다. 하지만 이는 `Owners`이라는 다른 컬렉션(있는 경우)이 아니라 `VehicleRegistration` 안에 `Owners` 구조를 적용하고자 한다는 것을 명시적으로 나타냅니다.

## PartiQL 사양
<a name="ql-reference.query.spec"></a>

PartiQL 쿼리 언어에 대한 자세한 내용은 [PartiQL 사양](https://partiql.org/assets/PartiQL-Specification.pdf)을 참조하세요.

# Amazon QLDB의 PartiQL 명령
<a name="ql-reference.statements"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

PartiQL은 SQL-92 버전을 확장하여 Amazon Ion 데이터 형식의 문서를 지원합니다. Amazon QLDB에서는 다음 PartiQL 명령을 지원합니다.

특정 테이블에서 각 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md)을 참조하세요.

**참고**  
QLDB는 모든 PartiQL 명령을 지원하지 않습니다.
QLDB의 모든 PartiQL 문에는 [Amazon QLDB 할당량 및 제한](limits.md#limits.fixed)에 정의된 대로 트랜잭션 한도가 적용됩니다.
이 참조는 QLDB 콘솔 또는 QLDB 쉘에서 수동으로 실행하는 PartiQL 문의 기본 구문과 사용 예제를 제공합니다. 지원되는 프로그래밍 언어를 사용하여 유사한 명령문을 실행하는 방법을 보여주는 코드 예제는 [드라이버 시작하기](getting-started-driver.md)의 자습서를 참조하세요.

## DDL(데이터 정의 언어) 문
<a name="ql-functions.statements.ddl"></a>

DDL(*데이터 정의 언어*) 는 테이블 및 인덱스와 같은 데이터베이스 개체를 관리하는 데 사용하는 PartiQL 문 집합입니다. DDL을 사용하여 이러한 객체를 만들고 삭제합니다.
+ [CREATE INDEX](ql-reference.create-index.md)
+ [CREATE TABLE](ql-reference.create-table.md)
+ [DROP INDEX](ql-reference.drop-index.md)
+ [DROP TABLE](ql-reference.drop-table.md)
+ [UNDROP TABLE](ql-reference.undrop-table.md)

## DML(데이터 조작 언어) 문
<a name="ql-functions.statements.dml"></a>

DML(*데이터 조작 언어*)는 QLDB 테이블의 데이터를 관리하는 데 사용하는 PartiQL 문 집합입니다. DML 문을 사용하여 테이블의 데이터를 추가, 수정 또는 삭제할 수 있습니다.

지원되는 DML 및 쿼리 언어 문은 다음과 같습니다.
+ [DELETE](ql-reference.delete.md)
+ [FROM (INSERT, REMOVE, 또는 SET)](ql-reference.from.md)
+ [INSERT](ql-reference.insert.md)
+ [SELECT](ql-reference.select.md)
+ [UPDATE](ql-reference.update.md)

# Amazon QLDB에서 CREATE INDEX 명령
<a name="ql-reference.create-index"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `CREATE INDEX` 명령을 사용하여 테이블의 문서 필드에 대한 인덱스를 생성합니다.

특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**중요**  
QLDB는 문서를 효율적으로 조회하기 위한 인덱스가 필요합니다. 인덱스가 없으면 QLDB는 문서를 읽을 때 전체 테이블 스캔을 수행해야 합니다. 이로 인해 동시성 충돌 및 트랜잭션 시간 초과를 포함하여 대규모 테이블에서 성능 문제가 발생할 수 있습니다.  
인덱싱된 필드 또는 문서 ID(예: `=` 또는 `IN`)에서 동등 *연산자*를 사용하여 `WHERE` 조건자 절이 포함된 문을 실행하는 것이 좋습니다. 자세한 내용은 [쿼리 성능 최적화](working.optimize.md)을 참조하세요.

인덱스를 생성할 때는 다음 제약 조건에 유의하세요.
+ 인덱스는 단일 최상위 필드에만 생성할 수 있습니다. 복합, 중첩, 고유 및 함수 기반 인덱스는 지원되지 않습니다.
+ `list` 및 `struct`를 비롯한 모든 [Ion 데이터 유형](ql-reference.data-types.md)에 대해 인덱스를 생성할 수 있습니다. 그러나 Ion 유형에 관계없이 전체 Ion 값이 같아야만 인덱스 조회를 수행할 수 있습니다. 예를 들어 `list` 형식을 인덱스로 사용하는 경우 목록 내에서 한 항목씩 인덱스 검색을 수행할 수 없습니다.
+ 동등 조건자(예: `WHERE indexedField = 123` 또는 `WHERE indexedField IN (456, 789)`)를 사용할 때만 쿼리 성능이 향상됩니다.

  QLDB는 쿼리 조건자의 부등을 인정하지 않습니다. 따라서 범위 필터링된 스캔은 구현되지 않습니다.
+ 인덱싱된 필드 이름은 대소문자를 구분하며 최대 128자입니다.
+ QLDB에서의 인덱스 생성은 비동기적으로 이루어집니다. 비어 있지 않은 테이블에서 인덱스 빌드를 완료하는 데 걸리는 시간은 테이블 크기에 따라 다릅니다. 자세한 내용은 [인덱스 관리](working.manage-indexes.md)을 참조하세요.

**Topics**
+ [구문](#ql-reference.create-index.syntax)
+ [파라미터](#ql-reference.create-index.parameters)
+ [반환 값](#ql-reference.create-index.return)
+ [예시](#ql-reference.create-index.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.create-index.driver)

## 구문
<a name="ql-reference.create-index.syntax"></a>

```
CREATE INDEX ON table_name (field)
```

## 파라미터
<a name="ql-reference.create-index.parameters"></a>

***table\$1name***  
인덱스를 생성하려는 테이블의 이름입니다. 이미 있는 테이블이어야 합니다.  
테이블 이름은 대/소문자를 구분합니다.

***필드***  
인덱스를 생성할 문서 필드 이름입니다. 필드는 최상위 속성이어야 합니다.  
인덱싱된 필드 이름은 대소문자를 구분하며 최대 128자입니다.  
`list`및 `struct`를 비롯한 모든 [Amazon Ion 데이터 유형](ql-reference.data-types.md)에 인덱스를 생성할 수 있습니다. 그러나 Ion 유형에 관계없이 전체 Ion 값이 같아야만 인덱스 조회를 수행할 수 있습니다. 예를 들어 `list` 형식을 인덱스로 사용하는 경우 목록 내에서 한 항목씩 인덱스 검색을 수행할 수 없습니다.

## 반환 값
<a name="ql-reference.create-index.return"></a>

`tableId` - 인덱스를 생성한 테이블의 고유 ID입니다.

## 예시
<a name="ql-reference.create-index.examples"></a>

```
CREATE INDEX ON VehicleRegistration (LicensePlateNumber)
```

```
CREATE INDEX ON Vehicle (VIN)
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.create-index.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB에서 CREATE TABLE
<a name="ql-reference.create-table"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `CREATE TABLE` 명령을 사용하여 새 테이블을 생성합니다.

테이블에는 네임스페이스가 없는 단순한 이름이 있습니다. QLDB는 개방형 콘텐츠를 지원하며 스키마를 적용하지 않으므로 테이블을 만들 때 속성이나 데이터 유형을 정의하지 않습니다.

**참고**  
원장에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md)을 참조하세요.

**Topics**
+ [구문](#ql-reference.create-table.syntax)
+ [파라미터](#ql-reference.create-table.parameters)
+ [반환 값](#ql-reference.create-table.return)
+ [테이블 생성 시 태그 지정](#ql-reference.create-table.tagging)
+ [예시](#ql-reference.create-table.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.create-table.driver)

## 구문
<a name="ql-reference.create-table.syntax"></a>

```
CREATE TABLE table_name [ WITH (aws_tags = `{'key': 'value'}`) ]
```

## 파라미터
<a name="ql-reference.create-table.parameters"></a>

***table\$1name***  
생성할 테이블의 고유 이름입니다. 같은 이름의 활성 테이블이 이미 존재하지 않아야 합니다. 다음은 명명 제약 조건입니다.  
+ 1\$1128자의 영숫자 또는 밑줄만 포함해야 합니다.
+ 첫 번째 글자에는 문자 또는 밑줄이 있어야 합니다.
+ 영숫자와 밑줄을 조합하여 나머지 문자에 사용할 수 있습니다.
+ 대소문자를 구분합니다.
+ QLDB PartiQL [예약어](ql-reference.reserved.md)가 아니어야 합니다.

**'*key*': '*value*'**  
(선택 사항)생성 중에 테이블 리소스에 연결할 태그입니다. 각 태그는 키-값 쌍으로 정의되며, 키와 값은 각각 작은 따옴표로 표시됩니다. 각 키-값 쌍은 백틱으로 표시되는 Amazon Ion 구조 내에 정의됩니다.  
*테이블 생성 시 태그 지정은 현재 ‭`STANDARD` 권한 모드의 원장에만 지원됩니다.*

## 반환 값
<a name="ql-reference.create-table.return"></a>

`tableId` - 생성한 테이블의 고유 ID입니다.

## 테이블 생성 시 태그 지정
<a name="ql-reference.create-table.tagging"></a>

**참고**  
 테이블 생성 시 태그 지정은 현재 ‭`STANDARD` 권한 모드의 원장에만 지원됩니다.

선택적으로 `CREATE TABLE` 문에 태그를 지정하여 테이블 리소스에 태그를 지정할 수 있습니다. 태그에 대한 자세한 내용은 [Amazon QLDB 리소스 태그 지정](tagging.md) 섹션을 참조하세요. 다음 예제에서는 ‭`environment=production`‬ 태그가 있는 ‭`Vehicle`‬이라는 테이블을 생성합니다.

```
CREATE TABLE Vehicle WITH (aws_tags = `{'environment': 'production'}`)
```

생성 시 테이블에 태그를 지정하려면 `qldb:PartiQLCreateTable` 및 `qldb:TagResource` 작업 모두에 액세스할 수 있어야 합니다. QLDB 리소스 권한에 대한 자세한 내용은 [Amazon QLDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 섹션을 참조하세요.

리소스를 생성하는 동안 태그를 지정하면 리소스 생성 후 사용자 지정 태그 지정 스크립트를 실행할 필요가 없습니다. 테이블에 태그가 지정된 후 해당 태그를 기반으로 테이블에 대한 액세스를 제어할 수 있습니다. 예를 들어 특정 태그가 있는 테이블에만 전체 액세스 권한을 부여할 수 있습니다. JSON 정책의 예는 [테이블 태그를 기반으로 하는 모든 작업에 대한 전체 액세스 권한](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-full-tags) 섹션을 참조하세요.

## 예시
<a name="ql-reference.create-table.examples"></a>

```
CREATE TABLE VehicleRegistration
```

```
CREATE TABLE Vehicle WITH (aws_tags = `{'environment': 'development'}`)
```

```
CREATE TABLE Vehicle WITH (aws_tags = `{'key1': 'value1', 'key2': 'value2'}`)
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.create-table.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 DELETE 명령
<a name="ql-reference.delete"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `DELETE` 명령을 사용하여 문서의 새로운 최종 개정본을 생성하여 활성 문서를 테이블에서 삭제된 것으로 표시합니다. 이 최종 개정본은 문서가 삭제되었음을 나타냅니다. 이 작업을 수행하면 문서의 수명 주기가 종료되므로 동일한 문서 ID로 더 이상 문서 개정본을 만들 수 없습니다.

이 작업은 되돌릴 수 없습니다. [기록 함수](working.history.md#working.history.function)를 사용하여 삭제된 문서의 개정 기록을 계속 쿼리할 수 있습니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.delete.syntax)
+ [파라미터](#ql-reference.delete.parameters)
+ [반환 값](#ql-reference.delete.return)
+ [예시](#ql-reference.delete.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.delete.driver)

## 구문
<a name="ql-reference.delete.syntax"></a>

```
DELETE FROM table_name [ AS table_alias ] [ BY id_alias ]
[ WHERE condition ]
```

## 파라미터
<a name="ql-reference.delete.parameters"></a>

***table\$1name***  
삭제할 데이터가 포함된 사용자 테이블 이름입니다. DML 문은 기본 [사용자 뷰](working.userdata.md)에서만 지원됩니다. 각 명령문은 단일 테이블에서만 실행할 수 있습니다.

**AS *table\$1alias***  
(선택 사항)삭제할 테이블에 속하는 사용자 정의 별칭입니다. `AS` 키워드는 선택 사항입니다.

**BY *id\$1alias***  
(선택 사항)결과 집합에 있는 각 문서의 `id` 메타데이터 필드에 바인딩되는 사용자 정의 별칭입니다. `BY` 키워드를 사용하여 `FROM` 절에서 별칭을 선언해야 합니다. 이는 기본 사용자 뷰를 쿼리하면서 [문서 ID](working.metadata.md)를 기준으로 필터링하려는 경우에 유용합니다. 자세한 내용은 [BY 절을 사용하여 문서 ID 쿼리하기](working.metadata.by-clause.md)을 참조하세요.

**WHERE *condition***  
삭제할 문서의 선택 기준입니다.

**참고**  
`WHERE` 절을 생략하면 테이블 내의 모든 문서가 삭제됩니다.

## 반환 값
<a name="ql-reference.delete.return"></a>

`documentId` - 삭제한 각 문서의 고유 ID입니다.

## 예시
<a name="ql-reference.delete.examples"></a>

```
DELETE FROM VehicleRegistration AS r
WHERE r.VIN = '1HVBBAANXWH544237'
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.delete.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 DROP INDEX 명령
<a name="ql-reference.drop-index"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `DROP INDEX` 명령을 사용하여 테이블의 인덱스를 삭제합니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.drop-index.syntax)
+ [파라미터](#ql-reference.drop-index.parameters)
+ [반환 값](#ql-reference.drop-index.return)
+ [예시](#ql-reference.drop-index.examples)

## 구문
<a name="ql-reference.drop-index.syntax"></a>

```
DROP INDEX "indexId" ON table_name WITH (purge = true)
```

**참고**  
이 `WITH (purge = true)` 절은 모든 `DROP INDEX` 명령문에 필수이며 `true`는 현재 지원되는 유일한 값입니다.  
`purge` 키워드는 대소문자를 구분하며 모두 소문자여야 합니다.

## 파라미터
<a name="ql-reference.drop-index.parameters"></a>

**"*indexId*"**  
삭제할 인덱스의 고유 ID로, 큰따옴표로 표시됩니다.

**ON *table\$1name***  
인덱스를 삭제할 테이블의 이름입니다.

## 반환 값
<a name="ql-reference.drop-index.return"></a>

`tableId` - 인덱스를 삭제한 테이블의 고유 ID입니다.

## 예시
<a name="ql-reference.drop-index.examples"></a>

```
DROP INDEX "4tPW3fUhaVhDinRgKRLhGU" ON VehicleRegistration WITH (purge = true)
```

# Amazon QLDB의 DROP TABLE 명령
<a name="ql-reference.drop-table"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `DROP TABLE` 명령을 사용하여 기존 테이블을 비활성화합니다. [UNDROP TABLE](ql-reference.undrop-table.md) 명령문을 사용하여 테이블을 다시 활성화할 수 있습니다. 테이블을 비활성화하거나 다시 활성화해도 해당 문서나 인덱스에는 영향을 주지 않습니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.drop-table.syntax)
+ [파라미터](#ql-reference.drop-table.parameters)
+ [반환 값](#ql-reference.drop-table.return)
+ [예시](#ql-reference.drop-table.examples)

## 구문
<a name="ql-reference.drop-table.syntax"></a>

```
DROP TABLE table_name
```

## 파라미터
<a name="ql-reference.drop-table.parameters"></a>

***table\$1name***  
비활성화할 테이블 이름입니다. 테이블이 이미 존재하고 `ACTIVE` 상태여야 합니다.

## 반환 값
<a name="ql-reference.drop-table.return"></a>

`tableId` - 비활성화한 테이블의 고유 ID입니다.

## 예시
<a name="ql-reference.drop-table.examples"></a>

```
DROP TABLE VehicleRegistration
```

# Amazon QLDB의 FROM (INSERT, REMOVE, 또는 SET) 명령
<a name="ql-reference.from"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 `FROM`로 시작하는 문은 문서 내에 특정 요소를 삽입하고 제거할 수 있는 PartiQL 확장입니다. [UPDATE](ql-reference.update.md) 명령과 마찬가지로 이 명령문을 사용하여 문서의 기존 요소를 업데이트할 수도 있습니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.from.syntax)
+ [파라미터](#ql-reference.from.parameters)
+ [중첩된 컬렉션](#ql-reference.from.nested-collections)
+ [반환 값](#ql-reference.from.return)
+ [예시](#ql-reference.from.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.from.driver)

## 구문
<a name="ql-reference.from.syntax"></a>

**FROM-INSERT**

기존 문서에 새 요소를 삽입합니다. 새 최상위 문서를 테이블에 삽입하려면 [INSERT](ql-reference.insert.md)를 사용해야 합니다.

```
FROM table_name [ AS table_alias ] [ BY id_alias ]
[ WHERE condition ]
INSERT INTO element VALUE data [ AT key_name ]
```

**FROM-REMOVE**

문서 내의 기존 요소를 제거하거나 최상위 문서 전체를 제거합니다. 후자는 의미상 기존 [DELETE](ql-reference.delete.md) 구문과 동일합니다.

```
FROM table_name [ AS table_alias ] [ BY id_alias ]
[ WHERE condition ]
REMOVE element
```

**FROM-SET**

문서 내 하나 이상의 요소를 업데이트합니다. 요소가 없으면 해당 요소가 삽입됩니다. 이는 기존 [UPDATE](ql-reference.update.md) 구문과 의미상 동일합니다.

```
FROM table_name [ AS table_alias ] [ BY id_alias ]
[ WHERE condition ]
SET element = data [, element = data, ... ]
```

## 파라미터
<a name="ql-reference.from.parameters"></a>

***table\$1name***  
수정할 데이터가 포함된 사용자 테이블의 이름입니다. DML 문은 기본 [사용자 뷰](working.userdata.md)에서만 지원됩니다. 각 명령문은 단일 테이블에서만 실행할 수 있습니다.  
이 절에는 지정된 테이블 내에 중첩된 컬렉션을 하나 이상 포함할 수도 있습니다. 자세한 내용은 [중첩된 컬렉션](#ql-reference.from.nested-collections) 섹션을 참조하세요.

**AS *table\$1alias***  
(선택 사항)수정할 테이블 전체에 적용되는 사용자 정의 별칭입니다. `SET`, `REMOVE`, `INSERT INTO` 또는 `WHERE` 절에 사용되는 모든 테이블 별칭은 `FROM` 절에서 선언되어야 합니다. `AS` 키워드는 선택 사항입니다.

**BY *id\$1alias***  
(선택 사항)결과 집합에 있는 각 문서의 `id` 메타데이터 필드에 바인딩되는 사용자 정의 별칭입니다. `BY` 키워드를 사용하여 `FROM` 절에서 별칭을 선언해야 합니다. 이는 기본 사용자 뷰를 쿼리하면서 [문서 ID](working.metadata.md)를 기준으로 필터링하려는 경우에 유용합니다. 자세한 내용은 [BY 절을 사용하여 문서 ID 쿼리하기](working.metadata.by-clause.md)을 참조하세요.

**WHERE *condition***  
수정할 문서의 선택 기준입니다.  
`WHERE` 절을 생략하면 테이블의 모든 문서가 수정됩니다.

***element***  
생성하거나 수정할 문서 요소입니다.

***data***  
요소의 새 값입니다.

**AT *key\$1name***  
수정할 문서에 추가할 키 이름입니다. 키 이름과 함께 해당하는 `VALUE`을 지정해야 합니다. 이는 문서 내 특정 위치에 새 값 `AT`을 삽입하는 데 필요합니다.

## 중첩된 컬렉션
<a name="ql-reference.from.nested-collections"></a>

단일 테이블에서만 DML 문을 실행할 수 있지만 해당 테이블의 문서 내에 있는 중첩된 컬렉션을 추가 소스로 지정할 수 있습니다. 중첩 컬렉션에 대해 선언한 각 별칭은 `WHERE` 절과 `SET`, `INSERT INTO` 또는 `REMOVE` 절에서 사용할 수 있습니다.

예를 들어, 다음 명령문의 `FROM` 소스에는 `VehicleRegistration` 테이블과 중첩된 `Owners.SecondaryOwners` 구조가 모두 포함됩니다.

```
FROM VehicleRegistration r, @r.Owners.SecondaryOwners o
WHERE r.VIN = '1N4AL11D75C109151' AND o.PersonId = 'abc123'
SET o.PersonId = 'def456'
```

이 예제는 `'1N4AL11D75C109151'`의 `VIN`가 있는 `VehicleRegistration` 문서 내에서 `'abc123'`의 `PersonId`가 있는 `SecondaryOwners` 목록의 특정 요소를 업데이트합니다. 이 표현식을 사용하면 인덱스가 아닌 값을 기준으로 목록의 요소를 지정할 수 있습니다.

## 반환 값
<a name="ql-reference.from.return"></a>

`documentId` - 업데이트 또는 삭제한 각 문서의 고유 ID입니다.

## 예시
<a name="ql-reference.from.examples"></a>

문서 내 요소를 수정합니다. 요소가 존재하지 않는 경우 해당 요소가 삽입됩니다.

```
FROM Vehicle AS v
WHERE v.VIN = '1N4AL11D75C109151' AND v.Color = 'Silver'
SET v.Color = 'Shiny Gray'
```

시스템에서 할당한 문서 `id` 메타데이터 필드에 요소와 필터를 수정하거나 삽입합니다.

```
FROM Vehicle AS v BY v_id
WHERE v_id = 'documentId'
SET v.Color = 'Shiny Gray'
```

문서 내 `Owners.SecondaryOwners` 목록에 있는 *첫 번째* 요소의 `PersonId` 필드를 수정합니다.

```
FROM VehicleRegistration AS r
WHERE r.VIN = '1N4AL11D75C109151'
SET r.Owners.SecondaryOwners[0].PersonId = 'abc123'
```

문서 내 기존 요소를 제거합니다.

```
FROM Person AS p
WHERE p.GovId = '111-22-3333'
REMOVE p.Address
```

테이블에서 전체 문서를 제거합니다.

```
FROM Person AS p
WHERE p.GovId = '111-22-3333'
REMOVE p
```

`VehicleRegistration` 테이블의 문서 내 `Owners.SecondaryOwners` 목록의 *첫 번째* 요소를 제거합니다.

```
FROM VehicleRegistration AS r
WHERE r.VIN = '1N4AL11D75C109151'
REMOVE r.Owners.SecondaryOwners[0]
```

`{'Mileage':26500}`를 `Vehicle` 테이블의 문서 내에 최상위 이름-값 쌍으로 삽입합니다.

```
FROM Vehicle AS v 
WHERE v.VIN = '1N4AL11D75C109151'
INSERT INTO v VALUE 26500 AT 'Mileage'
```

`{'PersonId':'abc123'}`를 `VehicleRegistration` 테이블의 문서 `Owners.SecondaryOwners` 필드에 이름-값 쌍으로 추가합니다. 이 명령문이 유효하려면 `Owners.SecondaryOwners`이 이미 존재하고 목록 데이터 유형이어야 합니다. 그렇지 않으면 `INSERT INTO` 절에 `AT` 키워드가 필요합니다.

```
FROM VehicleRegistration AS r 
WHERE r.VIN = '1N4AL11D75C109151'
INSERT INTO r.Owners.SecondaryOwners VALUE { 'PersonId' : 'abc123' }
```

`{'PersonId':'abc123'}`를 문서 내 기존 `Owners.SecondaryOwners` 목록의 *첫 번째* 요소로 삽입합니다.

```
FROM VehicleRegistration AS r 
WHERE r.VIN = '1N4AL11D75C109151'
INSERT INTO r.Owners.SecondaryOwners VALUE {'PersonId' : 'abc123'} AT 0
```

문서 내 기존 `Owners.SecondaryOwners` 목록에 여러 개의 이름-값 쌍을 추가합니다.

```
FROM VehicleRegistration AS r 
WHERE r.VIN = '1N4AL11D75C109151'
INSERT INTO r.Owners.SecondaryOwners << {'PersonId' : 'abc123'}, {'PersonId' : 'def456'} >>
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.from.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 INSERT 명령
<a name="ql-reference.insert"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `INSERT` 명령을 사용하여 하나 이상의 Amazon Ion 문서를 테이블에 추가합니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.insert.syntax)
+ [파라미터](#ql-reference.insert.parameters)
+ [반환 값](#ql-reference.insert.return)
+ [예시](#ql-reference.insert.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.insert.driver)

## 구문
<a name="ql-reference.insert.syntax"></a>

단일 문서를 삽입합니다.

```
INSERT INTO table_name VALUE document
```

여러 문서를 삽입합니다.

```
INSERT INTO table_name << document, document, ... >>
```

## 파라미터
<a name="ql-reference.insert.parameters"></a>

***table\$1name***  
데이터를 삽입할 사용자 테이블의 이름입니다. 이미 있는 테이블이어야 합니다. DML 문은 기본 [사용자 뷰](working.userdata.md)에서만 지원됩니다.

***document***  
유효한 [QLDB 문서](ql-reference.docs.md)입니다. 문서를 최소 하나 이상 지정해야 합니다. 여러 문서는 쉼표로 구분해야 합니다.  
문서는 중괄호(`{...}`)로 표시해야 합니다.  
문서의 각 필드 이름은 PartiQL에서 *작은* 따옴표(`'...'`)로 표시할 수 있는 대소문자를 구분하는 Ion 기호입니다.  
문자열 값도 PartiQL에서 *작은* 따옴표(`'...'`)로 표시될 수 있습니다.  
모든 Ion 리터럴은 백틱(``...``)으로 표시할 수 있습니다.

**참고**  
이중 꺾쇠 괄호(`<<...>>`)는 정렬되지 않은 컬렉션(PartiQL에서는 *백*이라고 함)을 나타내며 여러 문서를 삽입하려는 경우에만 필요합니다.

## 반환 값
<a name="ql-reference.insert.return"></a>

`documentId` - 삽입한 각 문서의 고유 ID입니다.

## 예시
<a name="ql-reference.insert.examples"></a>

단일 문서를 삽입합니다.

```
INSERT INTO VehicleRegistration VALUE
{
    'VIN' : 'KM8SRDHF6EU074761', --string
    'RegNum' : 1722, --integer
    'State' : 'WA',
    'City' : 'Kent',
    'PendingPenaltyTicketAmount' : 130.75, --decimal
    'Owners' : { --nested struct
        'PrimaryOwner' : { 'PersonId': '294jJ3YUoH1IEEm8GSabOs' },
        'SecondaryOwners' : [ --list of structs
            { 'PersonId' : '1nmeDdLo3AhGswBtyM1eYh' },
            { 'PersonId': 'IN7MvYtUjkp1GMZu0F6CG9' }
        ]
    },
    'ValidFromDate' : `2017-09-14T`, --Ion timestamp literal with day precision
    'ValidToDate' : `2020-06-25T`
}
```

이 명령문은 삽입한 문서의 고유 ID를 다음과 같이 반환합니다.

```
{
    documentId: "2kKuOPNB07D2iTPBrUTWGl"
}
```

여러 문서를 삽입합니다.

```
INSERT INTO Person << 
{
    'FirstName' : 'Raul',
    'LastName' : 'Lewis',
    'DOB' : `1963-08-19T`,
    'GovId' : 'LEWISR261LL',
    'GovIdType' : 'Driver License',
    'Address' : '1719 University Street, Seattle, WA, 98109'
},
{
    'FirstName' : 'Brent',
    'LastName' : 'Logan',
    'DOB' : `1967-07-03T`,
    'GovId' : 'LOGANB486CG',
    'GovIdType' : 'Driver License',
    'Address' : '43 Stockert Hollow Road, Everett, WA, 98203'
},
{
    'FirstName' : 'Alexis',
    'LastName' : 'Pena',
    'DOB' : `1974-02-10T`,
    'GovId' : '744 849 301',
    'GovIdType' : 'SSN',
    'Address' : '4058 Melrose Street, Spokane Valley, WA, 99206'
}
>>
```

이 명령문은 삽입한 각 문서의 고유 ID를 다음과 같이 반환합니다.

```
{
    documentId: "6WXzLscsJ3bDWW97Dy8nyp"
},
{
    documentId: "35e0ToZyTGJ7LGvcwrkX65"
},
{
    documentId: "BVHPcH612o7JROQ4yP8jiH"
}
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.insert.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 SELECT 명령
<a name="ql-reference.select"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `SELECT` 명령을 사용하여 하나 이상의 테이블에서 데이터를 검색합니다. QLDB의 모든 `SELECT` 쿼리는 트랜잭션에서 처리되며 [트랜잭션 시간 초과 제한](limits.md#limits.fixed)이 적용됩니다.

결과 순서는 구체적이지 않으며 각 `SELECT` 쿼리마다 다를 수 있습니다. QLDB의 모든 쿼리에 대해 결과 순서에 의존해서는 안 됩니다.

특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**주의**  
인덱싱된 조회 없이 QLDB에서 쿼리를 실행하면 전체 테이블 스캔이 호출됩니다. PartiQL은 SQL과 호환되므로 이러한 쿼리를 지원합니다. 하지만 QLDB의 프로덕션 사용 사례에 대해서는 테이블 스캔을 실행하지 *마세요.*. 테이블 스캔은 동시성 충돌 및 트랜잭션 시간 초과를 포함하여 대규모 테이블에서 성능 문제를 일으킬 수 있습니다.  
인덱싱된 필드 또는 문서 ID(예: `WHERE indexedField = 123` 또는 `WHERE indexedField IN (456, 789)`)에서 동등 *연산자*를 사용하여 `WHERE` 조건자 절이 포함된 문을 실행하는 것이 좋습니다. 자세한 내용은 [쿼리 성능 최적화](working.optimize.md)을 참조하세요.

**Topics**
+ [구문](#ql-reference.select.syntax)
+ [파라미터](#ql-reference.select.parameters)
+ [조인](#ql-reference.select.joins)
+ [중첩된 쿼리 한도](#ql-reference.select.subqueries)
+ [예시](#ql-reference.select.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.select.driver)

## 구문
<a name="ql-reference.select.syntax"></a>

```
SELECT [ VALUE ] expression [ AS field_alias ] [, expression, ... ]
FROM source [ AS source_alias ] [ AT idx_alias ] [ BY id_alias ] [, source, ... ]
[ WHERE condition ]
```

## 파라미터
<a name="ql-reference.select.parameters"></a>

**값**  
값을 튜플 구조로 래핑하는 대신 쿼리에서 원시 데이터 유형 값을 반환하도록 하는 표현식의 한정자입니다.

***expression***  
`*` 와일드카드에서 형성된 프로젝션 또는 결과 집합에 있는 하나 이상의 필드로 구성된 프로젝션 목록입니다. 표현은 [PartiQL 함수](ql-functions.md)에 대한 호출 또는 [PartiQL 연산자](ql-operators.md)에서 수정되는 필드로 구성될 수 있습니다.

**AS *field\$1alias***  
(선택 사항)최종 결과 집합에 사용되는 필드의 임시 사용자 정의 별칭입니다. `AS` 키워드는 옵션입니다.  
단순 필드 이름이 아닌 표현식에 별칭을 지정하지 않으면 결과 집합은 해당 필드에 기본 이름을 적용합니다.

**FROM *source***  
쿼리할 소스입니다. 현재 지원되는 소스는 테이블 이름, 테이블 간 [내부 조인](#ql-reference.select.joins), 중첩된 `SELECT` 쿼리([중첩된 쿼리 한도](#ql-reference.select.subqueries)에 적용), 테이블에 대한 [기록 함수](working.history.md) 호출 뿐입니다.  
소스를 최소 하나 이상 지정해야 합니다. 여러 소스는 쉼표로 구분해야 합니다.

**AS *source\$1alias***  
(선택 사항)쿼리할 소스의 범위를 지정하는 사용자 정의 별칭입니다. `SELECT` 또는 `WHERE` 절에 사용되는 모든 소스 별칭은 `FROM` 절에 선언되어야 합니다. `AS` 키워드는 선택 사항입니다.

**AT *idx\$1alias***  
(선택 사항)소스 목록 내 각 요소의 인덱스(서수) 번호에 바인딩되는 사용자 정의 별칭입니다. `AT` 키워드를 사용하여 `FROM` 절에서 별칭을 선언해야 합니다.

**BY *id\$1alias***  
(선택 사항)결과 집합에 있는 각 문서의 `id` 메타데이터 필드에 바인딩되는 사용자 정의 별칭입니다. `BY` 키워드를 사용하여 `FROM` 절에서 별칭을 선언해야 합니다. 이는 기본 사용자 뷰를 쿼리하면서 [문서 ID](working.metadata.md)를 기반으로 프로젝션하거나 필터링하려는 경우에 유용합니다. 자세한 내용은 [BY 절을 사용하여 문서 ID 쿼리하기](working.metadata.by-clause.md)을 참조하세요.

**WHERE *condition***  
쿼리의 선택 기준 및 조인 기준(해당하는 경우)입니다.

**참고**  
`WHERE` 절을 생략하면 테이블의 모든 문서가 검색됩니다.

## 조인
<a name="ql-reference.select.joins"></a>

현재 내부 조인만 지원됩니다. 다음과 같이 명시적 `INNER JOIN` 절을 사용하여 내부 조인 쿼리를 작성할 수 있습니다. 이 구문에서는 `JOIN`와 `ON`가 쌍을 이루어야 하며 `INNER` 키워드는 선택 사항입니다.

```
SELECT expression
FROM table1 AS t1 [ INNER ] JOIN table2 AS t2
ON t1.element = t2.element
```

또는 다음과 같이 암시적 구문을 사용하여 내부 조인을 작성할 수 있습니다.

```
SELECT expression
FROM table1 AS t1, table2 AS t2
WHERE t1.element = t2.element
```

## 중첩된 쿼리 한도
<a name="ql-reference.select.subqueries"></a>

`SELECT` 표현식과 `FROM` 소스 내에서 중첩된 쿼리(하위 쿼리)를 작성할 수 있습니다. 주요 제한 사항은 가장 바깥쪽 쿼리만 글로벌 데이터베이스 환경에 액세스할 수 있다는 것입니다. 예를 들어, `VehicleRegistration` 및 `Person` 테이블이 있는 원장이 있다고 가정해 보겠습니다. 다음 중첩 쿼리는 내부 `SELECT`가 `Person`에 액세스를 시도하므로 유효하지 않습니다.

```
SELECT r.VIN,
    (SELECT p.PersonId FROM Person AS p WHERE p.PersonId = r.Owners.PrimaryOwner.PersonId) AS PrimaryOwner
FROM VehicleRegistration AS r
```

반면 다음 중첩 쿼리는 유효합니다.

```
SELECT r.VIN, (SELECT o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner
FROM VehicleRegistration AS r
```

## 예시
<a name="ql-reference.select.examples"></a>

다음 쿼리는 `IN` 연산자를 사용하는 표준 `WHERE` 술어 절이 포함된 기본 `SELECT` 전체 와일드카드를 보여줍니다.

```
SELECT * FROM Vehicle
WHERE VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

다음은 문자열 필터를 사용한 `SELECT` 프로젝션을 보여줍니다.

```
SELECT FirstName, LastName, Address 
FROM Person 
WHERE Address LIKE '%Seattle%'
AND GovId = 'LEWISR261LL'
```

다음은 중첩된 데이터를 평면화하는 상관 하위 쿼리를 보여줍니다. 참고로 이 `@` 문자는 기술적으로 선택 사항입니다. 하지만 이 표현은 `Owners`(존재하는 경우)이라는 이름의 다른 컬렉션이 아니라 `VehicleRegistration` 내에 중첩된 `Owners` 구조를 적용하고 싶다는 것을 명시적으로 나타냅니다. 자세한 내용은 *데이터 및 기록 다루기* 장의 [중첩된 데이터](working.userdata.md#working.userdata.nested) 섹션을 참조하세요.

```
SELECT 
    r.VIN, 
    o.SecondaryOwners
FROM
    VehicleRegistration AS r, @r.Owners AS o
WHERE
    r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

다음은 중첩된 데이터를 프로젝션하는 `SELECT` 목록의 하위 쿼리와 암시적 내부 조인을 보여줍니다.

```
SELECT
    v.Make, 
    v.Model, 
    (SELECT VALUE o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner
FROM 
    VehicleRegistration AS r, Vehicle AS v
WHERE 
    r.VIN = v.VIN AND r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

다음은 명시적 내부 조인을 보여줍니다.

```
SELECT
    v.Make, 
    v.Model, 
    r.Owners
FROM 
    VehicleRegistration AS r JOIN Vehicle AS v
ON
    r.VIN = v.VIN
WHERE
    r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')
```

다음은 `BY` 절을 사용한 문서 `id` 메타데이터 필드의 프로젝션을 보여줍니다.

```
SELECT
    r_id,
    r.VIN
FROM
    VehicleRegistration AS r BY r_id
WHERE
    r_id = 'documentId'
```

다음은 `BY` 절을 사용하여 `PersonId` 및 문서 `id` 필드의 `DriversLicense` 및 `Person` 테이블에 각각 조인합니다.

```
SELECT * FROM DriversLicense AS d INNER JOIN Person AS p BY pid
ON d.PersonId = pid
WHERE pid = 'documentId'
```

다음은 [커밋된 뷰](working.metadata.md#working.metadata.committed)을 사용하여 `PersonId` 및 문서 `id` 필드의 `DriversLicense` 및 `Person` 테이블에 각각 조인합니다.

```
SELECT * FROM DriversLicense AS d INNER JOIN _ql_committed_Person AS cp
ON d.PersonId = cp.metadata.id
WHERE cp.metadata.id = 'documentId'
```

다음은 테이블 `VehicleRegistration` 내 문서에 대한 `Owners.SecondaryOwners` 목록에 있는 각 사람의 `PersonId` 및 인덱스(서수)를 반환합니다.

```
SELECT s.PersonId, owner_idx
FROM VehicleRegistration AS r, @r.Owners.SecondaryOwners AS s AT owner_idx
WHERE r.VIN = 'KM8SRDHF6EU074761'
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.select.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 UPDATE 명령
<a name="ql-reference.update"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `UPDATE` 명령을 사용하여 문서 내 하나 이상의 요소의 값을 수정합니다. 요소가 없으면 해당 요소가 삽입됩니다.

[FROM (INSERT, REMOVE, 또는 SET)](ql-reference.from.md) 명령문처럼 이 명령을 사용하여 문서 내에 특정 요소를 명시적으로 삽입하고 제거할 수도 있습니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.update.syntax)
+ [파라미터](#ql-reference.update.parameters)
+ [반환 값](#ql-reference.update.return)
+ [예시](#ql-reference.update.examples)
+ [드라이버를 사용하여 프로그래밍 방식으로 실행](#ql-reference.update.driver)

## 구문
<a name="ql-reference.update.syntax"></a>

**UPDATE-SET**

문서 내 하나 이상의 요소를 업데이트합니다. 요소가 없으면 해당 요소가 삽입됩니다. 이는 [FROM-SET](ql-reference.from.md) 문과 의미상 동일합니다.

```
UPDATE table_name [ AS table_alias ] [ BY id_alias ]
SET element = data [, element = data, ... ]
[ WHERE condition ]
```

**UPDATE-INSERT**

기존 문서에 새 요소를 삽입합니다. 새 최상위 문서를 테이블에 삽입하려면 [INSERT](ql-reference.insert.md)를 사용해야 합니다.

```
UPDATE table_name [ AS table_alias ] [ BY id_alias ]
INSERT INTO element VALUE data [ AT key_name ]
[ WHERE condition ]
```

**UPDATE-REMOVE**

문서 내의 기존 요소를 제거하거나 최상위 문서 전체를 제거합니다. 후자는 의미상 기존 [DELETE](ql-reference.delete.md) 구문과 동일합니다.

```
UPDATE table_name [ AS table_alias ] [ BY id_alias ]
REMOVE element
[ WHERE condition ]
```

## 파라미터
<a name="ql-reference.update.parameters"></a>

***table\$1name***  
수정할 데이터가 포함된 사용자 테이블의 이름입니다. DML 문은 기본 [사용자 뷰](working.userdata.md)에서만 지원됩니다. 각 명령문은 단일 테이블에서만 실행할 수 있습니다.

**AS *table\$1alias***  
(선택 사항)업데이트할 테이블에 속하는 사용자 정의 별칭입니다. `AS` 키워드는 선택 사항입니다.

**BY *id\$1alias***  
(선택 사항)결과 집합에 있는 각 문서의 `id` 메타데이터 필드에 바인딩되는 사용자 정의 별칭입니다. `BY` 키워드를 사용하여 `UPDATE` 절에서 별칭을 선언해야 합니다. 이는 기본 사용자 뷰를 쿼리하면서 [문서 ID](working.metadata.md)를 기준으로 필터링하려는 경우에 유용합니다. 자세한 내용은 [BY 절을 사용하여 문서 ID 쿼리하기](working.metadata.by-clause.md)을 참조하세요.

***element***  
생성하거나 수정할 문서 요소입니다.

***data***  
요소의 새 값입니다.

**AT *key\$1name***  
수정할 문서에 추가할 키 이름입니다. 키 이름과 함께 해당하는 `VALUE`을 지정해야 합니다. 이는 문서 내 특정 위치에 새 값 `AT`을 삽입하는 데 필요합니다.

**WHERE *condition***  
수정할 문서의 선택 기준입니다.

**참고**  
`WHERE` 절을 생략하면 테이블의 모든 문서가 수정됩니다.

## 반환 값
<a name="ql-reference.update.return"></a>

`documentId` - 업데이트한 각 문서의 고유 ID입니다.

## 예시
<a name="ql-reference.update.examples"></a>

문서의 필드를 업데이트합니다. 필드가 존재하지 않는 경우 해당 필드가 삽입됩니다.

```
UPDATE Person AS p
SET p.LicenseNumber = 'HOLLOR123ZZ'
WHERE p.GovId = '111-22-3333'
```

시스템에서 할당한 문서 `id` 메타데이터 필드를 기준으로 필터링합니다.

```
UPDATE Person AS p BY pid
SET p.LicenseNumber = 'HOLLOR123ZZ'
WHERE pid = 'documentId'
```

문서 전체를 덮어씁니다.

```
UPDATE Person AS p
SET p = {
    'FirstName' : 'Rosemarie',
    'LastName' : 'Holloway',
    'DOB' : `1977-06-18T`,
    'GovId' : '111-22-3333',
    'GovIdType' : 'Driver License',
    'Address' : '4637 Melrose Street, Ellensburg, WA, 98926'
}
WHERE p.GovId = '111-22-3333'
```

문서 내 `Owners.SecondaryOwners` 목록에 있는 *첫 번째* 요소의 `PersonId` 필드를 수정합니다.

```
UPDATE VehicleRegistration AS r
SET r.Owners.SecondaryOwners[0].PersonId = 'abc123'
WHERE r.VIN = '1N4AL11D75C109151'
```

`{'Mileage':26500}`를 `Vehicle` 테이블의 문서 내에 최상위 이름-값 쌍으로 삽입합니다.

```
UPDATE Vehicle AS v
INSERT INTO v VALUE 26500 AT 'Mileage'
WHERE v.VIN = '1N4AL11D75C109151'
```

`{'PersonId':'abc123'}`를 `VehicleRegistration` 테이블의 문서 `Owners.SecondaryOwners` 필드에 이름-값 쌍으로 추가합니다. 이 명령문이 유효하려면 `Owners.SecondaryOwners`이 이미 존재하고 목록 데이터 유형이어야 합니다. 그렇지 않으면 `INSERT INTO` 절에 `AT` 키워드가 필요합니다.

```
UPDATE VehicleRegistration AS r
INSERT INTO r.Owners.SecondaryOwners VALUE { 'PersonId' : 'abc123' }
WHERE r.VIN = '1N4AL11D75C109151'
```

`{'PersonId':'abc123'}`를 문서 내 기존 `Owners.SecondaryOwners` 목록의 *첫 번째* 요소로 삽입합니다.

```
UPDATE VehicleRegistration AS r
INSERT INTO r.Owners.SecondaryOwners VALUE {'PersonId' : 'abc123'} AT 0
WHERE r.VIN = '1N4AL11D75C109151'
```

문서 내 기존 `Owners.SecondaryOwners` 목록에 여러 개의 이름-값 쌍을 추가합니다.

```
UPDATE VehicleRegistration AS r
INSERT INTO r.Owners.SecondaryOwners << {'PersonId' : 'abc123'}, {'PersonId' : 'def456'} >>
WHERE r.VIN = '1N4AL11D75C109151'
```

문서 내 기존 요소를 제거합니다.

```
UPDATE Person AS p
REMOVE p.Address
WHERE p.GovId = '111-22-3333'
```

테이블에서 전체 문서를 제거합니다.

```
UPDATE Person AS p
REMOVE p
WHERE p.GovId = '111-22-3333'
```

`VehicleRegistration` 테이블의 문서 내 `Owners.SecondaryOwners` 목록의 *첫 번째* 요소를 제거합니다.

```
UPDATE VehicleRegistration AS r
REMOVE r.Owners.SecondaryOwners[0]
WHERE r.VIN = '1N4AL11D75C109151'
```

## 드라이버를 사용하여 프로그래밍 방식으로 실행
<a name="ql-reference.update.driver"></a>

QLDB 드라이버를 사용하여 이 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 *드라이버 시작하기*에서 다음 자습서를 참조하세요.
+ Java: [빠른 시작 자습서](driver-quickstart-java.md) \$1 [Cookbook 참조](driver-cookbook-java.md)
+ .NET: [빠른 시작 자습서](driver-quickstart-dotnet.md) \$1 [Cookbook 참조](driver-cookbook-dotnet.md)
+ Go: [빠른 시작 자습서](driver-quickstart-golang.md) \$1 [Cookbook 참조](driver-cookbook-golang.md)
+ Node.js: [빠른 시작 자습서](driver-quickstart-nodejs.md) \$1 [Cookbook 참조](driver-cookbook-nodejs.md)
+ Python: [빠른 시작 자습서](driver-quickstart-python.md) \$1 [Cookbook 참조](driver-cookbook-python.md)

# Amazon QLDB의 UNDROP TABLE 명령
<a name="ql-reference.undrop-table"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 `UNDROP TABLE` 명령을 사용하여 이전에 삭제한(즉, 비활성화된) 테이블을 다시 활성화합니다. 테이블을 비활성화하거나 다시 활성화해도 해당 문서나 인덱스에는 영향을 주지 않습니다.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [구문](#ql-reference.undrop-table.syntax)
+ [파라미터](#ql-reference.undrop-table.parameters)
+ [반환 값](#ql-reference.undrop-table.return)
+ [예시](#ql-reference.undrop-table.examples)

## 구문
<a name="ql-reference.undrop-table.syntax"></a>

```
UNDROP TABLE "tableId"
```

## 파라미터
<a name="ql-reference.undrop-table.parameters"></a>

**"*tableId*"**  
다시 활성화할 테이블의 고유 ID로, 큰따옴표로 표시됩니다.  
테이블은 이전에 삭제된 적이 있어야 합니다. 즉, 해당 테이블은 [시스템 카탈로그 테이블](working.catalog.md) `information_schema.user_tables`에 존재하며 `INACTIVE` 상태여야 합니다. 또한 동일한 이름을 가진 활성 기존 테이블이 없어야 합니다.

## 반환 값
<a name="ql-reference.undrop-table.return"></a>

`tableId` - 재활성화한 테이블의 고유 ID입니다.

## 예시
<a name="ql-reference.undrop-table.examples"></a>

```
UNDROP TABLE "5PLf9SXwndd63lPaSIa0O6"
```

# Amazon QLDB의 PartiQL 함수
<a name="ql-functions"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB의 PartiQL은 SQL 표준 함수의 다음과 같은 기본 제공 변형을 지원합니다.

**참고**  
이 목록에 포함되지 않은 SQL 함수는 현재 QLDB에 지원되지 않습니다.  
이 함수 참조는 PartiQL 설명서 [기본 제공 함수](https://github.com/partiql/partiql-lang-kotlin/blob/main/docs/wiki/documentation/Functions.md#built-in-functions)를 기반으로 합니다.

**알 수 없는 타입(null 및 누락) 전파**

달리 명시되지 않는 한, 이러한 함수는 모두 null 및 누락된 인수 값을 전파합니다. `NULL` 또는 `MISSING`의 *전파*는 함수 인수가 `NULL` 또는 `MISSING` 중 하나일 경우 반환하는 `NULL`로 정의됩니다. 다음은 이러한 전파의 예입니다.

```
CHAR_LENGTH(null)    -- null
CHAR_LENGTH(missing) -- null (also returns null)
```

## 집계 함수
<a name="ql-functions.aggregate"></a>
+ [AVG](ql-functions.avg.md)
+ [COUNT](ql-functions.count.md)
+ [MAX](ql-functions.max.md)
+ [MIN](ql-functions.min.md)
+ [SIZE](ql-functions.size.md)
+ [SUM](ql-functions.sum.md)

## 조건 함수
<a name="ql-functions.conditional"></a>
+ [COALESCE](ql-functions.coalesce.md)
+ [exists](ql-functions.exists.md)
+ [nullIF](ql-functions.nullif.md)

## 날짜 및 시간 함수
<a name="ql-functions.date"></a>
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [EXTRACT](ql-functions.extract.md)
+ [UTCNOW](ql-functions.utcnow.md)

## 스칼라 함수
<a name="ql-functions.scalar"></a>
+ [TXID](ql-functions.txid.md)

## 문자열 함수
<a name="ql-functions.string"></a>
+ [CHAR\$1LENGTH](ql-functions.char_length.md)
+ [CHARACTER\$1LENGTH](ql-functions.character_length.md)
+ [LOWER](ql-functions.lower.md)
+ [SUBSTRING](ql-functions.substring.md)
+ [TRIM](ql-functions.trim.md)
+ [UPPER](ql-functions.upper.md)

## 데이터 형식 지정 함수
<a name="ql-functions.formatting"></a>
+ [CAST](ql-functions.cast.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)

# Amazon QLDB의 AVG 함수
<a name="ql-functions.avg"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `AVG` 함수를 사용해 입력 표현식 값의 평균(산술 평균)을 반환합니다. 이 함수는 수치를 사용하고 null 또는 누락 값은 무시합니다.

## 구문
<a name="ql-functions.avg.syntax"></a>

```
AVG ( expression )
```

## 인수
<a name="ql-functions.avg.arguments"></a>

*expression*  
함수가 실행되는 숫자 데이터 타입의 필드 명칭 또는 표현식입니다.

## 데이터 타입
<a name="ql-functions.avg.data-types"></a>

지원되는 인수 타입:
+ `int`
+ `decimal`
+ `float`

반환 타입: `decimal`

## 예
<a name="ql-functions.avg.examples"></a>

```
SELECT AVG(r.PendingPenaltyTicketAmount) FROM VehicleRegistration r  -- 147.19
SELECT AVG(a) FROM << { 'a' : 1 }, { 'a': 2 }, { 'a': 3 } >>         -- 2.
```

## 관련 함수
<a name="ql-functions.avg.related"></a>
+ [COUNT](ql-functions.count.md)
+ [MAX](ql-functions.max.md)
+ [MIN](ql-functions.min.md)
+ [SIZE](ql-functions.size.md)
+ [SUM](ql-functions.sum.md)

# Amazon QLDB의 CAST 함수
<a name="ql-functions.cast"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `CAST` 함수를 사용하여 주어진 표현식을 값으로 평가하고 값을 지정된 대상 데이터 타입으로 변환합니다. 변환할 수 없는 경우 함수는 오류를 반환합니다.

## 구문
<a name="ql-functions.cast.syntax"></a>

```
CAST ( expression AS type )
```

## 인수
<a name="ql-functions.cast.arguments"></a>

*expression*  
함수가 변환하는 값으로 평가되는 파일 명칭 또는 표현식입니다. null 값을 변환하면 마찬가지로 null이 반환됩니다. 이 파라미터는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

*타입*  
변환할 대상 데이터 타입의 명칭입니다. 이 파라미터는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

## 반환 타입
<a name="ql-functions.cast.return-type"></a>

*type* 인수에 의해 지정된 데이터 타입.

## 예
<a name="ql-functions.cast.examples"></a>

다음 예는 알 수 없는 타입(`NULL` 또는`MISSING`)의 전파를 보여줍니다.

```
CAST(null    AS null)    -- null 
CAST(missing AS null)    -- null 
CAST(missing AS missing) -- missing
CAST(null    AS missing) -- missing
CAST(null    AS boolean) -- null (null AS any data type name results in null)
CAST(missing AS boolean) -- missing (missing AS any data type name results in missing)
```

알 수 없는 형식이 아닌 값은 `NULL` 또는 `MISSING`로 캐스팅할 수 없습니다.

```
CAST(true AS null)    -- error 
CAST(true AS missing) -- error
CAST(1    AS null)    -- error
CAST(1    AS missing) -- error
```

다음 예는 캐스팅 `AS boolean`을 보여줍니다.

```
CAST(true      AS boolean) -- true no-op
CAST(0         AS boolean) -- false
CAST(1         AS boolean) -- true
CAST(`1e0`     AS boolean) -- true (float)
CAST(`1d0`     AS boolean) -- true (decimal)
CAST('a'       AS boolean) -- false
CAST('true'    AS boolean) -- true (SqlName string 'true')
CAST(`'true'`  AS boolean) -- true (Ion symbol `'true'`)
CAST(`'false'` AS boolean) -- false (Ion symbol `'false'`)
```

다음 예는 캐스팅 `AS integer`을 보여줍니다.

```
CAST(true   AS integer) -- 1
CAST(false  AS integer) -- 0
CAST(1      AS integer) -- 1
CAST(`1d0`  AS integer) -- 1
CAST(`1d3`  AS integer) -- 1000
CAST(1.00   AS integer) -- 1
CAST(1.45   AS integer) -- 1
CAST(1.75   AS integer) -- 1
CAST('12'   AS integer) -- 12
CAST('aa'   AS integer) -- error
CAST(`'22'` AS integer) -- 22
CAST(`'x'`  AS integer) -- error
```

다음 예는 캐스팅 `AS float`을 보여줍니다.

```
CAST(true   AS float) -- 1e0
CAST(false  AS float) -- 0e0
CAST(1      AS float) -- 1e0
CAST(`1d0`  AS float) -- 1e0
CAST(`1d3`  AS float) -- 1000e0
CAST(1.00   AS float) -- 1e0
CAST('12'   AS float) -- 12e0
CAST('aa'   AS float) -- error
CAST(`'22'` AS float) -- 22e0
CAST(`'x'`  AS float) -- error
```

다음 예는 캐스팅 `AS decimal`을 보여줍니다.

```
CAST(true   AS decimal) -- 1.
CAST(false  AS decimal) -- 0.
CAST(1      AS decimal) -- 1.
CAST(`1d0`  AS decimal) -- 1. (REPL printer serialized to 1.)
CAST(`1d3`  AS decimal) -- 1d3
CAST(1.00   AS decimal) -- 1.00
CAST('12'   AS decimal) -- 12.
CAST('aa'   AS decimal) -- error
CAST(`'22'` AS decimal) -- 22.
CAST(`'x'`  AS decimal) -- error
```

다음 예는 캐스팅 `AS timestamp`을 보여줍니다.

```
CAST(`2001T`                      AS timestamp) -- 2001T
CAST('2001-01-01T'                AS timestamp) -- 2001-01-01T
CAST(`'2010-01-01T00:00:00.000Z'` AS timestamp) -- 2010-01-01T00:00:00.000Z
CAST(true                         AS timestamp) -- error
CAST(2001                         AS timestamp) -- error
```

다음 예는 캐스팅 `AS symbol`을 보여줍니다.

```
CAST(`'xx'`                     AS symbol) -- xx (`'xx'` is an Ion symbol)
CAST('xx'                       AS symbol) -- xx ('xx' is a string)
CAST(42                         AS symbol) -- '42'
CAST(`1e0`                      AS symbol) -- '1.0'
CAST(`1d0`                      AS symbol) -- '1'
CAST(true                       AS symbol) -- 'true'
CAST(false                      AS symbol) -- 'false'
CAST(`2001T`                    AS symbol) -- '2001T'
CAST(`2001-01-01T00:00:00.000Z` AS symbol) -- '2001-01-01T00:00:00.000Z'
```

다음 예는 캐스팅 `AS string`을 보여줍니다.

```
CAST(`'xx'`                     AS string) -- "xx" (`'xx'` is an Ion symbol)
CAST('xx'                       AS string) -- "xx" ('xx' is a string)
CAST(42                         AS string) -- "42"
CAST(`1e0`                      AS string) -- "1.0"
CAST(`1d0`                      AS string) -- "1"
CAST(true                       AS string) -- "true"
CAST(false                      AS string) -- "false"
CAST(`2001T`                    AS string) -- "2001T"
CAST(`2001-01-01T00:00:00.000Z` AS string) -- "2001-01-01T00:00:00.000Z"
```

다음 예는 캐스팅 `AS struct`을 보여줍니다.

```
CAST(`{ a: 1 }` AS struct) -- {a:1}
CAST(true       AS struct) -- err
```

다음 예는 캐스팅 `AS list`을 보여줍니다.

```
CAST(`[1, 2, 3]`        AS list) -- [1,2,3]
CAST(<<'a', { 'b':2 }>> AS list) -- ["a",{'b':2}]
CAST({ 'b':2 }          AS list) -- error
```

다음 예는 이전 예 중 일부를 포함하는 실행 가능한 명령문입니다.

```
SELECT CAST(true AS integer) FROM << 0 >>            -- 1
SELECT CAST('2001-01-01T' AS timestamp) FROM << 0 >> -- 2001-01-01T
SELECT CAST('xx' AS symbol) FROM << 0 >>             -- xx
SELECT CAST(42 AS string) FROM << 0 >>               -- "42"
```

## 관련 함수
<a name="ql-functions.cast.related"></a>
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)

# Amazon QLDB의 CHAR\$1LENGTH 함수
<a name="ql-functions.char_length"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `CHAR_LENGTH` 함수를 사용하여 지정된 문자열의 문자 수를 반환합니다. 여기서 *문자*는 단일 유니코드 코드 포인트로 정의됩니다.

## 구문
<a name="ql-functions.char_length.syntax"></a>

```
CHAR_LENGTH ( string )
```

`CHAR_LENGTH`는 [Amazon QLDB의 CHARACTER\$1LENGTH 함수](ql-functions.character_length.md)의 동의어입니다.

## 인수
<a name="ql-functions.char_length.arguments"></a>

*string*  
함수가 평가하는 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

## 반환 타입
<a name="ql-functions.char_length.return-type"></a>

`int`

## 예
<a name="ql-functions.char_length.examples"></a>

```
SELECT CHAR_LENGTH('') FROM << 0 >>        -- 0
SELECT CHAR_LENGTH('abcdefg') FROM << 0 >> -- 7
SELECT CHAR_LENGTH('eࠫ') FROM << 0 >>      -- 2 (because 'eࠫ' is two code points: the letter 'e' and combining character U+032B)
```

## 관련 함수
<a name="ql-functions.char_length.related"></a>
+ [LOWER](ql-functions.lower.md)
+ [SUBSTRING](ql-functions.substring.md)
+ [TRIM](ql-functions.trim.md)
+ [UPPER](ql-functions.upper.md)

# Amazon QLDB의 CHARACTER\$1LENGTH 함수
<a name="ql-functions.character_length"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

`CHAR_LENGTH` 함수의 동의어입니다.

[Amazon QLDB의 CHAR\$1LENGTH 함수](ql-functions.char_length.md)을 참조하세요.

# Amazon QLDB의 COALESCE 함수
<a name="ql-functions.coalesce"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 하나 이상의 인수 목록이 주어지면 `COALESCE` 함수를 사용하여 왼쪽에서 오른쪽 순으로 인수를 평가하고 알 수 없는 타입(`NULL` 또는`MISSING` )이 아닌 첫 번째 값을 반환합니다. 모든 인수 타입을 알 수 없는 경우 결과는 `NULL`입니다.

`COALESCE` 함수는 `NULL` 및 `MISSING`을 전파하지 않습니다.

## 구문
<a name="ql-functions.coalesce.syntax"></a>

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

## 인수
<a name="ql-functions.coalesce.arguments"></a>

*expression*  
함수가 평가하는 하나 이상의 필드 명칭 또는 표현식 목록입니다. 각 인수는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

## 반환 타입
<a name="ql-functions.coalesce.return-type"></a>

지원되는 모든 데이터 타입입니다. 반환 타입은 `NULL`이거낙 null이 아니고 누락되지 않은 값으로 평가되는 첫 번째 표현식의 타입과 동일합니다.

## 예
<a name="ql-functions.coalesce.examples"></a>

```
SELECT COALESCE(1, null) FROM << 0 >>         -- 1
SELECT COALESCE(null, null, 1) FROM << 0 >>   -- 1
SELECT COALESCE(null, 'string') FROM << 0 >>  -- "string"
```

## 관련 함수
<a name="ql-functions.coalesce.related"></a>
+ [exists](ql-functions.exists.md)
+ [nullIF](ql-functions.nullif.md)

# Amazon QLDB의 COUNT 함수
<a name="ql-functions.count"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `COUNT` 함수를 사용하여 주어진 표현식으로 정의된 문서 수를 반환합니다. 이 함수는 2가지 변형이 있습니다:
+ `COUNT(*)` - null 또는 누락 값의 포함 여부에 관계없이 대상 표의 모든 문서를 계수합니다.
+ `COUNT(expression)` - 특정 기존 필드 또는 표현식에서 null이 아닌 값을 가진 문서 수를 계수합니다.

**주의**  
`COUNT` 함수는 최적화되지 않았으므로 인덱싱된 조회 없이는 사용하지 않는 것이 좋습니다. 인덱싱된 조회 없이 QLDB에서 쿼리를 실행하면 전체 테이블 스캔이 호출됩니다. 이로 인해 동시성 충돌 및 트랜잭션 시간 초과를 포함하여 대규모 테이블에서 성능 문제가 발생할 수 있습니다.  
인덱싱된 필드 또는 문서 ID(예: `=` 또는 `IN`)에서 동등 *연산자*를 사용하여 `WHERE` 조건자 절이 포함된 문을 실행하는 것이 좋습니다. 자세한 내용은 [쿼리 성능 최적화](working.optimize.md)을 참조하세요.

## 구문
<a name="ql-functions.count.syntax"></a>

```
COUNT ( * | expression )
```

## 인수
<a name="ql-functions.count.arguments"></a>

*expression*  
함수가 실행되는 필드 명칭 또는 표현식. 이 파라미터는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

## 반환 타입
<a name="ql-functions.count.return-type"></a>

`int`

## 예
<a name="ql-functions.count.examples"></a>

```
SELECT COUNT(*) FROM VehicleRegistration r WHERE r.LicensePlateNumber = 'CA762X' -- 1
SELECT COUNT(r.VIN) FROM Vehicle r WHERE r.VIN = '1N4AL11D75C109151'             -- 1
SELECT COUNT(a) FROM << { 'a' : 1 }, { 'a': 2 }, { 'a': 3 } >>                   -- 3
```

## 관련 함수
<a name="ql-functions.count.related"></a>
+ [AVG](ql-functions.avg.md)
+ [MAX](ql-functions.max.md)
+ [MIN](ql-functions.min.md)
+ [SIZE](ql-functions.size.md)
+ [SUM](ql-functions.sum.md)

# Amazon QLDB의 DATE\$1ADD 함수
<a name="ql-functions.date_add"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `DATE_ADD` 함수를 사용하여 주어진 타임스탬프 값을 지정된 간격만큼 증가시킵니다.

## 구문
<a name="ql-functions.date_add.syntax"></a>

```
DATE_ADD( datetimepart, interval, timestamp )
```

## 인수
<a name="ql-functions.date_add.arguments"></a>

*datetimepart*  
함수가 실행되는 날짜 또는 시간 부분입니다. 이 파라미터는 다음 중 하나일 수 있습니다:  
+ `year`
+ `month`
+ `day`
+ `hour`
+ `minute`
+ `second`

*interval*  
주어진 *timestamp*에 추가할 간격을 지정하는 정수입니다. 음의 정수는 간격을 감산합니다.

*timestamp*  
함수가 증분하는 데이터 타입 `timestamp`의 필드 명칭 또는 표현식.  
Ion 타임스탬프 리터럴 값은 백틱(``...``)으로 표시할 수 있습니다. 형식 지정 세부 정보 및 타임스탬프 값의 예는 Amazon Ion 사양 문서의 [타임스탬프](https://amzn.github.io/ion-docs/docs/spec.html#timestamp)를 참조하세요.

## 반환 타입
<a name="ql-functions.date_add.return-type"></a>

`timestamp`

## 예
<a name="ql-functions.date_add.examples"></a>

```
DATE_ADD(year, 5, `2010-01-01T`)                -- 2015-01-01T
DATE_ADD(month, 1, `2010T`)                     -- 2010-02T (result adds precision as necessary)
DATE_ADD(month, 13, `2010T`)                    -- 2011-02T (2010T is equivalent to 2010-01-01T00:00:00.000Z)
DATE_ADD(day, -1, `2017-01-10T`)                -- 2017-01-09T
DATE_ADD(hour, 1, `2017T`)                      -- 2017-01-01T01:00Z
DATE_ADD(hour, 1, `2017-01-02T03:04Z`)          -- 2017-01-02T04:04Z
DATE_ADD(minute, 1, `2017-01-02T03:04:05.006Z`) -- 2017-01-02T03:05:05.006Z
DATE_ADD(second, 1, `2017-01-02T03:04:05.006Z`) -- 2017-01-02T03:04:06.006Z

-- Runnable statements
SELECT DATE_ADD(year, 5, `2010-01-01T`) FROM << 0 >> -- 2015-01-01T
SELECT DATE_ADD(day, -1, `2017-01-10T`) FROM << 0 >> -- 2017-01-09T
```

## 관련 함수
<a name="ql-functions.date_add.related"></a>
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [EXTRACT](ql-functions.extract.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)
+ [UTCNOW](ql-functions.utcnow.md)

# Amazon QLDB의 DATE\$1DIFF 함수
<a name="ql-functions.date_diff"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 `DATE_DIFF` 함수를 사용하여 주어진 두 타임스탬프의 지정된 날짜 부분 간의 차이를 반환합니다.

## 구문
<a name="ql-functions.date_diff.syntax"></a>

```
DATE_DIFF( datetimepart, timestamp1, timestamp2 )
```

## 인수
<a name="ql-functions.date_diff.arguments"></a>

*datetimepart*  
함수가 실행되는 날짜 또는 시간 부분입니다. 이 파라미터는 다음 중 하나일 수 있습니다:  
+ `year`
+ `month`
+ `day`
+ `hour`
+ `minute`
+ `second`

*timestamp1*, *timestamp2*  
함수가 비교하는 데이터 타입 `timestamp`의 두 개의 필드 명칭 또는 표현식입니다. *timestamp2*가 *timestamp1*보다 이후인 경우 결과는 양수입니다. *timestamp2*가 *timestamp1*보다 이전인 경우 결과는 음수입니다.  
Ion 타임스탬프 리터럴 값은 백틱(``...``)으로 표시할 수 있습니다. 형식 지정 세부 정보 및 타임스탬프 값의 예는 Amazon Ion 사양 문서의 [타임스탬프](https://amzn.github.io/ion-docs/docs/spec.html#timestamp)를 참조하세요.

## 반환 타입
<a name="ql-functions.date_diff.return-type"></a>

`int`

## 예
<a name="ql-functions.date_diff.examples"></a>

```
DATE_DIFF(year, `2010-01-01T`, `2011-01-01T`)            -- 1
DATE_DIFF(year, `2010-12T`, `2011-01T`)                  -- 0 (must be at least 12 months apart to evaluate as a 1 year difference)
DATE_DIFF(month, `2010T`, `2010-05T`)                    -- 4 (2010T is equivalent to 2010-01-01T00:00:00.000Z)
DATE_DIFF(month, `2010T`, `2011T`)                       -- 12
DATE_DIFF(month, `2011T`, `2010T`)                       -- -12
DATE_DIFF(month, `2010-12-31T`, `2011-01-01T`)           -- 0 (must be at least a full month apart to evaluate as a 1 month difference)
DATE_DIFF(day, `2010-01-01T23:00Z`, `2010-01-02T01:00Z`) -- 0 (must be at least 24 hours apart to evaluate as a 1 day difference)

-- Runnable statements
SELECT DATE_DIFF(year, `2010-01-01T`, `2011-01-01T`) FROM << 0 >> -- 1
SELECT DATE_DIFF(month, `2010T`, `2010-05T`) FROM << 0 >>         -- 4
```

## 관련 함수
<a name="ql-functions.date_diff.related"></a>
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [EXTRACT](ql-functions.extract.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)
+ [UTCNOW](ql-functions.utcnow.md)

# Amazon QLDB의 EXISTS 함수
<a name="ql-functions.exists"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 PartiQL 값이 주어진된 경우 값이 비어 있지 않은 컬렉션이면 `EXISTS` 함수를 사용하여 `TRUE`을 반환합니다. 그렇지 않으면 이 함수가 `FALSE`를 반환합니다. `EXISTS`에 대한 입력이 컨테이너가 아닌 경우 결과는 `FALSE`입니다.

`EXISTS` 함수는 `NULL` 및 `MISSING`을 전파하지 않습니다.

## 구문
<a name="ql-functions.exists.syntax"></a>

```
EXISTS ( value )
```

## 인수
<a name="ql-functions.exists.arguments"></a>

*USD 상당*  
함수가 평가하는 필드 명칭 또는 표현식입니다. 이 파라미터는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

## 반환 타입
<a name="ql-functions.exists.return-type"></a>

`bool`

## 예
<a name="ql-functions.exists.examples"></a>

```
EXISTS(`[]`)        -- false (empty list)
EXISTS(`[1, 2, 3]`) -- true (non-empty list)
EXISTS(`[missing]`) -- true (non-empty list)
EXISTS(`{}`)        -- false (empty struct)
EXISTS(`{ a: 1 }`)  -- true (non-empty struct)
EXISTS(`()`)        -- false (empty s-expression)
EXISTS(`(+ 1 2)`)   -- true (non-empty s-expression)
EXISTS(1)           -- false
EXISTS(`2017T`)     -- false
EXISTS(null)        -- false
EXISTS(missing)     -- error

-- Runnable statements
SELECT EXISTS(`[]`) FROM << 0 >>        -- false
SELECT EXISTS(`[1, 2, 3]`) FROM << 0 >> -- true
```

## 관련 함수
<a name="ql-functions.exists.related"></a>
+ [COALESCE](ql-functions.coalesce.md)
+ [nullIF](ql-functions.nullif.md)

# Amazon QLDB의 EXTRACT 함수
<a name="ql-functions.extract"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `EXTRACT` 함수를 사용하여 주어진 타임스탬프에서 지정된 날짜 또는 시간 부분의 정수 값을 반환합니다.

## 구문
<a name="ql-functions.extract.syntax"></a>

```
EXTRACT ( datetimepart FROM timestamp )
```

## 인수
<a name="ql-functions.extract.arguments"></a>

*datetimepart*  
함수가 추출하는 날짜 또는 시간 부분입니다. 이 파라미터는 다음 중 하나일 수 있습니다:  
+ `year`
+ `month`
+ `day`
+ `hour`
+ `minute`
+ `second`
+ `timezone_hour`
+ `timezone_minute`

*timestamp*  
함수가 추출하는 데이터 타입 `timestamp`의 필드 명칭 또는 표현식입니다. 이 파라미터가 알 수 없는 타입(`NULL` 또는`MISSING` )인 경우 함수는 `NULL`을 반환합니다.  
Ion 타임스탬프 리터럴 값은 백틱(``...``)으로 표시할 수 있습니다. 형식 지정 세부 정보 및 타임스탬프 값의 예는 Amazon Ion 사양 문서의 [타임스탬프](https://amzn.github.io/ion-docs/docs/spec.html#timestamp)를 참조하세요.

## 반환 타입
<a name="ql-functions.extract.return-type"></a>

`int`

## 예
<a name="ql-functions.extract.examples"></a>

```
EXTRACT(YEAR FROM `2010-01-01T`)                           -- 2010
EXTRACT(MONTH FROM `2010T`)                                -- 1 (equivalent to 2010-01-01T00:00:00.000Z)
EXTRACT(MONTH FROM `2010-10T`)                             -- 10
EXTRACT(HOUR FROM `2017-01-02T03:04:05+07:08`)             -- 3
EXTRACT(MINUTE FROM `2017-01-02T03:04:05+07:08`)           -- 4
EXTRACT(TIMEZONE_HOUR FROM `2017-01-02T03:04:05+07:08`)    -- 7
EXTRACT(TIMEZONE_MINUTE FROM `2017-01-02T03:04:05+07:08`)  -- 8

-- Runnable statements
SELECT EXTRACT(YEAR FROM `2010-01-01T`) FROM << 0 >> -- 2010
SELECT EXTRACT(MONTH FROM `2010T`) FROM << 0 >>      -- 1
```

## 관련 함수
<a name="ql-functions.extract.related"></a>
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)
+ [UTCNOW](ql-functions.utcnow.md)

# Amazon QLDB의 LOWER 함수
<a name="ql-functions.lower"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `LOWER` 함수를 사용하여 주어진 문자열의 모든 대문자를 소문자로 변환합니다.

## 구문
<a name="ql-functions.lower.syntax"></a>

```
LOWER ( string )
```

## 인수
<a name="ql-functions.lower.arguments"></a>

*string*  
함수가 변환하는 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

## 반환 타입
<a name="ql-functions.lower.return-type"></a>

`string`

## 예
<a name="ql-functions.lower.examples"></a>

```
SELECT LOWER('AbCdEfG!@#$') FROM << 0 >> -- 'abcdefg!@#$'
```

## 관련 함수
<a name="ql-functions.lower.related"></a>
+ [CHAR\$1LENGTH](ql-functions.char_length.md)
+ [SUBSTRING](ql-functions.substring.md)
+ [TRIM](ql-functions.trim.md)
+ [UPPER](ql-functions.upper.md)

# Amazon QLDB의 MAX 함수
<a name="ql-functions.max"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `MAX` 함수를 사용하여 숫자 값 세트에서 최대값을 반환합니다.

## 구문
<a name="ql-functions.max.syntax"></a>

```
MAX ( expression )
```

## 인수
<a name="ql-functions.max.arguments"></a>

*expression*  
함수가 실행되는 숫자 데이터 타입의 필드 명칭 또는 표현식입니다.

## 데이터 타입
<a name="ql-functions.max.data-types"></a>

지원되는 인수 타입:
+ `int`
+ `decimal`
+ `float`

지원되는 반환 타입:
+ `int`
+ `decimal`
+ `float`

## 예
<a name="ql-functions.max.examples"></a>

```
SELECT MAX(r.PendingPenaltyTicketAmount) FROM VehicleRegistration r  -- 442.30
SELECT MAX(a) FROM << { 'a' : 1 }, { 'a': 2 }, { 'a': 3 } >>         -- 3
```

## 관련 함수
<a name="ql-functions.max.related"></a>
+ [AVG](ql-functions.avg.md)
+ [COUNT](ql-functions.count.md)
+ [MIN](ql-functions.min.md)
+ [SIZE](ql-functions.size.md)
+ [SUM](ql-functions.sum.md)

# Amazon QLDB의 MIN 함수
<a name="ql-functions.min"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `MIN` 함수를 사용하여 수치 세트에서 최소값을 반환합니다.

## 구문
<a name="ql-functions.min.syntax"></a>

```
MIN ( expression )
```

## 인수
<a name="ql-functions.min.arguments"></a>

*expression*  
함수가 실행되는 숫자 데이터 타입의 필드 명칭 또는 표현식입니다.

## 데이터 타입
<a name="ql-functions.min.data-types"></a>

지원되는 인수 타입:
+ `int`
+ `decimal`
+ `float`

지원되는 반환 타입:
+ `int`
+ `decimal`
+ `float`

## 예
<a name="ql-functions.min.examples"></a>

```
SELECT MIN(r.PendingPenaltyTicketAmount) FROM VehicleRegistration r  -- 30.45
SELECT MIN(a) FROM << { 'a' : 1 }, { 'a': 2 }, { 'a': 3 } >>         -- 1
```

## 관련 함수
<a name="ql-functions.min.related"></a>
+ [AVG](ql-functions.avg.md)
+ [COUNT](ql-functions.count.md)
+ [MAX](ql-functions.max.md)
+ [SIZE](ql-functions.size.md)
+ [SUM](ql-functions.sum.md)

# Amazon QLDB의 nullIF 함수
<a name="ql-functions.nullif"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 두 개의 표현식 주어지면 `NULLIF` 함수를 사용하여 두 개의 표현식이 동일한 값으로 평가되는 경우 `NULL`를 반환합니다. 그렇지 않다면 이 함수는 첫 번째 표현식을 평가한 결과를 반환합니다.

`NULLIF` 함수는 `NULL` 및 `MISSING`을 전파하지 않습니다.

## 구문
<a name="ql-functions.nullif.syntax"></a>

```
NULLIF ( expression1, expression2 )
```

## 인수
<a name="ql-functions.nullif.arguments"></a>

*expression1*, *expression2*  
함수가 비교하는 두 개의 필드 명칭 또는 표현식입니다. 이러한 파라미터는 지원되는 [데이터 타입](ql-reference.data-types.md) 중 하나일 수 있습니다.

## 반환 타입
<a name="ql-functions.nullif.return-type"></a>

지원되는 모든 데이터 타입입니다. 반환 타입은 `NULL`이거나 첫 번째 표현식의 타입과 같습니다.

## 예
<a name="ql-functions.nullif.examples"></a>

```
NULLIF(1, 1)             -- null
NULLIF(1, 2)             -- 1
NULLIF(1.0, 1)           -- null
NULLIF(1, '1')           -- 1
NULLIF([1], [1])         -- null
NULLIF(1, NULL)          -- 1
NULLIF(NULL, 1)          -- null
NULLIF(null, null)       -- null
NULLIF(missing, null)    -- null
NULLIF(missing, missing) -- null

-- Runnable statements
SELECT NULLIF(1, 1) FROM << 0 >>   -- null
SELECT NULLIF(1, '1') FROM << 0 >> -- 1
```

## 관련 함수
<a name="ql-functions.nullif.related"></a>
+ [COALESCE](ql-functions.coalesce.md)
+ [exists](ql-functions.exists.md)

# Amazon QLDB의 SIZE 함수
<a name="ql-functions.size"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `SIZE` 함수를 사용하여 주어진 컨테이너 데이터 타입(목록, 구조 또는 백)의 요소 수를 반환합니다.

## 구문
<a name="ql-functions.size.syntax"></a>

```
SIZE ( container )
```

## 인수
<a name="ql-functions.size.arguments"></a>

*컨테이너*  
함수가 실행되는 컨테이너 필드 명칭 또는 표현식.

## 데이터 타입
<a name="ql-functions.size.data-types"></a>

지원되는 인수 타입:
+ list
+ 구조
+ 백

반환 타입: `int`

`SIZE`에 대한 입력이 컨테이너가 아닌 경우 함수에서 오류가 발생합니다.

## 예
<a name="ql-functions.size.examples"></a>

```
SIZE(`[]`)                   -- 0
SIZE(`[null]`)               -- 1
SIZE(`[1,2,3]`)              -- 3
SIZE(<<'foo', 'bar'>>)       -- 2
SIZE(`{foo: bar}`)           -- 1 (number of key-value pairs)
SIZE(`[{foo: 1}, {foo: 2}]`) -- 2
SIZE(12)                     -- error

-- Runnable statements
SELECT SIZE(`[]`) FROM << 0 >>      -- 0
SELECT SIZE(`[1,2,3]`) FROM << 0 >> -- 3
```

## 관련 함수
<a name="ql-functions.size.related"></a>
+ [AVG](ql-functions.avg.md)
+ [COUNT](ql-functions.count.md)
+ [MAX](ql-functions.max.md)
+ [MIN](ql-functions.min.md)
+ [SUM](ql-functions.sum.md)

# Amazon QLDB의 SUBSTRING 함수
<a name="ql-functions.substring"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `SUBSTRING` 함수를 사용하여 주어진 문자열에서 하위 문자열을 반환합니다. 하위 문자열은 지정된 시작 인덱스에서 시작하여 문자열의 마지막 문자에서 끝나거나 지정된 길이에서 끝납니다.

## 구문
<a name="ql-functions.substring.syntax"></a>

```
SUBSTRING ( string, start-index [, length ] )
```

## 인수
<a name="ql-functions.substring.arguments"></a>

*string*  
하위 문자열을 추출할 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

*start-index*  
*문자열*내에서 추출을 시작할 시작 위치. 이 수는 음의 값이 될 수 있습니다.  
*문자열*의 첫 번째 문자가 인덱스 1을 갖습니다.

*length*  
(옵션) *start-index*에서 시작하여(*start-index* \$1 *length*) - 1에서 끝나는 *string*에서 추출할 문자(코드 포인트)의 수입니다. 다시 말해 하위 문자열의 길이입니다. 이 수는 음의 값이 될 수 없습니다.  
이 파라미터를 제공하지 않으면 함수는 *string* 끝까지 진행됩니다.

## 반환 타입
<a name="ql-functions.substring.return-type"></a>

`string`

## 예
<a name="ql-functions.substring.examples"></a>

```
SUBSTRING('123456789', 0)      -- '123456789'
SUBSTRING('123456789', 1)      -- '123456789'
SUBSTRING('123456789', 2)      -- '23456789'
SUBSTRING('123456789', -4)     -- '123456789'
SUBSTRING('123456789', 0, 999) -- '123456789'
SUBSTRING('123456789', 0, 2)   -- '1'
SUBSTRING('123456789', 1, 999) -- '123456789'
SUBSTRING('123456789', 1, 2)   -- '12'
SUBSTRING('1', 1, 0)           -- ''
SUBSTRING('1', 1, 0)           -- ''
SUBSTRING('1', -4, 0)          -- ''
SUBSTRING('1234', 10, 10)      -- ''

-- Runnable statements
SELECT SUBSTRING('123456789', 1) FROM << 0 >>    -- "123456789"
SELECT SUBSTRING('123456789', 1, 2) FROM << 0 >> -- "12"
```

## 관련 함수
<a name="ql-functions.substring.related"></a>
+ [CHAR\$1LENGTH](ql-functions.char_length.md)
+ [LOWER](ql-functions.lower.md)
+ [TRIM](ql-functions.trim.md)
+ [UPPER](ql-functions.upper.md)

# Amazon QLDB의 SUM 함수
<a name="ql-functions.sum"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `SUM` 함수를 사용하여 입력 필드 또는 표현식 값의 합계를 반환합니다. 이 함수는 수치를 사용하고 null 또는 누락 값은 무시합니다.

## 구문
<a name="ql-functions.sum.syntax"></a>

```
SUM ( expression )
```

## 인수
<a name="ql-functions.sum.arguments"></a>

*expression*  
함수가 실행되는 숫자 데이터 타입의 필드 명칭 또는 표현식입니다.

## 데이터 타입
<a name="ql-functions.sum.data-types"></a>

지원되는 인수 타입:
+ `int`
+ `decimal`
+ `float`

지원되는 반환 타입:
+ `int` - 정수 인수의 경우
+ `decimal` - 십진수 또는 부동 소수점 인수의 경우

## 예
<a name="ql-functions.sum.examples"></a>

```
SELECT SUM(r.PendingPenaltyTicketAmount) FROM VehicleRegistration r  -- 735.95
SELECT SUM(a) FROM << { 'a' : 1 }, { 'a': 2 }, { 'a': 3 } >>         -- 6
```

## 관련 함수
<a name="ql-functions.sum.related"></a>
+ [AVG](ql-functions.avg.md)
+ [COUNT](ql-functions.count.md)
+ [MAX](ql-functions.max.md)
+ [MIN](ql-functions.min.md)
+ [SIZE](ql-functions.size.md)

# Amazon QLDB의 TO\$1STRING 함수
<a name="ql-functions.to_string"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `TO_STRING` 함수를 사용하여 주어진 타임스탬프의 문자열 표현을 지정된 형식 패턴으로 반환합니다.

## 구문
<a name="ql-functions.to_string.syntax"></a>

```
TO_STRING ( timestamp, 'format' )
```

## 인수
<a name="ql-functions.to_string.arguments"></a>

*timestamp*  
함수가 문자열로 변환하는 데이터 타입 `timestamp`의 필드 명칭 또는 표현식입니다.  
Ion 타임스탬프 리터럴 값은 백틱(``...``)으로 표시할 수 있습니다. 형식 지정 세부 정보 및 타임스탬프 값의 예는 Amazon Ion 사양 문서의 [타임스탬프](https://amzn.github.io/ion-docs/docs/spec.html#timestamp)를 참조하세요.

*format*  
날짜 부분을 기준으로 결과의 형식 패턴을 지정하는 문자열 리터럴입니다. 유효한 형식은 [타임스탬프 형식 문자열](ql-functions.timestamp-format.md) 섹션을 참조하세요.

## 반환 타입
<a name="ql-functions.to_string.return-type"></a>

`string`

## 예
<a name="ql-functions.to_string.examples"></a>

```
TO_STRING(`1969-07-20T20:18Z`, 'MMMM d, y')                     -- "July 20, 1969"
TO_STRING(`1969-07-20T20:18Z`, 'MMM d, yyyy')                   -- "Jul 20, 1969"
TO_STRING(`1969-07-20T20:18Z`, 'M-d-yy')                        -- "7-20-69"
TO_STRING(`1969-07-20T20:18Z`, 'MM-d-y')                        -- "07-20-1969"
TO_STRING(`1969-07-20T20:18Z`, 'MMMM d, y h:m a')               -- "July 20, 1969 8:18 PM"
TO_STRING(`1969-07-20T20:18Z`, 'y-MM-dd''T''H:m:ssX')           -- "1969-07-20T20:18:00Z"
TO_STRING(`1969-07-20T20:18+08:00Z`, 'y-MM-dd''T''H:m:ssX')     -- "1969-07-20T20:18:00Z"
TO_STRING(`1969-07-20T20:18+08:00`, 'y-MM-dd''T''H:m:ssXXXX')   -- "1969-07-20T20:18:00+0800"
TO_STRING(`1969-07-20T20:18+08:00`, 'y-MM-dd''T''H:m:ssXXXXX')  -- "1969-07-20T20:18:00+08:00"

-- Runnable statements
SELECT TO_STRING(`1969-07-20T20:18Z`, 'MMMM d, y') FROM << 0 >>           -- "July 20, 1969"
SELECT TO_STRING(`1969-07-20T20:18Z`, 'y-MM-dd''T''H:m:ssX') FROM << 0 >> -- "1969-07-20T20:18:00Z"
```

## 관련 함수
<a name="ql-functions.to_string.related"></a>
+ [CAST](ql-functions.cast.md)
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [EXTRACT](ql-functions.extract.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)
+ [UTCNOW](ql-functions.utcnow.md)

# Amazon QLDB의 TO\$1TIMESTAMP 함수
<a name="ql-functions.to_timestamp"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서 타임스탬프를 나타내는 문자열이 주어지면 `TO_TIMESTAMP` 함수를 사용하여 문자열을 `timestamp` 데이터 타입으로 변환합니다. 이것은 `TO_STRING`의 역연산입니다.

## 구문
<a name="ql-functions.to_timestamp.syntax"></a>

```
TO_TIMESTAMP ( string [, 'format' ] )
```

## 인수
<a name="ql-functions.to_timestamp.arguments"></a>

*string*  
함수가 타임스탬프로 변환하는 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

*format*  
(옵션) 입력 *문자열*의 형식 패턴을 날짜 부분 면에서 정의하는 문자열 리터럴입니다. 유효한 형식은 [타임스탬프 형식 문자열](ql-functions.timestamp-format.md) 섹션을 참조하세요.  
이 인수를 생략하면 함수는 *string*이 [표준 Ion 타임스탬프](http://amzn.github.io/ion-docs/docs/spec.html#timestamp) 형식이라고 가정합니다. 이 함수를 사용하여 Ion 타임스탬프를 파싱하는 데 권장되는 방법입니다.  
제로 패딩은 단일 문자 형식 기호(예:`y`, `M`, `d`, `H`, `h`, `m`, `s`)를 사용할 때는 선택 사항이지만, 제로 패딩 변형(예: `yyyy`, `MM`, `dd`, `HH`, `hh`, `mm`, `ss`)에는 필요합니다.  
두 자리 연도(형식 기호 `yy`)에는 특별한 처리가 적용됩니다. 70보다 크거나 같은 값에는 1900이 추가되고 70보다 작은 값에는 2000이 추가됩니다.  
월 명칭과 AM 또는 PM 표시기는 대소문자를 구분하지 않습니다.

## 반환 타입
<a name="ql-functions.to_timestamp.return-type"></a>

`timestamp`

## 예
<a name="ql-functions.to_timestamp.examples"></a>

```
TO_TIMESTAMP('2007T')                         -- `2007T`
TO_TIMESTAMP('2007-02-23T12:14:33.079-08:00') -- `2007-02-23T12:14:33.079-08:00`
TO_TIMESTAMP('2016', 'y')                     -- `2016T`
TO_TIMESTAMP('2016', 'yyyy')                  -- `2016T`
TO_TIMESTAMP('02-2016', 'MM-yyyy')            -- `2016-02T`
TO_TIMESTAMP('Feb 2016', 'MMM yyyy')          -- `2016-02T`
TO_TIMESTAMP('February 2016', 'MMMM yyyy')     -- `2016-02T`

-- Runnable statements
SELECT TO_TIMESTAMP('2007T') FROM << 0 >>              -- 2007T
SELECT TO_TIMESTAMP('02-2016', 'MM-yyyy') FROM << 0 >> -- 2016-02T
```

## 관련 함수
<a name="ql-functions.to_timestamp.related"></a>
+ [CAST](ql-functions.cast.md)
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [EXTRACT](ql-functions.extract.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [UTCNOW](ql-functions.utcnow.md)

# Amazon QLDB의 TRIM 함수
<a name="ql-functions.trim"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `TRIM` 함수를 사용하여 선행 및 후행 공백 또는 지정된 문자 *세트*를 제거하여 지정된 문자열을 잘라냅니다.

## 구문
<a name="ql-functions.trim.syntax"></a>

```
TRIM ( [ LEADING | TRAILING | BOTH [ characters ] FROM ] string)
```

## 인수
<a name="ql-functions.trim.arguments"></a>

LEADING  
(옵션) *문자열*의 시작 부분에서 공백 또는 지정된 문자를 제거할 것임을 나타냅니다. 지정되지 않은 경우, 기본 작업은 `BOTH`입니다.

TRAILING  
(옵션) *문자열*의 끝 부분에서 공백 또는 지정된 문자를 제거할 것임을 나타냅니다. 지정되지 않은 경우, 기본 작업은 `BOTH`입니다.

BOTH  
(옵션) *string*의 처음과 끝 부분에서 선행 및 후행 공백 또는 지정된 문자를 모두 제거할 것임을 나타냅니다.

*작성해야 합니다*  
(옵션) 제거할 문자 *세트*로, `string`로 지정됩니다.  
이 파라미터를 제공하지 않으면 공백이 제거됩니다.

*string*  
함수가 잘라내는 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

## 반환 타입
<a name="ql-functions.trim.return-type"></a>

`string`

## 예
<a name="ql-functions.trim.examples"></a>

```
TRIM('       foobar         ')               -- 'foobar'
TRIM('      \tfoobar\t         ')            -- '\tfoobar\t'
TRIM(LEADING FROM '       foobar         ')  -- 'foobar         '
TRIM(TRAILING FROM '       foobar         ') -- '       foobar'
TRIM(BOTH FROM '       foobar         ')     -- 'foobar'
TRIM(BOTH '1' FROM '11foobar11')             -- 'foobar'
TRIM(BOTH '12' FROM '1112211foobar22211122') -- 'foobar'

-- Runnable statements
SELECT TRIM('       foobar         ') FROM << 0 >>              -- "foobar"
SELECT TRIM(LEADING FROM '       foobar         ') FROM << 0 >> -- "foobar         "
```

## 관련 함수
<a name="ql-functions.trim.related"></a>
+ [CHAR\$1LENGTH](ql-functions.char_length.md)
+ [LOWER](ql-functions.lower.md)
+ [SUBSTRING](ql-functions.substring.md)
+ [UPPER](ql-functions.upper.md)

# Amazon QLDB의 TXID 함수
<a name="ql-functions.txid"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `TXID` 함수를 사용하여 실행 중인 현재 명령문의 고유한 트랜잭션 ID를 반환합니다. 이 값은 현재 트랜잭션이 저널에 체결될 때 문서의 `txId` 메타데이터 필드에 할당되는 값입니다.

## 구문
<a name="ql-functions.txid.syntax"></a>

```
TXID()
```

## 인수
<a name="ql-functions.txid.arguments"></a>

없음

## 반환 타입
<a name="ql-functions.txid.return-type"></a>

`string`

## 예
<a name="ql-functions.txid.examples"></a>

```
SELECT TXID() FROM << 0 >>  -- "L7S9iJqcn9W2M4qOEn27ay"
SELECT TXID() FROM Person WHERE GovId = 'LEWISR261LL'  -- "BKeMb48PNyvHWJGZHkaodG"
```

# Amazon QLDB의 UPPER 함수
<a name="ql-functions.upper"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `UPPER` 함수를 사용하여 주어진 문자열의 모든 소문자를 대문자로 변환합니다.

## 구문
<a name="ql-functions.upper.syntax"></a>

```
UPPER ( string )
```

## 인수
<a name="ql-functions.upper.arguments"></a>

*string*  
함수가 변환하는 데이터 타입 `string`의 필드 명칭 또는 표현식입니다.

## 반환 타입
<a name="ql-functions.upper.return-type"></a>

`string`

## 예
<a name="ql-functions.upper.examples"></a>

```
SELECT UPPER('AbCdEfG!@#$') FROM << 0 >> -- 'ABCDEFG!@#$'
```

## 관련 함수
<a name="ql-functions.upper.related"></a>
+ [CHAR\$1LENGTH](ql-functions.char_length.md)
+ [LOWER](ql-functions.lower.md)
+ [SUBSTRING](ql-functions.substring.md)
+ [TRIM](ql-functions.trim.md)

# Amazon QLDB의 UTCNOW 함수
<a name="ql-functions.utcnow"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `UTCNOW` 함수를 사용하여 UTC(협정 세계시) 기준 현재 시간을 `timestamp`로 반환합니다.

## 구문
<a name="ql-functions.utcnow.syntax"></a>

```
UTCNOW()
```

이 함수를 사용하려면 `SELECT` 쿼리에 `FROM` 절을 지정해야 합니다.

## 인수
<a name="ql-functions.utcnow.arguments"></a>

없음

## 반환 타입
<a name="ql-functions.utcnow.return-type"></a>

`timestamp`

## 예
<a name="ql-functions.utcnow.examples"></a>

```
SELECT UTCNOW() FROM << 0 >>  -- 2019-12-27T20:12:16.999Z
SELECT UTCNOW() FROM Person WHERE GovId = 'LEWISR261LL'  -- 2019-12-27T20:12:26.999Z

INSERT INTO Person VALUE { 'firstName': 'Jane', 'createdAt': UTCNOW() }
UPDATE Person p SET p.updatedAt = UTCNOW() WHERE p.firstName = 'John'
```

## 관련 함수
<a name="ql-functions.utcnow.related"></a>
+ [DATE\$1ADD](ql-functions.date_add.md)
+ [DATE\$1DIFF](ql-functions.date_diff.md)
+ [EXTRACT](ql-functions.extract.md)
+ [TO\$1STRING](ql-functions.to_string.md)
+ [TO\$1TIMESTAMP](ql-functions.to_timestamp.md)

# 타임스탬프 형식 문자열
<a name="ql-functions.timestamp-format"></a>

**중요**  
지원 종료 공지: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

이 섹션에서는 타임스탬프 형식 문자열에 대한 참조 정보를 제공합니다.

타임스탬프 형식 문자열은 `TO_STRING` 및 `TO_TIMESTAMP` 함수에 적용됩니다. 이러한 문자열에는 날짜 부분 구분 기호(예: '`-`', '`/`' 또는 '`:`')와 다음 형식 기호가 포함될 수 있습니다.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/qldb/latest/developerguide/ql-functions.timestamp-format.html)

# Amazon QLDB의 PartiQL 저장 프로시저
<a name="ql-stored-procedures"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB에서는 `EXEC` 명령을 사용하여 다음 구문으로 PartiQL 저장 프로시저를 실행할 수 있습니다.

```
EXEC stored_procedure_name argument [, ... ]
```

QLDB는 다음 시스템 저장 프로시저를 지원합니다.

**Topics**
+ [REDACT\$1REVISION](ql-stored-procedures.redact_revision.md)

# Amazon QLDB의 REDACT\$1REVISION 저장 프로시저
<a name="ql-stored-procedures.redact_revision"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

**참고**  
2021년 7월 22일 이전에 생성된 원장은 현재 수정할 수 없습니다. Amazon QLDB 콘솔에서 원장 생성 시간을 볼 수 있습니다.

Amazon QLDB에서는 `REDACT_REVISION` 저장 프로시저를 사용하여 인덱싱된 스토리지와 저널 스토리지 모두에서 비활성 상태의 개별 문서 수정본을 영구적으로 삭제합니다. 이 저장 프로시저는 지정된 수정본의 모든 사용자 데이터를 삭제합니다. 하지만 저널 시퀀스와 문서 ID 및 해시를 포함한 문서 메타데이터는 변경되지 않습니다. *이 작업은 되돌릴 수 없습니다.*

지정된 문서 수정본은 기록에서 비활성 상태여야 합니다. 문서의 최신 활성 수정본은 수정할 수 없습니다.

이 저장 프로시저를 실행하여 수정 요청을 제출하면 QLDB는 데이터 삭제를 비동기적으로 처리합니다. 수정이 완료되면 지정된 수정본(`data` 구조로 표시됨)의 사용자 데이터가 새 `dataHash` 필드로 대체됩니다. 이 필드의 값은 제거된 `data` 구조의 [Amazon Ion](ion.md) 해시입니다. 따라서 원장은 전반적인 데이터 무결성을 유지하고 기존 검증 API 작업을 통해 암호화 방식으로 검증 가능한 상태를 유지합니다.

샘플 데이터를 사용한 수정 작업의 예는 [문서 개정본 수정하기](working.redaction.md)의 [수정 예제](working.redaction.md#working.redaction.example) 항목을 참조하세요.

**참고**  
특정 테이블에서 이 PartiQL 명령을 실행하기 위한 액세스를 제어하는 방법을 알아보려면 [Amazon QLDB에서 표준 권한 모드로 시작하기](getting-started-standard-mode.md) 섹션을 참조하세요.

**Topics**
+ [수정 고려 사항 및 제한](#ql-stored-procedures.redact_revision.considerations)
+ [구문](#ql-stored-procedures.redact_revision.syntax)
+ [인수](#ql-stored-procedures.redact_revision.arguments)
+ [반환 값](#ql-stored-procedures.redact_revision.return)
+ [예시](#ql-stored-procedures.redact_revision.examples)

## 수정 고려 사항 및 제한
<a name="ql-stored-procedures.redact_revision.considerations"></a>

Amazon QLDB에서 데이터 수정을 시작하기 전에 다음 고려 사항과 제한 사항을 검토하세요.
+ `REDACT_REVISION` 저장 프로시저는 비활성 상태의 개별 문서 수정본의 사용자 데이터를 대상으로 합니다. 여러 수정본을 수정하려면 각 수정본마다 한 번씩 저장 프로시저를 실행해야 합니다. 트랜잭션당 하나의 수정본을 수정할 수 있습니다.
+ 문서 수정본 내의 특정 필드를 수정하려면 먼저 별도의 데이터 조작 언어(DML) 문을 사용하여 수정본을 수정해야 합니다. 자세한 내용은 [개정본 내 특정 필드 수정하기](working.redaction.md#working.redaction.field) 단원을 참조하십시오.
+ QLDB가 수정 요청을 받은 후에는 요청을 취소하거나 변경할 수 없습니다. 수정 완료 여부를 확인하려면 수정본의 `data` 구조가 `dataHash` 필드로 대체되었는지 확인하면 됩니다. 자세한 내용은 [수정 완료 여부 확인](working.redaction.md#working.redaction.check-completion)을 참조하십시오.
+ 수정은 QLDB 서비스 외부에 복제된 QLDB 데이터에는 영향을 주지 않습니다. 여기에는 Amazon S3로의 모든 내보내기와 Amazon Kinesis Data Streams로의 스트림이 포함됩니다. QLDB 외부에 저장된 모든 데이터를 관리하려면 다른 데이터 보존 방법을 사용해야 합니다.
+ 수정은 저널에 기록된 PartiQL 명령문의 리터럴 값에는 영향을 주지 않습니다. 모범 사례에 따라 파라미터화된 명령문은 리터럴 값 대신 변수 자리 표시자를 사용하여 프로그래밍 방식으로 실행해야 합니다. 저널에서 자리 표시자는 수정이 필요할 수 있는 민감한 정보 대신 물음표(`?`)로 기록됩니다.

  QLDB 드라이버를 사용하여 PartiQL 명령문을 프로그래밍 방식으로 실행하는 방법을 알아보려면 [드라이버 시작하기](getting-started-driver.md)에서 지원되는 각 프로그래밍 언어의 자습서를 참조하세요.

## 구문
<a name="ql-stored-procedures.redact_revision.syntax"></a>

```
EXEC REDACT_REVISION `block-address`, 'table-id', 'document-id'
```

## 인수
<a name="ql-stored-procedures.redact_revision.arguments"></a>

`*block-address*`  
수정할 문서의 수정본의 저널 블록 위치입니다. 주소는 `strandId` 및 `sequenceNo`라는 두 개의 필드로 구성된 Amazon Ion 구조입니다.  
이 값은 백틱으로 표시되는 Ion 리터럴 값입니다. 예시:  

```
`{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`
```
블록 주소를 찾는 방법을 알아보려면 [문서 메타데이터 쿼리](working.metadata.md) 섹션을 참조하세요.

'*table-id*'  
수정하고자 하는 문서 개정본이 있는 테이블의 고유 ID로, 작은 따옴표로 표시됩니다.  
테이블 ID를 찾는 방법에 대한 자세한 내용은 [시스템 카탈로그 쿼리](working.catalog.md) 섹션을 참조하세요.

'*document-id*'  
수정할 개정본의 고유한 문서 ID로, 작은 따옴표로 표시됩니다.  
문서 ID를 찾는 방법에 대한 자세한 내용은 [문서 메타데이터 쿼리](working.metadata.md) 섹션을 참조하세요.

## 반환 값
<a name="ql-stored-procedures.redact_revision.return"></a>

수정해야 할 문서 개정을 다음 형식으로 나타내는 Amazon Ion 구조입니다.

```
{
  blockAddress: {
    strandId: String,
    sequenceNo: Int
  },
  tableId: String,
  documentId: String,
  version: Int
}
```

**반환 구조 필드**
+ `blockAddress` - 수정할 수정본의 저널 블록 위치입니다. 주소에는 다음과 같은 두 가지 필드가 있습니다.
  + `strandId` - 블록을 포함하는 저널 스트랜드의 고유 ID입니다.
  + `sequenceNo` - 스트랜드 내 블록 위치를 지정하는 인덱스 번호입니다.
+ `tableId` - 수정하려는 수정본이 있는 테이블의 고유 ID입니다.
+ `documentId` - 수정할 수정본의 고유한 문서 ID입니다.
+ `version` - 수정할 문서 수정본의 버전 번호입니다.

다음은 샘플 데이터를 사용한 반환 구조의 예입니다.

```
{
  blockAddress: {
    strandId: "CsRnx0RDoNK6ANEEePa1ov",
    sequenceNo: 134
  },
  tableId: "6GZumdHggklLdMGyQq9DNX",
  documentId: "IXlQPSbfyKMIIsygePeKrZ",
  version: 0
}
```

## 예시
<a name="ql-stored-procedures.redact_revision.examples"></a>

```
EXEC REDACT_REVISION `{strandId:"7z2P0AyQKWD8oFYmGNhi8D", sequenceNo:7}`, '8F0TPCmdNQ6JTRpiLj2TmW', '05K8zpGYWynDlEOK5afDRc'
```

# Amazon QLDB의 PartiQL 연산자
<a name="ql-operators"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB의 PartiQL에서는 다음과 같은 [SQL 표준 연산자](https://www.w3schools.com/sql/sql_operators.asp)를 지원합니다.

**참고**  
이 목록에 없는 모든 SQL 연산자는 현재 QLDB에서 지원되지 않습니다.

## 산술 연산자
<a name="ql-operators.arithmetic"></a>


****  

| 연산자 | 설명 | 
| --- | --- | 
| \$1 | 더하기 | 
| - | 빼기 | 
| \$1 | 곱하기 | 
| / | 나누기 | 
| % | 모듈로 | 

## 비교 연산자
<a name="ql-operators.comparison"></a>


****  

| 연산자 | 설명 | 
| --- | --- | 
| = | 같음 | 
| > | 보다 큼 | 
| < | 보다 작음 | 
| >= | 크거나 같음 | 
| <= | 작거나 같음 | 
| <> | 같지 않음 | 

## 논리 연산자
<a name="ql-operators.logical"></a>


****  

| 연산자 | 설명 | 
| --- | --- | 
| AND | AND로 구분된 조건이 모두 TRUE이면 TRUE | 
| BETWEEN | 피연산자가 비교 범위 이내이면 TRUE | 
| IN | 피연산자가 표현식 목록 중 하나와 같으면 TRUE | 
| IS | 피연산자가 지정된 데이터 유형(NULL 또는 MISSING 포함)이면 TRUE | 
| LIKE | 피연산자가 패턴과 일치하면 TRUE | 
| NOT | 지정된 부울 식의 값을 반대로 바꿈 | 
| OR | OR로 구분된 조건 중 하나라도 TRUE이면 TRUE | 

## 문자열 연산자
<a name="ql-operators.compound"></a>


****  

| 연산자 | 설명 | 
| --- | --- | 
| \$1\$1 | \$1\$1 연산자의 양쪽으로 두 문자열을 연결하여 연결된 문자열을 반환합니다. 문자열 하나 또는 둘 모두가 NULL인 경우 연결 결과는 null입니다. | 

# Amazon QLDB의 예약어
<a name="ql-reference.reserved"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

다음은 Amazon QLDB의 PartiQL 예약 키워드 목록입니다. 예약어를 큰따옴표가 있는 따옴표로 묶은 식별자로 사용할 수 있습니다(예: `"user"`). QLDB의 PartiQL 인용 규칙에 대한 자세한 내용은 [PartiQL을 사용하여 Ion 쿼리하기](ql-reference.query.md) 섹션을 참조하세요.

**중요**  
PartiQL은 [SQL-92](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt) 이전 버전과 호환되므로 이 목록의 키워드는 모두 예약된 것으로 간주됩니다. 하지만 QLDB는 이러한 예약어 중 일부만 지원합니다. QLDB에서 현재 지원하는 SQL 키워드 목록은 다음 주제를 참조하세요.  
[PartiQL 함수](ql-functions.md)
[PartiQL 연산자](ql-operators.md)
[PartiQL 명령](ql-reference.statements.md)

```
ABSOLUTE
ACTION
ADD
ALL
ALLOCATE
ALTER
AND
ANY
ARE
AS
ASC
ASSERTION
AT
AUTHORIZATION
AVG
BAG
BEGIN
BETWEEN
BIT
BIT_LENGTH
BLOB
BOOL
BOOLEAN
BOTH
BY
CASCADE
CASCADED
CASE
CAST
CATALOG
CHAR
CHARACTER
CHARACTER_LENGTH
CHAR_LENGTH
CHECK
CLOB
CLOSE
COALESCE
COLLATE
COLLATION
COLUMN
COMMIT
CONNECT
CONNECTION
CONSTRAINT
CONSTRAINTS
CONTINUE
CONVERT
CORRESPONDING
COUNT
CREATE
CROSS
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
CURSOR
DATE
DATE_ADD
DATE_DIFF
DAY
DEALLOCATE
DEC
DECIMAL
DECLARE
DEFAULT
DEFERRABLE
DEFERRED
DELETE
DESC
DESCRIBE
DESCRIPTOR
DIAGNOSTICS
DISCONNECT
DISTINCT
DOMAIN
DOUBLE
DROP
ELSE
END
END-EXEC
ESCAPE
EXCEPT
EXCEPTION
EXEC
EXECUTE
EXISTS
EXTERNAL
EXTRACT
FALSE
FETCH
FIRST
FLOAT
FOR
FOREIGN
FOUND
FROM
FULL
GET
GLOBAL
GO
GOTO
GRANT
GROUP
HAVING
HOUR
IDENTITY
IMMEDIATE
IN
INDEX
INDICATOR
INITIALLY
INNER
INPUT
INSENSITIVE
INSERT
INT
INTEGER
INTERSECT
INTERVAL
INTO
IS
ISOLATION
JOIN
KEY
LANGUAGE
LAST
LEADING
LEFT
LEVEL
LIKE
LIMIT
LIST
LOCAL
LOWER
MATCH
MAX
MIN
MINUTE
MISSING
MODULE
MONTH
NAMES
NATIONAL
NATURAL
NCHAR
NEXT
NO
NOT
NULL
NULLIF
NUMERIC
OCTET_LENGTH
OF
ON
ONLY
OPEN
OPTION
OR
ORDER
OUTER
OUTPUT
OVERLAPS
PAD
PARTIAL
PIVOT
POSITION
PRECISION
PREPARE
PRESERVE
PRIMARY
PRIOR
PRIVILEGES
PROCEDURE
PUBLIC
READ
REAL
REFERENCES
RELATIVE
REMOVE
RESTRICT
REVOKE
RIGHT
ROLLBACK
ROWS
SCHEMA
SCROLL
SECOND
SECTION
SELECT
SESSION
SESSION_USER
SET
SEXP
SIZE
SMALLINT
SOME
SPACE
SQL
SQLCODE
SQLERROR
SQLSTATE
STRING
STRUCT
SUBSTRING
SUM
SYMBOL
SYSTEM_USER
TABLE
TEMPORARY
THEN
TIME
TIMESTAMP
TIMEZONE_HOUR
TIMEZONE_MINUTE
TO
TO_STRING
TO_TIMESTAMP
TRAILING
TRANSACTION
TRANSLATE
TRANSLATION
TRIM
TRUE
TUPLE
TXID
UNDROP
UNION
UNIQUE
UNKNOWN
UNPIVOT
UPDATE
UPPER
USAGE
USER
USING
UTCNOW
VALUE
VALUES
VARCHAR
VARYING
VIEW
WHEN
WHENEVER
WHERE
WITH
WORK
WRITE
YEAR
ZONE
```

# Amazon QLDB의 Amazon Ion 데이터 형식 참조
<a name="ion"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

Amazon QLDB는 [Amazon Ion](http://amzn.github.io/ion-docs/)을 [PartiQL](https://partiql.org/) 유형의 하위 집합과 통합하는 데이터 표기법 모델을 사용합니다. 이 섹션에서는 PartiQL과의 통합과 별도로 Ion 문서 데이터 형식에 대한 참조 개요를 제공합니다.

**Amazon QLDB에서 PartiQL을 사용한 Ion 쿼리**

QLDB에서 PartiQL을 사용하여 Ion 데이터를 쿼리하는 구문 및 시맨틱은 *Amazon QLDB PartiQL 참조*의 [PartiQL을 사용하여 Ion 쿼리하기](ql-reference.query.md)를 참조하세요.

QLDB 원장에서 Ion 데이터를 쿼리하고 처리하는 코드 예제는 [Amazon Ion 코드 예제](ion.code-examples.md) 및 [Amazon Ion 작업](driver-working-with-ion.md)을 참조하세요.

**Topics**
+ [Amazon Ion이란 무엇입니까?](#ion.summary)
+ [Ion 사양](#ion.spec)
+ [JSON 호환](#ion.json-compatible)
+ [JSON의 확장](#ion.json-ext)
+ [Ion 텍스트 예시](#ion.example)
+ [API 참조](#ion.api-ref)
+ [QLDB의 Amazon Ion 코드 예제](ion.code-examples.md)

## Amazon Ion이란 무엇입니까?
<a name="ion.summary"></a>

Ion은 풍부한 유형의 자체 설명이 가능한 오픈 소스 계층적 데이터 직렬화 형식으로, 원래 Amazon 내부에서 개발되었습니다. 이는 구조화된 데이터와 구조화되지 않은 데이터를 모두 저장할 수 있는 추상 데이터 모델을 기반으로 합니다. 이는 JSON의 상위 집합입니다. 즉, 유효한 JSON 문서는 모두 유효한 Ion 문서이기도 합니다. 이 가이드에서는 JSON에 대한 기본적인 실무 지식을 전제로 합니다. JSON에 아직 익숙하지 않은 경우 자세한 내용은 [JSON 소개](http://json.org)를 참조하세요.

Ion 문서를 사람이 읽을 수 있는 텍스트 형식이나 이진 인코딩 형식으로 바꿔서 표기할 수 있습니다. JSON과 마찬가지로 텍스트 형식은 읽고 쓰기가 쉬우며 신속한 프로토타이핑을 지원합니다. 이진 인코딩은 더욱 간결하고 지속, 전송 및 구문 분석에 효율적입니다. Ion 프로세서는 두 형식 사이를 트랜스코딩하여 데이터 손실 없이 정확히 동일한 데이터 구조 집합을 표현할 수 있습니다. 이 기능을 통해 애플리케이션은 다양한 사용 사례에 맞게 데이터를 처리하는 방법을 최적화할 수 있습니다.

**참고**  
Ion 데이터 모델은 엄격하게 값을 기반으로 하며 참조를 지원하지 않습니다. 따라서 데이터 모델은 방향성 그래프가 아닌 임의의 깊이로 중첩될 수 있는 데이터 계층 구조를 나타낼 수 있습니다.

## Ion 사양
<a name="ion.spec"></a>

전체 설명 및 값 형식 지정 세부 정보가 포함된 Ion 코어 데이터 유형의 전체 목록은 Amazon GitHub 사이트의 [Ion 사양 문서](http://amzn.github.io/ion-docs/docs/spec.html)를 참조하세요.

애플리케이션 개발을 간소화하기 위해 Amazon Ion은 Ion 데이터를 처리하는 클라이언트 라이브러리를 제공합니다. Ion 데이터를 처리하는 일반적인 사용 사례의 코드 예제는 GitHub의 [Amazon Ion Cookbook](http://amzn.github.io/ion-docs/guides/cookbook.html)을 참조하세요.

## JSON 호환
<a name="ion.json-compatible"></a>

JSON과 마찬가지로, 원시 데이터 유형 집합과 재귀적으로 정의된 컨테이너 유형 집합을 사용하여 Amazon Ion 문서를 작성합니다. Ion에는 다음과 같은 기존 JSON 데이터 유형이 포함됩니다.
+ `null`: 형식이 지정되지 않은 일반 null(빈) 값입니다. 또한 다음 섹션에 설명된 대로 Ion은 각 원시 유형에 대해 고유한 null 유형을 지원합니다.
+ `bool`: 부울 값입니다.
+ `string`: 유니코드 텍스트 리터럴입니다.
+ `list`: 서로 다른 유형의 값 컬렉션을 정렬했습니다.
+ `struct`: 정렬된 서로 다른 유형의 값 컬렉션입니다. JSON과 마찬가지로 `struct`은 이름당 여러 값을 허용하지만 일반적으로 권장되지 않습니다.

## JSON의 확장
<a name="ion.json-ext"></a>



### 숫자 유형
<a name="ion.json-ext.numbers"></a>

Amazon Ion은 숫자를 모호한 JSON `number` 유형 대신 다음 유형 중 하나로 엄격하게 정의합니다.
+ `int`: 임의 크기의 부호 있는 정수입니다.
+ `decimal`: 십진 인코딩된 임의 정밀도의 실수입니다.
+ `float`: 이진 인코딩된 부동 소수점 숫자(64비트 IEEE)입니다.

문서를 구문 분석할 때 Ion 프로세서는 다음과 같이 숫자 유형을 할당합니다.
+ `int`: 지수나 소수점이 없는 숫자(예: `100200`)입니다.
+ `decimal`: 소수점이 있고 지수는 없는 숫자(예: `0.00001`, `200.0`)입니다.
+ `float`: 과학 표기법 또는 전자 표기법과 같이 지수가 있는 숫자(예: `2e0`, `3.1e-4`)입니다.

### 새로운 데이터 유형
<a name="ion.json-ext.newtypes"></a>

Amazon Ion은 다음과 같은 데이터 유형을 추가합니다.
+ `timestamp`: 임의 정밀도의 날짜/시간/시간대 모멘트입니다.
+ `symbol`: 유니코드 기호 원자(예: 식별자)입니다.
+ `blob`: 사용자 정의 인코딩의 이진 데이터입니다.
+ `clob`: 사용자 정의 인코딩의 텍스트 데이터입니다.
+ `sexp`: 애플리케이션 정의 시맨틱을 사용하여 정렬된 값 컬렉션입니다.

### Null 유형
<a name="ion.json-ext.nulls"></a>

Amazon Ion은 JSON으로 정의된 일반적인 null 유형 외에도 각 원시 유형에 대해 고유한 null 유형을 지원합니다. 이는 엄격한 데이터 유형을 유지하면서도 값이 부족하다는 것을 나타냅니다.

```
null
null.null       // Identical to untyped null
null.bool
null.int
null.float
null.decimal
null.timestamp
null.string
null.symbol
null.blob
null.clob
null.struct
null.list
null.sexp
```

## Ion 텍스트 예시
<a name="ion.example"></a>

```
// Here is a struct, which is similar to a JSON object.
{
    // Field names don't always have to be quoted.
    name: "fido",
    
    // This is an integer.
    age: 7,
    
    // This is a timestamp with day precision.
    birthday: 2012-03-01T,
    
    // Here is a list, which is like a JSON array.
    toys: [
        // These are symbol values, which are like strings,
        // but get encoded as integers in binary.
        ball,
        rope
    ],
}
```

## API 참조
<a name="ion.api-ref"></a>
+ [ion-go](https://pkg.go.dev/github.com/amzn/ion-go/ion)
+ [ion-java](https://www.javadoc.io/doc/com.amazon.ion/ion-java/latest/index.html)
+ [ion-js](https://amazon-ion.github.io/ion-js/api/)
+ [ion-python](https://ion-python.readthedocs.io/en/latest/)

# QLDB의 Amazon Ion 코드 예제
<a name="ion.code-examples"></a>

**중요**  
지원 종료 알림: 기존 고객은 07/31/2025에 지원이 종료될 때까지 Amazon QLDB를 사용할 수 있습니다. 자세한 내용은 [Amazon QLDB 원장을 Amazon Aurora PostgreSQL로 마이그레이션](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)을 참조하세요.

이 섹션에서는 Amazon QLDB 원장에서 문서 값을 읽고 쓰는 방식으로 Amazon Ion 데이터를 처리하는 코드 예제를 제공합니다. 코드 예제는 QLDB 드라이버를 사용하여 원장에서 PartiQL 문을 실행합니다. 이 예제는 [샘플 애플리케이션 자습서를 사용하여 Amazon QLDB 시작하기](getting-started-sample-app.md)의 샘플 애플리케이션의 일부이며 [AWS 샘플 GitHub 사이트](https://github.com/aws-samples/?q=qldb)의 오픈 소스입니다.

Ion 데이터 처리의 일반적인 사용 사례를 보여주는 일반적인 코드 예제는 GitHub의 [Amazon Ion Cookbook](http://amzn.github.io/ion-docs/guides/cookbook.html)을 참조하세요.

## 코드 실행
<a name="ion.code-examples.running"></a>

각 프로그래밍 언어에 대한 자습서 코드는 다음 단계를 수행합니다.

1. `vehicle-registration` 샘플 원장에 연결합니다.

1. `IonTypes`이라는 테이블을 생성합니다.

1. 단일 `Name` 필드를 사용하여 테이블에 문서를 삽입합니다.

1. 지원되는 각 [Ion 데이터 유형](http://amzn.github.io/ion-docs/docs/spec.html)에 대해:

   1. 문서의 `Name` 필드를 데이터 유형의 리터럴 값으로 업데이트합니다.

   1. 테이블을 쿼리하여 문서의 최신 개정판을 가져올 수 있습니다.

   1. `Name` 값이 예상 유형과 일치하는지 확인하여 원래 데이터 유형 속성을 유지하는지 확인합니다.

1. `IonTypes` 테이블을 삭제합니다.

**참고**  
이 자습서 코드를 실행하기 전에 `vehicle-registration`이라는 이름의 원장을 생성해야 합니다.

------
#### [ Java ]

```
/*
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
 * software and associated documentation files (the "Software"), to deal in the Software
 * without restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package software.amazon.qldb.tutorial;

import com.amazon.ion.IonBlob;
import com.amazon.ion.IonBool;
import com.amazon.ion.IonClob;
import com.amazon.ion.IonDecimal;
import com.amazon.ion.IonFloat;
import com.amazon.ion.IonInt;
import com.amazon.ion.IonList;
import com.amazon.ion.IonNull;
import com.amazon.ion.IonSexp;
import com.amazon.ion.IonString;
import com.amazon.ion.IonStruct;
import com.amazon.ion.IonSymbol;
import com.amazon.ion.IonTimestamp;
import com.amazon.ion.IonValue;
import com.amazon.ion.Timestamp;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.qldb.Result;
import software.amazon.qldb.TransactionExecutor;

/**
 * Insert all the supported Ion types into a ledger and verify that they are stored and can be retrieved properly, retaining
 * their original properties.
 *
 * This code expects that you have AWS credentials setup per:
 * http://docs.aws.amazon.com/java-sdk/latest/developer-guide/setup-credentials.html
 */
public class InsertIonTypes {
    public static final Logger log = LoggerFactory.getLogger(InsertIonTypes.class);
    public static final String TABLE_NAME = "IonTypes";

    private InsertIonTypes() {}

    /**
     * Update a document's Name value in the database. Then, query the value of the Name key and verify the expected Ion type was
     * saved.
     *
     * @param txn
     *              The {@link TransactionExecutor} for statement execution.
     * @param ionValue
     *              The {@link IonValue} to set the document's Name value to.
     *
     * @throws AssertionError when no value is returned for the Name key or if the value does not match the expected type.
     */
    public static void updateRecordAndVerifyType(final TransactionExecutor txn, final IonValue ionValue) {
        final String updateStatement = String.format("UPDATE %s SET Name = ?", TABLE_NAME);
        final List<IonValue> parameters = Collections.singletonList(ionValue);
        txn.execute(updateStatement, parameters);
        log.info("Updated document.");

        final String searchQuery = String.format("SELECT VALUE Name FROM %s", TABLE_NAME);
        final Result result = txn.execute(searchQuery);

        if (result.isEmpty()) {
            throw new AssertionError("Did not find any values for the Name key.");
        }
        for (IonValue value : result) {
            if (!ionValue.getClass().isInstance(value)) {
                throw new AssertionError(String.format("The queried value, %s, is not an instance of %s.",
                        value.getClass().toString(), ionValue.getClass().toString()));
            }
            if (!value.getType().equals(ionValue.getType())) {
                throw new AssertionError(String.format("The queried value type, %s, does not match %s.",
                        value.getType().toString(), ionValue.getType().toString()));
            }
        }

        log.info("Successfully verified value is instance of {} with type {}.", ionValue.getClass().toString(),
                ionValue.getType().toString());
    }

    /**
     * Delete a table.
     *
     * @param txn
     *              The {@link TransactionExecutor} for lambda execute.
     * @param tableName
     *              The name of the table to delete.
     */
    public static void deleteTable(final TransactionExecutor txn, final String tableName) {
        log.info("Deleting {} table...", tableName);
        final String statement = String.format("DROP TABLE %s", tableName);
        txn.execute(statement);
        log.info("{} table successfully deleted.", tableName);
    }

    public static void main(final String... args) {
        final IonBlob ionBlob = Constants.SYSTEM.newBlob("hello".getBytes());
        final IonBool ionBool = Constants.SYSTEM.newBool(true);
        final IonClob ionClob = Constants.SYSTEM.newClob("{{'This is a CLOB of text.'}}".getBytes());
        final IonDecimal ionDecimal = Constants.SYSTEM.newDecimal(0.1);
        final IonFloat ionFloat = Constants.SYSTEM.newFloat(0.2);
        final IonInt ionInt = Constants.SYSTEM.newInt(1);
        final IonList ionList = Constants.SYSTEM.newList(new int[]{1, 2});
        final IonNull ionNull = Constants.SYSTEM.newNull();
        final IonSexp ionSexp = Constants.SYSTEM.newSexp(new int[]{2, 3});
        final IonString ionString = Constants.SYSTEM.newString("string");
        final IonStruct ionStruct = Constants.SYSTEM.newEmptyStruct();
        ionStruct.put("brand", Constants.SYSTEM.newString("ford"));
        final IonSymbol ionSymbol = Constants.SYSTEM.newSymbol("abc");
        final IonTimestamp ionTimestamp = Constants.SYSTEM.newTimestamp(Timestamp.now());

        final IonBlob ionNullBlob = Constants.SYSTEM.newNullBlob();
        final IonBool ionNullBool = Constants.SYSTEM.newNullBool();
        final IonClob ionNullClob = Constants.SYSTEM.newNullClob();
        final IonDecimal ionNullDecimal = Constants.SYSTEM.newNullDecimal();
        final IonFloat ionNullFloat = Constants.SYSTEM.newNullFloat();
        final IonInt ionNullInt = Constants.SYSTEM.newNullInt();
        final IonList ionNullList = Constants.SYSTEM.newNullList();
        final IonSexp ionNullSexp = Constants.SYSTEM.newNullSexp();
        final IonString ionNullString = Constants.SYSTEM.newNullString();
        final IonStruct ionNullStruct = Constants.SYSTEM.newNullStruct();
        final IonSymbol ionNullSymbol = Constants.SYSTEM.newNullSymbol();
        final IonTimestamp ionNullTimestamp = Constants.SYSTEM.newNullTimestamp();


        ConnectToLedger.getDriver().execute(txn -> {
            CreateTable.createTable(txn, TABLE_NAME);
            final Document document = new Document(Constants.SYSTEM.newString("val"));
            InsertDocument.insertDocuments(txn, TABLE_NAME, Collections.singletonList(document));

            updateRecordAndVerifyType(txn, ionBlob);
            updateRecordAndVerifyType(txn, ionBool);
            updateRecordAndVerifyType(txn, ionClob);
            updateRecordAndVerifyType(txn, ionDecimal);
            updateRecordAndVerifyType(txn, ionFloat);
            updateRecordAndVerifyType(txn, ionInt);
            updateRecordAndVerifyType(txn, ionList);
            updateRecordAndVerifyType(txn, ionNull);
            updateRecordAndVerifyType(txn, ionSexp);
            updateRecordAndVerifyType(txn, ionString);
            updateRecordAndVerifyType(txn, ionStruct);
            updateRecordAndVerifyType(txn, ionSymbol);
            updateRecordAndVerifyType(txn, ionTimestamp);

            updateRecordAndVerifyType(txn, ionNullBlob);
            updateRecordAndVerifyType(txn, ionNullBool);
            updateRecordAndVerifyType(txn, ionNullClob);
            updateRecordAndVerifyType(txn, ionNullDecimal);
            updateRecordAndVerifyType(txn, ionNullFloat);
            updateRecordAndVerifyType(txn, ionNullInt);
            updateRecordAndVerifyType(txn, ionNullList);
            updateRecordAndVerifyType(txn, ionNullSexp);
            updateRecordAndVerifyType(txn, ionNullString);
            updateRecordAndVerifyType(txn, ionNullStruct);
            updateRecordAndVerifyType(txn, ionNullSymbol);
            updateRecordAndVerifyType(txn, ionNullTimestamp);

            deleteTable(txn, TABLE_NAME);
        });
    }

    /**
     * This class represents a simple document with a single key, Name, to use for the IonTypes table.
     */
    private static class Document {
        private final IonValue name;

        @JsonCreator
        private Document(@JsonProperty("Name") final IonValue name) {
            this.name = name;
        }

        @JsonProperty("Name")
        private IonValue getName() {
            return name;
        }
    }
}
```

------
#### [ Node.js ]

```
/*
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
 * software and associated documentation files (the "Software"), to deal in the Software
 * without restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

import { QldbDriver, Result, TransactionExecutor } from "amazon-qldb-driver-nodejs";
import { AssertionError } from "assert";
import { dom, IonType, IonTypes } from "ion-js";

import { insertDocument } from "./InsertDocument";
import { getQldbDriver } from "./ConnectToLedger";
import { createTable } from "./CreateTable";
import { error, log } from "./qldb/LogUtil";

const TABLE_NAME: string = "IonTypes";

/**
 * Delete a table.
 * @param txn The {@linkcode TransactionExecutor} for lambda execute.
 * @param tableName Name of the table to delete.
 * @returns Promise which fulfills with void.
 */
export async function deleteTable(txn: TransactionExecutor, tableName: string): Promise<void> {
    log(`Deleting ${tableName} table...`);
    const statement: string = `DROP TABLE ${tableName}`;
    await txn.execute(statement);
    log(`${tableName} table successfully deleted.`);
}

/**
 * Update a document's Name value in QLDB. Then, query the value of the Name key and verify the expected Ion type was
 * saved.
 * @param txn The {@linkcode TransactionExecutor} for lambda execute.
 * @param parameter The IonValue to set the document's Name value to.
 * @param ionType The Ion type that the Name value should be.
 * @returns Promise which fulfills with void.
 */
async function updateRecordAndVerifyType(
    txn: TransactionExecutor,
    parameter: any,
    ionType: IonType
): Promise<void> {
    const updateStatement: string = `UPDATE ${TABLE_NAME} SET Name = ?`;
    await txn.execute(updateStatement, parameter);
    log("Updated record.");

    const searchStatement: string = `SELECT VALUE Name FROM ${TABLE_NAME}`;
    const result: Result = await txn.execute(searchStatement);

    const results: dom.Value[] = result.getResultList();

    if (0 === results.length) {
        throw new AssertionError({
            message: "Did not find any values for the Name key."
        });
    }

    results.forEach((value: dom.Value) => {
        if (value.getType().binaryTypeId !== ionType.binaryTypeId) {
            throw new AssertionError({
                message: `The queried value type, ${value.getType().name}, does not match expected type, ${ionType.name}.`
            });
        }
    });

    log(`Successfully verified value is of type ${ionType.name}.`);
}

/**
 * Insert all the supported Ion types into a table and verify that they are stored and can be retrieved properly,
 * retaining their original properties.
 * @returns Promise which fulfills with void.
 */
const main = async function(): Promise<void> {
    try {
        const qldbDriver: QldbDriver = getQldbDriver();
        await qldbDriver.executeLambda(async (txn: TransactionExecutor) => {
            await createTable(txn, TABLE_NAME);
            await insertDocument(txn, TABLE_NAME, [{ "Name": "val" }]);
            await updateRecordAndVerifyType(txn, dom.load("null"), IonTypes.NULL);
            await updateRecordAndVerifyType(txn, true, IonTypes.BOOL);
            await updateRecordAndVerifyType(txn, 1, IonTypes.INT);
            await updateRecordAndVerifyType(txn, 3.2, IonTypes.FLOAT);
            await updateRecordAndVerifyType(txn, dom.load("5.5"), IonTypes.DECIMAL);
            await updateRecordAndVerifyType(txn, dom.load("2020-02-02"), IonTypes.TIMESTAMP);
            await updateRecordAndVerifyType(txn, dom.load("abc123"), IonTypes.SYMBOL);
            await updateRecordAndVerifyType(txn, dom.load("\"string\""), IonTypes.STRING);
            await updateRecordAndVerifyType(txn, dom.load("{{ \"clob\" }}"), IonTypes.CLOB);
            await updateRecordAndVerifyType(txn, dom.load("{{ blob }}"), IonTypes.BLOB);
            await updateRecordAndVerifyType(txn, dom.load("(1 2 3)"), IonTypes.SEXP);
            await updateRecordAndVerifyType(txn, dom.load("[1, 2, 3]"), IonTypes.LIST);
            await updateRecordAndVerifyType(txn, dom.load("{brand: ford}"), IonTypes.STRUCT);
            await deleteTable(txn, TABLE_NAME);
        });
    } catch (e) {
        error(`Error updating and validating Ion types: ${e}`);
    }
}

if (require.main === module) {
    main();
}
```

------
#### [ Python ]

```
# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this
# software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify,
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# This code expects that you have AWS credentials setup per:
# https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html
from datetime import datetime
from decimal import Decimal
from logging import basicConfig, getLogger, INFO

from amazon.ion.simple_types import IonPyBool, IonPyBytes, IonPyDecimal, IonPyDict, IonPyFloat, IonPyInt, IonPyList, \
    IonPyNull, IonPySymbol, IonPyText, IonPyTimestamp
from amazon.ion.simpleion import loads
from amazon.ion.symbols import SymbolToken
from amazon.ion.core import IonType

from pyqldbsamples.create_table import create_table
from pyqldbsamples.constants import Constants
from pyqldbsamples.insert_document import insert_documents
from pyqldbsamples.model.sample_data import convert_object_to_ion
from pyqldbsamples.connect_to_ledger import create_qldb_driver

logger = getLogger(__name__)
basicConfig(level=INFO)

TABLE_NAME = 'IonTypes'


def update_record_and_verify_type(driver, parameter, ion_object, ion_type):
    """
    Update a record in the database table. Then query the value of the record and verify correct ion type saved.

    :type driver: :py:class:`pyqldb.driver.qldb_driver.QldbDriver`
    :param driver: An instance of the QldbDriver class.

    :type parameter: :py:class:`amazon.ion.simple_types.IonPyValue`
    :param parameter: The Ion value or Python native type that is convertible to Ion for filling in parameters of the
                      statement.

    :type ion_object: :py:obj:`IonPyBool`/:py:obj:`IonPyBytes`/:py:obj:`IonPyDecimal`/:py:obj:`IonPyDict`
                      /:py:obj:`IonPyFloat`/:py:obj:`IonPyInt`/:py:obj:`IonPyList`/:py:obj:`IonPyNull`
                      /:py:obj:`IonPySymbol`/:py:obj:`IonPyText`/:py:obj:`IonPyTimestamp`
    :param ion_object: The Ion object to verify against.

    :type ion_type: :py:class:`amazon.ion.core.IonType`
    :param ion_type: The Ion type to verify against.

    :raises TypeError: When queried value is not an instance of Ion type.
    """
    update_query = 'UPDATE {} SET Name = ?'.format(TABLE_NAME)
    driver.execute_lambda(lambda executor: executor.execute_statement(update_query, parameter))
    logger.info('Updated record.')

    search_query = 'SELECT VALUE Name FROM {}'.format(TABLE_NAME)
    cursor = driver.execute_lambda(lambda executor: executor.execute_statement(search_query))

    for c in cursor:
        if not isinstance(c, ion_object):
            raise TypeError('The queried value is not an instance of {}'.format(ion_object.__name__))

        if c.ion_type is not ion_type:
            raise TypeError('The queried value type does not match {}'.format(ion_type))

    logger.info("Successfully verified value is instance of '{}' with type '{}'.".format(ion_object.__name__, ion_type))
    return cursor


def delete_table(driver, table_name):
    """
    Delete a table.

    :type driver: :py:class:`pyqldb.driver.qldb_driver.QldbDriver`
    :param driver: An instance of the QldbDriver class.

    :type table_name: str
    :param table_name: Name of the table to delete.

    :rtype: int
    :return: The number of changes to the database.
    """
    logger.info("Deleting '{}' table...".format(table_name))
    cursor = driver.execute_lambda(lambda executor: executor.execute_statement('DROP TABLE {}'.format(table_name)))
    logger.info("'{}' table successfully deleted.".format(table_name))
    return len(list(cursor))


def insert_and_verify_ion_types(driver):
    """
    Insert all the supported Ion types and Python values that are convertible to Ion into a ledger and verify that they
    are stored and can be retrieved properly, retaining their original properties.

    :type driver: :py:class:`pyqldb.driver.qldb_driver.QldbDriver`
    :param driver: A QLDB Driver object.
    """
    python_bytes = str.encode('hello')
    python_bool = True
    python_float = float('0.2')
    python_decimal = Decimal('0.1')
    python_string = "string"
    python_int = 1
    python_null = None
    python_datetime = datetime(2016, 12, 20, 5, 23, 43)
    python_list = [1, 2]
    python_dict = {"brand": "Ford"}

    ion_clob = convert_object_to_ion(loads('{{"This is a CLOB of text."}}'))
    ion_blob = convert_object_to_ion(python_bytes)
    ion_bool = convert_object_to_ion(python_bool)
    ion_decimal = convert_object_to_ion(python_decimal)
    ion_float = convert_object_to_ion(python_float)
    ion_int = convert_object_to_ion(python_int)
    ion_list = convert_object_to_ion(python_list)
    ion_null = convert_object_to_ion(python_null)
    ion_sexp = convert_object_to_ion(loads('(cons 1 2)'))
    ion_string = convert_object_to_ion(python_string)
    ion_struct = convert_object_to_ion(python_dict)
    ion_symbol = convert_object_to_ion(SymbolToken(text='abc', sid=123))
    ion_timestamp = convert_object_to_ion(python_datetime)

    ion_null_clob = convert_object_to_ion(loads('null.clob'))
    ion_null_blob = convert_object_to_ion(loads('null.blob'))
    ion_null_bool = convert_object_to_ion(loads('null.bool'))
    ion_null_decimal = convert_object_to_ion(loads('null.decimal'))
    ion_null_float = convert_object_to_ion(loads('null.float'))
    ion_null_int = convert_object_to_ion(loads('null.int'))
    ion_null_list = convert_object_to_ion(loads('null.list'))
    ion_null_sexp = convert_object_to_ion(loads('null.sexp'))
    ion_null_string = convert_object_to_ion(loads('null.string'))
    ion_null_struct = convert_object_to_ion(loads('null.struct'))
    ion_null_symbol = convert_object_to_ion(loads('null.symbol'))
    ion_null_timestamp = convert_object_to_ion(loads('null.timestamp'))

    create_table(driver, TABLE_NAME)
    insert_documents(driver, TABLE_NAME, [{'Name': 'val'}])
    update_record_and_verify_type(driver, python_bytes, IonPyBytes, IonType.BLOB)
    update_record_and_verify_type(driver, python_bool, IonPyBool, IonType.BOOL)
    update_record_and_verify_type(driver, python_float, IonPyFloat, IonType.FLOAT)
    update_record_and_verify_type(driver, python_decimal, IonPyDecimal, IonType.DECIMAL)
    update_record_and_verify_type(driver, python_string, IonPyText, IonType.STRING)
    update_record_and_verify_type(driver, python_int, IonPyInt, IonType.INT)
    update_record_and_verify_type(driver, python_null, IonPyNull, IonType.NULL)
    update_record_and_verify_type(driver, python_datetime, IonPyTimestamp, IonType.TIMESTAMP)
    update_record_and_verify_type(driver, python_list, IonPyList, IonType.LIST)
    update_record_and_verify_type(driver, python_dict, IonPyDict, IonType.STRUCT)
    update_record_and_verify_type(driver, ion_clob, IonPyBytes, IonType.CLOB)
    update_record_and_verify_type(driver, ion_blob, IonPyBytes, IonType.BLOB)
    update_record_and_verify_type(driver, ion_bool, IonPyBool, IonType.BOOL)
    update_record_and_verify_type(driver, ion_decimal, IonPyDecimal, IonType.DECIMAL)
    update_record_and_verify_type(driver, ion_float, IonPyFloat, IonType.FLOAT)
    update_record_and_verify_type(driver, ion_int, IonPyInt, IonType.INT)
    update_record_and_verify_type(driver, ion_list, IonPyList, IonType.LIST)
    update_record_and_verify_type(driver, ion_null, IonPyNull, IonType.NULL)
    update_record_and_verify_type(driver, ion_sexp, IonPyList, IonType.SEXP)
    update_record_and_verify_type(driver, ion_string, IonPyText, IonType.STRING)
    update_record_and_verify_type(driver, ion_struct, IonPyDict, IonType.STRUCT)
    update_record_and_verify_type(driver, ion_symbol, IonPySymbol, IonType.SYMBOL)
    update_record_and_verify_type(driver, ion_timestamp, IonPyTimestamp, IonType.TIMESTAMP)
    update_record_and_verify_type(driver, ion_null_clob, IonPyNull, IonType.CLOB)
    update_record_and_verify_type(driver, ion_null_blob, IonPyNull, IonType.BLOB)
    update_record_and_verify_type(driver, ion_null_bool, IonPyNull, IonType.BOOL)
    update_record_and_verify_type(driver, ion_null_decimal, IonPyNull, IonType.DECIMAL)
    update_record_and_verify_type(driver, ion_null_float, IonPyNull, IonType.FLOAT)
    update_record_and_verify_type(driver, ion_null_int, IonPyNull, IonType.INT)
    update_record_and_verify_type(driver, ion_null_list, IonPyNull, IonType.LIST)
    update_record_and_verify_type(driver, ion_null_sexp, IonPyNull, IonType.SEXP)
    update_record_and_verify_type(driver, ion_null_string, IonPyNull, IonType.STRING)
    update_record_and_verify_type(driver, ion_null_struct, IonPyNull, IonType.STRUCT)
    update_record_and_verify_type(driver, ion_null_symbol, IonPyNull, IonType.SYMBOL)
    update_record_and_verify_type(driver, ion_null_timestamp, IonPyNull, IonType.TIMESTAMP)
    delete_table(driver, TABLE_NAME)


def main(ledger_name=Constants.LEDGER_NAME):
    """
    Insert all the supported Ion types and Python values that are convertible to Ion into a ledger and verify that they
    are stored and can be retrieved properly, retaining their original properties.
    """
    try:
        with create_qldb_driver(ledger_name) as driver:
            insert_and_verify_ion_types(driver)
    except Exception as e:
        logger.exception('Error updating and validating Ion types.')
        raise e


if __name__ == '__main__':
    main()
```

------