PartiQL for DynamoDB 的 Select 语句
使用 SELECT
语句从 Amazon DynamoDB 的表检索数据。
如果 WHERE 子句中未提供带有分区键的相等或 IN 条件,使用 SELECT
语句会导致全表扫描。扫描操作会检查每个项目的请求值,并且可以在单个操作中使用大型表或索引的预置吞吐量。
如果您想避免在 PartiQL 中进行全表扫描,您可以:
-
创作您的
SELECT
语句不会导致全表扫描,方法是确保您的 WHERE 子句条件相应地配置。 -
使用《DynamoDB 开发人员指南》示例:允许 Select 语句并拒绝 PartiQL for DynamoDB 的完整表扫描语句中指定的 IAM 策略禁用全表扫描。
有关更多信息,请参阅《DynamoDB 开发人员指南》中的查询和扫描数据的最佳实践。
语法
SELECT
expression
[, ...] FROMtable
[.index
] [ WHEREcondition
] [ [ORDER BYkey
[DESC|ASC] , ...]
参数
expression
-
(必需)从
*
通配符形成的投影,或者结果集的一个或多个属性名称或文档路径的投影列表。表达式可以包括对 将 PartiQL 函数和 DynamoDB 结合使用 或通过 用于 DynamoDB 的 PartiQL 算术、比较和逻辑运算符 修改的字段的调用。 table
-
(必需)要查询的表名。
index
-
(可选)要查询的索引的名称。
注意
查询索引时,必须在表名和索引名称中添加双引号。
SELECT * FROM "TableName"."IndexName"
condition
-
(可选)查询的选择条件。
重要
为了确保
SELECT
语句不会导致全表扫描,WHERE
子句条件必须指定分区键。使用相等或 IN 运算符。例如,如果
Orders
表有OrderID
分区键和其他非键属性,包括Address
,则以下语句不会导致完整表扫描: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'
密钥
-
(可选)用于对返回结果进行排序的哈希键或排序键。默认顺序为升序 (
ASC
) 指定DESC
如果您希望按降序重新调整结果。
注意
如果省略 WHERE
子句,则检索表中的所有项目。
示例
以下查询指定分区键 OrderID
,并使用相等运算符,返回 Orders
表中的一个项目(如果存在)。
SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1
以下查询使用 OR 运算符返回 Orders
表中具有特定分区键 OrderID
的所有项目。
SELECT OrderID, Total FROM "Orders" WHERE OrderID = 1 OR OrderID = 2
以下查询使用 IN 运算符返回 Orders
表中具有特定分区键 OrderID
的所有项目。返回的结果基于 OrderID
密钥属性值按降序排列。
SELECT OrderID, Total FROM "Orders" WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESC
以下查询显示一个全表扫描,返回 Orders
表中 Total
大于 500,Total
是非键属性的所有项目。
SELECT OrderID, Total FROM "Orders" WHERE Total > 500
以下查询显示一个全表扫描,使用 IN 运算符和非键属性 Total
返回 Orders
表特定 Total
订单范围内的所有项目。
SELECT OrderID, Total FROM "Orders" WHERE Total IN [500, 600]
以下查询显示一个全表扫描,使用 BETWEEN 运算符和非键属性 Total
返回 Orders
表特定 Total
订单范围内的所有项目。
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 子句条件中使用文档路径,返回 12/24/19 之后首次使用 firestick 设备的项目列表。
SELECT Devices FROM WatchList WHERE Devices.FireStick.DateWatched[0] >= '12/24/19'