DynamoDB 用の PartiQL select ステートメント - Amazon DynamoDB

DynamoDB 用の PartiQL select ステートメント

Amazon DynamoDB では、SELECT ステートメントを使用して、テーブルからデータを取得します。

SELECT ステートメントを使用すると、パーティションキーを持つ等価条件または IN 条件が WHERE 句で指定されていない場合、完全なテーブルスキャンになることがあります。スキャンオペレーションは、すべての項目でリクエストされた値を調べるので、大きなテーブルまたはインデックスに対してプロビジョニングされたスループットを 1 回のオペレーションで使い果たすことがあります。

PartiQL で完全なテーブルスキャンを避けたい場合は、次のようにします。

詳細については、「DynamoDB デベロッパーガイド」の「データのクエリとスキャンのベストプラクティス」を参照してください。

構文

SELECT expression [, ...] FROM table[.index] [ WHERE condition ] [ [ORDER BY key [DESC|ASC] , ...]

パラメータ

expression

(必須) * ワイルドカードからの射影、または結果セットからの 1 つ以上の属性名かドキュメントパスの射影リスト。式には、Amazon DynamoDB での PartiQL 関数の使用 への呼び出し、または DynamoDB での PartiQL 算術演算子、比較演算子、論理演算子 によって変更されたフィールドで構成できます。

table

(必須) クエリするテーブル名。

index

(オプション) クエリを実行するインデックスの名前です。

注記

インデックスにクエリを実行するときは、テーブル名とインデックス名に二重引用符を追加する必要があります。

SELECT * FROM "TableName"."IndexName"
condition

(オプション) クエリの選択条件。

重要

SELECT ステートメントによって、完全なテーブルスキャンが行われないようにするには、WHERE 句の条件がパーティションキーを指定する必要があります。等価演算子または IN 演算子を使用します。

例えば、OrderID パーティションキーと、Address を含むその他の非キー属性がある Orders テーブルがある場合、次のステートメントは完全なテーブルスキャンを実行しません。

SELECT * FROM "Orders" WHERE OrderID = 100 SELECT * FROM "Orders" WHERE OrderID = 100 and Address='some address' SELECT * FROM "Orders" WHERE OrderID = 100 or pk = 200 SELECT * FROM "Orders" WHERE OrderID IN [100, 300, 234]

ただし、次の SELECT ステートメントを実行すると、完全なテーブルスキャンが行われます。

SELECT * FROM "Orders" WHERE OrderID > 1 SELECT * FROM "Orders" WHERE Address='some address' SELECT * FROM "Orders" WHERE OrderID = 100 OR Address='some address'
key

(任意) 返ってきた結果の並び替えに使用するハッシュキーまたはソートキー。デフォルトの順序は昇順 (ASC) です。返ってきた結果を降順に並べる場合は、DESC を指定します。

注記

WHERE 句を省略すると、テーブル内のすべての項目が取得されます。

次のクエリは、Orders テーブルでパーティションキーと OrderID を指定し、等価演算子を使用することで、存在する場合に項目を 1 つ返します。

SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1

次のクエリは、OR 演算子を使用することで、特定のパーティションキーと OrderID、値を持つ Orders テーブルから、すべての項目を返します。

SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1 OR OrderID = 2

次のクエリは、IN 演算子を使用することで、特定のパーティションキーと OrderID、値を持つ Orders テーブルから、すべての項目を返します。返ってきた結果は、OrderID キー属性の値によって、降順に並べられます。

SELECT OrderID, Total FROM "Orders" WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESC

次のクエリは、Total が非キー属性である場合に、Total が 500 以上である Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。

SELECT OrderID, Total FROM "Orders" WHERE Total > 500

次のクエリは、IN 演算子と非キー属性である Total を使用して、特定の Total 範囲の順序で、Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。

SELECT OrderID, Total FROM "Orders" WHERE Total IN [500, 600]

次のクエリは、BETWEEN 演算子と非キー属性である Total を使用して、特定の Total 範囲の順序で、Orders テーブルからすべての項目を返す、完全なテーブルスキャンを示します。

SELECT OrderID, Total FROM "Orders" WHERE Total BETWEEN 500 AND 600

次のクエリは、WHERE 句の条件で CustomerID パーティションキーと MovieID ソートキーを指定し、SELECT 句でドキュメントのパスを使用することで、firestick デバイスで視聴を開始した最初の日付を返します。

SELECT Devices.FireStick.DateWatched[0] FROM WatchList WHERE CustomerID= 'C1' AND MovieID= 'M1'

次のクエリは、テーブル全体のスキャンを示しています。このスキャンでは、WHERE 句の条件でドキュメントのパスを使用し、2019 年 12 月 24 日以降に初めて firestick デバイスを使用した項目のリストを返します。

SELECT Devices FROM WatchList WHERE Devices.FireStick.DateWatched[0] >= '12/24/19'