Зарегистрируйтесь, чтобы продолжить обучение

Сортировка результатов Аналитика на SQL

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

В этом уроке мы обсудим, как сортировать данные с помощью оператора ORDER BY.

Базовый синтаксис

Синтаксис сортировки данных в SQL с использованием оператора ORDER BY выглядит так:

SELECT <названия_колонок>
FROM <таблица>
ORDER BY <название_колонки1> [ASC|DESC], <название_колонки2> [ASC|DESC], ...

Рассмотрим его подробнее:

  • <названия_колонок> — список столбцов, которые мы хотим выбрать
  • <таблица> — название таблицы, из которой мы выбираем данные
  • <название_колонки1>, <название_колонки2>, ... — столбцы, по которым мы хотим отсортировать данные
  • [ASC|DESC] — необязательная опция, которая указывает направление сортировки

Обсудим последнюю опцию. С ее помощью мы задаем направление сортировки, используя ключевые слова:

  • ASC — сортировка по возрастанию (от меньшего к большему, от более ранних дат к более поздним)
  • DESC— сортировка в обратную сторону, то есть по убыванию

Когда мы используем оператор ORDER BY без указания направления сортировки, по умолчанию используется ASC.

Возьмем нашу базу продаж и отсортируем список продуктов по убыванию цены:

SELECT
    product_name,
    price
FROM products
ORDER BY price DESC;

В этом примере мы выбираем столбцы product_name и price из таблицы products, а затем сортируем результаты по столбцу price в порядке убывания. Таким образом, мы получим список продуктов от дорогих к дешевым:

Untitled

Также мы можем сортировать данные по нескольким столбцам. Например, отсортируем таблицу продаж по дате и количеству продаж:

SELECT
    sale_date,
    quantity
FROM sales
ORDER BY sale_date ASC, quantity DESC;

В этом примере мы выбираем столбцы sale_date и quantity из таблицы sales. Затем мы сортируем результаты сначала по столбцу sale_date в порядке возрастания, а затем — по столбцу quantity в порядке убывания. В итоге получаем список продаж, отсортированных сначала по дате, а затем — по количеству продаж:

Untitled

Мы можем указывать не только имена столбцов в операторе ORDER BY, но еще и использовать порядок сортировки столбцов. Это делается с помощью выражения ORDER BY 1, 2, ..., n, где числа соответствуют позиции столбцов в выборке.

Это удобно, когда мы работаем с большими наборами данных и хотим отсортировать результаты по нескольким столбцам. Здесь можно не прописывать имена столбцов, а просто можно перечислить их позиции. Так удобнее и читать запрос, и писать его.

Возьмем для примера следующий запрос:

SELECT
    product_name,
    category,
    price
FROM products
ORDER BY 3 DESC, 2 ASC;

В ответ на него мы получим такой результат:

Untitled

Здесь мы указываем позиции двух столбцов:

  • 3 для сортировки по столбцу price
  • 2 для сортировки по столбцу category

Такой подход позволяет нам сократить код и сделать его более лаконичным.

Обработка нулевых значений

При работе с оператором ORDER BY нужно не забывать про NULL-значения — с ними есть несколько тонкостей.

В языке SQL нет единого стандарта как сортировать данные с NULL, и каждый провайдер, авторы базы данных, решает сам. Поэтому положение NULL-значений может отличаться в разных БД. Например, в MySQL NULL будут впереди при сортировке по возрастанию, тогда как в PostreSQL в самом конце.

Потому, если ваши данные содержат NULL, то важно явно указывать, где должны располагаться значения NULL в результирующем наборе данных. Для этого можно пользоваться двумя расширениями:

  • NULLS LAST — оно указывает, что значения NULL должны быть в конце результата. Обычно его используют при сортировке по возрастанию
  • NULLS FIRST — оно указывает, что значения NULL должны быть в начале результата. Его используют в сортировке по убыванию

Оба расширения помогают убрать значения NULL, чтобы они не влияли на порядок вывода ненулевых значений.

