

# DynamoDB의 PartiQL 문
<a name="ql-reference.statements"></a>

Amazon DynamoDB에서는 다음 PartiQL 문을 지원합니다.

**참고**  
DynamoDB는 일부 PartiQL 문을 지원하지 않습니다.  
이 참조에서는 AWS CLI 또는 API를 사용하여 수동으로 실행하는 PartiQL 문의 기본 구문 및 사용 예제를 제공합니다.

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

지원되는 DML 및 쿼리 언어 문은 다음과 같습니다.
+ [DynamoDB의 PartiQL select 문](ql-reference.select.md)
+ [DynamoDB의 PartiQL update 문](ql-reference.update.md)
+ [DynamoDB의 PartiQL insert 문](ql-reference.insert.md)
+ [DynamoDB의 PartiQL delete 문](ql-reference.delete.md)

[DynamoDB용 PartiQL에서 트랜잭션 수행](ql-reference.multiplestatements.transactions.md) 및 [DynamoDB용 PartiQL에서 일괄 작업 실행](ql-reference.multiplestatements.batching.md)도 DynamoDB용 PartiQL에서 지원됩니다.

# DynamoDB의 PartiQL select 문
<a name="ql-reference.select"></a>

`SELECT` 문을 사용하면 Amazon DynamoDB의 테이블에서 데이터를 검색할 수 있습니다.

`SELECT` 문을 사용하면 WHERE 절에 파티션 키를 사용한 등식 또는 IN 조건을 지정하지 않은 경우 전체 테이블이 스캔될 수 있습니다. 스캔 작업은 요청한 값을 찾기 위해 전체 항목을 검사하기 때문에 대용량 테이블이나 인덱스일 경우에는 단 한 번의 작업으로 프로비저닝된 처리량을 모두 사용할 수 있습니다.

