DynamoDB 支持 SQL 吗?

部分支持。DynamoDB 支持 PartiQL——一种兼容 SQL 的查询语言,可用于 SELECTINSERTUPDATEDELETE 语句。它不是完整的 SQL:没有 JOIN、没有 GROUP BY、也没有任意聚合,而且高效的查询仍然要求命中主键或某个索引。如果你想要那些缺失的部分,DynoTable 的 SQL Workbench 能在桌面端针对你的 DynamoDB 表运行真正的 JOINGROUP 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 止步于单表 SELECTDynoTableSQL Workbench 走得更远:它能针对你的 DynamoDB 表运行真正的 JOINGROUP BY 和聚合函数(COUNTSUMAVGMINMAX)。它通过普通的 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,以及真正的 JOINGROUP BY 和聚合。

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

上方每一条 ValidationException 都于 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 复现,并原样照录,包括列偏移量。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。