

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

# Amazon Keyspaces 中的 DML 陳述式 （資料處理語言）
<a name="cql.dml"></a>

*資料處理語言* (DML) 是一組 Cassandra 查詢語言 (CQL) 陳述式，用於管理 Amazon Keyspaces （適用於 Apache Cassandra) 資料表中的資料。您可使用 DML 陳述式新增、修改或刪除資料表中的資料。

您也可以使用 DML 陳述式來查詢資料表中的資料。（請注意，CQL 不支援聯結或子查詢。)

**Topics**
+ [SELECT](cql.dml.select.md)
+ [INSERT](cql.dml.insert.md)
+ [UPDATE](cql.dml.update.md)
+ [DELETE](cql.dml.delete.md)

# SELECT
<a name="cql.dml.select"></a>

使用 SELECT 陳述式查詢資料。

**語法**

```
select_statement ::=  SELECT  [ JSON ] ( select_clause | '*' )
                      FROM table_name
                      [ WHERE 'where_clause' ]
                      [ ORDER BY 'ordering_clause' ]
                      [ LIMIT (integer | bind_marker) ]
                      [ ALLOW FILTERING ]
select_clause    ::=  selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector         ::=  column_name
                      | term
                      | CAST '(' selector AS cql_type ')'
                      | function_name '(' [ selector ( ',' selector )* ] ')'
where_clause     ::=  relation ( AND relation )*
relation         ::=  column_name operator term
                      TOKEN
operator         ::=  '=' | '<' | '>' | '<=' | '>=' | IN | CONTAINS | CONTAINS KEY
ordering_clause  ::=  column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*
```

**範例**

```
SELECT name, id, manager_id FROM "myGSGKeyspace".employees_tbl ;

SELECT JSON name, id, manager_id FROM "myGSGKeyspace".employees_tbl ;
```

