Выражение ORDER BY

Выражение ORDER BY является модификатором вывода. Логически оно применяется в самом конце запроса (непосредственно перед LIMIT, если оно присутствует). Выражение ORDER BY сортирует строки по критериям сортировки в порядке возрастания или убывания. Кроме того, в каждом выражении ORDER BY можно указать, следует ли перемещать значения NULL в начало или в конец.

Выражение ORDER BY может содержать одно или несколько выражений, разделенных запятыми. Если выражений нет, то будет выдана ошибка. Выражения могут начинаться либо с произвольного скалярного выражения (которое может быть именем столбца), либо с номера позиции столбца (где индексация начинается с 1), либо с ключевого слова ALL. За каждым выражением может следовать модификатор порядка (ASC или DESC, по умолчанию — ASC), и/или модификатор порядка NULL (NULLS FIRST или NULLS LAST, по умолчанию — NULLS LAST).

ORDER BY ALL

Ключевое слово ALL указывает, что вывод должен быть отсортирован по каждому столбцу в порядке слева направо. Направление сортировки может быть изменено с помощью ORDER BY ALL ASC или ORDER BY ALL DESC и/или NULLS FIRST или NULLS LAST. Обратите внимание, что ALL не может использоваться в сочетании с другими выражениями в выражении ORDER BY — оно должно быть само по себе.

Модификатор порядка значений NULL

По умолчанию сортировка производится с параметрами ASC и NULLS LAST, то есть значения сортируются в порядке возрастания, а значения NULL располагаются последними. Это идентично порядку сортировки по умолчанию в PostgreSQL. Порядок сортировки по умолчанию можно изменить с помощью следующих параметров конфигурации.

Используйте параметр default_null_order, чтобы изменить порядок сортировки по умолчанию NULL на один из следующих вариантов:

  • NULLS_FIRST

  • NULLS_LAST

  • NULLS_FIRST_ON_ASC_LAST_ON_DESC

  • NULLS_LAST_ON_ASC_FIRST_ON_DESC:

Например:

SET default_null_order = 'NULLS_FIRST';

Используйте параметр default_order, чтобы изменить направление сортировки по умолчанию на один из следующих вариантов:

  • DESC

  • ASC

Например:

SET default_order = 'DESC';

Коллации (схемы сопоставления)

Текст по умолчанию сортируется с использованием коллации двоичного сравнения. Это означает, что значения сортируются по их двоичным представлениям в UTF-8. Хотя это хорошо работает для ASCII-текста (например, для данных на английском языке), порядок сортировки может быть неправильным для других языков. Для этой цели предусмотрены коллации.

Синтаксис

SELECT ...
FROM ...
ORDER BY orderItem [ , orderItem , ... ]
[ ... ]

где:

orderItem ::= { <column_alias> | <position> | <expr> }
    [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]

Параметры

  • <column_alias>
    Псевдоним столбца, заданный в списке SELECT.


  • <position>
    Позиция выражения в списке SELECT.


  • <expr>
    Любое выражение, заданное на таблицах в текущей области видимости.


  • { ASC | DESC }
    Опционально возвращает значения ключа сортировки в порядке возрастания (от наименьшего к наибольшему) или убывания (от наибольшего к наименьшему).
    По умолчанию: ASC


  • NULLS { FIRST | LAST }
    Опционально указывает, возвращаются ли значения NULL до/после значений, отличных от NULL, в зависимости от порядка сортировки (ASC или DESC).
    По умолчанию: зависит от порядка сортировки (ASC или DESC), см. Модификатор порядка значений NULL.

Примеры

  • Выведем дни недели, упорядоченные по их названию, используя порядок сортировки по умолчанию и стандартный порядок для значений NULL:

    SELECT *
    FROM weekdays
    ORDER BY name;
    +--------+-----------+
    | number |    name   |
    +--------+-----------+
    | 5      | Friday    |
    +--------+-----------+
    | 1      | Monday    |
    +--------+-----------+
    | 6      | Saturday  |
    +--------+-----------+
    | 7      | Sunday    |
    +--------+-----------+
    | 4      | Thursday  |
    +--------+-----------+
    | 2      | Tuesday   |
    +--------+-----------+
    | 3      | Wednesday |
    +--------+-----------+
    | 8      | null      |
    +--------+-----------+
  • Выведем дни недели, упорядоченные по их названию в порядке убывания со значениями NULL в начале:

    SELECT *
    FROM weekdays
    ORDER BY name DESC NULLS FIRST;
    +--------+-----------+
    | number |    name   |
    +--------+-----------+
    | 8      | null      |
    +--------+-----------+
    | 3      | Wednesday |
    +--------+-----------+
    | 2      | Tuesday   |
    +--------+-----------+
    | 4      | Thursday  |
    +--------+-----------+
    | 7      | Sunday    |
    +--------+-----------+
    | 6      | Saturday  |
    +--------+-----------+
    | 1      | Monday    |
    +--------+-----------+
    | 5      | Friday    |
    +--------+-----------+
  • Теперь рассмотрим ситуацию, при которой в нашей таблице дни недели пронумерованы начиная с воскресенья (как делается в некоторых календарных системах). Чтобы привести ее к привычному виду, упорядочим дни недели сначала по типу (weekend или нет), а затем по номеру:

    SELECT *
    FROM weekdays
    ORDER BY weekend, number;
    +--------+-----------+---------+
    | number |    name   | weekend |
    +--------+-----------+---------+
    | 2      | Monday    | false   |
    +--------+-----------+---------+
    | 3      | Tuesday   | false   |
    +--------+-----------+---------+
    | 4      | Wednesday | false   |
    +--------+-----------+---------+
    | 5      | Thursday  | false   |
    +--------+-----------+---------+
    | 6      | Friday    | false   |
    +--------+-----------+---------+
    | 1      | Sunday    | true    |
    +--------+-----------+---------+
    | 7      | Saturday  | true    |
    +--------+-----------+---------+
  • Покажем разницу в сортировке с использованием разных коллаций. Возьмем названия двух финских городов в их шведском и финском вариантах и упорядочим их по их шведским названиям, используя сначала правила коллации для английского:

    SELECT *
    FROM finnish_cities
    ORDER BY swed_name COLLATE EN
    +-------------+-----------+
    |  swed_name  |  fin_name |
    +-------------+-----------+
    | Åbo         | Turku     |
    +-------------+-----------+
    | Helsingfors | Helsinki  |
    +-------------+-----------+

    Теперь сделаем то же самое, но используем правила коллации для шведского:

    SELECT *
    FROM finnish_cities
    ORDER BY swed_name COLLATE SV
    +-------------+-----------+
    |  swed_name  |  fin_name |
    +-------------+-----------+
    | Helsingfors | Helsinki  |
    +-------------+-----------+
    | Åbo         | Turku     |
    +-------------+-----------+

    В шведском алфавите буква å идет в конце, а в английских правилах коллации она идет в начале. Отсюда мы получаем разницу в порядке сортировки.