

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

# Amazon Keyspaces의 DML 문(데이터 조작 언어)
<a name="cql.dml"></a>

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

또한 DML 문을 사용하여 테이블의 데이터를 쿼리합니다. (참고로 CQL은 조인 또는 하위 쿼리를 지원하지 않습니다.)

**Topics**
+ [SELECT](cql.dml.select.md)
+ [INSERT](cql.dml.insert.md)
+ [UPDATE](cql.dml.update.md)
+ [DELETE](cql.dml.delete.md)

# SELECT
<a name="cql.dml.select"></a>

SELECT 문을 사용하여 데이터를 쿼리합니다.

**구문**

```
select_statement ::=  SELECT  [ JSON ] ( select_clause | '*' )
                      FROM table_name
                      [ WHERE 'where_clause' ]
                      [ ORDER BY 'ordering_clause' ]
                      [ LIMIT (integer | bind_marker) ]
                      [ ALLOW FILTERING ]
select_clause    ::=  selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector         ::=  column_name
                      | term
                      | CAST '(' selector AS cql_type ')'
                      | function_name '(' [ selector ( ',' selector )* ] ')'
where_clause     ::=  relation ( AND relation )*
relation         ::=  column_name operator term
                      TOKEN
operator         ::=  '=' | '<' | '>' | '<=' | '>=' | IN | CONTAINS | CONTAINS KEY
ordering_clause  ::=  column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*
```

**예시**

```
SELECT name, id, manager_id FROM "myGSGKeyspace".employees_tbl ;

SELECT JSON name, id, manager_id FROM "myGSGKeyspace".employees_tbl ;
```

