

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon Keyspaces 中使用 CQL 建立、讀取、更新和刪除資料 (CRUD)
<a name="getting-started.dml"></a>

在教學課程的此步驟中，您將了解如何使用 CQL 資料處理語言 (DML) 陳述式在 Amazon Keyspaces 資料表中插入、讀取、更新和刪除資料。在 Amazon Keyspaces 中，您只能以 CQL 語言建立 DML 陳述式。在本教學課程中，您將練習在 [AWS CloudShell](using-aws-with-cloudshell.md)中使用 `cqlsh-expansion` 搭配 執行 DML 陳述式 AWS 管理主控台。
+ **插入資料** – 本節涵蓋使用 `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 工作階段的寫入一致性設定為 ，才能使用 cqlsh 將資料寫入 Amazon Keyspaces 資料表`LOCAL_QUORUM`。如需支援的一致性層級的詳細資訊，請參閱 [寫入一致性層級](consistency.md#WriteConsistency)。請注意，如果您在 中使用 CQL 編輯器，則不需要此步驟 AWS 管理主控台。

   ```
   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_tw/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. 若要僅擷取指定年份獎勵的記錄，請執行下列查詢。

   ```
   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` AND `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) 復原來協助還原已刪除的資料表，進一步了解 [使用 point-in-time復原來備份和還原資料](PointInTimeRecovery.md) 。若要了解如何還原已啟用 PITR 的已刪除資料表，請參閱 [使用 Amazon Keyspaces PITR 還原已刪除的資料表](restoredeleted.md)。

## 刪除儲存格
<a name="getting-started.dml.delete-cell"></a>

從資料列刪除資料欄會從指定的儲存格移除資料。當您使用`SELECT`陳述式顯示該資料欄時，資料會顯示為 *null*，但 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 的存留時間 (TTL) 過期資料 （適用於 Apache Cassandra)](TTL.md)。