Сортировка возвращаемого результата

Результат может быть гораздо более полезным если добавить возможность упорядочивания или сортировки информации. Информация может сортироваться по алфавиту, по численному порядку, хронологическому порядку, в режиме по возрастанию или убыванию. Более того данные можно отсортировать используя комбинацию столбцов и можно использовать столбцы которые не возвращаются запросом. Сортировка результата обычно происходи после того как результат команды SELECT готов. Параметры сортировки не влияют на данные в результате, они влияют лишь на то как результат отобразится. Одни и теже строки могут быть получены как в результате запроса с сортировкой, так и в результате запроса без сортировки. Сортировка результата обеспечивается предикатом ORDER BY

 

Предикат ORDER BY

 

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

SELECT *|{[DISTINCT] column|expression [alias],…}

FROM table

[WHERE condition(s)]

[ORDER BY {col(s)|expr|numeric_pos} [ASC|DESC] [NULLS FIRST|LAST]];

 

Сортировка по возрастанию или убыванию

 

Сортировка по возрастанию более естественна для большинства типов данных и поэтому используется по умолчанию в команде ORDER BY. Сортировка по возрастанию для чисел значит от меньшего к большему, для даты – от более старой к более новой и символьные данные сортируются по в зависимости от позиции символа в алфавите. Первая часть предиката ORDER BY значит что результат может сортироваться по одному или нескольким столбцам или выражениям

ORDER BT col(s)|expr

Предположим что нам нужен отчёт в котором должны быть указаны фамилия сотрудника, дата приёма на работу и зарплата. Данные должны быть отсортированы по алфавиту и включать только торговых представителей и менеджеров по маркетингу. Такой запрос можно получить выполнив

 

select last_name, hire_date, salary from employees

where job_id in (‘SA_REP’,’MK_MAN’)

order by last_name desc nulls last;

 

Выбранные данные можно сортировать используя любые столбцы таблицы в секции FROM, включая столбцы которые не перечислены в списке SELECT. Добавляя ключевое слово DESC к столбцу или выражению в секции ORDER BY строки сортируются по убыванию. Параметр NULLS  LAST указывает, что если в строках результата присутствуют значения NULL то строки со значением NULL будут отображены в конце результата, после всех других отсортированных значений. Для указания сортировки таким образом чтобы значения NULL были вначале – используется ключевое слово NULL FIRST. Также данные можно сортировать основываясь на выражениях, как показано в следующем примере

 

select last_name, salary, hire_date, sysdate-hire_date tenure

from employees order by tenure;

 

Наименьшее значение TENURE отображается первым в результате, так как ORDER BY указывает БД отсортировать результат используя псевдоним. Обратите внимание, что результат можно сортировать по выражению без псевдонима, но использование псевдонима делает запрос более читабельным.

По умолчанию используются следующие параметры ORDER BY.  Самым важным является то, что если явно не задать режим DESC  — предполагается сортировка по возрастанию. Если в результате есть значения NULL то по умолчанию используется NULLS LAST при сортировке ASC и NULLS FIRST при сортировке DESC. Если не указать директиву ORDER BY в запросе, то одинаковый запрос может вернуть одинаковые данные, но в разном порядке, таким образом нельзя строить предположения о порядке возвращаемых данных без указания порядка сортировки.

 

Сортировка по позиции

 

В Oracle доступен альтернативный,более короткий метод указания столбца или выражения для сортировки. Вместо указания имени столбца используется его позиция в списке SELECT. Рассмотрим пример

select last_name, hire_date, salary from employees order by 2;

 

В ORDER BY директиве указано число 2. Это эквивалентно указанию поля HIRE_DATE, так как второй столбец в списке SELECT является столбцом HIRE_DATE. Сортировка по позиции доступна только для столбцов которые указаны в списке столбцов команды SELECT.

 

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

 

Результат может быть отсортирован по нескольким столбцам используя составную сортировку. Несколько столбцов могут быть указаны (неважно по имени или по позиции) как составной ключ сортировки, путём перечисления их в секции ORDER BY через запятую. Для выборки JOB_ID, LAST_NAME, SALARY и HIRE_DATE из таблицы EMPLOYEES и сортировки данных по убыванию в зависимости от значения столбца JO_ID, затем по возрастанию по LAST_NAME и наконец по убыванию зарплаты можно выполнить запрос такого вида

 

select job_id, last_name, salary, hire_date from employees

where job_id in (‘SA_REP’,’MK_MAN’) order by job_id desc nulls last, last_name, 3 desc;

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