如需將 JSON 編碼資料類型映射至 Amazon Keyspaces 資料類型的資料表，請參閱 [Amazon Keyspaces 資料類型的 JSON 編碼](cql.elements.md#cql.data-types.JSON)。

**使用 `IN`關鍵字**

`IN` 關鍵字指定一或多個值的相等性。它可以套用至分割區索引鍵和叢集資料欄。結果會依索引鍵在`SELECT`陳述式中呈現的順序傳回。

**範例**

```
SELECT * from mykeyspace.mytable WHERE primary.key1 IN (1,2) and clustering.key1 = 2;
SELECT * from mykeyspace.mytable WHERE primary.key1 IN (1,2) and clustering.key1 <= 2;
SELECT * from mykeyspace.mytable WHERE primary.key1 = 1 and clustering.key1 IN (1, 2);
SELECT * from mykeyspace.mytable WHERE primary.key1 <= 2 and clustering.key1 IN (1, 2) ALLOW FILTERING;
```

如需`IN`關鍵字以及 Amazon Keyspaces 如何處理陳述式的詳細資訊，請參閱 [在 Amazon Keyspaces 的查詢中使用 `IN`運算子搭配 `SELECT`陳述式](in.select.md)。

**排序結果**

`ORDER BY` 子句指定傳回結果的排序順序。它需要資料欄名稱清單以及每個資料欄的排序順序做為引數。您只能依子句順序指定叢集資料欄。不允許使用非叢集資料欄。排序順序選項`ASC`適用於遞增和`DESC`遞減排序。如果省略排序順序，則會使用叢集資料欄的預設順序。如需可能的排序順序，請參閱 [在 Amazon Keyspaces `ORDER BY`中使用 排序結果](ordering-results.md)。

**範例**

```
SELECT name, id, division, manager_id FROM "myGSGKeyspace".employees_tbl WHERE id = '012-34-5678' ORDER BY division;
```

`ORDER BY` 搭配 `IN`關鍵字使用 時，結果會在頁面中排序。不支援使用已停用分頁進行完整重新排序。

**TOKEN**

您可以將`TOKEN`函數套用至 `SELECT`和 `WHERE`子句中的資料`PARTITION KEY`欄。使用 `TOKEN`函數時，Amazon Keyspaces 會根據 的映射字符值傳回資料列，`PARTITION_KEY`而不是根據 的值傳回資料列`PARTITION KEY`。

`TOKEN` `IN`關鍵字不支援關聯。

**範例**

```
SELECT TOKEN(id) from my_table; 

SELECT TOKEN(id) from my_table WHERE TOKEN(id) > 100 and TOKEN(id) < 10000;
```

**TTL 函數**

您可以使用 `TTL`函數搭配 `SELECT`陳述式，以秒為單位擷取為資料欄存放的過期時間。如果未設定`TTL`任何值，函數會傳回 `null`。

**範例**

```
SELECT TTL(my_column) from my_table;
```

`TTL` 函數無法用於多儲存格資料欄，例如集合。

**WRITETIME 函式**

只有在資料表使用用戶端時間戳記時，您才能使用 `WRITETIME`函數搭配 `SELECT`陳述式來擷取存放為資料欄值中繼資料的時間戳記。如需詳細資訊，請參閱[Amazon Keyspaces 中的用戶端時間戳記](client-side-timestamps.md)。

```
SELECT WRITETIME(my_column) from my_table;
```

`WRITETIME` 函數無法用於多儲存格資料欄，例如集合。

**注意**  
為了相容於已建立的 Cassandra 驅動程式行為，當您透過 Cassandra 驅動程式和開發人員工具使用 Cassandra 查詢語言 (CQL) API 呼叫對系統資料表執行操作時，不會強制執行標籤型授權政策。如需詳細資訊，請參閱[根據標籤的 Amazon Keyspaces 資源存取](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-tags)。

# INSERT
<a name="cql.dml.insert"></a>

使用 `INSERT`陳述式將資料列新增至資料表。

**語法**

```
insert_statement ::=  INSERT INTO table_name ( names_values | json_clause )
                      [ IF NOT EXISTS ]
                      [ USING update_parameter ( AND update_parameter )* ]
names_values     ::=  names VALUES tuple_literal
json_clause      ::=  JSON string [ DEFAULT ( NULL | UNSET ) ]                
names            ::=  '(' column_name ( ',' column_name )* ')'
```

**範例**

```
INSERT INTO "myGSGKeyspace".employees_tbl (id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id)
VALUES ('012-34-5678','Russ','NightFlight','US','Engineering','IC',3,12.5, '234-56-7890') ;
```

**更新參數**

`INSERT` 支援下列值做為 `update_parameter`：
+ `TTL` – 以秒為單位的時間值。最大可設定的值為 630,720,000 秒，相當於 20 年。
+ `TIMESTAMP` – 代表自稱為 的標準基準時間以來微秒數`bigint`的值epoch：1970 年 1 月 1 日 00：00：00 GMT。Amazon Keyspaces 中的時間戳記必須介於過去 2 天到未來的 5 分鐘之間。

**範例**

```
INSERT INTO my_table (userid, time, subject, body, user)
        VALUES (B79CB3BA-745E-5D9A-8903-4A02327A7E09, 96a29100-5e25-11ec-90d7-b5d91eceda0a, 'Message', 'Hello','205.212.123.123')
        USING TTL 259200;
```

**JSON 支援**

如需將 JSON 編碼資料類型映射至 Amazon Keyspaces 資料類型的資料表，請參閱 [Amazon Keyspaces 資料類型的 JSON 編碼](cql.elements.md#cql.data-types.JSON)。

您可以使用 `JSON`關鍵字，將 `JSON`編碼的映射插入為單一資料列。對於資料表中存在但 JSON 插入陳述式中省略的資料欄，請使用 `DEFAULT UNSET`保留現有的值。使用 `DEFAULT NULL`將 NULL 值寫入省略的資料欄的每一列，並覆寫現有的值 （需支付標準寫入費用）。 `DEFAULT NULL`是預設選項。

**範例**

```
INSERT INTO "myGSGKeyspace".employees_tbl JSON '{"id":"012-34-5678",
                                                 "name": "Russ",
                                                 "project": "NightFlight",
                                                 "region": "US",
                                                 "division": "Engineering",
                                                 "role": "IC",
                                                 "pay_scale": 3,
                                                 "vacation_hrs": 12.5,
                                                 "manager_id": "234-56-7890"}';
```

如果 JSON 資料包含重複的金鑰，Amazon Keyspaces 會儲存金鑰的最後一個值 （類似於 Apache Cassandra)。在下列範例中，如果重複的金鑰是 `id`，`234-56-7890`則會使用 值。

**範例**

```
INSERT INTO "myGSGKeyspace".employees_tbl JSON '{"id":"012-34-5678",
                                                 "name": "Russ",
                                                 "project": "NightFlight",
                                                 "region": "US",
                                                 "division": "Engineering",
                                                 "role": "IC",
                                                 "pay_scale": 3,
                                                 "vacation_hrs": 12.5,
                                                 "id": "234-56-7890"}';
```

# UPDATE
<a name="cql.dml.update"></a>

使用 `UPDATE`陳述式來修改資料表中的資料列。

**語法**

```
update_statement ::=  UPDATE table_name
                      [ USING update_parameter ( AND update_parameter )* ]
                      SET assignment ( ',' assignment )*
                      WHERE where_clause
                      [ IF ( EXISTS | condition ( AND condition )*) ]
update_parameter ::=  ( integer | bind_marker )
assignment       ::=  simple_selection '=' term
                     | column_name '=' column_name ( '+' | '-' ) term
                     | column_name '=' list_literal '+' column_name
simple_selection ::=  column_name
                     | column_name '[' term ']'
                     | column_name '.' `field_name
condition        ::=  simple_selection operator term
```

**範例**

```
UPDATE "myGSGKeyspace".employees_tbl SET pay_scale = 5 WHERE id = '567-89-0123' AND division = 'Marketing' ;
```

若要遞增 `counter`，請使用下列語法。如需詳細資訊，請參閱[計數器](cql.elements.md#cql.data-types.numeric.counters)。

```
UPDATE ActiveUsers SET counter = counter + 1  WHERE user = A70FE1C0-5408-4AE3-BE34-8733E5K09F14 AND action = 'click';
```

**更新參數**

`UPDATE` 支援下列值做為 `update_parameter`：
+ `TTL` – 以秒為單位的時間值。最大可設定的值為 630,720,000 秒，相當於 20 年。
+ `TIMESTAMP` – 代表自稱為 的標準基準時間以來微秒數`bigint`的值epoch：1970 年 1 月 1 日 00：00：00 GMT。Amazon Keyspaces 中的時間戳記必須介於過去 2 天到未來的 5 分鐘之間。

**範例**

```
UPDATE my_table (userid, time, subject, body, user)
        VALUES (B79CB3BA-745E-5D9A-8903-4A02327A7E09, 96a29100-5e25-11ec-90d7-b5d91eceda0a, 'Message', 'Hello again','205.212.123.123')
        USING TIMESTAMP '2022-11-03 13:30:54+0400';
```

# DELETE
<a name="cql.dml.delete"></a>

使用 `DELETE`陳述式從資料表中移除資料列。

**語法**

```
delete_statement ::=  DELETE [ simple_selection ( ',' simple_selection ) ]
                      FROM table_name
                      [ USING update_parameter ( AND update_parameter )* ]
                      WHERE where_clause
                      [ IF ( EXISTS | condition ( AND condition )*) ]

simple_selection ::=  column_name
                     | column_name '[' term ']'
                     | column_name '.' `field_name

condition        ::=  simple_selection operator term
```

其中：
+ `table_name` 是包含您要刪除之資料列的資料表。

**範例**

```
DELETE manager_id FROM "myGSGKeyspace".employees_tbl WHERE id='789-01-2345' AND division='Executive' ;
```

`DELETE` 支援以下值為 `update_parameter`：
+ `TIMESTAMP` – 代表自稱為 的標準基準時間以來微秒數`bigint`的值epoch：1970 年 1 月 1 日 00：00：00 GMT。