

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

# 在 Amazon Keyspaces 中使用 CQL 创建、读取、更新和删除数据（CRUD）
<a name="getting-started.dml"></a>

在本教程的这一步中，您将学习如何使用 CQL 数据操作语言（DML）语句在 Amazon Keyspaces 表中插入、读取、更新和删除数据。在 Amazon Keyspaces 中，您只能使用 CQL 语言创建 DML 语句。在本教程中，您将练习结合使用 `cqlsh-expansion` 与 AWS 管理控制台中的 [AWS CloudShell](using-aws-with-cloudshell.md) 来运行 DML 语句。
+ **插入数据** - 本节介绍如何使用 `INSERT` 语句向表中插入单条以及多条记录。您将学习如何通过 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. 使用以下 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. 下载存档文件 [samplemigration.zip](samples/samplemigration.zip) 中包含的示例 CSV 文件（`keyspaces_sample_table.csv`）。解压缩存档文件并记下指向 `keyspaces_sample_table.csv` 的路径。  
![\[CSV 文件的屏幕截图，其中显示了导入 csv 文件后表的输出。\]](http://docs.aws.amazon.com/zh_cn/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>

查询大型数据集时，您可能只需要满足特定条件的记录。为此，您可以在 `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 年所有奖项的一等奖得主，并显示书名和奖项名称。

# 使用 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 奖得主。

```
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` 语句。

您可以从行或分区中删除数据。删除数据时要小心，因为删除是不可逆操作。

从表中删除一行或所有行不会删除该表。因此，您可以用数据重新填充该表。删除表将删除表及其中的所有数据。要再次使用表，必须重新创建表并向其中添加数据。删除键空间会删除键空间及其中的所有表。要使用键空间和表，必须重新创建，然后用数据填充。您可以使用 Amazon Keyspaces Point-in-time (PITR) 恢复来帮助恢复已删除的表，要了解更多信息，请参阅。[使用 Amazon Keyspaces 的 point-in-time恢复功能备份和还原数据](PointInTimeRecovery.md)要了解如何在启用 PITR 的情况下还原已删除的表，请参阅[使用 Amazon Keyspaces PITR 还原已删除的表](restoredeleted.md)。

## 删除单元格
<a name="getting-started.dml.delete-cell"></a>

从行中删除列会从指定单元格中删除数据。使用`SELECT`语句显示该列时，数据显示为*null*，尽管该位置没有存储空值。

删除一个或多个特定列的一般语法如下所示。

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

在 `book_awards` 表中，您可以看到荣获 2020 年“Richard Roe”奖第一名的书名是《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 生存时间自动从表中删除过期的数据，有关更多信息，请参阅[使用 Amazon Keyspaces（Apache Cassandra 兼容）的生存时间（TTL）功能让数据过期](TTL.md)。