7.5. Сортировка строк
После того как запрос выдал таблицу результатов (после обработки списка выборки), её можно отсортировать. Если сортировка не задана, строки возвращаются в неопределённом порядке. Фактический порядок строк в этом случае будет зависеть от плана соединения и сканирования, а также от порядка данных на диске, поэтому полагаться на него нельзя. Определённый порядок выводимых строк гарантируется, только если этап сортировки задан явно.
Порядок сортировки определяет предложение ORDER BY
:
SELECTсписок_выборки
FROMтабличное_выражение
ORDER BYвыражение_сортировки1
[ASC | DESC] [NULLS { FIRST | LAST }] [,выражение_сортировки2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
Выражениями сортировки могут быть любые выражения, допустимые в списке выборки запроса. Например:
SELECT a, b FROM table1 ORDER BY a + b, c;
Когда указывается несколько выражений, последующие значения позволяют отсортировать строки, в которых совпали все предыдущие значения. Каждое выражение можно дополнить ключевыми словами ASC
или DESC
, которые выбирают сортировку соответственно по возрастанию или убыванию. По умолчанию принят порядок по возрастанию (ASC
). При сортировке по возрастанию сначала идут меньшие значения, где понятие «меньше» определяется оператором <
. Подобным образом, сортировка по возрастанию определяется оператором >
. [5]
Для определения места значений NULL можно использовать указания NULLS FIRST
и NULLS LAST
, которые помещают значения NULL соответственно до или после значений не NULL. По умолчанию значения NULL считаются больше любых других, то есть подразумевается NULLS FIRST
для порядка DESC
и NULLS LAST
в противном случае.
Заметьте, что порядки сортировки определяются независимо для каждого столбца. Например, ORDER BY x, y DESC
означает ORDER BY x ASC, y DESC
, и это не то же самое, что ORDER BY x DESC, y DESC
.
Здесь выражение_сортировки
может быть меткой столбца или номером выводимого столбца, как в данном примере:
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; -- неправильно
Это ограничение позволяет уменьшить неоднозначность. Тем не менее неоднозначность возможна, когда в ORDER BY
указано простое имя, но оно соответствует и имени выходного столбца, и столбцу из табличного выражения. В этом случае используется выходной столбец. Эта ситуация может возникнуть, только когда с помощью AS
выходному столбцу назначается то же имя, что имеет столбец в другой таблице.
ORDER BY
можно применить к результату комбинации UNION
, INTERSECT
и EXCEPT
, но в этом случае возможна сортировка только по номерам или именам столбцов, но не по выражениям.
[5] На деле Postgres Pro определяет порядок сортировки для ASC
и DESC
по классу оператора B-дерева по умолчанию для типа данных выражения. Обычно типы данных создаются так, что этому порядку соответствуют операторы <
и >
, но возможно разработать собственный тип данных, который будет вести себя по-другому.