Документация по PostgreSQL 9.1.1 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 7. Запросы | Fast Forward | Next |
После того как запрос выдал итоговую результирующую таблицу (после обработки списка выбора), эта таблица по желанию может быть отсортирована. Если сортировка не задана, строки выдаются в несортированном виде. Фактически, сортировка в этом случае будет зависеть от плана сканирования и объединения и порядка расположения на диске, но вы не должны доверять этим соображениям. Определённый порядок вывода может быть гарантирован только, если явно задана и выполнена сортировка.
Предложение 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, но в этому случае допускается только сортировка по именам или номерам выходных колонок, а не по выражениям.
[1] | Фактически, PostgreSQL использует класс оператора B-tree по умолчанию для типа данных указанного выражения сортировки, чтобы определить порядок сортировки при использовании ASC и DESC. По соглашению, типы данных установливаются так, чтобы операторы < и > отвечали порядку сортировки, но разработчик пользовательского типа данных может выбрать что-либо другое. |