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 復現,並原樣照錄,包括列偏移量。