Выражение 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> | <expression> }
[ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Параметры
-
<column_alias>
Псевдоним столбца, заданный в спискеSELECT.
-
<position>
Позиция выражения в спискеSELECT.
-
<expression>
Любое выражение, заданное на таблицах в текущей области видимости.
-
{ 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 | +-------------+-----------+В шведском алфавите буква
åидет в конце, а в английских правилах коллации она идет в начале. Отсюда мы получаем разницу в порядке сортировки.