PartiQL에서 전체 테이블 스캔을 방지하려면 다음과 같이 할 수 있습니다.
+ [WHERE 절 조건](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.select.html#ql-reference.select.parameters)이 적절히 구성되도록 하여 전체 테이블이 스캔되지 않도록 `SELECT` 문을 작성합니다.
+ DynamoDB 개발자 안내서의 [예: DynamoDB용 PartiQL에서 select 문은 허용하고 전체 테이블 스캔 문은 거부](ql-iam.md#access-policy-ql-iam-example6) 단원에 지정된 IAM 정책을 사용하여 전체 테이블 스캔을 사용 중지합니다.

자세한 내용은 DynamoDB 개발자 안내서에서 [데이터 쿼리 및 검색 모범 사례](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-query-scan.html)를 참조하세요.

**Topics**
+ [구문](#ql-reference.select.syntax)
+ [파라미터](#ql-reference.select.parameters)
+ [예제](#ql-reference.select.examples)

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

```
SELECT expression  [, ...] 
FROM table[.index]
[ WHERE condition ] [ [ORDER BY key [DESC|ASC] , ...]
```

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

***expression***  
(필수) `*` 와일드카드에서 형성된 프로젝션 또는 결과 집합에 있는 하나 이상의 속성 이름 또는 문서 경로로 구성된 프로젝션 목록입니다. expression은 [DynamoDB에서 PartiQL 함수 사용](ql-functions.md)에 대한 호출 또는 [DynamoDB용 PartiQL 산술, 비교 및 논리 연산자](ql-operators.md)에서 수정되는 필드로 구성될 수 있습니다.

***테이블*\$1**  
(필수) 쿼리할 테이블 이름입니다.

*** 인덱스***  
(선택 사항) 쿼리할 인덱스의 이름입니다.  
인덱스를 쿼리할 때 테이블 이름과 인덱스 이름에 큰따옴표를 추가해야 합니다.  

```
SELECT * 
FROM "TableName"."IndexName"
```

*** 조건***  
(선택 사항) 쿼리의 선택 기준입니다.  
`SELECT` 문이 전체 테이블 스캔이 되지 않게 하려면 `WHERE` 절 조건에서 파티션 키를 지정해야 합니다. 등식 또는 IN 연산자를 사용합니다.  
예를 들어, `Orders` 테이블에 `OrderID` 파티션 키 및 키가 아닌 기타 속성(`Address` 등)이 있는 경우 다음 문을 사용하면 전체 테이블 스캔이 되지 않습니다.  

```
SELECT * 
FROM "Orders" 
WHERE OrderID = 100

SELECT * 
FROM "Orders" 
WHERE OrderID = 100 and Address='some address'

SELECT * 
FROM "Orders" 
WHERE OrderID = 100 or OrderID = 200

SELECT * 
FROM "Orders" 
WHERE OrderID IN [100, 300, 234]
```
그러나 다음 `SELECT` 문을 사용하면 전체 테이블 스캔이 됩니다.  

```
SELECT * 
FROM "Orders" 
WHERE OrderID > 1

SELECT * 
FROM "Orders" 
WHERE Address='some address'

SELECT * 
FROM "Orders" 
WHERE OrderID = 100 OR Address='some address'
```

***키***  
(선택 사항) 반환된 결과를 정렬하는 데 사용할 해시 키 또는 정렬 키입니다. 기본 순서는 오름차순(`ASC`)이며, 결과가 내림차순으로 반환되게 하려면 `DESC`를 지정합니다.

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

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

다음 쿼리는 파티션 키 `OrderID`를 지정하고 등식 연산자를 사용하여 `Orders` 테이블에서 항목 하나(있는 경우)를 반환합니다.

```
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID = 1
```

다음 쿼리는 특정 파티션 키 `OrderID` 값을 OR 연산자로 지정하여 `Orders` 테이블에서 모든 항목을 반환합니다.

```
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID = 1 OR OrderID = 2
```

다음 쿼리는 특정 파티션 키 `OrderID` 값을 IN 연산자로 지정하여 `Orders` 테이블에서 모든 항목을 반환합니다. 반환되는 결과는 `OrderID` 키 속성 값을 기준으로 내림차순으로 표시됩니다.

```
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESC
```

다음 쿼리는 `Orders` 테이블에서 `Total`이 500보다 큰 모든 항목을 반환하는 전체 테이블 스캔을 표시합니다. 여기서 `Total`은 키가 아닌 속성입니다.

```
SELECT OrderID, Total 
FROM "Orders"
WHERE Total > 500
```

다음 쿼리는 IN 연산자와 키가 아닌 속성 `Total`을 사용하여 `Orders` 테이블에서 특정 `Total` 주문 범위 내의 모든 항목을 반환하는 전체 테이블 스캔을 표시합니다.

```
SELECT OrderID, Total 
FROM "Orders"
WHERE Total IN [500, 600]
```

다음 쿼리는 BETWEEN 연산자가 키가 아닌 속성 `Total`을 사용하여 `Orders` 테이블에서 특정 `Total` 주문 범위 내의 모든 항목을 반환하는 전체 테이블 스캔을 표시합니다.

```
SELECT OrderID, Total 
FROM "Orders" 
WHERE Total BETWEEN 500 AND 600
```

다음 쿼리는 WHERE 절 조건에 파키션 키 `CustomerID` 및 정렬 키 `MovieID`를 지정하고 SELECT 절에 문서 경로를 사용하여 파이어스틱 디바이스를 사용해 시청한 첫 번째 날짜를 반환합니다.

```
SELECT Devices.FireStick.DateWatched[0] 
FROM WatchList 
WHERE CustomerID= 'C1' AND MovieID= 'M1'
```

다음 쿼리는 WHERE 절 조건에 문서 경로를 사용하여 2019년 12월 24일 이후 파이어스틱 디바이스가 처음 사용된 항목 목록을 반환하는 전체 테이블 스캔을 표시합니다.

```
SELECT Devices 
FROM WatchList 
WHERE Devices.FireStick.DateWatched[0] >= '12/24/19'
```

# DynamoDB의 PartiQL update 문
<a name="ql-reference.update"></a>

`UPDATE` 문을 사용하면 Amazon DynamoDB 테이블에서 항목 내의 특성 하나 이상의 값을 수정할 수 있습니다.

**참고**  
한 번에 하나의 항목만 업데이트할 수 있어서, 여러 항목을 업데이트하는 단일 DynamoDB PartiQL 문을 실행할 수는 없습니다. 여러 항목을 업데이트하는 방법은 [DynamoDB용 PartiQL에서 트랜잭션 수행](ql-reference.multiplestatements.transactions.md) 또는 [DynamoDB용 PartiQL에서 일괄 작업 실행](ql-reference.multiplestatements.batching.md) 단원을 참조하세요.

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

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

```
UPDATE  table  
[SET | REMOVE]  path  [=  data] […]
WHERE condition [RETURNING returnvalues]
<returnvalues>  ::= [ALL OLD | MODIFIED OLD | ALL NEW | MODIFIED NEW] *
```

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

***테이블*\$1**  
(필수) 수정할 데이터가 포함된 테이블입니다.

***path***  
(필수) 생성하거나 수정할 속성 이름 또는 문서 경로입니다.

***data***  
(필수) 속성 값 또는 작업의 결과입니다.  
SET과 함께 사용할 수 있는 작업은 다음과 같습니다.  
+ LIST\$1APPEND: 목록 형식에 값을 추가합니다.
+ SET\$1ADD: 숫자 또는 문자열 집합에 값을 추가합니다.
+ SET\$1DELETE: 숫자 또는 문자열 집합에서 값을 제거합니다.

*** 조건***  
(필수) 수정할 항목의 선택 기준입니다. 이 조건은 단일 기본 키 값으로 확인되어야 합니다.

***returnvalues***  
(선택 사항) 항목 속성이 업데이트되기 전이나 후에 표시되는 해당 속성을 가져오려면 `returnvalues`를 사용합니다. 유효한 값은 다음과 같습니다.  
+ `ALL OLD *` - 업데이트 작업 전에 표시된 항목 속성을 모두 반환합니다.
+ `MODIFIED OLD *` - 업데이트 작업 전에 표시된 업데이트된 속성만 반환합니다.
+ `ALL NEW *` - 업데이트 작업 후에 표시되는 항목 속성을 모두 반환합니다.
+ `MODIFIED NEW *` - `UpdateItem` 작업 후에 표시되는 업데이트된 속성만 반환합니다.

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

이 문은 `returnvalues` 파라미터를 지정하지 않는 경우 값을 반환하지 않습니다.

**참고**  
DynamoDB 테이블의 모든 항목에 대해 UPDATE 문의 WHERE 절이 true로 평가되지 않으면 `ConditionalCheckFailedException`이 반환됩니다.

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

기존 항목의 속성 값을 업데이트합니다. 속성이 없으면 새로 생성됩니다.

다음 쿼리는 숫자 형식의 속성(`AwardsWon`)과 맵 형식의 속성(`AwardDetail`)을 추가하여 `"Music"` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
SET AwardsWon=1 
SET AwardDetail={'Grammys':[2020, 2018]}  
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

`RETURNING ALL OLD *`를 추가하여 `Update` 작업 전에 있던 속성을 반환할 수 있습니다.

```
UPDATE "Music" 
SET AwardsWon=1 
SET AwardDetail={'Grammys':[2020, 2018]}  
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
RETURNING ALL OLD *
```

그러면 다음이 반환됩니다.

```
{
    "Items": [
        {
            "Artist": {
                "S": "Acme Band"
            },
            "SongTitle": {
                "S": "PartiQL Rocks"
            }
        }
    ]
}
```

`RETURNING ALL NEW *`를 추가하여 `Update` 작업 후에 있던 속성을 반환할 수 있습니다.

```
UPDATE "Music" 
SET AwardsWon=1 
SET AwardDetail={'Grammys':[2020, 2018]}  
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
RETURNING ALL NEW *
```

그러면 다음이 반환됩니다.

```
{
    "Items": [
        {
            "AwardDetail": {
                "M": {
                    "Grammys": {
                        "L": [
                            {
                                "N": "2020"
                            },
                            {
                                "N": "2018"
                            }
                        ]
                    }
                }
            },
            "AwardsWon": {
                "N": "1"
            }
        }
    ]
}
```

다음 쿼리는 `AwardDetail.Grammys` 목록에 추가하여 `"Music"` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
SET AwardDetail.Grammys =list_append(AwardDetail.Grammys,[2016])  
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

다음 쿼리는 `AwardDetail.Grammys` 목록에서 제거하여 `"Music"` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
REMOVE AwardDetail.Grammys[2]   
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

다음 쿼리는 `AwardDetail` 맵에 `"Music"`을 추가하여 `BillBoard` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
SET AwardDetail.BillBoard=[2020] 
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

다음 쿼리는 문자열 집합 속성 `BandMembers`를 추가하여 `"Music"` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
SET BandMembers =<<'member1', 'member2'>> 
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

다음 쿼리는 문자열 집합 `BandMembers`에 `newbandmember`를 추가하여 `"Music"` 테이블에서 항목을 업데이트합니다.

```
UPDATE "Music" 
SET BandMembers =set_add(BandMembers, <<'newbandmember'>>) 
WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'
```

# DynamoDB의 PartiQL delete 문
<a name="ql-reference.delete"></a>

`DELETE` 문을 사용하면 Amazon DynamoDB 테이블에서 기존 항목을 삭제할 수 있습니다.

**참고**  
항목은 한 번에 하나만 삭제할 수 있습니다. 여러 항목을 삭제하는 단일 DynamoDB PartiQL 문을 실행할 수는 없습니다. 여러 항목을 삭제하는 방법에 대한 자세한 내용은 [DynamoDB용 PartiQL에서 트랜잭션 수행](ql-reference.multiplestatements.transactions.md) 또는 [DynamoDB용 PartiQL에서 일괄 작업 실행](ql-reference.multiplestatements.batching.md) 단원을 참조하세요.

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

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

```
DELETE FROM table 
 WHERE condition [RETURNING returnvalues]
 <returnvalues>  ::= ALL OLD *
```

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

***테이블*\$1**  
(필수) 삭제할 항목이 포함된 DynamoDB 테이블입니다.

*** 조건***  
(필수) 삭제할 항목의 선택 기준입니다. 이 조건은 단일 기본 키 값으로 확인되어야 합니다.

***returnvalues***  
(선택 사항) 항목 속성이 삭제되기 전에 표시된 해당 속성을 가져오려면 `returnvalues`를 사용합니다. 유효한 값은 다음과 같습니다.  
+ `ALL OLD *` - 이전 항목의 내용이 반환됩니다.

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

이 문은 `returnvalues` 파라미터를 지정하지 않는 경우 값을 반환하지 않습니다.

**참고**  
DELETE가 실행된 대상 항목과 기본 키가 같은 항목이 DynamoDB 테이블에 없는 경우 삭제된 항목이 0개인 SUCCESS가 반환됩니다. 테이블에 기본 키가 같은 항목이 있지만 DELETE 문의 WHERE 절 조건이 false로 평가되는 경우에는 `ConditionalCheckFailedException`이 반환됩니다.

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

다음 쿼리는 `"Music"` 테이블의 항목을 삭제합니다.

```
DELETE FROM "Music" WHERE "Artist" = 'Acme Band' AND "SongTitle" = 'PartiQL Rocks'
```

`RETURNING ALL OLD *` 파라미터를 추가하여 삭제된 데이터를 반환할 수 있습니다.

```
DELETE FROM "Music" WHERE "Artist" = 'Acme Band' AND "SongTitle" = 'PartiQL Rocks' RETURNING ALL OLD *
```

이제 `Delete` 문은 다음을 반환합니다.

```
{
    "Items": [
        {
            "Artist": {
                "S": "Acme Band"
            },
            "SongTitle": {
                "S": "PartiQL Rocks"
            }
        }
    ]
}
```

# DynamoDB의 PartiQL insert 문
<a name="ql-reference.insert"></a>

`INSERT` 문을 사용하면 Amazon DynamoDB의 테이블에 항목을 추가할 수 있습니다.

**참고**  
한 번에 하나의 항목만 업데이트할 수 있어서, 여러 항목을 삽입하는 단일 DynamoDB PartiQL 문을 실행할 수는 없습니다. 여러 항목을 삽입하는 방법에 대한 자세한 내용은 [DynamoDB용 PartiQL에서 트랜잭션 수행](ql-reference.multiplestatements.transactions.md) 또는 [DynamoDB용 PartiQL에서 일괄 작업 실행](ql-reference.multiplestatements.batching.md) 단원을 참조하세요.

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

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

단일 항목을 삽입합니다.

```
INSERT INTO table VALUE item
```

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

***테이블*\$1**  
(필수) 데이터를 삽입할 테이블입니다. 이미 있는 테이블이어야 합니다.

***item***  
(필수) [PartiQL 튜플](https://partiql.org/docs.html)로 표시된 유효한 DynamoDB 항목입니다. 항목을 *하나*만 지정해야 하며 항목의 각 속성 이름은 대/소문자를 구분하고 PartiQL에서 *작은* 따옴표(`'...'`)로 표시될 수 있습니다.  
문자열 값도 PartiQL에서 *작은* 따옴표(`'...'`)로 표시될 수 있습니다.

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

이 문은 값을 반환하지 않습니다.

**참고**  
DynamoDB 테이블에 삽입되는 항목과 기본 키가 같은 항목이 이미 있는 경우 `DuplicateItemException`이 반환됩니다.

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

```
INSERT INTO "Music" value {'Artist' : 'Acme Band','SongTitle' : 'PartiQL Rocks'}
```