

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

# 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` 的值）返回行。

`IN` 关键字不支持 `TOKEN` 关系。

**示例**

```
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`：以秒为单位的时间值。最大可配置值为 630720000 秒，相当于 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`：以秒为单位的时间值。最大可配置值为 630720000 秒，相当于 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）以来的微秒数。