Read from a DynamoDB table or GSI, a native vector index, an OpenSearch projection, an S3 Tables analytics replica, or a configured virtual hybrid table. The source decides the native operation, consistency, and meter; the Executes-as strip names that plane and every client-side composition before the run. Every example below is quotable: the link icon copies a permanent URL to that exact query.
Syntax
sql
SELECT [DISTINCT] column | expr [AS name], … -- or SELECT VALUE exprFROM "table" | "table"."index"[WHERE predicates][GROUP BY keys [HAVING condition]][ORDER BY key [ASC|DESC] [NULLS FIRST|LAST]][LIMIT n] [OFFSET n] [PARALLEL n]-- vector-index shapeSELECT projected_column, VECTOR_DISTANCE(vector_attr, {queryVector}) AS scoreFROM "table"."vector-index"[WHERE search_schema_attr = value [AND …]]ORDER BY VECTOR_DISTANCE(vector_attr, {queryVector}) [ASC|DESC]LIMIT 1..100-- explicit query planes (Professional, read-only)FROM dynamodb."table" | s3tables."table" | opensearch."index" | hybrid."table"-- OpenSearch shorthand: FROM OPENSEARCH "index"
Quote table names — especially namespaced ones containing dots ("stage.Users"). Keywords read case-blind; attribute names are case-sensitive on the wire. Guides: First queries for projection and computed columns, Targeted reads for the WHERE reference.
Use cases
Fetch one item by its keyNative
The bread-and-butter point read — profile lookups, order details, config rows. The complete key makes it a one-item Query.
sql
SELECT * FROM "stage.Users"WHERE pk = 'USER#42' AND sk = 'PROFILE'
Executes asQuery · KeyConditionExpression: pk = 'USER#42' AND sk = 'PROFILE'
Partition-key equality plus the sort key: DynamoDB touches exactly one item.
List a partition by sort-key prefixNative
All events for one order, newest first — begins_with on the queried sort key narrows the key condition itself, so only the matching slice is read.
sql
SELECT * FROM "stage.Outbox"WHERE pk = 'Outbox#123' AND begins_with(sk, 'EVT#')ORDER BY sk DESCLIMIT 25
Executes asQuery · KeyConditionExpression: pk = 'Outbox#123' AND begins_with(sk, 'EVT#')
ORDER BY on the queried sort key stays native — DynamoDB returns index order.
Look up by a non-key attribute via a GSINative
Find users by organization when the base table is keyed by user id — the FROM "table"."index" form reads the alternate key path.
sql
SELECT * FROM "stage.Users"."ByOrg"WHERE OrgId = 'ORG#kanject'
LIMIT is required (1–100), selected fields must be projected, and the live descriptor must be ACTIVE with backfill finished. Full contract: Vector similarity search.
Full-text search with highlights and facetsLowered
Search an eventually consistent order projection by analyzed notes while filtering, sorting, highlighting, and returning typed status buckets.
sql
SELECT orderId, status, totalFROM OPENSEARCH "open-orders"WHERE notes MATCH 'urgent refund' AND status = 'OPEN'ORDER BY status ASC LIMIT 50HIGHLIGHT (notes)FACET status
Executes asOpenSearch Query DSL · match notes · term status · sort status · highlight notes · terms facet status
notes needs a SEARCH mapping; exact string filtering, sorting, and faceting on status need status FILTER. Full contract: OpenSearch indexes and queries.
Merge live and replica rows explicitlyLowered
Read the same projected columns from DynamoDB and its S3 Tables replica, preserving duplicates and showing each leg's freshness.
sql
SELECT sale_id, total_amount FROM dynamodb."Sales"UNION ALLSELECT sale_id, total_amount FROM s3tables."Sales"
Executes asDynamoDB SELECT leg + Athena/Iceberg SELECT leg → client-side UNION ALL
Both legs must stay bounded. Plain UNION, combined ORDER BY/LIMIT, and a leg that itself spans planes refuse. Full contract: Hybrid and cross-plane queries.
Shape columns with expressionsLowered
Build display values in the query — document paths, || concatenation, and CASE relabelling, all computed client-side after the read and disclosed.
sql
SELECT Name || ' <' || email || '>' AS contact, address.city, CASE Status WHEN 1 THEN 'Pending' WHEN 2 THEN 'Shipped' ELSE Status END AS statusFROM "stage.Users" WHERE pk = 'USER#42'
Executes asQuery · Projection: Name, email, address, Status → shaped client-side per fetched row
Client-side shaping changes what you see, never what DynamoDB reads or bills — the WHERE controls the bill.
Count the rows in one partitionLowered
How many events does this order have? The fold has no native form — the partition drains as a Query, then COUNT computes client-side.
sql
SELECT COUNT(*) AS total FROM "stage.Outbox"WHERE pk = 'Outbox#123'