Amazon QLDB에서 PartiQL을 사용한 Ion 쿼리 - Amazon Quantum Ledger Database(QLDB)

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

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

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

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

작은 정보

프로그래밍 방식으로 PartiQL 쿼리를 실행하는 경우 가장 좋은 방법은 매개 변수가 있는 명령문을 사용하는 것입니다. 명령문에서 물음표(?)를 바인드 변수 자리 표시자로 사용하면 이러한 구문 규칙을 피할 수 있습니다. 또한 이 방법이 더 안전하고 효율적입니다.

자세한 내용은 드라이버 시작하기에서 다음 자습서를 참조하세요.

구문 및 시맨틱

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

대소문자 구분

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

문자열 값

Ion에서 큰따옴표("...")는 문자열을 나타냅니다.

PartiQL에서 작은따옴표('...')는 문자열을 나타냅니다.

기호 및 식별자

Ion에서 작은따옴표('...')는 기호를 나타냅니다. Ion에서 식별자라고 하는 기호 중 일부는 따옴표가 없는 텍스트로 표시됩니다.

PartiQL에서 큰따옴표("...")는 따옴표로 묶인 PartiQL 식별자(예: 테이블 이름으로 사용되는 예약어)를 나타냅니다. 따옴표가 없는 텍스트는 예약어가 아닌 테이블 이름과 같은 일반 PartiQL 식별자를 나타냅니다.

Ion 리터럴

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

필드 이름

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

Literal

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

Scalar

해당하는 경우 PartiQL-Ion 유형 매핑 섹션에 설명된 대로 SQL 구문을 따르세요. 예:

  • 5

  • 'foo'

  • null

Struct

다양한 형식 및 기타 데이터 모델에서 튜플 또는 객체라고도 합니다.

중괄호({...})로 표시되며 struct 요소는 쉼표로 구분됩니다.

  • { 'id' : 3, 'arr': [1, 2] }

List

배열이라고도 합니다.

대괄호([...])로 표시되며 목록 요소는 쉼표로 구분됩니다.

  • [ 1, 'foo' ]

Bag

PartiQL의 순서가 지정되지 않은 컬렉션입니다.

양각 괄호(<<...>>)로 표시되며, 백 요소는 쉼표로 구분됩니다. QLDB에서는 테이블을 백으로 생각할 수 있습니다. 하지만 백은 테이블의 문서 내에 중첩될 수 없습니다.

  • << 1, 'foo' >>

다음은 다양한 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` }

백틱 표기법

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`

경로 탐색

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

Vehicle.Model

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

SecondaryOwners[2]

별칭

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

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

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

PartiQL 쿼리 언어에 대한 자세한 내용은 PartiQL 사양을 참조하세요.