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 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。