Сортировка строк

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. Сортировка по возрастанию помещает меньшие значения вначале, где "меньшее" определяется согласно оператору <. Точно также, сортировка по убыванию определяется оператором >. [1]

Для указания порядка следования значений NULL при сортировке, могут быть использованы опции 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.

Для обратной совместимости с версией стандарта SQL92, в выражении_сортировки могут быть метка или номер колонки в выводе:

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, но в этому случае допускается только сортировка по именам или номерам выходных колонок, а не по выражениям.

Notes

[1]

Фактически, PostgreSQL использует класс оператора B-tree по умолчанию для типа данных указанного выражения сортировки, чтобы определить порядок сортировки при использовании ASC и DESC. По соглашению, типы данных установливаются так, чтобы операторы < и > отвечали порядку сортировки, но разработчик пользовательского типа данных может выбрать что-либо другое.

Back to top

(С) Виктор Вислобоков, 2008-2023