JSON 인코딩 데이터 유형을 Amazon Keyspaces 데이터 유형에 매핑하는 테이블은 [Amazon Keyspaces 데이터 유형의 JSON 인코딩](cql.elements.md#cql.data-types.JSON)을 참조하세요.

**`IN` 키워드 사용**

`IN` 키워드는 하나 이상의 값이 같도록 지정합니다. 파티션 키와 클러스터링 열에 적용할 수 있습니다. `SELECT` 문에 키가 표시된 순서대로 결과가 반환됩니다.

**예시**

```
SELECT * from mykeyspace.mytable WHERE primary.key1 IN (1,2) and clustering.key1 = 2;
SELECT * from mykeyspace.mytable WHERE primary.key1 IN (1,2) and clustering.key1 <= 2;
SELECT * from mykeyspace.mytable WHERE primary.key1 = 1 and clustering.key1 IN (1, 2);
SELECT * from mykeyspace.mytable WHERE primary.key1 <= 2 and clustering.key1 IN (1, 2) ALLOW FILTERING;
```

`IN` 키워드 및 Amazon Keyspaces가 문을 처리하는 방식에 대한 자세한 내용은 [Amazon Keyspaces에서 쿼리의 `SELECT` 문과 함께 `IN` 연산자 사용](in.select.md)섹션을 참조하세요.

**결과 순서 지정**

`ORDER BY` 절은 반환된 결과의 정렬 순서를 지정합니다. 각 열의 정렬 순서와 함께 열 이름 목록을 인수로 사용합니다. 정렬 절에는 클러스터링 열만 지정할 수 있습니다. 비클러스터링 열은 허용되지 않습니다. 정렬 순서 옵션은 `ASC`(오름차순)과 `DESC`(내림차순) 정렬 순서입니다. 정렬 순서를 생략하면 클러스터링 열의 기본 순서가 사용됩니다. 가능한 정렬 순서는 [Amazon Keyspaces에서 `ORDER BY`로 결과 순서 지정](ordering-results.md)을 참조하세요.

**예제**

```
SELECT name, id, division, manager_id FROM "myGSGKeyspace".employees_tbl WHERE id = '012-34-5678' ORDER BY division;
```

`IN` 키워드와 함께 `ORDER BY`을 사용하면 페이지 내에서 결과가 정렬됩니다. 페이지 매김이 비활성화된 상태에서는 전체 재정렬이 지원되지 않습니다.

**토큰**

`TOKEN` 함수를 `SELECT` 및 `WHERE` 절의 `PARTITION KEY` 열에 적용할 수 있습니다. `TOKEN` 함수를 사용하면 Amazon Keyspaces는 `PARTITION KEY`의 값이 아닌 `PARTITION_KEY`의 매핑된 토큰 값을 기준으로 행을 반환합니다.

`IN` 키워드에서는 `TOKEN` 관계가 지원되지 않습니다.

**예시**

```
SELECT TOKEN(id) from my_table; 

SELECT TOKEN(id) from my_table WHERE TOKEN(id) > 100 and TOKEN(id) < 10000;
```

**TTL 함수**

`TTL` 함수를 `SELECT` 문과 함께 사용하여 열에 저장된 만료 시간(초)을 검색할 수 있습니다. `TTL`인 값이 설정되지 않으면 없으면 함수가 `null`를 반환합니다.

**예제**

```
SELECT TTL(my_column) from my_table;
```

수집과 같은 다중 셀 열에는 `TTL` 함수를 사용할 수 없습니다.

**WRITETIME 함수**

테이블에서 클라이언트 측 타임스탬프를 사용하는 경우에만 `WRITETIME` 함수를 `SELECT` 문과 함께 사용하여 열 값의 메타데이터로 저장된 타임스탬프를 검색할 수 있습니다. 자세한 내용은 [Amazon Keyspaces의 클라이언트 측 타임스탬프](client-side-timestamps.md) 단원을 참조하십시오.

```
SELECT WRITETIME(my_column) from my_table;
```

수집과 같은 다중 셀 열에는 `WRITETIME` 함수를 사용할 수 없습니다.

**참고**  
설정된 Cassandra 드라이버 동작과의 호환성을 위해 Cassandra 드라이버 및 개발자 도구를 통해 Cassandra 쿼리 언어(CQL) API 호출을 사용하여 시스템 테이블에서 작업을 수행할 때는 태그 기반 권한 부여 정책이 적용되지 않습니다. 자세한 내용은 [태그를 기반으로 한 Amazon Keyspaces 리소스 액세스](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-tags) 단원을 참조하십시오.

# INSERT
<a name="cql.dml.insert"></a>

`INSERT` 문을 사용하여 테이블에 행을 추가합니다.

**구문**

```
insert_statement ::=  INSERT INTO table_name ( names_values | json_clause )
                      [ IF NOT EXISTS ]
                      [ USING update_parameter ( AND update_parameter )* ]
names_values     ::=  names VALUES tuple_literal
json_clause      ::=  JSON string [ DEFAULT ( NULL | UNSET ) ]                
names            ::=  '(' column_name ( ',' column_name )* ')'
```

**예제**

```
INSERT INTO "myGSGKeyspace".employees_tbl (id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id)
VALUES ('012-34-5678','Russ','NightFlight','US','Engineering','IC',3,12.5, '234-56-7890') ;
```

**파라미터 업데이트**

`INSERT`에서 `update_parameter`로 지원하는 값은 다음과 같습니다.
+ `TTL` — 시간 값(초)입니다. 구성 가능한 최댓값은 630,720,000초로 20년에 해당합니다.
+ `TIMESTAMP` — epoch로 알려진 표준 기준 시간인 1970년 1월 1일 00:00:00(그리니치 표준시 기준) 이후 경과된 시간을 마이크로초 단위로 나타내는 `bigint` 값입니다. Amazon Keyspaces의 타임스탬프는 과거 2일에서 미래 5분 사이의 범위여야 합니다.

**예제**

```
INSERT INTO my_table (userid, time, subject, body, user)
        VALUES (B79CB3BA-745E-5D9A-8903-4A02327A7E09, 96a29100-5e25-11ec-90d7-b5d91eceda0a, 'Message', 'Hello','205.212.123.123')
        USING TTL 259200;
```

**JSON 지원**

JSON 인코딩 데이터 유형을 Amazon Keyspaces 데이터 유형에 매핑하는 테이블은 [Amazon Keyspaces 데이터 유형의 JSON 인코딩](cql.elements.md#cql.data-types.JSON)을 참조하세요.

`JSON` 키워드를 사용하여 `JSON` 인코딩 맵을 단일 행으로 삽입할 수 있습니다. 테이블에는 있지만 JSON insert 문에서 생략된 열의 경우 `DEFAULT UNSET`을(를) 사용하여 기존 값을 보존합니다. `DEFAULT NULL`을 사용하여 생략된 열의 각 행에 NULL 값을 쓰고 기존 값을 덮어씁니다(표준 쓰기 요금 적용). `DEFAULT NULL`가 기본 옵션입니다.

**예제**

```
INSERT INTO "myGSGKeyspace".employees_tbl JSON '{"id":"012-34-5678",
                                                 "name": "Russ",
                                                 "project": "NightFlight",
                                                 "region": "US",
                                                 "division": "Engineering",
                                                 "role": "IC",
                                                 "pay_scale": 3,
                                                 "vacation_hrs": 12.5,
                                                 "manager_id": "234-56-7890"}';
```

JSON 데이터에 중복 키가 포함된 경우 Amazon Keyspaces는 키의 마지막 값을 저장합니다(Apache Cassandra와 유사). 중복 키가 `id`인 다음 예제에서는 `234-56-7890` 값이 사용됩니다.

**예제**

```
INSERT INTO "myGSGKeyspace".employees_tbl JSON '{"id":"012-34-5678",
                                                 "name": "Russ",
                                                 "project": "NightFlight",
                                                 "region": "US",
                                                 "division": "Engineering",
                                                 "role": "IC",
                                                 "pay_scale": 3,
                                                 "vacation_hrs": 12.5,
                                                 "id": "234-56-7890"}';
```

# UPDATE
<a name="cql.dml.update"></a>

`UPDATE` 문을 사용하여 테이블의 행을 수정합니다.

**구문**

```
update_statement ::=  UPDATE table_name
                      [ USING update_parameter ( AND update_parameter )* ]
                      SET assignment ( ',' assignment )*
                      WHERE where_clause
                      [ IF ( EXISTS | condition ( AND condition )*) ]
update_parameter ::=  ( integer | bind_marker )
assignment       ::=  simple_selection '=' term
                     | column_name '=' column_name ( '+' | '-' ) term
                     | column_name '=' list_literal '+' column_name
simple_selection ::=  column_name
                     | column_name '[' term ']'
                     | column_name '.' `field_name
condition        ::=  simple_selection operator term
```

**예제**

```
UPDATE "myGSGKeyspace".employees_tbl SET pay_scale = 5 WHERE id = '567-89-0123' AND division = 'Marketing' ;
```

`counter`를 증가하려면 다음 구문을 사용합니다. 자세한 내용은 [카운터](cql.elements.md#cql.data-types.numeric.counters) 단원을 참조하십시오.

```
UPDATE ActiveUsers SET counter = counter + 1  WHERE user = A70FE1C0-5408-4AE3-BE34-8733E5K09F14 AND action = 'click';
```

**파라미터 업데이트**

`UPDATE`에서 `update_parameter`로 지원하는 값은 다음과 같습니다.
+ `TTL` — 시간 값(초)입니다. 구성 가능한 최댓값은 630,720,000초로 20년에 해당합니다.
+ `TIMESTAMP` — epoch로 알려진 표준 기준 시간인 1970년 1월 1일 00:00:00(그리니치 표준시 기준) 이후 경과된 시간을 마이크로초 단위로 나타내는 `bigint` 값입니다. Amazon Keyspaces의 타임스탬프는 과거 2일에서 미래 5분 사이의 범위여야 합니다.

**예제**

```
UPDATE my_table (userid, time, subject, body, user)
        VALUES (B79CB3BA-745E-5D9A-8903-4A02327A7E09, 96a29100-5e25-11ec-90d7-b5d91eceda0a, 'Message', 'Hello again','205.212.123.123')
        USING TIMESTAMP '2022-11-03 13:30:54+0400';
```

# DELETE
<a name="cql.dml.delete"></a>

`DELETE` 문을 사용하여 테이블에서 행을 제거합니다.

**구문**

```
delete_statement ::=  DELETE [ simple_selection ( ',' simple_selection ) ]
                      FROM table_name
                      [ USING update_parameter ( AND update_parameter )* ]
                      WHERE where_clause
                      [ IF ( EXISTS | condition ( AND condition )*) ]

simple_selection ::=  column_name
                     | column_name '[' term ']'
                     | column_name '.' `field_name

condition        ::=  simple_selection operator term
```

위치:
+ `table_name`는 삭제하려는 행이 포함된 테이블입니다.

**예제**

```
DELETE manager_id FROM "myGSGKeyspace".employees_tbl WHERE id='789-01-2345' AND division='Executive' ;
```

`DELETE`은 다음 값을 `update_parameter`로 지원합니다.
+ `TIMESTAMP` — epoch로 알려진 표준 기준 시간인 1970년 1월 1일 00:00:00(그리니치 표준시 기준) 이후 경과된 시간을 마이크로초 단위로 나타내는 `bigint` 값입니다.