Предположим, у нас есть таблица customers с информацией о клиентах. В ней есть столбцы customer_id, customer_name и age. Создадим новую таблицу с NULL-значениями в столбце age:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    customer_name VARCHAR(255),
    age INT
);


INSERT INTO customers (customer_id, customer_name, age) VALUES
(1, 'John', 30),
(2, 'Jane', NULL),
(3, 'Mike', 40),
(4, 'Sarah', NULL),
(5, 'David', 25);

Выведем данные с помощью такого запроса:

SELECT * FROM customers;

Новая таблица будет выглядеть так:

Untitled

Теперь попробуем убрать нулевые значения в начало или конец списка.

Отсортируем по возрастанию с расширением NULLS LAST:

SELECT
    customer_id,
    customer_name,
    age
FROM customers
ORDER BY age ASC NULLS LAST;

Результат будет следующим:

Untitled

Как видим, значения NULL отображаются в конце результата после всех ненулевых значений.

Похожим образом работает сортировка по убыванию с расширением NULLS FIRST:

SELECT
    customer_id,
    customer_name,
    age
FROM customers
ORDER BY age DESC NULLS FIRST;

Получаем:

Untitled

Здесь значения NULL отображаются в начале результата перед всеми ненулевыми значениями.

Как видите, расширения NULLS LAST и NULLS FIRST позволяют контролировать положение значений NULL и адаптировать результаты запроса так, чтобы нам было удобно работать с результатами.

Сортировка с агрегацией

Кроме того, сортировку данных можно сочетать с агрегатными функциями — COUNT, SUM и AVG. Таким образом, можно найти самые частые или самые редкие повторяющиеся значения в столбце. Например, можно найти самый популярный продукт или клиента с наибольшим количеством заказов.

Например, отсортируем продукты по количеству продаж:

SELECT
    product_id,
    SUM(quantity) AS total_sales
FROM sales
GROUP BY product_id
ORDER BY total_sales DESC;

Получаем таблицу:

Untitled

Разберемся, что происходит в этом коде:

  1. SELECT product_id, SUM(quantity) AS total_sales — выбираем столбец product_id, вычисляем сумму продаж для каждого уникального product_id и задаем псевдоним total_sales для результирующего столбца с суммой продаж
  2. FROM sales — указываем, что данные берутся из таблицы sales
  3. GROUP BY product_id — группируем данные по уникальным значениям столбца product_id. Это означает, что в результате мы увидим product_id — отдельную строку для каждого уникального значения
  4. ORDER BY total_sales DESC — сортируем результаты по столбцу total_sales в порядке убывания от большего к меньшему

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

Сортировка с оператором LIMIT

Кроме того, мы можем отсортировать данные одновременно с ограничением размера выборки. В этом помогает оператор LIMIT. Это полезно, когда мы хотим вывести несколько значений из начала или конца результирующего набора.

Для примера выберем из нашей базы пять продуктов с самой высокой ценой:

SELECT
    product_name,
    price
FROM products
ORDER BY price DESC
LIMIT 5;

Здесь мы сортируем данные по столбцу price в обратном порядке (DESC). Затем мы используем оператор LIMIT и ограничиваем выборку пятью первыми результатами:

Untitled

Это очень удобно при работе с большими объемами данных — можно вывести не все соответствующие результаты, а только значимые для анализа.

Выводы

В этом уроке мы изучили сортировку данных. Она помогает структурировать информацию, выделять значимые значения, определять тенденции и принимать обоснованные решения на основе анализа данных. Подведем краткие итоги этого урока:

  • Данные сортируются с помощью оператора ORDER BY, который позволяет управлять порядком вывода результатов запроса
  • Синтаксис оператора ORDER BY включает список столбцов, по которым мы хотим отсортировать данные
  • По умолчанию сортировка происходит по возрастанию (ASC), но можно и указать сортировку по убыванию (DESC)
  • Можно сортировать данные по нескольким столбцам, указывая их имена или позиции в выборке
  • Расширения NULLS LAST и NULLS FIRST помогают указать положение значений NULL в результирующем наборе
  • С помощью LIMIT можно выводить не все результаты сортировки, а ограниченное их количество — например, первые пять значений

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff