

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 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>

查询大型数据集时，您可能只需要满足特定条件的记录。为此，您可以在 `SELECT` 语句末尾追加一个 `WHERE` 子句。

**查询行的子集**

1. 使用以下 AWS CloudShell 命令打开并连接到 Amazon Keyspaces。请务必*us-east-1*使用您自己的地区进行更新。

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

1. 要仅检索指定年份的奖项记录，请运行以下查询。

   ```
   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 奖的获奖者并显示书名和作者，按排名排序。
+ 显示 2020 年所有奖项的一等奖得主，并显示书名和奖项名称。