

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