

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

# 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)。