

# 使用项目的主键读取项目方面的差异
<a name="SQLtoNoSQL.ReadData.SingleItem"></a>

数据库的一个常见访问模式是从表中读取一个项目。您必须指定所需项目的主键。

**Topics**
+ [通过 SQL 使用项目的主键读取项目](#SQLtoNoSQL.ReadData.SingleItem.SQL)
+ [在 DynamoDB 中使用项目的主键读取项目](#SQLtoNoSQL.ReadData.SingleItem.DynamoDB)

## 通过 SQL 使用项目的主键读取项目
<a name="SQLtoNoSQL.ReadData.SingleItem.SQL"></a>

在 SQL 中，您将使用 `SELECT` 语句从表中检索数据。您可以在结果中请求一个或多个列 (或所有列，如果您使用 `*` 运算符)。`WHERE` 子句确定要返回的行。

以下是 `SELECT` 语句，它从 *Music* 表中检索单个行。`WHERE` 子句指定主键值。

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

您可以修改此查询以仅检索一部分列。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

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

## 在 DynamoDB 中使用项目的主键读取项目
<a name="SQLtoNoSQL.ReadData.SingleItem.DynamoDB"></a>

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

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

使用 DynamoDB API，您可以使用 `PutItem` 操作向表添加项目。

DynamoDB 提供 `GetItem` 操作来按项目的主键检索项目。`GetItem` 非常高效，因为它提供对项目物理位置的直接访问。（有关更多信息，请参阅 [DynamoDB 中的分区和数据分布](HowItWorks.Partitions.md)。）

默认情况下，`GetItem` 将返回整个项目及其所有属性。

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    }
}
```

您可以添加 `ProjectionExpression` 参数以仅返回一些属性。

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    },
    "ProjectionExpression": "AlbumTitle, Year, Price"
}
```

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

DynamoDB `GetItem` 操作非常高效。此操作使用主键值确定相关项目的确切存储位置，并直接从此位置检索该项目。在按主键值检索项目时，SQL `SELECT` 语句同样高效。

SQL `SELECT` 语句支持多种类型的查询和表扫描。DynamoDB 的 `Query` 和 `Scan` 操作功能类似，这两个操作在 [查询表方面的差异](SQLtoNoSQL.ReadData.Query.md) 和 [扫描表方面的差异](SQLtoNoSQL.ReadData.Scan.md) 中介绍。

SQL `SELECT` 语句可执行表联接，这允许您同时从多个表中检索数据。在标准化数据库表的情况下，联接是最高效的，并且各个表之间的关系很明确。不过，如果您在一个 `SELECT` 语句中联接的表过多，则会影响应用程序性能。可使用数据库复制、具体化的视图或查询重写来解决此类问题。

DynamoDB 是一个非关系数据库且不支持表联接。如果您将现有应用程序从关系数据库迁移到 DynamoDB，则需要非规范化数据模型以消除联接需要。

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

使用 PartiQL，您可以通过使用 PartiQL `ExecuteStatement` 语句来使用 `Select` 操作读取表中的项目。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

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

**注意**  
 选择 PartiSQL 语句也可用于查询或扫描 DynamoDB 表

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

------