ORDER BY
ORDER BY is an output modifier. Logically it is applied near the very end of the query (just prior to LIMIT or OFFSET, if present).
The ORDER BY clause sorts the rows on the sorting criteria in either ascending or descending order.
In addition, every order clause can specify whether NULL values should be moved to the beginning or to the end.
The ORDER BY clause may contain one or more expressions, separated by commas.
An error will be thrown if no expressions are included, since the ORDER BY clause should be removed in that situation.
The expressions may begin with either an arbitrary scalar expression (which could be a column name), a column position number (where the indexing starts from 1), or the keyword ALL.
Each expression can optionally be followed by an order modifier (ASC or DESC, default is ASC), and/or a NULL order modifier (NULLS FIRST or NULLS LAST, default is NULLS LAST).
ORDER BY ALL
The ALL keyword indicates that the output should be sorted by every column in order from left to right.
The direction of this sort may be modified using either ORDER BY ALL ASC or ORDER BY ALL DESC and/or NULLS FIRST or NULLS LAST.
Note that ALL may not be used in combination with other expressions in the ORDER BY clause – it must be by itself.
See examples below.
NULL Order Modifier
By default, SereneDB sorts ASC and NULLS LAST, i.e., the values are sorted in ascending order and NULL values are placed last.
This is identical to the default sort order of PostgreSQL.
The default sort order can be changed with the following configuration options.
Use the default_null_order option to change the default NULL sorting order to either NULLS_FIRST, NULLS_LAST, NULLS_FIRST_ON_ASC_LAST_ON_DESC or NULLS_LAST_ON_ASC_FIRST_ON_DESC:
SET default_null_order = 'NULLS_FIRST';Use the default_order option to change the direction of the default sorting order to either DESC or ASC:
SET default_order = 'DESC';Collations
Text is sorted using the binary comparison collation by default, which means values are sorted on their binary UTF-8 values. While this works well for ASCII text (e.g., for English language data), the sorting order can be incorrect for other languages. For this purpose, SereneDB provides collations. For more information on collations, see the Collation page.
Examples
All examples use this example table:
CREATE OR REPLACE TABLE planets AS SELECT 'Mars' AS planet, 'terrestrial' AS kind, 2 AS moons UNION ALL SELECT 'Mercury', 'terrestrial', 0 UNION ALL SELECT 'Neptune', 'ice giant', 14 UNION ALL SELECT 'Jupiter', 'gas giant', 95;Select the planets, ordered by kind using the default NULL order and default order:
SELECT *FROM planetsORDER BY kind; planet | kind | moons---------+-------------+------- Jupiter | gas giant | 95 Neptune | ice giant | 14 Mars | terrestrial | 2 Mercury | terrestrial | 0Select the planets, ordered by kind in descending order with nulls at the end:
SELECT *FROM planetsORDER BY kind DESC NULLS LAST; planet | kind | moons---------+-------------+------- Mars | terrestrial | 2 Mercury | terrestrial | 0 Neptune | ice giant | 14 Jupiter | gas giant | 95Order by kind and then by planet, both using the default orderings:
SELECT *FROM planetsORDER BY kind, planet; planet | kind | moons---------+-------------+------- Jupiter | gas giant | 95 Neptune | ice giant | 14 Mars | terrestrial | 2 Mercury | terrestrial | 0Region- and language-specific (ICU) collations, such as German, are available in this build of SereneDB, so ordering by one such collation works. For example, German orders ä next to a rather than at the end. For more information, see the Collation page:
SELECT wordFROM (VALUES ('apfel'), ('zebra'), ('äpfel'), ('birne')) AS t(word)ORDER BY word COLLATE DE; word------- apfel äpfel birne zebraORDER BY ALL Examples
Order from left to right (by planet, then by kind, then by moons) in ascending order:
SELECT *FROM planetsORDER BY ALL; planet | kind | moons---------+-------------+------- Jupiter | gas giant | 95 Mars | terrestrial | 2 Mercury | terrestrial | 0 Neptune | ice giant | 14Order from left to right (by planet, then by kind, then by moons) in descending order:
SELECT *FROM planetsORDER BY ALL DESC; planet | kind | moons---------+-------------+------- Neptune | ice giant | 14 Mercury | terrestrial | 0 Mars | terrestrial | 2 Jupiter | gas giant | 95