

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

# 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 位を表示し、その本のタイトルと賞の名前を表示します。