

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

# Amazon Keyspaces で CQL を使用してデータを作成/読み取り/更新/削除する (CRUD)
<a name="getting-started.dml"></a>

チュートリアルのこのステップでは、CQL データ操作言語 (DML) ステートメントを使用して、Amazon Keyspaces テーブルのデータを挿入/読み取り/更新/削除する方法について説明します。Amazon Keyspaces では、CQL 言語でのみ DML ステートメントを作成できます。このチュートリアルでは、 AWS マネジメントコンソールの [AWS CloudShell](using-aws-with-cloudshell.md) で `cqlsh-expansion` を使用して、DML ステートメントの実行を練習します。
+ **データの挿入** – `INSERT` ステートメントを使用して、1 つのテーブルに単一および複数のレコードを挿入する方法を説明します。CSV ファイルからデータをアップロードし、正常に挿入されたことを `SELECT` クエリで確認する方法を学びます。
+ **データの読み取り** – `SELECT` ステートメントのさまざまなバリエーションを試し、テーブルからデータを取得します。取り扱うトピックは、すべてのデータの選択、特定の列の選択、`WHERE` 句を使用した条件に基づく行のフィルタリング、単純条件と複合条件の理解などです。
+ **データの更新** – `UPDATE` ステートメントを使用して、テーブル内の既存のデータを変更する方法を学びます。単一列と複数列を実際に更新してみて、プライマリキー列の更新にまつわる制約について理解しましょう。
+ **データの削除** – 最終セクションでは、`DELETE` ステートメントを使用して、テーブルからデータを削除する方法を説明します。特定のセルや行全体の削除方法を学び、データを削除した場合とテーブル全体またはキースペース全体を削除した場合の違いを理解しましょう。

このチュートリアル全体を通じて、例やヒントを紹介します。また、さまざまなシナリオに合わせて自分で CQL クエリを書く練習をすることもできます。

**Topics**
+ [Amazon Keyspaces テーブルにデータを挿入してロードする](getting-started.dml.create.md)
+ [Amazon Keyspaces で CQL `SELECT` ステートメントを使用してテーブルからデータを読み取る](getting-started.dml.read.md)
+ [CQL を使用して Amazon Keyspaces テーブルのデータを更新する](getting-started.dml.update.md)
+ [CQL `DELETE` ステートメントを使用してテーブルからデータを削除する](getting-started.dml.delete.md)

# Amazon Keyspaces テーブルにデータを挿入してロードする
<a name="getting-started.dml.create"></a>

`book_awards` テーブルでデータを作成するには、`INSERT` ステートメントを使用して 1 行を追加します。

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

   このコマンドの出力は次のようになります。

   ```
   Connected to Amazon Keyspaces at cassandra.us-east-1.amazonaws.com:9142
   [cqlsh 6.1.0 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
   Use HELP for help.
   cqlsh current consistency level is ONE.
   ```

