

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Keyspaces の DML ステートメント (データ操作言語)
<a name="cql.dml"></a>

*データ操作言語* (DML) は、Amazon Keyspaces (Apache Cassandra 向け) テーブル内でのデータ管理に使用する Cassandra Query Language (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 ステートメントを使用してデータのクエリを行います。

**[Syntax]** (構文)

```
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` キーワードは、1 つ以上の値が等しいことを指定します。パーティションキーとクラスタリング列に適用できます。結果は `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` マッピングされたトークン値に基づいて行を返します。

`TOKEN` キーワードではリレーションはサポートしていません。`IN`

**例**

```
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 関数**

`SELECT` ステートメントで `WRITETIME` 関数を使用して、列の値のメタデータとして保存されているタイムスタンプを取得できるのは、テーブルがクライアント側のタイムスタンプを使用している場合だけです。詳細については、「[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` ステートメントを使用してテーブルに行を追加します。

**[Syntax]** (構文)

```
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 GMT からのマイクロ秒数を表す `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` マップを 1 行として挿入できます。テーブル内に存在しても、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` ステートメントを使用して、テーブル内の行を変更します。

[**Syntax (構文)**]

```
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 GMT からのマイクロ秒数を表す `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` ステートメントを使用してテーブルから行を削除します。

[**Syntax (構文)**]

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

Where:
+ `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 GMT からのマイクロ秒数を表す `bigint` 値。