7.5. Сортировка строк (ORDER BY)#

7.5. Сортировка строк (ORDER BY)

7.5. Сортировка строк (ORDER BY)

После того, как запрос выдал таблицу (после обработки списка выбора), ее можно дополнительно отсортировать. Если сортировка не выбрана, строки будут возвращены в произвольном порядке. Фактический порядок в этом случае будет зависеть от типов планов сканирования и соединения и порядка на диске, но на него нельзя полагаться. Определенный порядок вывода может быть гарантирован только в случае явного выбора сортировки.

Предложение ORDER BY определяет порядок сортировки:

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