Skip to main content

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. For ascending order this matches PostgreSQL. For DESC it does not: PostgreSQL places NULL values first there, while SereneDB still places them last. Write NULLS FIRST or NULLS LAST in queries ported from PostgreSQL, or set default_null_order to NULLS_LAST_ON_ASC_FIRST_ON_DESC for PostgreSQL's order. 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:

SQL
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:

SQL
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:

SQL
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:

SQL
SELECT *FROM planetsORDER BY kind;
 planet  | kind        | moons
---------+-------------+-------
 Jupiter | gas giant   |    95
 Neptune | ice giant   |    14
 Mars    | terrestrial |     2
 Mercury | terrestrial |     0

Select the planets, ordered by kind in descending order with nulls at the end:

SQL
SELECT *FROM planetsORDER BY kind DESC NULLS LAST;
 planet  | kind        | moons
---------+-------------+-------
 Mars    | terrestrial |     2
 Mercury | terrestrial |     0
 Neptune | ice giant   |    14
 Jupiter | gas giant   |    95

Order by kind and then by planet, both using the default orderings:

SQL
SELECT *FROM planetsORDER BY kind, planet;
 planet  | kind        | moons
---------+-------------+-------
 Jupiter | gas giant   |    95
 Neptune | ice giant   |    14
 Mars    | terrestrial |     2
 Mercury | terrestrial |     0

Region- and language-specific 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:

SQL
SELECT wordFROM (VALUES ('apfel'), ('zebra'), ('äpfel'), ('birne')) AS t(word)ORDER BY word COLLATE DE;
 word
-------
 apfel
 äpfel
 birne
 zebra

ORDER BY ALL Examples​

Order from left to right (by planet, then by kind, then by moons) in ascending order:

SQL
SELECT *FROM planetsORDER BY ALL;
 planet  | kind        | moons
---------+-------------+-------
 Jupiter | gas giant   |    95
 Mars    | terrestrial |     2
 Mercury | terrestrial |     0
 Neptune | ice giant   |    14

Order from left to right (by planet, then by kind, then by moons) in descending order:

SQL
SELECT *FROM planetsORDER BY ALL DESC;
 planet  | kind        | moons
---------+-------------+-------
 Neptune | ice giant   |    14
 Mercury | terrestrial |     0
 Mars    | terrestrial |     2
 Jupiter | gas giant   |    95

Syntax​

Syntax