

# 查询表方面的差异
<a name="SQLtoNoSQL.ReadData.Query"></a>

另一个常见访问模式是根据您的查询条件从表中读取多个项目。

**Topics**
+ [使用 SQL 查询表](#SQLtoNoSQL.ReadData.Query.SQL)
+ [在 DynamoDB 中查询表](#SQLtoNoSQL.ReadData.Query.DynamoDB)

## 使用 SQL 查询表
<a name="SQLtoNoSQL.ReadData.Query.SQL"></a>

使用 SQL 时，`SELECT` 语句可让您查询关键列、非关键列或任意组合。`WHERE` 子句确定返回的行，如以下示例所示。

```
/* Return a single song, by primary key */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today';
```

```
/* Return all of the songs by an artist */

SELECT * FROM Music
WHERE Artist='No One You Know';
```

```
/* Return all of the songs by an artist, matching first part of title */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
```

```
/* Return all of the songs by an artist, only if the price is less than 1.00 */

SELECT * FROM Music
WHERE Artist='No One You Know'
AND Price < 1.00;
```

请注意，此表的主键包含 *Artist* 和 *SongTitle*。

## 在 DynamoDB 中查询表
<a name="SQLtoNoSQL.ReadData.Query.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html)（一种与 SQL 兼容的查询语言）查询表中的项目。

------
#### [ DynamoDB API ]

通过 Amazon DynamoDB，您可以使用 `Query` 操作以类似方式检索数据。`Query` 操作提供对存储数据的物理位置的快速高效访问。有关更多信息，请参阅 [DynamoDB 中的分区和数据分布](HowItWorks.Partitions.md)。

您可以将 `Query` 与任何表或二级索引一起使用。您必须为分区键的值指定相等条件，并且可以有选择性地为排序键属性（如果已定义）提供另一个条件。

`KeyConditionExpression` 参数指定要查询的键值。可使用可选 `FilterExpression` 在结果中的某些项目返回给您之前删除这些项目。

在 DynamoDB 中，您必须使用 `ExpressionAttributeValues` 作为表达式参数（如 `KeyConditionExpression` 和 `FilterExpression`）中的占位符。这类似于在关系数据库中使用*绑定变量*，其中，您在运行时将实际值代入 `SELECT` 语句。

请注意，此表的主键包含 *Artist* 和 *SongTitle*。

以下是其他几个 DynamoDB `Query` 示例。

```
// Return a single song, by primary key

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and SongTitle = :t",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call Me Today"
    }
}
```

```
// Return all of the songs by an artist

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    ExpressionAttributeValues: {
        ":a": "No One You Know"
    }
}
```

```
// Return all of the songs by an artist, matching first part of title

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and begins_with(SongTitle, :t)",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call"
    }
}
```

```
// Return all of the songs by an artist, only if the price is less than 1.00

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    FilterExpression: "Price < :p",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":p": 1.00
    }
}
```

**注意**  
`FilterExpression` 在 `Query` 读取匹配的项目之后应用，因此不会减少消耗的读取容量。尽可能对数据进行建模，以便范围条件可以在排序键上使用 `KeyConditionExpression` 高效地进行查询。有关更多信息，请参阅 [在 DynamoDB 中查询表](Query.md)。

------
#### [ PartiQL for DynamoDB ]

通过 PartiQL，您可以对分区键使用 `ExecuteStatement` 操作和 `Select` 语句执行查询。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know'
```

通过此方式使用 `SELECT` 语句将返回与此特定 `Artist` 关联的所有歌曲。

有关使用 `Select` 和 `ExecuteStatement` 的代码示例，请参阅 [PartiQL for DynamoDB 的 Select 语句](ql-reference.select.md)。

------