

# プライマリキーを使用して項目を読み込むときの相違点
<a name="SQLtoNoSQL.ReadData.SingleItem"></a>

データベースの一般的なアクセスパターンの 1 つは、テーブルから単一項目を読み取ることです。目的の項目のプライマリキーを指定する必要があります。

**Topics**
+ [SQL にプライマリキーを使用して項目を読み込む](#SQLtoNoSQL.ReadData.SingleItem.SQL)
+ [DynamoDB でプライマリキーを使用して項目を読み込む](#SQLtoNoSQL.ReadData.SingleItem.DynamoDB)

## SQL にプライマリキーを使用して項目を読み込む
<a name="SQLtoNoSQL.ReadData.SingleItem.SQL"></a>

SQL では、`SELECT` ステートメントを使用して、テーブルからデータを取得します。結果の 1 つ以上の列 (`*` オペレーター を使用すれば、すべて) をリクエストできます。`WHERE` 句は返る行を判別します。

以下は、*Music* テーブルから単一の行を取得するための `SELECT` ステートメントです。`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 は、[テーブルのクエリにおける相違点](SQLtoNoSQL.ReadData.Query.md) および [テーブルのスキャンにおける相違点](SQLtoNoSQL.ReadData.Scan.md) で説明されている `Query` および `Scan` オペレーションと同様の機能を提供します。

SQL `SELECT` ステートメントは、テーブルの結合を実行でき、同時に複数のテーブルからデータを取得できます。データベーステーブルが正規化され、テーブル間の関係が明確である場合、結合は最も効果的です。ただし、1 つの `SELECT`ステートメントであまりに多くのテーブルを結合すると、アプリケーションパフォーマンスが影響を受けます。データベースレプリケーション、マテリアライズドビュー、またはクエリの書き換えを使用して、このような問題を回避できます。

DynamoDB は、非リレーショナルデータベースのため、テーブルの結合はサポートされません。リレーショナルデータベースから既存のアプリケーションを DynamoDB に移行する場合、結合の必要を排除するためデータモデルを非正規化する必要があります。

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

PartiQL では、PartiQL `Select` ステートメントを利用する `ExecuteStatement` オペレーションを使用して、テーブルから項目を読みます。

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

このテーブルのプライマリキーが、Artist および SongTitle で構成されていることに注意してください。

**注記**  
 選択 PartiQL ステートメントは、DynamoDB テーブルにクエリやスキャンを実行する場合にも使用できます

`Select` と `ExecuteStatement` を使用したコード例については、[DynamoDB 用の PartiQL select ステートメント](ql-reference.select.md) を参照してください。

------