

# PartiQL - Amazon DynamoDB용 SQL 호환 쿼리 언어
<a name="ql-reference"></a>

Amazon DynamoDB에서는 SQL 호환 쿼리 언어인 [PartiQL](https://partiql.org/)을 사용하여 Amazon DynamoDB에서 데이터를 선택, 삽입, 업데이트, 삭제할 수 있습니다. PartiQL을 사용하면 DynamoDB 테이블과 쉽게 상호 작용하고 AWS Management Console, NoSQL Workbench, AWS Command Line Interface 및 PartiQL용 DynamoDB API를 사용하여 임시 쿼리를 실행할 수 있습니다.

PartiQL 작업은 다른 DynamoDB 데이터 영역 작업과 동일한 가용성, 대기 시간 및 성능을 제공합니다.

다음 단원에서는 PartiQL의 DynamoDB 구현을 설명합니다.

**Topics**
+ [PartiQL이란?](#ql-reference.what-is)
+ [Amazon DynamoDB의 PartiQL](#ql-reference.what-is)
+ [시작하기](ql-gettingstarted.md)
+ [데이터 타입](ql-reference.data-types.md)
+ [문](ql-reference.statements.md)
+ [함수](ql-functions.md)
+ [연산자](ql-operators.md)
+ [트랜잭션](ql-reference.multiplestatements.transactions.md)
+ [배치 작업](ql-reference.multiplestatements.batching.md)
+ [IAM 정책](ql-iam.md)

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

*PartiQL*은 구조화 데이터, 반구조화 데이터 및 중첩 데이터를 포함하는 여러 데이터 스토어에서 SQL 호환 쿼리 액세스를 제공합니다. Amazon 내에서 널리 사용되며 현재 DynamoDB를 비롯한 여러 AWS 서비스의 일부로 제공됩니다.

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

**참고**  
Amazon DynamoDB는 [PartiQL](https://partiql.org/) 쿼리 언어의 *하위 집합*을 지원합니다.
Amazon DynamoDB에서는 [Amazon ion](http://amzn.github.io/ion-docs/) 데이터 형식 또는 Amazon Ion 리터럴을 지원하지 않습니다.

## Amazon DynamoDB의 PartiQL
<a name="ql-reference.what-is"></a>

DynamoDB에서 PartiQL 쿼리를 실행하려면 다음을 사용할 수 있습니다.
+ DynamoDB 콘솔
+ NoSQL Workbench
+ AWS Command Line Interface(AWS CLI)
+ DynamoDB API

DynamoDB에 액세스하는 이러한 방법에 대한 자세한 내용은 [DynamoDB 액세스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/AccessingDynamoDB.html)를 참조하세요.

# DynamoDB용 PartiQL 시작하기
<a name="ql-gettingstarted"></a>

이 단원에서는 Amazon DynamoDB 콘솔, AWS Command Line Interface(AWS CLI) 및 DynamoDB API에서 DynamoDB용 PartiQL을 사용하는 방법을 설명합니다.

다음 예에서 [DynamoDB 시작하기](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html) 자습서에 정의된 DynamoDB 테이블은 사전 조건입니다.

DynamoDB 콘솔, AWS Command Line Interface 또는 DynamoDB API를 사용하여 DynamoDB에 액세스하는 방법에 대한 자세한 내용은 [DynamoDB DB 액세스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/AccessingDynamoDB.html)를 참조하세요.

[NoSQL 워크벤치](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.html)를 [다운로드](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.html)하고 사용하여 [DynamoDB용 PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) 문을 빌드하려면 DynamoDB용 NoSQL Workbench **작업 빌더(Operation Builder)** 오른쪽 맨 위에서 [PartiQL 작업(PartiQL operations)](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.querybuilder.operationbuilder.html)를 선택합니다.

------
#### [ Console ]

![\[Music 테이블에 대한 Query 작업 실행 결과를 보여주는 PartiQL 에디터 인터페이스.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/partiqlgettingstarted.png)


1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1. 콘솔 왼쪽의 탐색 창에서 **PartiQL editor(PartiQL 편집기)**를 선택합니다.

1. **Music** 테이블을 선택합니다.

1. **Query table(테이블 쿼리)**을 선택합니다. 이 작업을 수행하면 전체 테이블이 스캔되지 않는 쿼리가 생성됩니다.

1. `partitionKeyValue`를 문자열 값 `Acme Band`로 바꿉니다. `sortKeyValue`를 문자열 값 `Happy Day`로 바꿉니다.

1. **실행** 버튼을 선택합니다.

1. **Table view(테이블 보기)** 또는 **JSON view(JSON 보기)** 버튼을 선택하여 쿼리의 결과를 볼 수 있습니다.

------
#### [ NoSQL workbench ]

![\[NoSQL Workbench 인터페이스. Music 테이블에 대해 실행할 수 있는 PartiQL SELECT 문을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/workbench/partiql.single.png)


1. **PartiQL statement(PartiQL 문)**를 선택합니다.

1. 다음 PartiQL [SELECT 문](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.select.html)을 입력합니다.

   ```
   SELECT *                                         
   FROM Music  
   WHERE Artist=? and SongTitle=?
   ```

1. `Artist` 및 `SongTitle` 파라미터의 값을 지정하려면 다음을 수행합니다.

   1. **Optional request parameters(선택적 요청 파라미터)**를 선택합니다.

   1. **Add new parameter(새 파라미터 추가)**를 선택합니다.

   1. 속성 형식 **문자열**과 값 `Acme Band`를 선택합니다.

   1. b단계와 c단계를 반복하고 형식 **문자열**과 값 `PartiQL Rocks`를 선택합니다.

1. 코드를 생성하려면 **Generate code(코드 생성)**를 선택합니다.

   표시된 탭에서 원하는 언어를 선택합니다. 이제 이 코드를 복사하여 애플리케이션에서 사용할 수 있습니다.

1. 작업을 즉시 실행하려면 **Run(실행)**을 선택합니다.

------
#### [ AWS CLI ]

1. INSERT PartiQL 문을 사용하여 `Music` 테이블에 항목을 생성합니다.

   ```
   aws dynamodb execute-statement --statement "INSERT INTO Music  \
   					    VALUE  \
   					    {'Artist':'Acme Band','SongTitle':'PartiQL Rocks'}"
   ```

1. SELECT PartiQL 문을 사용하여 Music 테이블에서 항목을 검색합니다.

   ```
   aws dynamodb execute-statement --statement "SELECT * FROM Music   \
                                               WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

1. UPDATE PartiQL 문을 사용하여 `Music` 테이블의 항목을 업데이트합니다.

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

   `Music` 테이블에서 항목의 목록 값을 추가합니다.

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

   `Music` 테이블에서 항목의 목록 값을 제거합니다.

   ```
   aws dynamodb execute-statement --statement "UPDATE Music  \
                                               REMOVE AwardDetail.Grammys[2]  \
                                               WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

   `Music` 테이블에서 항목의 새 맵 멤버를 추가합니다.

   ```
   aws dynamodb execute-statement --statement "UPDATE Music  \
                                               SET AwardDetail.BillBoard=[2020]  \
                                               WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

   `Music` 테이블에서 항목의 새 문자열 집합 속성을 추가합니다.

   ```
   aws dynamodb execute-statement --statement "UPDATE Music  \
                                               SET BandMembers =<<'member1', 'member2'>>  \
                                               WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

   `Music` 테이블에서 항목의 문자열 집합 속성을 업데이트합니다.

   ```
   aws dynamodb execute-statement --statement "UPDATE Music  \
                                               SET BandMembers =set_add(BandMembers, <<'newmember'>>)  \
                                               WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

1. DELETE PartiQL 문을 사용하여 `Music` 테이블에서 항목을 삭제합니다.

   ```
   aws dynamodb execute-statement --statement "DELETE  FROM Music  \
       WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
   ```

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

```
import java.util.ArrayList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import software.amazon.dynamodb.AmazonDynamoDB;
import software.amazon.dynamodb.AmazonDynamoDBClientBuilder;
import software.amazon.dynamodb.model.AttributeValue;
import software.amazon.dynamodb.model.ConditionalCheckFailedException;
import software.amazon.dynamodb.model.ExecuteStatementRequest;
import software.amazon.dynamodb.model.ExecuteStatementResult;
import software.amazon.dynamodb.model.InternalServerErrorException;
import software.amazon.dynamodb.model.ItemCollectionSizeLimitExceededException;
import software.amazon.dynamodb.model.ProvisionedThroughputExceededException;
import software.amazon.dynamodb.model.RequestLimitExceededException;
import software.amazon.dynamodb.model.ResourceNotFoundException;
import software.amazon.dynamodb.model.TransactionConflictException;

public class DynamoDBPartiQGettingStarted {

    public static void main(String[] args) {
        // Create the DynamoDB Client with the region you want
        AmazonDynamoDB dynamoDB = createDynamoDbClient("us-west-1");

        try {
            // Create ExecuteStatementRequest
            ExecuteStatementRequest executeStatementRequest = new ExecuteStatementRequest();
            List<AttributeValue> parameters= getPartiQLParameters();

            //Create an item in the Music table using the INSERT PartiQL statement
            processResults(executeStatementRequest(dynamoDB, "INSERT INTO Music value {'Artist':?,'SongTitle':?}", parameters));

            //Retrieve an item from the Music table using the SELECT PartiQL statement.
            processResults(executeStatementRequest(dynamoDB, "SELECT * FROM Music  where Artist=? and SongTitle=?", parameters));

            //Update an item in the Music table using the UPDATE PartiQL statement.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music SET AwardsWon=1 SET AwardDetail={'Grammys':[2020, 2018]}  where Artist=? and SongTitle=?", parameters));

            //Add a list value for an item in the Music table.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music SET AwardDetail.Grammys =list_append(AwardDetail.Grammys,[2016])  where Artist=? and SongTitle=?", parameters));

            //Remove a list value for an item in the Music table.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music REMOVE AwardDetail.Grammys[2]   where Artist=? and SongTitle=?", parameters));

            //Add a new map member for an item in the Music table.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music set AwardDetail.BillBoard=[2020] where Artist=? and SongTitle=?", parameters));

            //Add a new string set attribute for an item in the Music table.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music SET BandMembers =<<'member1', 'member2'>> where Artist=? and SongTitle=?", parameters));

            //update a string set attribute for an item in the Music table.
            processResults(executeStatementRequest(dynamoDB, "UPDATE Music SET BandMembers =set_add(BandMembers, <<'newmember'>>) where Artist=? and SongTitle=?", parameters));

            //Retrieve an item from the Music table using the SELECT PartiQL statement.
            processResults(executeStatementRequest(dynamoDB, "SELECT * FROM Music  where Artist=? and SongTitle=?", parameters));

            //delete an item from the Music Table
            processResults(executeStatementRequest(dynamoDB, "DELETE  FROM Music  where Artist=? and SongTitle=?", parameters));
        } catch (Exception e) {
            handleExecuteStatementErrors(e);
        }
    }

    private static AmazonDynamoDB createDynamoDbClient(String region) {
        return AmazonDynamoDBClientBuilder.standard().withRegion(region).build();
    }

    private static List<AttributeValue> getPartiQLParameters() {
        List<AttributeValue> parameters = new ArrayList<AttributeValue>();
        parameters.add(new AttributeValue("Acme Band"));
        parameters.add(new AttributeValue("PartiQL Rocks"));
        return parameters;
    }

    private static ExecuteStatementResult executeStatementRequest(AmazonDynamoDB client, String statement, List<AttributeValue> parameters ) {
        ExecuteStatementRequest request = new ExecuteStatementRequest();
        request.setStatement(statement);
        request.setParameters(parameters);
        return client.executeStatement(request);
    }

    private static void processResults(ExecuteStatementResult executeStatementResult) {
        System.out.println("ExecuteStatement successful: "+ executeStatementResult.toString());

    }

    // Handles errors during ExecuteStatement execution. Use recommendations in error messages below to add error handling specific to
    // your application use-case.
    private static void handleExecuteStatementErrors(Exception exception) {
        try {
            throw exception;
        } catch (ConditionalCheckFailedException ccfe) {
            System.out.println("Condition check specified in the operation failed, review and update the condition " +
                                       "check before retrying. Error: " + ccfe.getErrorMessage());
        } catch (TransactionConflictException tce) {
            System.out.println("Operation was rejected because there is an ongoing transaction for the item, generally " +
                                       "safe to retry with exponential back-off. Error: " + tce.getErrorMessage());
        } catch (ItemCollectionSizeLimitExceededException icslee) {
            System.out.println("An item collection is too large, you\'re using Local Secondary Index and exceeded " +
                                       "size limit of items per partition key. Consider using Global Secondary Index instead. Error: " + icslee.getErrorMessage());
        } catch (Exception e) {
            handleCommonErrors(e);
        }
    }

    private static void handleCommonErrors(Exception exception) {
        try {
            throw exception;
        } catch (InternalServerErrorException isee) {
            System.out.println("Internal Server Error, generally safe to retry with exponential back-off. Error: " + isee.getErrorMessage());
        } catch (RequestLimitExceededException rlee) {
            System.out.println("Throughput exceeds the current throughput limit for your account, increase account level throughput before " +
                                       "retrying. Error: " + rlee.getErrorMessage());
        } catch (ProvisionedThroughputExceededException ptee) {
            System.out.println("Request rate is too high. If you're using a custom retry strategy make sure to retry with exponential back-off. " +
                                       "Otherwise consider reducing frequency of requests or increasing provisioned capacity for your table or secondary index. Error: " +
                                       ptee.getErrorMessage());
        } catch (ResourceNotFoundException rnfe) {
            System.out.println("One of the tables was not found, verify table exists before retrying. Error: " + rnfe.getErrorMessage());
        } catch (AmazonServiceException ase) {
            System.out.println("An AmazonServiceException occurred, indicates that the request was correctly transmitted to the DynamoDB " +
                                       "service, but for some reason, the service was not able to process it, and returned an error response instead. Investigate and " +
                                       "configure retry strategy. Error type: " + ase.getErrorType() + ". Error message: " + ase.getErrorMessage());
        } catch (AmazonClientException ace) {
            System.out.println("An AmazonClientException occurred, indicates that the client was unable to get a response from DynamoDB " +
                                       "service, or the client was unable to parse the response from the service. Investigate and configure retry strategy. "+
                                       "Error: " + ace.getMessage());
        } catch (Exception e) {
            System.out.println("An exception occurred, investigate and configure retry strategy. Error: " + e.getMessage());
        }
    }

}
```

------

## 파라미터화된 문 사용
<a name="ql-gettingstarted.parameterized"></a>

PartiQL 문 문자열에 직접 값을 포함하는 대신 물음표(`?`) 자리 표시자를 사용하고 `Parameters` 필드에 값을 별도로 제공할 수 있습니다. 각 `?` 값은 제공된 순서대로 해당 파라미터 값으로 대체됩니다.

파라미터화된 문을 사용하는 것이 모범 사례입니다. 문 구조를 데이터 값과 분리하므로 문을 더 쉽게 읽고 재사용할 수 있기 때문입니다. 또한 명령문 문자열에서 속성 값을 수동으로 포맷하고 이스케이프할 필요가 없습니다.

파라미터화된 문은 `ExecuteStatement`, `BatchExecuteStatement` 및 `ExecuteTransaction` 작업에서 지원됩니다.

다음 예제에서는 파티션 키 및 정렬 키에 대해 파라미터화된 값을 사용하여 `Music` 테이블에서 항목을 검색합니다.

------
#### [ AWS CLI parameterized ]

```
aws dynamodb execute-statement \
    --statement "SELECT * FROM \"Music\" WHERE Artist=? AND SongTitle=?" \
    --parameters '[{"S": "Acme Band"}, {"S": "PartiQL Rocks"}]'
```

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

```
List<AttributeValue> parameters = new ArrayList<>();
parameters.add(new AttributeValue("Acme Band"));
parameters.add(new AttributeValue("PartiQL Rocks"));

ExecuteStatementRequest request = new ExecuteStatementRequest()
    .withStatement("SELECT * FROM Music WHERE Artist=? AND SongTitle=?")
    .withParameters(parameters);

ExecuteStatementResult result = dynamoDB.executeStatement(request);
```

------
#### [ Python parameterized ]

```
response = dynamodb_client.execute_statement(
    Statement="SELECT * FROM Music WHERE Artist=? AND SongTitle=?",
    Parameters=[
        {'S': 'Acme Band'},
        {'S': 'PartiQL Rocks'}
    ]
)
```

------

**참고**  
이전 시작하기 섹션의 Java 예제에서는 파라미터화된 문을 전체적으로 사용합니다. `getPartiQLParameters()` 메서드는 파라미터 목록을 빌드하고 각 문은 인라인 값 대신 `?` 자리 표시자를 사용합니다.

# DynamoDB에 대한 PartiQL 데이터 형식
<a name="ql-reference.data-types"></a>

다음 표에는 DynamoDB용 PartiQL에서 사용할 수 있는 데이터 형식이 나와 있습니다.

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

## 예제
<a name="ql-reference.data-types"></a>

다음 문은 `String`, `Number`, `Map`, `List`, `Number Set` 및 `String Set` 데이터 형식을 삽입하는 방법을 보여 줍니다.

```
INSERT INTO TypesTable value {'primarykey':'1', 
'NumberType':1,
'MapType' : {'entryname1': 'value', 'entryname2': 4}, 
'ListType': [1,'stringval'], 
'NumberSetType':<<1,34,32,4.5>>, 
'StringSetType':<<'stringval','stringval2'>>
}
```

다음 문은 `Map`, `List`, `Number Set` 및 `String Set` 형식에 새 요소를 삽입하고 `Number` 형식의 값을 변경하는 방법을 보여 줍니다.

```
UPDATE TypesTable 
SET NumberType=NumberType + 100 
SET MapType.NewMapEntry=[2020, 'stringvalue', 2.4]
SET ListType = LIST_APPEND(ListType, [4, <<'string1', 'string2'>>])
SET NumberSetType= SET_ADD(NumberSetType, <<345, 48.4>>)
SET StringSetType = SET_ADD(StringSetType, <<'stringsetvalue1', 'stringsetvalue2'>>)
WHERE primarykey='1'
```

다음 문은 `Map`, `List`, `Number Set` 및 `String Set` 형식에서 요소를 제거하고 `Number` 형식의 값을 변경하는 방법을 보여 줍니다.

```
UPDATE TypesTable 
SET NumberType=NumberType - 1
REMOVE ListType[1]
REMOVE MapType.NewMapEntry
SET NumberSetType = SET_DELETE( NumberSetType, <<345>>)
SET StringSetType = SET_DELETE( StringSetType, <<'stringsetvalue1'>>)
WHERE primarykey='1'
```

자세한 내용은 [DynamoDB 데이터 형식](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes) 단원을 참조하세요.

# 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'}
```

# DynamoDB에서 PartiQL 함수 사용
<a name="ql-functions"></a>

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

**참고**  
이 목록에 없는 모든 SQL 함수는 현재 DynamoDB에서 지원되지 않습니다.

## 집계 함수
<a name="ql-functions.aggregate"></a>
+ [Amazon DynamoDB용 PartiQL에서 SIZE 함수 사용](ql-functions.size.md)

## 조건 함수
<a name="ql-functions.conditional"></a>
+ [DynamoDB용 PartiQL에서 EXISTS 함수 사용](ql-functions.exists.md)
+ [DynamoDB용 PartiQL에서 ATTRIBUTE\$1TYPE 함수 사용](ql-functions.attribute_type.md)
+ [DynamoDB용 PartiQL에서 BEGINS\$1WITH 함수 사용](ql-functions.beginswith.md)
+ [DynamoDB용 PartiQL에서 CONTAINS 함수 사용](ql-functions.contains.md)
+ [DynamoDB용 PartiQL에서 MISSING 함수 사용](ql-functions.missing.md)

# DynamoDB용 PartiQL에서 EXISTS 함수 사용
<a name="ql-functions.exists"></a>

EXISTS를 사용하면 [TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems) API에서 `ConditionCheck`가 하는 기능을 똑같이 수행할 수 있습니다. EXISTS 함수는 트랜잭션에서만 사용할 수 있습니다.

값이 지정된 경우 값이 비어 있지 않은 컬렉션이면 `TRUE`를 반환합니다. 그렇지 않은 경우 `FALSE`를 반환합니다.

**참고**  
이 함수는 트랜잭션 작업에서만 사용할 수 있습니다.

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

```
EXISTS ( statement )
```

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

*설명*  
(필수) 함수가 평가하는 SELECT 문입니다.  
SELECT 문은 전체 기본 키와 하나의 다른 조건을 지정해야 합니다.

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

`bool`

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

```
EXISTS(
    SELECT * FROM "Music" 
    WHERE "Artist" = 'Acme Band' AND "SongTitle" = 'PartiQL Rocks')
```

# DynamoDB용 PartiQL에서 BEGINS\$1WITH 함수 사용
<a name="ql-functions.beginswith"></a>

지정된 속성이 특정 하위 문자열로 시작하는 경우 `TRUE`를 반환합니다.

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

```
begins_with(path, value )
```

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

*경로*  
(필수) 사용할 속성 이름 또는 문서 경로입니다.

*USD 상당*  
(필수) 검색할 문자열입니다.

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

`bool`

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

```
SELECT * FROM "Orders" WHERE "OrderID"=1 AND begins_with("Address", '7834 24th')
```

# DynamoDB용 PartiQL에서 MISSING 함수 사용
<a name="ql-functions.missing"></a>

항목에 지정된 속성이 포함되어 있지 않은 경우 `TRUE`를 반환합니다. 이 함수에는 등식 및 부등식 연산자만 사용할 수 있습니다.

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

```
 attributename IS | IS NOT  MISSING 
```

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

*attributename*  
(필수) 찾을 속성 이름입니다.

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

`bool`

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

```
SELECT * FROM Music WHERE "Awards" is MISSING
```

# DynamoDB용 PartiQL에서 ATTRIBUTE\$1TYPE 함수 사용
<a name="ql-functions.attribute_type"></a>

지정된 경로의 속성이 특정 데이터 형식인 경우 `TRUE`를 반환합니다.

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

```
attribute_type( attributename, type )
```

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

*attributename*  
(필수) 사용할 속성 이름입니다.

type**  
(필수) 확인할 속성 형식입니다. 유효한 값 목록은 DynamoDB [attribute\$1type](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions)을 참조하세요.

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

`bool`

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

```
SELECT * FROM "Music" WHERE attribute_type("Artist", 'S')
```

# DynamoDB용 PartiQL에서 CONTAINS 함수 사용
<a name="ql-functions.contains"></a>

경로에서 지정된 속성이 다음 중 하나인 경우 `TRUE`를 반환합니다.
+ 특정 하위 문자열을 포함하는 문자열 
+ 특정 요소를 포함하는 집합

자세한 내용은 DynamoDB [contains](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions) 함수를 참조하세요.

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

```
contains( path, substring )
```

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

*경로*  
(필수) 사용할 속성 이름 또는 문서 경로입니다.

*substring*  
(필수) 확인할 속성 하위 문자열 또는 집합 멤버입니다. 자세한 내용은 DynamoDB [contains](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions) 함수를 참조하세요.

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

`bool`

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

```
SELECT * FROM "Orders" WHERE "OrderID"=1 AND contains("Address", 'Kirkland')
```

# Amazon DynamoDB용 PartiQL에서 SIZE 함수 사용
<a name="ql-functions.size"></a>

속성의 크기(바이트)를 나타내는 숫자가 반환됩니다. Size를 사용하는 데 유효한 데이터 형식은 다음과 같습니다. 자세한 내용은 DynamoDB [size](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions) 함수를 참조하세요.

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

```
size( path)
```

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

*경로*  
(필수) 속성 이름 또는 문서 경로입니다.  
지원되는 형식은 DynamoDB [size](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html#Expressions.OperatorsAndFunctions.Functions) 함수를 참조하세요.

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

`int`

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

```
 SELECT * FROM "Orders" WHERE "OrderID"=1 AND size("Image") >300
```

# DynamoDB용 PartiQL 산술, 비교 및 논리 연산자
<a name="ql-operators"></a>

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

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

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


****  

| 연산자 | 설명 | 
| --- | --- | 
| \$1 | 더하기 | 
| - | 차감 | 

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


****  

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

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


****  

| 연산자 | 설명 | 
| --- | --- | 
| AND | AND로 구분된 조건이 모두 TRUE이면 TRUE | 
| BETWEEN |  피연산자가 비교 범위 이내이면 `TRUE`입니다. 이 연산자는 해당 연산자를 적용하는 피연산자의 하한과 상한을 포함합니다.  | 
| IN | `TRUE` 피연산자가 표현식 목록 중 하나와 같은 경우(해시 속성 값 최대 50개 또는 키가 아닌 속성 값 최대 100개). 결과는 최대 10개의 항목으로 구성된 페이지로 반환됩니다. `IN` 목록에 더 많은 값이 포함된 경우 응답에서 반환된 `NextToken`을 사용하여 후속 페이지를 검색해야 합니다. | 
| IS | 피연산자가 지정된 PartiQL 데이터 형식(NULL 또는 MISSING 포함)이면 TRUE | 
| NOT | 지정된 부울 식의 값을 반대로 바꿈 | 
| OR | OR로 구분된 조건 중 하나라도 TRUE이면 TRUE | 

논리 연산자 사용에 대한 자세한 내용은 [비교 실행](Expressions.OperatorsAndFunctions.md#Expressions.OperatorsAndFunctions.Comparators) 및 [논리 평가](Expressions.OperatorsAndFunctions.md#Expressions.OperatorsAndFunctions.LogicalEvaluations) 섹션을 참조하세요.

# DynamoDB용 PartiQL에서 트랜잭션 수행
<a name="ql-reference.multiplestatements.transactions"></a>

이 단원에서는 DynamoDB용 PartiQL에서 트랜잭션을 사용하는 방법을 설명합니다. PartiQL 트랜잭션은 총 100개의 명령문(작업)으로 제한됩니다.

DynamoDB 트랜잭션에 대한 자세한 내용은 [DynamoDB Transactions를 사용하여 복잡한 워크플로 관리](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html)를 참조하세요.

**참고**  
전체 트랜잭션은 읽기 또는 쓰기 문으로 구성해야 합니다. 하나의 트랜잭션에서 두 가지를 모두 혼용할 수는 없습니다. EXISTS 함수는 예외입니다. [TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems) API 작업의 `ConditionCheck`와 유사한 방식으로 특정 항목 속성의 조건을 확인하는 데 사용할 수 있습니다.

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

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

```
[
   {
      "Statement":" statement ",
      "Parameters":[
         {
            " parametertype " : " parametervalue "
         }, ...]
   } , ...
]
```

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

*** 명령문***  
(필수) DynamoDB용 PartiQL에서 지원되는 문입니다.  
전체 트랜잭션은 읽기 또는 쓰기 문으로 구성해야 합니다. 하나의 트랜잭션에서 두 가지를 모두 혼용할 수는 없습니다.

***parametertype***  
(선택 사항) ParitPartiQL 문을 지정할 때 파라미터가 사용된 경우 DynamoDB 형식입니다.

***parametervalue***  
(선택 사항) PartiQL 문을 지정할 때 파라미터가 사용된 경우 파라미터 값입니다.

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

이 문은 쓰기 작업(INSERT, UPDATE 또는 DELETE)에 대한 값을 반환하지 않습니다. 그러나 WHERE 절에 지정된 조건에 따라 읽기 작업 (SELECT) 에 대해 서로 다른 값을 반환합니다.

**참고**  
Singleton INSERT, UPDATE 또는 DELETE 작업 중 하나에서 오류를 반환하는 경우 트랜잭션이 `TransactionCanceledException` 예외로 취소되고 취소 이유 코드에 개별 singleton 작업의 오류가 포함됩니다.

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

다음 예는 여러 문을 트랜잭션으로 실행합니다.

------
#### [ AWS CLI ]

1. 다음 JSON 코드를 partiql.json이라는 파일에 저장합니다.

   ```
   [
       {
           "Statement": "EXISTS(SELECT * FROM \"Music\" where Artist='No One You Know' and SongTitle='Call Me Today' and Awards is  MISSING)"
       },
       {
           "Statement": "INSERT INTO Music value {'Artist':?,'SongTitle':'?'}",
           "Parameters": [{\"S\": \"Acme Band\"}, {\"S\": \"Best Song\"}]
       },
       {
           "Statement": "UPDATE \"Music\" SET AwardsWon=1 SET AwardDetail={'Grammys':[2020, 2018]}  where Artist='Acme Band' and SongTitle='PartiQL Rocks'"
       }
   ]
   ```

1. 명령 프롬프트에서 다음 명령을 실행합니다.

   ```
   aws dynamodb execute-transaction --transact-statements  file://partiql.json
   ```

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

```
public class DynamoDBPartiqlTransaction {

    public static void main(String[] args) {
        // Create the DynamoDB Client with the region you want
        AmazonDynamoDB dynamoDB = createDynamoDbClient("us-west-2");
        
        try {
            // Create ExecuteTransactionRequest
            ExecuteTransactionRequest executeTransactionRequest = createExecuteTransactionRequest();
            ExecuteTransactionResult executeTransactionResult = dynamoDB.executeTransaction(executeTransactionRequest);
            System.out.println("ExecuteTransaction successful.");
            // Handle executeTransactionResult

        } catch (Exception e) {
            handleExecuteTransactionErrors(e);
        }
    }

    private static AmazonDynamoDB createDynamoDbClient(String region) {
        return AmazonDynamoDBClientBuilder.standard().withRegion(region).build();
    }

    private static ExecuteTransactionRequest createExecuteTransactionRequest() {
        ExecuteTransactionRequest request = new ExecuteTransactionRequest();
        
        // Create statements
        List<ParameterizedStatement> statements = getPartiQLTransactionStatements();

        request.setTransactStatements(statements);
        return request;
    }

    private static List<ParameterizedStatement> getPartiQLTransactionStatements() {
        List<ParameterizedStatement> statements = new ArrayList<ParameterizedStatement>();

        statements.add(new ParameterizedStatement()
                               .withStatement("EXISTS(SELECT * FROM "Music" where Artist='No One You Know' and SongTitle='Call Me Today' and Awards is  MISSING)"));

        statements.add(new ParameterizedStatement()
                               .withStatement("INSERT INTO "Music" value {'Artist':'?','SongTitle':'?'}")
                               .withParameters(new AttributeValue("Acme Band"),new AttributeValue("Best Song")));

        statements.add(new ParameterizedStatement()
                               .withStatement("UPDATE "Music" SET AwardsWon=1 SET AwardDetail={'Grammys':[2020, 2018]}  where Artist='Acme Band' and SongTitle='PartiQL Rocks'"));

        return statements;
    }

    // Handles errors during ExecuteTransaction execution. Use recommendations in error messages below to add error handling specific to 
    // your application use-case.
    private static void handleExecuteTransactionErrors(Exception exception) {
        try {
            throw exception;
        } catch (TransactionCanceledException tce) {
            System.out.println("Transaction Cancelled, implies a client issue, fix before retrying. Error: " + tce.getErrorMessage());
        } catch (TransactionInProgressException tipe) {
            System.out.println("The transaction with the given request token is already in progress, consider changing " +
                "retry strategy for this type of error. Error: " + tipe.getErrorMessage());
        } catch (IdempotentParameterMismatchException ipme) {
            System.out.println("Request rejected because it was retried with a different payload but with a request token that was already used, " +
                "change request token for this payload to be accepted. Error: " + ipme.getErrorMessage());
        } catch (Exception e) {
            handleCommonErrors(e);
        }
    }

    private static void handleCommonErrors(Exception exception) {
        try {
            throw exception;
        } catch (InternalServerErrorException isee) {
            System.out.println("Internal Server Error, generally safe to retry with exponential back-off. Error: " + isee.getErrorMessage());
        } catch (RequestLimitExceededException rlee) {
            System.out.println("Throughput exceeds the current throughput limit for your account, increase account level throughput before " + 
                "retrying. Error: " + rlee.getErrorMessage());
        } catch (ProvisionedThroughputExceededException ptee) {
            System.out.println("Request rate is too high. If you're using a custom retry strategy make sure to retry with exponential back-off. " +
                "Otherwise consider reducing frequency of requests or increasing provisioned capacity for your table or secondary index. Error: " + 
                ptee.getErrorMessage());
        } catch (ResourceNotFoundException rnfe) {
            System.out.println("One of the tables was not found, verify table exists before retrying. Error: " + rnfe.getErrorMessage());
        } catch (AmazonServiceException ase) {
            System.out.println("An AmazonServiceException occurred, indicates that the request was correctly transmitted to the DynamoDB " + 
                "service, but for some reason, the service was not able to process it, and returned an error response instead. Investigate and " +
                "configure retry strategy. Error type: " + ase.getErrorType() + ". Error message: " + ase.getErrorMessage());
        } catch (AmazonClientException ace) {
            System.out.println("An AmazonClientException occurred, indicates that the client was unable to get a response from DynamoDB " +
                "service, or the client was unable to parse the response from the service. Investigate and configure retry strategy. "+
                "Error: " + ace.getMessage());
        } catch (Exception e) {
            System.out.println("An exception occurred, investigate and configure retry strategy. Error: " + e.getMessage());
        }
    }

}
```

------

다음 예제에서는 DynamoDB가 WHERE 절에 지정된 조건이 다른 항목을 읽을 때 서로 다른 반환 값을 보여줍니다.

------
#### [ AWS CLI ]

1. 다음 JSON 코드를 partiql.json이라는 파일에 저장합니다.

   ```
   [
       // Item exists and projected attribute exists
       {
           "Statement": "SELECT * FROM "Music" WHERE Artist='No One You Know' and SongTitle='Call Me Today'"
       },
       // Item exists but projected attributes do not exist
       {
           "Statement": "SELECT non_existent_projected_attribute FROM "Music" WHERE Artist='No One You Know' and SongTitle='Call Me Today'"
       },
       // Item does not exist
       {
           "Statement": "SELECT * FROM "Music" WHERE Artist='No One I Know' and SongTitle='Call You Today'"
       }
   ]
   ```

1.  명령 프롬프트에서 다음 명령.

   ```
   aws dynamodb execute-transaction --transact-statements  file://partiql.json
   ```

1. 다음 응답이 반환됩니다.

   ```
   {
       "Responses": [
           // Item exists and projected attribute exists
           {
               "Item": {
                   "Artist":{
                       "S": "No One You Know"
                   },
                   "SongTitle":{
                       "S": "Call Me Today"
                   }    
               }
           },
           // Item exists but projected attributes do not exist
           {
               "Item": {}
           },
           // Item does not exist
           {}
       ]
   }
   ```

------

# DynamoDB용 PartiQL에서 일괄 작업 실행
<a name="ql-reference.multiplestatements.batching"></a>

이 단원에서는 DynamoDB용 PartiQL에서 배치 문을 사용하는 방법을 설명합니다.

**참고**  
전체 배치는 읽기 문이나 쓰기 문 중 하나로 구성해야 하며, 하나의 배치에서 두 문을 함께 사용할 수는 없습니다.
`BatchExecuteStatement` 및 `BatchWriteItem`으로 배치당 25개 이하의 문을 실행할 수 있습니다.
`BatchExecuteStatement`는 별도의 문에서 프라이머리 키 목록을 가져오는 `BatchGetItem`을 사용합니다.

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

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

```
[
  {
    "Statement": "SELECT pk FROM ProblemSet WHERE pk = 'p#9StkWHYTxm7x2AqSXcrfu7' AND sk = 'info'"
  },
  {
    "Statement": "SELECT pk FROM ProblemSet WHERE pk = 'p#isC2ChceGbxHgESc4szoTE' AND sk = 'info'"
  }
]
```

```
[
   {
      "Statement":" statement ",
      "Parameters":[
         {
            " parametertype " : " parametervalue "
         }, ...]
   } , ...
]
```

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

*** 명령문***  
(필수) DynamoDB용 PartiQL에서 지원되는 문입니다.  
+ 전체 배치는 읽기 문이나 쓰기 문 중 하나로 구성해야 하며, 하나의 배치에서 두 문을 함께 사용할 수는 없습니다.
+ `BatchExecuteStatement` 및 `BatchWriteItem`으로 배치당 25개 이하의 문을 실행할 수 있습니다.

***parametertype***  
(선택 사항) ParitPartiQL 문을 지정할 때 파라미터가 사용된 경우 DynamoDB 형식입니다.

***parametervalue***  
(선택 사항) PartiQL 문을 지정할 때 파라미터가 사용된 경우 파라미터 값입니다.

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

------
#### [ AWS CLI ]

1. 다음 json을 partiql.json이라는 파일에 저장합니다.

   ```
   [
      {
   	 "Statement": "INSERT INTO Music VALUE {'Artist':?,'SongTitle':?}",
   	  "Parameters": [{"S": "Acme Band"}, {"S": "Best Song"}]
   	},
   	{
   	 "Statement": "UPDATE Music SET AwardsWon=1, AwardDetail={'Grammys':[2020, 2018]} WHERE Artist='Acme Band' AND SongTitle='PartiQL Rocks'"
       }
   ]
   ```

1. 명령 프롬프트에서 다음 명령을 실행합니다.

   ```
   aws dynamodb batch-execute-statement  --statements  file://partiql.json
   ```

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

```
public class DynamoDBPartiqlBatch {

    public static void main(String[] args) {
        // Create the DynamoDB Client with the region you want
        AmazonDynamoDB dynamoDB = createDynamoDbClient("us-west-2");
        
        try {
            // Create BatchExecuteStatementRequest
            BatchExecuteStatementRequest batchExecuteStatementRequest = createBatchExecuteStatementRequest();
            BatchExecuteStatementResult batchExecuteStatementResult = dynamoDB.batchExecuteStatement(batchExecuteStatementRequest);
            System.out.println("BatchExecuteStatement successful.");
            // Handle batchExecuteStatementResult

        } catch (Exception e) {
            handleBatchExecuteStatementErrors(e);
        }
    }

    private static AmazonDynamoDB createDynamoDbClient(String region) {

        return AmazonDynamoDBClientBuilder.standard().withRegion(region).build();
    }

    private static BatchExecuteStatementRequest createBatchExecuteStatementRequest() {
        BatchExecuteStatementRequest request = new BatchExecuteStatementRequest();

        // Create statements
        List<BatchStatementRequest> statements = getPartiQLBatchStatements();

        request.setStatements(statements);
        return request;
    }

    private static List<BatchStatementRequest> getPartiQLBatchStatements() {
        List<BatchStatementRequest> statements = new ArrayList<BatchStatementRequest>();

        statements.add(new BatchStatementRequest()
                               .withStatement("INSERT INTO Music value {'Artist':'Acme Band','SongTitle':'PartiQL Rocks'}"));

        statements.add(new BatchStatementRequest()
                               .withStatement("UPDATE Music set AwardDetail.BillBoard=[2020] where Artist='Acme Band' and SongTitle='PartiQL Rocks'"));

        return statements;
    }

    // Handles errors during BatchExecuteStatement execution. Use recommendations in error messages below to add error handling specific to 
    // your application use-case.
    private static void handleBatchExecuteStatementErrors(Exception exception) {
        try {
            throw exception;
        } catch (Exception e) {
            // There are no API specific errors to handle for BatchExecuteStatement, common DynamoDB API errors are handled below
            handleCommonErrors(e);
        }
    }

    private static void handleCommonErrors(Exception exception) {
        try {
            throw exception;
        } catch (InternalServerErrorException isee) {
            System.out.println("Internal Server Error, generally safe to retry with exponential back-off. Error: " + isee.getErrorMessage());
        } catch (RequestLimitExceededException rlee) {
            System.out.println("Throughput exceeds the current throughput limit for your account, increase account level throughput before " + 
                "retrying. Error: " + rlee.getErrorMessage());
        } catch (ProvisionedThroughputExceededException ptee) {
            System.out.println("Request rate is too high. If you're using a custom retry strategy make sure to retry with exponential back-off. " +
                "Otherwise consider reducing frequency of requests or increasing provisioned capacity for your table or secondary index. Error: " + 
                ptee.getErrorMessage());
        } catch (ResourceNotFoundException rnfe) {
            System.out.println("One of the tables was not found, verify table exists before retrying. Error: " + rnfe.getErrorMessage());
        } catch (AmazonServiceException ase) {
            System.out.println("An AmazonServiceException occurred, indicates that the request was correctly transmitted to the DynamoDB " + 
                "service, but for some reason, the service was not able to process it, and returned an error response instead. Investigate and " +
                "configure retry strategy. Error type: " + ase.getErrorType() + ". Error message: " + ase.getErrorMessage());
        } catch (AmazonClientException ace) {
            System.out.println("An AmazonClientException occurred, indicates that the client was unable to get a response from DynamoDB " +
                "service, or the client was unable to parse the response from the service. Investigate and configure retry strategy. "+
                "Error: " + ace.getMessage());
        } catch (Exception e) {
            System.out.println("An exception occurred, investigate and configure retry strategy. Error: " + e.getMessage());
        }
    }

}
```

------

# DynamoDB용 PartiQL을 사용하는 IAM 보안 정책
<a name="ql-iam"></a>

다음 권한이 필요합니다.
+ DynamoDB용 PartiQL을 사용하여 항목을 읽으려면 테이블 또는 인덱스에 대한 `dynamodb:PartiQLSelect` 권한이 있어야 합니다.
+ DynamoDB용 PartiQL을 사용하여 항목을 삽입하려면 테이블 또는 인덱스에 대한 `dynamodb:PartiQLInsert` 권한이 있어야 합니다.
+ DynamoDB용 PartiQL을 사용하여 항목을 업데이트하려면 테이블 또는 인덱스에 대한 `dynamodb:PartiQLUpdate` 권한이 있어야 합니다.
+ DynamoDB용 PartiQL을 사용하여 항목을 삭제하려면 테이블 또는 인덱스에 대한 `dynamodb:PartiQLDelete` 권한이 있어야 합니다.

## 예: 테이블에서 모든 DynamoDB용 PartiQL 문(Select/Insert/Update/Delete) 허용
<a name="access-policy-ql-iam-example1"></a>

다음 IAM 정책은 테이블에서 모든 DynamoDB용 PartiQL 문을 실행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLInsert",
            "dynamodb:PartiQLUpdate",
            "dynamodb:PartiQLDelete",
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music"
         ]
      }
   ]
}
```

------

## 예: 테이블에서 DynamoDB용 PartiQL select 문 허용
<a name="access-policy-ql-iam-example2"></a>

다음 IAM 정책은 특정 테이블에서 `select` 문을 실행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music"
         ]
      }
   ]
}
```

------

## 예: 테이블에서 DynamoDB용 PartiQL insert 문 허용
<a name="access-policy-ql-iam-example3"></a>

다음 IAM 정책은 특정 인덱스에서 `insert` 문을 실행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLInsert"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music/index/index1"
         ]
      }
   ]
}
```

------

## 예: 테이블에서 DynamoDB용 PartiQL 트랜잭션 문만 허용
<a name="access-policy-ql-iam-example4"></a>

다음 IAM 정책은 특정 테이블에서 트래잭션 문만 실행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLInsert",
            "dynamodb:PartiQLUpdate",
            "dynamodb:PartiQLDelete",
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:EnclosingOperation":[
                  "ExecuteTransaction"
               ]
            }
         }
      }
   ]
}
```

------

## 예: 테이블에서 DynamoDB용 PartiQL 비트랜잭션 읽기 및 쓰기는 허용하고 PartiQL 트랜잭션 읽기 및 쓰기는 차단
<a name="access-policy-ql-iam-example5"></a>

 다음 IAM 정책은 DynamoDB용 PartiQL 비트랜잭션 읽기 및 쓰기를 실행할 권한은 부여하고 DynamoDB용 PartiQL 트랜잭션 읽기 및 쓰기는 차단합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:PartiQLInsert",
            "dynamodb:PartiQLUpdate",
            "dynamodb:PartiQLDelete",
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:EnclosingOperation":[
                  "ExecuteTransaction"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLInsert",
            "dynamodb:PartiQLUpdate",
            "dynamodb:PartiQLDelete",
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/Music"
         ]
      }
   ]
}
```

------

## 예: DynamoDB용 PartiQL에서 select 문은 허용하고 전체 테이블 스캔 문은 거부
<a name="access-policy-ql-iam-example6"></a>

다음 IAM 정책은 특정 테이블에서 `select` 문을 실행할 수 있는 권한은 부여하고 전체 테이블이 스캔되는 `select` 문은 차단합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/WatchList"
         ],
         "Condition":{
            "Bool":{
               "dynamodb:FullTableScan":[
                  "true"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:PartiQLSelect"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/WatchList"
         ]
      }
   ]
}
```

------