Записи хранятся в таблицах в произвольном порядке. Более того, даже повторное выполнение запроса никоим образом не гарантирует одинакового порядка следования возвращаемых записей. Однако упорядочение данных играет важную роль при выборке, поэтому в SQL поддерживается инструкция ORDER BY
, являющаяся гибким средством сортировки.
Секции ORDER BY
передается список полей, разделенный запятыми (или выражений, в которых используются поля). Переданный список задает критерий сортировки. Для каждого критерия сортировки могут дополнительно указываться ключевые слова ASC
, DESC
и USING
, управляющие типом сортировки.
ASC
. Записи сортируются по возрастанию заданного критерия (то есть числа сортируются от меньших к большим, а текст – по алфавиту от “а” до “z”). Ключевое слово ASC
эквивалентно конструкции USING <
. По умолчанию выбирается именно этот способ сортировки, поэтому ASC
используется лишь для наглядности.
DESC
. Записи сортируются по убыванию заданного критерия (то есть числа сортируются от больших к меньшим, а текст – по алфавиту от “z” до “а”). Ключевое слово DESC
эквивалентно конструкции USING >
.
USING оператор
. Позволяет задать оператор сравнения полей при определении очередности записей. Особенно часто используется при нестандартных критериях сортировки.
В листинге 29 приведен пример сортировки таблицы editions
с использованием секции ORDER BY
. Сортировка осуществляется по значению поля publication
, причем в команде явно указан порядок сортировки – по возрастанию (ASC
).
booktown=# SELECT isbn, edition, publication FROM editions ORDER BY publication ASC;
Isbn | edition | publication
0760720002 | 1 | 1868-01-01
0679803335 | 1 | 1922-01-01
0694003611 | 1 | 1947-03-04
0394800753 | 1 | 1949-03-01
0394900014 | 1 | 1957-01-01
039480001X | 1 | 1957-03-01
0823015505 | 1 | 1958-01-01
0451160916 | 1 | 1981-08-01
0590445065 | 1 | 1987-03-01
0385121679 | 2 | 1993-10-01
1885418035 | 1 | 1995-03-28
0441172717 | 2 | 1998-09-01
0929605942 | 2 | 1998-12-01
044100590X | 3 | 1999-10-01
0451198492 | 3 | 1999-10-01
0451457994 | 3 | 2000-09-12
0596000855 | 2 | 2001-03-01
(17 rows)
Листинг 29 показывает, что записи возвращаются в порядке возрастания, от старых дат к новым. Следует помнить, что при сортировке и выборке допускается использование полей, отсутствующих в целевом списке команды SELECT
. Более того, если запрос связан с агрегированием, секция ORDER BY
может содержать вызовы агрегатных функций и выражения. Возможность сортировки по разнообразным источникам обеспечивает значительную гибкость при упорядочении результатов.
Внимание! Если синоним поля итогового набора совпадает с именем существующего поля в исходном наборе данных, из которого производится выборка, то при использовании этого имени в секции ORDER BY
PostgreSQL предполагает, что имя относится к итоговому набору, а не к полю источника. Такое поведение противоречит стандартному поведению секции GROUP BY
, соответствующему стандарту SQL92.
При сортировке по нескольким выражениям PostgreSQL сначала упорядочивает итоговый набор по первому (левому) критерию и продолжает применять дальнейшие критерии лишь в том случае, если сортировка по первому критерию не обеспечивает однозначного результата. Пример приведен в листинге 30.
booktown=# SELECT edition, publication FROM editions
ORDER BY edition ASC,
publication DESC;
edition | publication
1 | 1995-03-28
1 | 1987-03-01
1 | 1981-08-01
1 | 1958-01-01
1 | 1957-03-01
1 | 1957-01-01
1 | 1949-03-01
1 | 1947-03-04
1 | 1922-01-01
1 | 1868-01-01
2 | 2001-03-01
2 | 1998-12-01
2 | 1998-09-01
2 | 1993-10-01
3 | 2000-09-12
3 | 1999-10-01
3 | 1999-10-01
(17 rows)
Запрос выбирает поля edition
и publication
всех записей таблицы editions
. Затем секция ORDER BY
определяет два поля, по которым должна осуществляться сортировка результата: edition
(по возрастанию) и publication
(по убыванию).
Как видно из результатов в листинге 30, сначала записи сортируются по номеру издания, а при совпадении номеров дальнейшая сортировка осуществляется по дате публикации – от новых к старым.
Сортировка играет важную роль при использовании ключевого слова DISTINCT
, упоминавшегося в подразделе “Удаление дубликатов и ключевое слово DISTINCT
”. Если вы хотите ограничиться просмотром последнего издания для каждого значения поля edition
таблицы editions
, комбинация ORDER BY
и DISTINCT
позволит добиться эффекта, аналогичного применению секции GROUP BY
(листинг 31).
booktown=# SELECT DISTINCT ON (edition)
edition, publication
FROM editions
ORDER BY edition ASC,
publication DESC;
edition | publication
1 | 1995-03-28
2 | 2001-03-01
3 | 2000-09-12
(3 rows)
booktown=# SELECT edition, max(publication) FROM editions GROUP BY edition;
edition | max
1 | 1995-03-28
2 | 2001-03-01
3 | 2000-09-12
(3 rows)
Поскольку секция ORDER BY
обрабатывается перед удалением дубликатов ключевым словом DISTINCT
, общий эффект очень похож на вызов агрегатной функции max()
или min()
в секции GROUP BY
. Подобная методика бывает чрезвычайно эффективной, хотя все зависит от сложности агрегирования и сортировки.
Примечание. Вместо имен полей или выражений секция ORDER BY
может содержать целочисленные константы. Такие константы интерпретируются как номера позиций в целевом списке; отсчет ведется слева направо, начиная с 1. Таким образом, ORDER BY 1 ASC
означает сортировку по первому полю итогового набора.
Группировка записей | Выбор интервалов записей |