Amazon QLDB 中的 SELECT 命令 - Amazon Quantum Ledger Database (Amazon QLDB)

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

Amazon QLDB 中的 SELECT 命令

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

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

要了解如何控制对特定表运行此 PartiQL 命令的访问权限,请参阅。请参阅《Amazon 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 关键字是可选的。

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

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

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

AS source_alias

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

AT idx_alias

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

BY id_alias

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

WHERE condition

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

注意

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

Joins

目前仅支持内部联接。您可以使用显式 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 驱动程序以编程方式运行此语句,请参阅驱动程序入门中的以下教程: