Documentation Index
Fetch the complete documentation index at: https://docs.ditto.live/llms.txt
Use this file to discover all available pages before exploring further.
DQL now supports projections and aggregates in addition to
SELECT * operations. You can select specific fields, perform calculations, and use aggregate functions like COUNT, SUM, AVG, MIN, and MAX.SELECT Statements
The following syntax outlines the basic structure and optional clauses you can use within yourSELECT statements:
DQL
projection can be:
*- Returns all fields from the documentsfield1, field2, ...- Returns specific fieldsexpression AS alias- Returns calculated values with custom names- Aggregate functions like
COUNT(*),SUM(field), etc.
cars collection WHERE the color property is set to the value ‘blue’ :
DQL
Clauses for Filtering
The following table provides an overview of the different clauses you can use to define specific conditions and calculations within your DQLSELECT statements to provide more granular control over your queries:
| Clause | Description |
|---|---|
| FROM | The required clause specifying the collection containing the documents for retrieval. (See FROM) |
| WHERE | Applies filtering conditions to restrict the documents included in the result set. (See WHERE) |
| GROUP BY | Groups documents based on one or more expressions for aggregate calculations. (See GROUP BY) |
| HAVING | Filters grouped results based on aggregate conditions. (See HAVING) |
| ORDER BY | Specifies the sorting order of the result set based on one or more expressions. (See ORDER BY) |
| LIMIT | Restricts the number of documents included in the result set. (See LIMIT) |
| OFFSET | Skips a specific number of documents before returning the result set. (See OFFSET) |
FROM
Required in eachSELECT statement you write in DQL, the FROM element identifies the collection for document retrieval.
DQL
SELECT statement querying documents from the cars collection:
DQL
USE IDS
The optionalUSE IDS clause allows you to efficiently retrieve specific documents by their IDs without performing a collection scan. This is more performant than using WHERE _id IN (...) filters.
Syntax:
DQL
DQL
Performance Tip: Where possible, simple equality filters on
_id (like WHERE _id = '123') are automatically optimized internally similar to USE IDS. However, for explicit control and guaranteed performance, USE IDS is recommended. See also the #auto_use_ids directive in Directives.Collection Aliasing
You can assign an alias to a collection in the FROM clause to create shorter, more readable queries. TheAS keyword is optional:
DQL
- Complex queries: Shortening long collection names for readability
- Qualified field references: Explicitly referencing fields from a specific collection
- Query directives: Specifying collection-level directives (see Directives)
DQL
WHERE
TheWHERE clause filters data based on either an expression or a set of conditions that narrow the result set returned to you:
DQL
SELECT statement querying documents from the cars collection based on a given address:
DQL
SELECT statement that queries using multiple expressions and logical operators to further refine the criteria for document retrieval:
DQL
ORDER BY
With theORDER BY clause, if you’d like, you can integrate calculations or expressions in your SELECT statement. Then sort the resulting documents to return in either ascending (ASC) or descending (DESC) alphabetical order:
DQL
SELECT statement that uses the ORDER BY clause to query and sort documents from the cars collection in descending (DESC) alphabetical order based on the field value set for the color property:
DQL
your_collection_nameis the name of the collection from which you want to retrieve the data.expression_1, expression_2, ...are the expressions evaluated to sort the result. Expressions are resolved in order.[ASC|DESC]is an optional parameter that specifies the sort order. If omitted, the default sort order is ascending (ASC). To sort in descending order, you can specifyDESC.
DQL
"blue" cars return first and other cars sort by the natural order in the collection:
DQL
Sort Order by Object Type
In DQL, the hierarchy for comparing and sorting objects varies based on the following criteria:- If ascending (
ASC) order operations:booleannumberbinarystringarrayobjectnullmissing
- If descending (
DESC) order operations, sorting order is reversed:missingnullobjectarraystringbinarynumberboolean
- If evaluating values,
trueresults are prioritized and ordered first followed byfalseresults.
Expressing Sort Order
Unless explicitly defined asDESC in your query, Ditto defaults to sorting in ascending (ASC). So, if you want to sort in ascending order, you do not have to express that in your query.
LIMIT
TheLIMIT clause is used to restrict the number of documents returned by a query, allowing you to specify a maximum limit on the number of documents to be included in the result set:
DQL
your_collection_nameis the name of the collection from which you want to retrieve the data.limit_valueis the maximum number of documents you want to include in the result set.
your_collection_name collection:
DQL
OFFSET
TheOFFSET clause is used to specify the number of records to skip before starting to return documents from the query result:
DQL
your_collection_nameis the name of the collection from which you want to retrieve the data.number_of_items_to_skipis the number of items before returning the result set.
OFFSET with LIMIT is a common way to utilize OFFSET; for example:
DQL
Projections
Projections allow you to specify exactly which fields or calculated values to return from your query, rather than returning entire documents. This reduces data transfer and processing overhead.Basic Field Selection
Select specific fields from documents:DQL
Excluding Fields
To exclude specific fields from a projection, use theMISSING keyword. This can be combined with * to select all fields except those explicitly excluded:
DQL
Aliasing
Use aliases to rename fields in your results:DQL
- Simple field references use the field name as the alias
- Expressions get aliases like
($1),($2), etc.
Alias Constraints
Aliases must follow these rules:- Uniqueness: Each alias in a SELECT list must be unique. Duplicate aliases will raise an error.
- Identifier Rules: Aliases must be valid identifiers following field naming conventions.
- Special Characters: Use backticks (grave accents) to quote aliases containing special characters or reserved words.
DQL
Alias Scope
Projection aliases defined in the SELECT list can be referenced by the ORDER BY clause to sort by an aliased expression:DQL
GROUP BY and HAVING do not accept projection aliases. They must reference the underlying source expression or aggregate function directly: use GROUP BY color (the source field) rather than GROUP BY c (a projection alias), and HAVING COUNT(*) > 5 (the aggregate) rather than HAVING car_count > 5 (the alias).
Calculated Fields
Create new fields using expressions:DQL
DISTINCT Results
Remove duplicate rows from your results:DQL
Aggregate Functions
Aggregate functions perform calculations across multiple documents and return a single result. DQL supports the following aggregate functions:For a quick reference table of all aggregate functions and their syntax, see Operator Expressions - Aggregate Functions.
COUNT
Count documents or non-null values:DQL
SUM
Calculate the sum of numeric values:DQL
AVG
Calculate the average of numeric values:DQL
MIN and MAX
Find minimum and maximum values:DQL
MID
Calculate the midpoint between minimum and maximum values:DQL
MID function returns the midpoint value between MIN(expr) and MAX(expr). Non-numeric values are silently ignored.
MEDIAN
Calculate the median (middle) value:DQL
MEDIAN function returns the middle value when all values are sorted. Non-numeric values are silently ignored.
Combining Aggregates
Use multiple aggregate functions in a single query:DQL
GROUP BY
Group results and calculate aggregates for each group:DQL
GROUP BY, non-aggregate projections must be part of the GROUP BY clause:
DQL
HAVING
Filter grouped results based on aggregate values:DQL
Aggregate functions form a “dam” in the execution pipeline - all documents must be processed before results can be returned. This differs from non-aggregate queries which can stream results.
Aggregate Function Behavior
Understanding how aggregate functions work internally helps optimize query performance: Memory Requirements:- Aggregates accumulate results per group, so memory usage depends on the number of groups
- A small number of groups requires little memory regardless of document count
- A large number of groups increases memory requirements proportionally
DISTINCTaggregates must buffer all distinct values in memory, which can significantly increase memory usage with many unique values
- If no documents qualify for an aggregate in a group, the result is
MISSING(absent from results) - To always include a result, use conditional functions:
SUM(IFMISSING(field, 0)) MINandMAXsilently ignoreMISSINGvaluesCOUNTdoes not countNULL,MISSING, orFALSEvalues unless explicitly handled
SUM,AVG,MID, andMEDIANsilently ignore non-numeric valuesMINandMAXcompare values using Ditto’s standard type ordering rulesCOUNT(*)is equivalent toCOUNT(true)with no additional overhead
- Use
COUNT(*)instead ofCOUNT(field)when counting all documents - Avoid
DISTINCTwith aggregates unless necessary due to memory overhead - Minimize the number of groups in
GROUP BYfor better memory efficiency - Use
HAVINGto filter groups rather than filtering after aggregation
Advanced Aggregate Examples
Handling MISSING Values:DQL
DQL
DQL
DQL
DQL
DQL
DQL