Выражение 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 | +-------------+-----------+
В шведском алфавите буква
å
идет в конце, а в английских правилах коллации она идет в начале. Отсюда мы получаем разницу в порядке сортировки.