SELECT — read items

View .md

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 key Native

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 prefix Native

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 GSI Native

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'
Executes asQuery · stage.Users.ByOrg · KeyConditionExpression: OrgId = 'ORG#kanject'
  • A GSI obeys the same rule: equality on the index's partition key is a Query; filtering the index on a non-key attribute is still a Scan of the index.
Find the ten nearest products Lowered

Rank projected products by a query embedding while pinning the index's category partition and optional brand filter.

sql
SELECT ProductId, Title,       VECTOR_DISTANCE(Embedding, {queryVector}) AS scoreFROM "Products"."ProductEmbeddingIndex"WHERE Category = {category} AND Brand = 'Acme'ORDER BY VECTOR_DISTANCE(Embedding, {queryVector}) ASCLIMIT 10
Executes asSearchVectors · ProductEmbeddingIndex · TopK 10 · eventually consistent · byte-metered
  • LIMIT is required (1100), 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 facets Lowered

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 explicitly Lowered

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 expressions Lowered

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 partition Lowered

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'
Executes asQuery · stage.Outbox → client fold: COUNT(*)
  • Every folded item is read and billed. SELECT COUNT(*) with no WHERE folds over a full-table Scan — bound it. Full treatment in Aggregates & profiling.
Read rows whose keys come from another table Lowered

A semi-join: the subquery runs first, its ids re-spelled through a key template; a partition-key IN executes as key lookups, not a Scan.

sql
SELECT * FROM "stage.Users"WHERE pk IN (SELECT 'User#{CustomerId}' FROM "stage.Orders"             WHERE status = 'FAILED' LIMIT 25)
Executes asSemi-join · 2 native requests — subquery drains, then key lookups

Try it

Try it · SELECTSample
Executes asQuery · stage.Users
Query KeyConditionExpression: pk = 'USER#42' AND sk = 'PROFILE' · Projection: Name, Role
One item, one partition — the cheapest read there is.
#NameRole
1Ada Okaforadmin
Fetched 1 item in 9ms · 100% efficient · 1 RCU · 1 partition

Related: First queries · Targeted, vector & parallel reads · OpenSearch indexes and queries · Hybrid and cross-plane queries · Joins, subqueries & sets · Aggregates & profiling · keyword reference.

Was this page helpful?