

# テーブルのクエリにおける相違点
<a name="SQLtoNoSQL.ReadData.Query"></a>

もう 1 つの一般的なアクセスパターンは、クエリ条件に基づき、テーブルから複数の項目を読み込むことです。

**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 では、式パラメータ (`KeyConditionExpression` や `FilterExpression` など) で `ExpressionAttributeValues` をプレースホルダーとして使用する必要があります。これは、ランタイム時に実際の値を `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` を使用したコード例については、[DynamoDB 用の PartiQL select ステートメント](ql-reference.select.md) を参照してください。

------