DynamoDB 支持 SQL 吗?
部分支持。DynamoDB 支持 PartiQL——一种兼容 SQL 的查询语言,可用于 SELECT、INSERT、UPDATE 和 DELETE 语句。它不是完整的 SQL:没有 JOIN、没有 GROUP BY、也没有任意聚合,而且高效的查询仍然要求命中主键或某个索引。如果你想要那些缺失的部分,DynoTable 的 SQL Workbench 能在桌面端针对你的 DynamoDB 表运行真正的 JOIN、GROUP BY 和聚合查询。
PartiQL 给了你什么
四种数据操作的一套熟悉的 SQL 语法。你可以写 SELECT * FROM "Orders" WHERE ...,而不用去构造底层的 API 调用,这既方便又好读。
它没有给你什么
- 没有 JOIN——DynamoDB 是非关系型的;你要靠反规范化来替代。
- 没有 GROUP BY / 聚合——分组和求和发生在你的应用里。
- 自由扫描并不便宜——一个没有键条件的
SELECT照样跑一次 Scan,也照样按此计费。
解析器在哪里止步
这些不是换个语法就能够到的功能。跑一下,语句根本走不到读取项目那一步:
SELECT "region", SUM("total") FROM "Orders" GROUP BY "region"
ValidationException: Unsupported clause: GROUP BY
SELECT COUNT(*) FROM "Orders"
ValidationException: Unexpected path component at 1:8:5
SELECT SUM("total") FROM "Orders"
ValidationException: Unexpected path component at 1:8:3
SELECT DISTINCT "region" FROM "Orders"
ValidationException: Unsupported token in expression: DISTINCT看看那两条聚合错误说了什么。根本没有聚合函数供解析器去拒绝,所以 COUNT(*) 被当成一条属性路径来读,然后在第 8 列的 * 上栽了跟头。这个 SQL 表面就薄到这种程度。
ORDER BY 是值得知道的一个,因为它看起来像是能用的:
SELECT * FROM "Orders" WHERE "pk" = 'U#1' ORDER BY "total"
ValidationException: Variable reference total in ORDER BY clause must be part of the primary key你可以按排序键升序或降序排,除此之外什么都不行。按其他任何属性排序都是你的应用在读取之后要做的活儿。
心智模型
把 PartiQL 看作架在 DynamoDB 既有的 Query、Scan 和写入操作之上的一层语法;底下适用的还是同一套访问模式规则。
用 DynoTable 跑真正的 SQL(JOIN、GROUP BY、聚合)
PartiQL 止步于单表 SELECT。DynoTable 的 SQL Workbench 走得更远:它能针对你的 DynamoDB 表运行真正的 JOIN、GROUP BY 和聚合函数(COUNT、SUM、AVG、MIN、MAX)。它通过普通的 DynamoDB API 读取项目,然后在客户端执行查询里关系型的那部分:这是_在 DynamoDB 的访问模式规则内_的 SQL,因为每一次连接仍然要经由一个真实的键或索引来读。于是 PartiQL 做不到的那三件事,你写成一条语句:
SELECT c.region, COUNT(*) AS orders, SUM(o.total) AS revenue
FROM Orders o
JOIN Customers c ON o.customerId = c.id
GROUP BY c.region它对底层的约束保持诚实(一个无界的连接就是一次无界的读取),所以最快的查询是那些连接或 WHERE 命中了分区键或索引的查询。完整细节见 SQL for DynamoDB,以及产品手册 /docs/dynamodb-sql-workbench。
使用以下方法对同一数据模型的 PartiQL 端进行原型设计
DynamoDB query builder — 它发出分区范围的信号
Query 保持有效路径的程序 PartiQL SELECT 当密钥使用时条件已存在。
深入了解
在 PartiQL vs SQL里对比两者,看看 PartiQL 示例,并阅读 SQL for DynamoDB。下载 DynoTable 就能针对你的表写 PartiQL,以及真正的 JOIN、GROUP BY 和聚合。
参考资料
- PartiQL - a SQL-compatible query language for Amazon DynamoDB — Amazon DynamoDB Developer Guide
- PartiQL select statements for DynamoDB — Amazon DynamoDB Developer Guide
- Query data in DynamoDB (SQL to NoSQL) — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。
上方每一条 ValidationException 都于 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 复现,并原样照录,包括列偏移量。