Сортировка результатов SQL запроса с помощью оператора ORDER BY
Введение
В работе любого аналитика, часто бывают задачи, где нужно вывести данные в определенном порядке. По умолчанию, данные в результате SQL запроса не отсортированы, их положение зависит от порядка соединения таблиц и расположения данных на диске.
Например, вы оцениваете несколько продуктов и, вашему стейкхолдеру (заказчику) важно понимать какой продукт приносит наибольшую прибыль. На небольшом количестве данных это можно оценить визуально, но если таких продуктов более 100, то это становится настоящей проблемой. Конечно, это можно сделать в экселе, скопировав туда значения и, выполнив сортировку в нужном порядке. Но как быть когда вас просят вывести только 30 наиболее прибыльных продуктов из 100?
Для этого необходимо использовать сортировку данных прямо внутри SQL-запроса. Чтобы отсортировать данные необходимо использовать оператор ORDER BY.
Оператор ORDER BY
ORDER BY, в переводе с английского, означает «сортировать по». Сортировать данные можно по любому полю, по любому типу данных и в любом направлении. Для этого используются ключевые слова:
- ASC (от английского ascending - по возрастанию);
- DESC (от английского descending - по убыванию).
Таким образом, синтаксис запроса выглядит следующим образом:
В большинстве СУБД вы можете не указывать ASC, так как оно используется по умолчанию. В этом случае, запрос будет выглядеть как:
Сортировка по возрастанию и убыванию
Сортировка данных позволяет расположить строки таблицы в указанном порядке по выбранному столбцу:
Сортировка по нескольким полям
На примерах выше, мы видели, что при сортировке одинаковых значений мы получаем случайное положение строк внутри одной группы. Чтобы это исправить, применяется сортировка по нескольким столбцам. Она может быть как однонаправленная:
Так и разнонаправленная:
Полей может быть и больше. Все зависит от ваших потребностей. Однако, стоит понимать, что сортировка утяжеляет запрос, поэтому не рекомендуется применять ее без необходимости.
Использование ORDER BY в оконных функциях
Оконная функция это функция, которая работает с выделенным набором строк, объединенных партицией, но есть оконные функции, которые не нуждаются в партиции, а используют только оператор ORDER BY.
Пример такой оконной функции служит ROW_NUMBER(), которую часто используют для поиска более сложного упорядочивания строк внутри партиции или без нее. Она имеет следующий вид:
Оптимизация использования ORDER BY
Любой запрос который вы делаете в SQL имеет свою последовательность исполнения команд. Выглядит он следующим образом:
- FROM
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT
Как мы видим, ORDER BY находится в самом конце списка, что позволяет нам оптимизировать его использование.
Давайте рассмотрим три примера:
Если исполнить все три запроса, то мы получим одинаковый вид сортировки и одинаковый итоговый вид выведенных данных. Эта особенность ORDER BY позволяет нам не использовать оригинальные названия столбцов, вместо этого указывая элиас (псевдоним, который мы присвоили столбцу) или порядковый номер столбца.
Примеры
Давайте посмотрим несколько примеров сортировки реальных данных. Это позволит лучше понять как сортировка помогает отразить данные. В качестве примера мы возьмем небольшую таблицу, которая по умолчанию не имеет сортировки и выглядит вот так:
Для вывода данных я воспользовался запросом:
Сортировка по алфавиту
Сортировка по алфавиту позволит нам сделать выведенную информацию более удобной для восприятия. Для этого достаточно добавить ORDER BY в конце запроса и указать столбец PRODUCT:
Сортировка по дате
Теперь давайте отсортируем по дате – в нашем случае по месяцу.
На выходе мы получим следующий результат:
Сортировка по нескольким полям
Данный результат не удобен для чтения поэтому я предлагаю сделать сортировку по двум полям - по продукту и по месяцу.
В итоге мы получим следующий результат:
Именно в таком виде результат становится удобным для восприятия.
Отличие ORDER BY и GROUP BY
Аналитики, которые только начинают свой путь и знакомятся с SQL могут путать ORDER BY (“сортировать по”) и GROUP BY (“группировать по”). Однако эти две команды абсолютно разные. GROUP BY используется только при применении в запросе агрегирующих функций, таких как SUM, MAX, MIN, COUNT и AVG. При этом, использование одного оператора не исключает использование другого. Для примера давайте напишем команду, которая покажет сумму платежей по менеджерам и отсортируем ее по убыванию платежей:
После выполнения кода мы получим следующий результат:
Заключение
В заключение хочется сказать, что оператор ORDER BY может стать мощным вспомогательным инструментом в вашей работе. Его применение позволит вам выдавать более качественный результат в удобном для вас и заказчиков виде.