SELECT亚马逊中的命令 QLDB - 亚马逊 Quantum Ledger 数据库(亚马逊QLDB)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

SELECT亚马逊中的命令 QLDB

重要

终止支持通知:现有客户可以在2025年7月31日终止支持QLDB之前使用亚马逊。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL e。

在 Amazon 中QLDB,使用SELECT命令从一个或多个表中检索数据。中的每个SELECT查询都QLDB是在事务中处理的,并且受事务超时限制的约束。

结果的顺序不指定,可能因每个SELECT查询而异。中的任何查询都不应依赖结果顺序QLDB。

要了解如何控制对特定表运行此 PartiQL 命令的访问权限,请参阅。开始使用 Amazon 中的标准权限模式 QLDB

警告

当您在没有索引查询QLDB的情况下在中运行查询时,它会调用全表扫描。PartiQL 之所以支持此类查询,是因为它是兼容的。SQL但是,不要在中对生产用例运行表扫描QLDB。表扫描可能会导致大型表出现性能问题,包括并发冲突与事务超时。

为避免表扫描,必须在索引字段或文档 ID 上使用相等运算符(WHERE indexedField = 123WHERE indexedField IN (456, 789))运行带有WHERE谓词子句的语句。有关更多信息,请参阅 优化查询性能

语法

SELECT [ VALUE ] expression [ AS field_alias ] [, expression, ... ] FROM source [ AS source_alias ] [ AT idx_alias ] [ BY id_alias ] [, source, ... ] [ WHERE condition ]

参数

VALUE

表达式的限定符,它使查询返回原始数据类型值,而非将值封装在元组结构中。

expression

(必需)从 * 通配符形成的投影,或者结果集的一个或多个属性名称或文档路径的投影列表。表达式可以包括对 PartiQL 函数 或通过 PartiQL 运算符 修改的字段的调用。

AS field_alias

(可选)在最终结果集中使用字段的临时别名。AS 关键字是可选的。

如果您没有为不是简单列名的表达式指定别名,则结果集将对该字段应用默认名称。

FROM source

要查询的来源。当前支持的唯一来源是表名、表之间的内部联接、嵌套SELECT查询(以嵌套查询限制)和表的历史函数 调用为准。

您必须指定至少一个源。必须用逗号分隔多个源。

AS source_alias

(可选)用户定义的别名,范围涵盖要更新的源。SELECTWHERE 语句中所用的源别名必须在 FROM 语句中声明。AS 关键字是可选的。

AT idx_alias

(可选)用户定义的别名,它绑定至源列表中每个元素的索引(序数)。必须使用 AT 关键字在 FROM 子句中声明别名。

BY id_alias

(可选)用户定义的别名,它绑定至结果集中每个文档的 id元数据字段。必须使用 BY 关键字在 FROM 子句中声明别名。当您想在查询默认用户视图的同时投影或筛选文档 ID,这很有用。有关更多信息,请参阅 通过 BY 子句查询文档 ID

WHERE condition

查询的选择标准和联接标准(如适用)。

注意

如果省略 WHERE 子句,则检索表中的所有文档。

联接

目前仅支持内部联接。您可以使用显式 INNER JOIN 子句编写内部联接查询,如下所示。在此语法中,JOIN必须与ON配对,并且INNER 关键字是可选的。

SELECT expression FROM table1 AS t1 [ INNER ] JOIN table2 AS t2 ON t1.element = t2.element

或者,您可以使用隐式语法编写内部联接,如下所示。

SELECT expression FROM table1 AS t1, table2 AS t2 WHERE t1.element = t2.element

嵌套查询限制

可以在 SELECT 表达式和 FROM 源代码中编写嵌套查询(子查询)。主要限制是,只有最外层的查询才能访问全局数据库环境。例如,假设您有一个包含表VehicleRegistrationPerson的分类账。以下嵌套查询无效,因为内部SELECT试图访问Person

SELECT r.VIN, (SELECT p.PersonId FROM Person AS p WHERE p.PersonId = r.Owners.PrimaryOwner.PersonId) AS PrimaryOwner FROM VehicleRegistration AS r

而以下嵌套查询是有效的。

SELECT r.VIN, (SELECT o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner FROM VehicleRegistration AS r

示例

以下查询显示了一个基本的 SELECT,其中包含使用IN运算符的标准WHERE谓词子句。

SELECT * FROM Vehicle WHERE VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

下图显示了使用字符串筛选条件的 SELECT 光投影。

SELECT FirstName, LastName, Address FROM Person WHERE Address LIKE '%Seattle%' AND GovId = 'LEWISR261LL'

下面显示了用于扁平化嵌套数据的相关子查询。此处的 @ 字符在技术上是可选的。但它明确表示你想在里面放置一个Owners结构VehicleRegistration,而不是一个名为不同的集合Owners(如有)。有关更多背景信息,请参阅 处理数据和历史记录 一章中的嵌套数据

SELECT r.VIN, o.SecondaryOwners FROM VehicleRegistration AS r, @r.Owners AS o WHERE r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

下图显示了SELECT 列表中投射嵌套数据的子查询和隐式内部联接。

SELECT v.Make, v.Model, (SELECT VALUE o.PrimaryOwner.PersonId FROM @r.Owners AS o) AS PrimaryOwner FROM VehicleRegistration AS r, Vehicle AS v WHERE r.VIN = v.VIN AND r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

下面显示了一个显式的内部联接。

SELECT v.Make, v.Model, r.Owners FROM VehicleRegistration AS r JOIN Vehicle AS v ON r.VIN = v.VIN WHERE r.VIN IN ('1N4AL11D75C109151', 'KM8SRDHF6EU074761')

下图显示了使用 BY 子句对文档 id 元数据字段的投影。

SELECT r_id, r.VIN FROM VehicleRegistration AS r BY r_id WHERE r_id = 'documentId'

以下内容分别使用BY来联接DriversLicensePerson表的id字段PersonId和文档字段。

SELECT * FROM DriversLicense AS d INNER JOIN Person AS p BY pid ON d.PersonId = pid WHERE pid = 'documentId'

以下内容使用子已提交视图句分别连接DriversLicensePerson表的id字段PersonId和文档字段。

SELECT * FROM DriversLicense AS d INNER JOIN _ql_committed_Person AS cp ON d.PersonId = cp.metadata.id WHERE cp.metadata.id = 'documentId'

以下内容返回表 VehicleRegistration 中文 档Owners.SecondaryOwners 列表中每个人的 PersonId和索引(序数)。

SELECT s.PersonId, owner_idx FROM VehicleRegistration AS r, @r.Owners.SecondaryOwners AS s AT owner_idx WHERE r.VIN = 'KM8SRDHF6EU074761'

使用驱动程序以编程方式运行

要了解如何使用驱动程序以编程方式运行此语句,请参阅QLDB驱动程序入门中的以下教程: