

# 扫描表方面的差异
<a name="SQLtoNoSQL.ReadData.Scan"></a>

在 SQL 中，不带 `SELECT` 子句的 `WHERE` 语句将返回表中的每个行。在 Amazon DynamoDB 中，`Scan` 操作可执行相同的工作。在这两种情况下，您都可以检索所有项目或部分项目。

无论您使用的是 SQL 还是 NoSQL 数据库，都应谨慎使用扫描操作，因为它们会占用大量系统资源。有时，扫描是适合的 (例如，扫描小型表) 或不可避免的 (例如，执行数据的批量导出操作)。但通常来说，您应设计应用程序以避免执行扫描。有关更多信息，请参阅 [在 DynamoDB 中查询表](Query.md)。

**注意**  
执行批量导出还将为每个分区创建至少 1 个文件。每个文件中的所有项目都来自于该特定分区的哈希密钥空间。

**Topics**
+ [使用 SQL 扫描表](#SQLtoNoSQL.ReadData.Scan.SQL)
+ [在 DynamoDB 中扫描表](#SQLtoNoSQL.ReadData.Scan.DynamoDB)

## 使用 SQL 扫描表
<a name="SQLtoNoSQL.ReadData.Scan.SQL"></a>

使用 SQL 时，您可以在不指定 `SELECT` 子句的情况下使用 `WHERE` 语句扫描表并检索其所有数据。您可以在结果中请求一个或多个列。或者，如果您使用通配符 (\$1)，则可请求所有列。

以下是使用 `SELECT` 语句的示例。

```
/* Return all of the data in the table */
SELECT * FROM Music;
```

```
/* Return all of the values for Artist and Title */
SELECT Artist, Title FROM Music;
```

## 在 DynamoDB 中扫描表
<a name="SQLtoNoSQL.ReadData.Scan.DynamoDB"></a>

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

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

借助 DynamoDB API，您可以使用 `Scan` 操作来通过访问表或者二级索引中的每个项目来返回一个或多个项目和项目属性。

```
// Return all of the data in the table
{
    TableName:  "Music"
}
```

```
// Return all of the values for Artist and Title
{
    TableName:  "Music",
    ProjectionExpression: "Artist, Title"
}
```

`Scan` 操作还提供一个 `FilterExpression` 参数，您可以使用它丢弃不希望在结果中出现的项目。在执行扫描后且结果返回给您之前，应用 `FilterExpression`。（不建议对大表使用。即使仅返回几个匹配项目，您仍需为整个 `Scan` 付费。）

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

使用 PartiQL，您可以通过 `Select` 语句来使用 `ExecuteStatement` 操作执行扫描，以返回表的所有内容。

```
SELECT AlbumTitle, Year, Price
FROM Music
```

请注意，此语句将返回 Music 表中的所有项目。

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

------