1. cqlsh を使用してAmazon Keyspaces テーブルにデータを書き込む前に、現在の cqlsh セッションの書き込み整合性を `LOCAL_QUORUM` に設定する必要があります。サポートされる整合性レベルの詳細については、「[書き込みの整合性レベル](consistency.md#WriteConsistency)」を参照してください。 AWS マネジメントコンソールで CQL エディタを使用している場合は、このステップは不要であることに注意してください。

   ```
   CONSISTENCY LOCAL_QUORUM;
   ```

1. 単一のレコードを挿入するには、CQL エディタで次のコマンドを実行します。

   ```
   INSERT INTO catalog.book_awards (award, year, category, rank, author, book_title, publisher)
   VALUES ('Wolf', 2023, 'Fiction',3,'Shirley Rodriguez','Mountain', 'AnyPublisher') ;
   ```

1. 次のコマンドを実行して、データがテーブルに正しく追加されていることを確認します。

   ```
   SELECT * FROM catalog.book_awards;
   ```

   ステートメントの出力は次のようになります。

   ```
    year | award | category | rank | author            | book_title | publisher
   ------+-------+----------+------+-------------------+------------+--------------
    2023 |  Wolf |  Fiction |    3 | Shirley Rodriguez |   Mountain | AnyPublisher
   
   (1 rows)
   ```

**cqlsh を使用してファイルから複数のレコードを挿入するには**

1. サンプル CSV ファイル (`keyspaces_sample_table.csv`) を収録したアーカイブファイル [samplemigration.zip](samples/samplemigration.zip) をダウンロードします。アーカイブを解凍し、`keyspaces_sample_table.csv` へのパスをメモしておきます。  
![\[CSV ファイルをインポートした後のテーブルの出力を示す CSV ファイルのスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/keyspaces/latest/devguide/images/keyspaces-awards.png)

1.  AWS CloudShell で AWS マネジメントコンソール を開き、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. `cqlsh` プロンプト (`cqlsh>`) で、キースペースを指定します。

   ```
   USE catalog ;
   ```

1. 書き込み整合性を `LOCAL_QUORUM` に設定します。サポートされる整合性レベルの詳細については、「[書き込みの整合性レベル](consistency.md#WriteConsistency)」を参照してください。

   ```
   CONSISTENCY LOCAL_QUORUM;
   ```

1. 画面の右上にある**「アクション** AWS CloudShell 」を選択し、**「ファイルのアップロード**」を選択して、以前にダウンロードした csv ファイルをアップロードします。ファイルのパスを書き留めておいてください。

1. キースペースのプロンプト (`cqlsh:catalog>`) で、次のステートメントを実行します。

   ```
   COPY book_awards (award, year, category, rank, author, book_title, publisher) FROM '/home/cloudshell-user/keyspaces_sample_table.csv' WITH header=TRUE ;
   ```

   ステートメントの出力は次のようになります。

   ```
   cqlsh:catalog> COPY book_awards (award, year, category, rank, author, book_title, publisher)                      FROM '/home/cloudshell-user/keyspaces_sample_table.csv' WITH delimiter=',' AND header=TRUE ;
   cqlsh current consistency level is LOCAL_QUORUM.
   Reading options from /home/cloudshell-user/.cassandra/cqlshrc:[copy]: {'numprocesses': '16', 'maxattempts': '1000'}
   Reading options from /home/cloudshell-user/.cassandra/cqlshrc:[copy-from]: {'ingestrate': '1500', 'maxparseerrors': '1000', 'maxinserterrors': '-1', 'maxbatchsize': '10', 'minbatchsize': '1', 'chunksize': '30'}
   Reading options from the command line: {'delimiter': ',', 'header': 'TRUE'}
   Using 16 child processes
   
   Starting copy of catalog.book_awards with columns [award, year, category, rank, author, book_title, publisher].
   OSError: handle is closed      0 rows/s; Avg. rate:       0 rows/s
   Processed: 9 rows; Rate:       0 rows/s; Avg. rate:       0 rows/s
   9 rows imported from 1 files in 0 day, 0 hour, 0 minute, and 26.706 seconds (0 skipped).
   ```

1. 次のクエリを実行して、データがテーブルに正しく追加されていることを確認します。

   ```
   SELECT * FROM book_awards ;
   ```

   次のような出力が表示されます。

   ```
    year | award            | category    | rank | author             | book_title            | publisher
   ------+------------------+-------------+------+--------------------+-----------------------+---------------
    2020 |             Wolf | Non-Fiction |    1 |        Wang Xiulan |      History of Ideas | Example Books
    2020 |             Wolf | Non-Fiction |    2 | Ana Carolina Silva |         Science Today | SomePublisher
    2020 |             Wolf | Non-Fiction |    3 |  Shirley Rodriguez | The Future of Sea Ice |  AnyPublisher
    2020 | Kwesi Manu Prize |     Fiction |    1 |         Akua Mansa |     Where did you go? | SomePublisher
    2020 | Kwesi Manu Prize |     Fiction |    2 |        John Stiles |             Yesterday | Example Books
    2020 | Kwesi Manu Prize |     Fiction |    3 |         Nikki Wolf | Moving to the Chateau |  AnyPublisher
    2020 |      Richard Roe |     Fiction |    1 |  Alejandro Rosalez |           Long Summer | SomePublisher
    2020 |      Richard Roe |     Fiction |    2 |        Arnav Desai |               The Key | Example Books
    2020 |      Richard Roe |     Fiction |    3 |      Mateo Jackson |      Inside the Whale |  AnyPublisher
   
   (9 rows)
   ```

`cqlsh COPY` を使用して csv ファイルから Amazon Keyspaces テーブルにデータをアップロードする方法の詳細については、「[チュートリアル: cqlsh を使用した Amazon Keyspaces へのデータのロード](bulk-upload.md)」を参照してください。

# Amazon Keyspaces で CQL `SELECT` ステートメントを使用してテーブルからデータを読み取る
<a name="getting-started.dml.read"></a>

「[Amazon Keyspaces テーブルにデータを挿入してロードする](getting-started.dml.create.md)」セクションでは、`SELECT` ステートメントを使用してテーブルにデータを正しく追加できたことを確認しました。このセクションでは、`SELECT` を使用して特定の列を表示し、特定の条件を満たす行のみを表示する方法について詳しく説明します。

`SELECT` ステートメントの一般的な形式は次のとおりです。

```
SELECT column_list FROM table_name [WHERE condition [ALLOW FILTERING]] ;
```

**Topics**
+ [テーブル内のすべてのデータを選択する](#getting-started.dml.read.all)
+ [列のサブセットを選択する](#getting-started.dml.read.columns)
+ [行のサブセットを選択する](#getting-started.dml.read.rows)

## テーブル内のすべてのデータを選択する
<a name="getting-started.dml.read.all"></a>

最も単純な形式の `SELECT` ステートメントにより、テーブル内のすべてのデータが返されます。

**重要**  
 このコマンドを実行するとテーブル内のすべてのデータが返されるため、通常、本番環境でこのコマンドを実行することはベストプラクティスではありません。

**テーブルのすべてのデータを選択するには**

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. 次のクエリを実行します。

   ```
   SELECT * FROM catalog.book_awards ;
   ```

   `column_list` にワイルドカード文字 (`*`) を使用するとすべての列が選択されます。ステートメントの出力は、次の例のようになります。

   ```
    year | award            | category    | rank | author             | book_title            | publisher
   ------+------------------+-------------+------+--------------------+-----------------------+---------------
    2020 |             Wolf | Non-Fiction |    1 |        Wang Xiulan |      History of Ideas |  AnyPublisher
    2020 |             Wolf | Non-Fiction |    2 | Ana Carolina Silva |         Science Today | SomePublisher
    2020 |             Wolf | Non-Fiction |    3 |  Shirley Rodriguez | The Future of Sea Ice |  AnyPublisher
    2020 | Kwesi Manu Prize |     Fiction |    1 |         Akua Mansa |     Where did you go? | SomePublisher
    2020 | Kwesi Manu Prize |     Fiction |    2 |        John Stiles |             Yesterday | Example Books
    2020 | Kwesi Manu Prize |     Fiction |    3 |         Nikki Wolf | Moving to the Chateau |  AnyPublisher
    2020 |      Richard Roe |     Fiction |    1 |  Alejandro Rosalez |           Long Summer | SomePublisher
    2020 |      Richard Roe |     Fiction |    2 |        Arnav Desai |               The Key | Example Books
    2020 |      Richard Roe |     Fiction |    3 |      Mateo Jackson |      Inside the Whale |  AnyPublisher
   ```

## 列のサブセットを選択する
<a name="getting-started.dml.read.columns"></a>

**列のサブセットをクエリするには**

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. `award` 列、`category` 列、`year` 列のみを検索するには、次のクエリを実行します。

   ```
   SELECT award, category, year FROM catalog.book_awards ;
   ```

   出力には、指定した列だけが、`SELECT` ステートメントに指定された順序で表示されます。

   ```
    award            | category    | year
   ------------------+-------------+------
                Wolf | Non-Fiction | 2020
                Wolf | Non-Fiction | 2020
                Wolf | Non-Fiction | 2020
    Kwesi Manu Prize |     Fiction | 2020
    Kwesi Manu Prize |     Fiction | 2020
    Kwesi Manu Prize |     Fiction | 2020
         Richard Roe |     Fiction | 2020
         Richard Roe |     Fiction | 2020
         Richard Roe |     Fiction | 2020
   ```

## 行のサブセットを選択する
<a name="getting-started.dml.read.rows"></a>

大きなデータセットをクエリする場合、特定の条件を満たすレコードのみが必要になる可能性があります。これを行うには、`WHERE` 句を `SELECT` ステートメントの最後に追加します。

**行のサブセットをクエリするには**

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. 特定の年 (year) の賞 (award) に関するレコードのみを取得するには、次のクエリを実行します。

   ```
   SELECT * FROM catalog.book_awards WHERE year=2020 AND award='Wolf' ;
   ```

   上記の `SELECT` ステートメントは、次の出力を返します。

   ```
    year | award | category    | rank | author             | book_title            | publisher
   ------+-------+-------------+------+--------------------+-----------------------+---------------
    2020 |  Wolf | Non-Fiction |    1 |        Wang Xiulan |      History of Ideas |  AnyPublisher
    2020 |  Wolf | Non-Fiction |    2 | Ana Carolina Silva |         Science Today | SomePublisher
    2020 |  Wolf | Non-Fiction |    3 |  Shirley Rodriguez | The Future of Sea Ice |  AnyPublisher
   ```

### `WHERE` 句について
<a name="getting-started.dml.where"></a>

`WHERE` 句は、データをフィルタリングして指定の基準を満たすデータのみを返すために使用されます。指定の基準は単純条件または複合条件になります。

**`WHERE` 句で条件を使用する方法**
+ 単純条件 — 単一の列。

  ```
  WHERE column_name=value
  ```

  次の条件のいずれかを満たしていれば `WHERE` 句の単純条件を使用できます。
  + この列は、テーブルの唯一のパーティションキー列です。
  + `WHERE` 句の条件の後に `ALLOW FILTERING` を追加します。

    `ALLOW FILTERING` を使用すると、特に、複数に分割された大規模なテーブルでは、パフォーマンスの一貫性が失われる可能性がありますので注意が必要です。
+ 複合条件 — 複数の単純条件を `AND` によって結合したもの。

  ```
  WHERE column_name1=value1 AND column_name2=value2 AND column_name3=value3...
  ```

  次の条件のいずれかを満たしていれば `WHERE` 句の複合条件を使用できます。
  + `WHERE` 句では、テーブルのパーティションキーの列を使用できますが、それらの列を全部含めるか、一部だけを含める必要があります。`WHERE` 句で一部の列だけを使用する場合は、パーティションキーの先頭列を筆頭に、左から右に連続するパーティションキー列を含めなければなりません。例えば、パーティションキー列が `year`、`month`、`award` である場合、次の列を `WHERE` 句で使用できます。
    + `year`
    + `year` と `month` の両方
    + `year`、`month`、`award` のすべて
  + 次の例で示されているように、`WHERE` 句の複合条件の後に `ALLOW FILTERING` を追加します。

    ```
    SELECT * FROM my_table WHERE col1=5 AND col2='Bob' ALLOW FILTERING ;
    ```

    `ALLOW FILTERING` を使用すると、特に、複数に分割された大規模なテーブルでは、パフォーマンスの一貫性が失われる可能性がありますので注意が必要です。

### 試してみましょう
<a name="getting-started.dml.try"></a>

独自の CQL クエリを作成して、`book_awards` テーブルで以下の検索を実行してみましょう。
+ 2020 年の Wolf 賞 (award) の受賞作品を検索し、本のタイトル (book title) と著者 (author) をランク (rank) 順に表示します。
+ 2020 年のすべての賞の 1 位を表示し、その本のタイトルと賞の名前を表示します。

# CQL を使用して Amazon Keyspaces テーブルのデータを更新する
<a name="getting-started.dml.update"></a>

`book_awards` テーブルのデータを更新するには、`UPDATE` ステートメントを使用します。

`UPDATE` ステートメントの一般的な形式は次のとおりです。

```
UPDATE table_name SET column_name=new_value WHERE primary_key=value ;
```

**ヒント**  
次の例に示すとおり、`column_names` と値のカンマ区切りリストを使用して、複数の列を更新することができます。  

  ```
  UPDATE my_table SET col1='new_value_1', col2='new_value2' WHERE col3='1' ;
  ```
プライマリキーが複数の列で構成されている場合、すべてのプライマリキー列とその値が `WHERE` 句に含まれていなければなりません。
プライマリキーの列を更新すると、レコードのプライマリキーが変更されるため、更新はできません。

**単一のセルを更新するには**  
`book_awards` テーブルを使用して、2020 年のノンフィクション Wolf 賞受賞作品の出版社 (publisher) の名前を変更します。

```
UPDATE book_awards SET publisher='new Books' WHERE year = 2020 AND award='Wolf' AND category='Non-Fiction' AND rank=1;
```

出版社が `new Books` になったことを確認します。

```
SELECT * FROM book_awards WHERE year = 2020 AND award='Wolf' AND category='Non-Fiction' AND rank=1;
```

このステートメントは、次の出力を返します。

```
 year | award | category    | rank | author      | book_title       | publisher
------+-------+-------------+------+-------------+------------------+-----------
 2020 |  Wolf | Non-Fiction |    1 | Wang Xiulan | History of Ideas | new Books
```

## 試してみましょう
<a name="getting-started.dml.update.try"></a>

**上級:** 2020 年のフィクション「Kwezi Manu Prize」賞の受賞作品の名前が変更されました。該当するレコードを更新し、名前を `'Akua Mansa-House'` に変更してください。

# CQL `DELETE` ステートメントを使用してテーブルからデータを削除する
<a name="getting-started.dml.delete"></a>

`book_awards` テーブルのデータを削除するには、`DELETE` ステートメントを使用します。

行またはパーティションからデータを削除できます。削除は取り消せないため、データを削除するときは注意してください。

テーブルから 1 つまたはすべての行を削除しても、テーブルは削除されません。したがって、データの再入力が可能です。テーブルを削除すると、テーブルとその中のすべてのデータが削除されます。テーブルを再使用するには、テーブルを再作成してデータを追加する必要があります。キースペースを削除すると、キースペースとその中のすべてのテーブルが削除されます。削除したキースペースとテーブルを使用するには、それらを再作成してデータを入力する必要があります。Amazon Keyspaces のポイントインタイムリカバリ (PITR) を使用して、削除されたテーブルを復元できます。詳細については、「[Amazon Keyspaces のポイントインタイムリカバリでデータをバックアップおよび復元する](PointInTimeRecovery.md)」を参照してください。PITR が有効になっている削除済みテーブルを復元する方法については、「[削除済みのテーブルを Amazon Keyspaces PITR を使用して復元する](restoredeleted.md)」を参照してください。

## セルを削除する
<a name="getting-started.dml.delete-cell"></a>

行から列を削除すると、指定したセルからデータが削除されます。`SELECT` ステートメントを使用してその列を表示すると、そのデータは *null* として表示されます。ただし、null 値はその場所には保存されません。

1 つ以上の特定の列を削除するための一般的な構文は次のとおりです。

```
DELETE column_name1[, column_name2...] FROM table_name WHERE condition ;
```

`book_awards` テーブルでは、2020 年の「Richard Roe」賞の第 1 位を受賞した本のタイトルが「Long Summer」であることがわかります。この作品の受賞が取り消されたため、このセルから該当データを削除する必要があるとしましょう。

**特定のセルを削除するには**

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. 次の `DELETE` クエリを実行します。

   ```
   DELETE book_title FROM catalog.book_awards WHERE year=2020 AND award='Richard Roe' AND category='Fiction' AND rank=1;
   ```

1. 削除リクエストが想定どおりに行われたことを確認します。

   ```
   SELECT * FROM catalog.book_awards WHERE year=2020 AND award='Richard Roe' AND category='Fiction' AND rank=1;
   ```

   このステートメントの出力は次のようになります。

   ```
    year | award       | category | rank | author            | book_title | publisher
   ------+-------------+----------+------+-------------------+------------+---------------
    2020 | Richard Roe |  Fiction |    1 | Alejandro Rosalez |       null | SomePublisher
   ```

## 行を削除する
<a name="getting-started.dml.delete-row"></a>

データ削除のリクエストに応えるといった理由で、行全体を削除しなければならない場合も考えられます。行の削除に使用する一般的な構文は次のとおりです。

```
DELETE FROM table_name WHERE condition ;
```

**行を削除するには**

1. を開き AWS CloudShell 、次のコマンドを使用して Amazon Keyspaces に接続します。*us-east-1* は実際のリージョンに置き換えてください。

   ```
   cqlsh-expansion cassandra.us-east-1.amazonaws.com 9142 --ssl
   ```

1. 次の `DELETE` クエリを実行します。

   ```
   DELETE FROM catalog.book_awards WHERE year=2020 AND award='Richard Roe' AND category='Fiction' AND rank=1;
   ```

1. 削除が想定どおりに行われたことを確認します。

   ```
   SELECT * FROM catalog.book_awards WHERE year=2020 AND award='Richard Roe' AND category='Fiction' AND rank=1;
   ```

   行が削除された後は、このステートメントの出力が次のようになります。

   ```
    year | award | category | rank | author | book_title | publisher
   ------+-------+----------+------+--------+------------+-----------
   
   (0 rows)
   ```

Amazon Keyspaces の Time to Live を使用して、期限切れのデータをテーブルから自動的に削除できます。詳細については、「[Amazon Keyspaces (Apache Cassandra 向け) で有効期限 (TTL) を使用してデータを期限切れにする](TTL.md)」を参照してください。