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 BE использует оператор класса B-дерева по умолчанию для типа данных выражения, чтобы определить порядок сортировки для ASC
и DESC
. Как правило, типы данных настраиваются таким образом, чтобы операторы <
и >
соответствовали этому порядку сортировки, но разработчик пользовательского типа данных может выбрать другой подход.