7.5. Сортировка строк (ORDER BY)#
7.5. Сортировка строк (ORDER BY
) #
После того, как запрос выдал таблицу (после обработки списка выборки), ее можно дополнительно отсортировать. Если сортировка не определена, строки будут возвращены в произвольном порядке. Фактический порядок в этом случае будет зависеть от типов планов сканирования и соединения, а также порядка на диске, но на него нельзя полагаться. Определенный порядок вывода может быть гарантирован только в случае явного указания сортировки.
Предложение ORDER BY
определяет порядок сортировки:
SELECTselect_list
FROMtable_expression
ORDER BYsort_expression1
[ASC | DESC] [NULLS { FIRST | LAST }] [,sort_expression2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
Выражение сортировки может быть любым выражением, допустимым в списке выборке запроса. Пример:
SELECT a, b FROM table1 ORDER BY a + b, c;
Когда указывается несколько выражений, последние значения используются для сортировки строк, которые совпадают по предыдущим значениям. Каждое выражение может быть сопровождено необязательным ключевым словом ASC
или DESC
, чтобы установить сортировку соответственно по возрастанию или убыванию. Порядок ASC
является значением по умолчанию. Порядок по возрастанию сначала идут меньшие значения, где “меньшее” определяется с помощью оператора <
. Аналогично, порядок по убыванию определяется с помощью оператора >
.
[6]
Опции NULLS FIRST
и NULLS LAST
можно использовать чтобы определить, появляются ли значения NULL перед или после ненулевых значений в порядке сортировки. По умолчанию значения NULL сортируются так, как если бы они были больше любого ненулевого значения; то есть NULLS FIRST
является значением по умолчанию для порядка DESC
, а в противном случае - NULLS LAST
.
Обратите внимание, что опции сортировки рассматриваются независимо для каждого столбца сортировки. Например, ORDER BY x, y DESC
означает ORDER BY x ASC, y DESC
, что не то же самое, что ORDER BY x DESC, y DESC
.
A sort_expression
может также быть меткой столбца или номером выходного столбца, как в:
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
оба из которых сортируются по первому столбцу вывода. Обратите внимание, что имя столбца вывода должно быть самостоятельным, то есть его нельзя использовать в выражении - например, это неправильно:
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Это ограничение введено для уменьшения неоднозначности. Однако, остается неоднозначность, если элемент ORDER BY
является простым именем, которое может соответствовать как имени выходного столбца, так и столбцу из выражения таблицы. В таких случаях используется выходной столбец. Это может вызвать путаницу только в том случае, если вы используете AS
для переименования выходного столбца, так чтобы он совпадал с именем другого столбца таблицы.
ORDER BY
может быть применен к результату комбинации UNION
, INTERSECT
или EXCEPT
, но в этом случае разрешена только сортировка по именам или номерам выходных столбцов, а не по выражениям.
[6]
На самом деле, Tantor SE-1C использует оператор класса B-дерева по умолчанию для типа данных выражения, чтобы определить порядок сортировки для ASC
и DESC
. Как правило, типы данных настраиваются таким образом, чтобы операторы <
и >
соответствовали этому порядку сортировки, но разработчик пользовательского типа данных может выбрать другой подход.