![]() |
![]() |
![]() |
Сортировка записей Как упоминалось в главе 3, записи хранятся в таблицах в произвольном порядке. Более того, даже повторное выполнение запроса никоим образом не гарантирует одинакового порядка следования возвращаемых записей. Однако упорядочение данных играет важную роль при выборке, поэтому в SQL поддерживается инструкция ORDER BY, являющаяся гибким средством сортировки итогового гонораpa. Секции ORDER BY передается список полей, разделенный запятыми (или выражений, в которых используются поля). Переданный список задает критерий сортировки. Для каждого критерия сортировки могут дополнительно указываться ключевые слова ASC, DESC и USING, управляющие типом сортировки.
В листинге 4.42 приведен пример сортировки таблицы editions с использова-[ием секции ORDER BY. Сортировка осуществляется по значению поля publ ication, [ричем в команде явно указан порядок сортировки — по возрастанию (ASC). Листинг 4.42. Использование секции ORDER BY booktown=# SELECT isbn, edition, publication booktown-# FROM editions ooktown-# 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) Листинг 4.42 показывает, что записи возвращаются в порядке возрастания, от старых дат к новым. Следует помнить, что при сортировке и выборке допускается использование полей, отсутствующих в целевом списке команды SELECT. Более того, если запрос связан с агрегированием, секция ORDER BY может содержать вызовы агрегатных функций и выражения. Возможность сортировки по разнообразным источникам обеспечивает значительную гибкость при упорядочении результатов. ВНИМАНИЕ Если синоним поля итогового набора совпадает с именем существующего поля в исходном наборе данных, из которого производится выборка, то при использовании этого имени в секции ORDER BY PostgreSQL предполагает, что имя относится к итоговому набору, а не к полю источника. Такое поведение противоречит стандартному поведению секции GROUP BY, соответствующему стандарту SQL92. При сортировке по нескольким выражениям PostgreSQL сначала упорядочивает итоговый набор по первому (левому) критерию и продолжает применять дальнейшие критерии лишь в том случае, если сортировка по первому критерию не обеспечивает однозначного результата. Пример приведен в листинге 4.43. Листинг 4.43. Секция ORDER BY с несколькими выражениями booktown=# SELECT edition, publication booktown-# FROM editions booktown-# ORDER BY edition ASC, booktown-# 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 (по убыванию). Как видно из результатов в листинге 4.43, сначала записи сортируются по номеру издания, а при совпадении номеров дальнейшая сортировка осуществляется по дате публикации — от новых к старым. Сортировка играет важную роль при использовании ключевого слова DISTINCT, упоминавшегося в подразделе «Удаление дубликатов и ключевое слово DISTINCT». Если вы хотите ограничиться просмотром последнего издания для каждого значения поля edition таблицы editions, комбинация ORDER BY и DISTINCT позволит добиться эффекта, аналогичного применению секции GROUP BY (листинг 4.44). Листинг 4.44. Использование секции DISTINCT с ORDER BY booktown=# SELECT DISTINCT ON (edition) booktown-# edition, publication booktown-# FROM editions booktown-# ORDER BY edition ASC, booktown-# publication DESC; edition | publication 1 | 1995-03-28 2 | 2001-03-01 3 | 2000-09-12 (3 rows) booktown=# SELECT edition, max(publication) booktown-# FROM editions booktown-# 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 означает сортировку по первому полю итогового набора. |
![]() |
![]() |
![]() |