Sql

Order by postgresql: PostgreSQL : Документация: 9.6: 7.5. Сортировка строк : Компания Postgres Professional

PostgreSQL : Документация: 9.6: 7.5. Сортировка строк : Компания Postgres Professional

RU
EN
RU EN

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

Порядок сортировки определяет предложение 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] На деле PostgreSQL определяет порядок сортировки для ASC и DESC по классу оператора B-дерева по умолчанию для типа данных выражения. Обычно типы данных создаются так, что этому порядку соответствуют операторы < и

>, но возможно разработать собственный тип данных, который будет вести себя по-другому.

PostgreSQL: Документация: 15: 7.5. Сортировка строк (ORDER BY)

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

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

ВЫБЕРИТЕ   select_list  
    ОТ   table_expression  
    ORDER BY  
sort_expression1
[ASC | DESC] [НУЛИ { ПЕРВЫЙ | ПРОШЛОЙ }] [ sort_expression2 [ASC | DESC] [НУЛИ { ПЕРВЫЙ | ПРОШЛОЙ }] ...]

Выражение(я) сортировки может быть любым выражением, которое допустимо в списке выбора запроса. Пример:

SELECT a, b FROM table1 ORDER BY a + b, c;
 

Если указано более одного выражения, более поздние значения используются для сортировки строк, которые равны в соответствии с более ранними значениями. За каждым выражением может следовать необязательное ключевое слово ASC или DESC , чтобы установить направление сортировки по возрастанию или по убыванию. Порядок ASC используется по умолчанию. В порядке возрастания сначала помещаются меньшие значения, где «меньшее» определяется оператором < . Точно так же порядок убывания определяется с помощью >

оператор. [6]

Параметры NULLS FIRST и NULLS LAST можно использовать для определения того, появляются ли пустые значения до или после ненулевых значений в порядке сортировки. По умолчанию нулевые значения сортируются так, как если бы они были больше любого ненулевого значения; то есть 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 также может быть меткой столбца или номером выходного столбца, например:

ВЫБЕРИТЕ сумму a + b AS, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;

оба сортируются по первому выходному столбцу. Обратите внимание, что имя выходного столбца должно быть самостоятельным, то есть его нельзя использовать в выражении — например, это 9.0009 вместо правильно:

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- неправильный
 

Это ограничение сделано для уменьшения неоднозначности. Неопределенность сохраняется, если элемент ORDER BY представляет собой простое имя, которое может соответствовать либо имени выходного столбца, либо столбцу из табличного выражения. Выходной столбец используется в таких случаях. Это может вызвать путаницу только в том случае, если вы используете AS для переименования выходного столбца в соответствии с именем какого-либо другого столбца таблицы.

ORDER BY может применяться к результату комбинации UNION , INTERSECT или EXCEPT , но в этом случае разрешена сортировка только по именам или номерам выходных столбцов, а не по выражениям.



[6] Фактически, PostgreSQL использует класс операторов B-дерева по умолчанию для типа данных выражения, чтобы определить порядок сортировки для ASC и DESC . Традиционно типы данных будут настроены так, чтобы 9Операторы 0005 < и > соответствуют этому порядку сортировки, но разработчик пользовательского типа данных может сделать что-то другое.

PostgreSQL: пункт ORDER BY


В этом руководстве по PostgreSQL объясняется, как использовать пункт PostgreSQL ORDER BY с синтаксисом и примерами.

Описание

Предложение PostgreSQL ORDER BY используется для сортировки записей в результирующем наборе. Предложение ORDER BY можно использовать только в операторах SELECT.

Синтаксис

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

 SELECT выражения
ИЗ столов
[ГДЕ условия]
ORDER BY выражение [ASC | DESC | Оператор USING] [NULLS FIRST | ПОСЛЕДНИЕ НУЛИ]; 

Параметры или аргументы

выражения
Столбцы или вычисления, которые вы хотите получить.
столы
Таблицы, из которых вы хотите извлечь записи. В предложении FROM должна быть хотя бы одна таблица.
ГДЕ условия
Дополнительно. Условия, которые должны быть соблюдены для выбора записей.
АСЦ
Дополнительно. Он сортирует результирующий набор в порядке возрастания по выражению (по умолчанию, если не указан модификатор).
DESC
Дополнительно. Он сортирует результирующий набор в порядке убывания по выражению .
НУЛИ ПЕРВЫМИ
Дополнительно. Если указано, все значения NULL сортируются перед значениями, отличными от NULL, в результирующем наборе.
НУЛИ ПОСЛЕДНИЕ
Дополнительно. Если указано, все значения NULL сортируются после значений, отличных от NULL, в результирующем наборе.

Примечание

  • Если модификатор ASC или DESC не указан в предложении ORDER BY, результаты будут отсортированы по выражению в порядке возрастания. Это эквивалентно выражению ORDER BY ASC .

Пример — сортировка без использования атрибута ASC/DESC

Предложение PostgreSQL ORDER BY можно использовать без указания модификатора ASC или DESC. Когда этот атрибут опущен в предложении ORDER BY, порядок сортировки по умолчанию устанавливается в ASC или в порядке возрастания.

Например:

 ВЫБЕРИТЕ фамилию, имя
ОТ контакты
ГДЕ государство = 'Калифорния'
ЗАКАЗАТЬ ПО фамилии; 

Этот пример PostgreSQL ORDER BY вернет все записи, отсортированные по полю last_name в порядке возрастания, и будет эквивалентен следующему предложению ORDER BY:

 SELECT last_name, first_name
ОТ контакты
ГДЕ государство = 'Калифорния'
ЗАКАЗАТЬ ПО фамилии ASC; 

Большинство программистов опускают атрибут ASC при сортировке по возрастанию.

Пример — сортировка по убыванию

При сортировке набора результатов по убыванию вы используете атрибут DESC в предложении ORDER BY следующим образом:

 SELECT last_name, first_name, city
ОТ контакты
ГДЕ first_name = 'Джо'
ORDER BY last_name DESC; 

Этот пример PostgreSQL ORDER BY возвращает все записи, отсортированные по полю last_name в порядке убывания.

Пример — сортировка по относительному положению

Вы также можете использовать предложение PostgreSQL ORDER BY для сортировки по относительному положению (порядковому положению) в наборе результатов, где первое поле в наборе результатов — 1. Следующее поле — 2, и так далее.

Например:

 ВЫБЕРИТЕ фамилию, имя, город
ОТ контакты
ГДЕ first_name = 'Джейн'
ЗАКАЗАТЬ ПО 3 DESC; 

Этот PostgreSQL ORDER BY вернет все записи, отсортированные по полю city в порядке убывания, поскольку поле city находится в позиции #3 в результирующем наборе и будет эквивалентно следующему предложению ORDER BY:

 SELECT фамилия, имя, город
ОТ контакты
ГДЕ first_name = 'Джейн'
ORDER BY last_name DESC; 

Пример — использование атрибутов ASC и DESC

При сортировке результирующего набора с помощью предложения PostgreSQL ORDER BY можно использовать атрибуты ASC и DESC в одном операторе SELECT.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *