Czytaj książkę: «ORDER BY и LIMIT в SQL. 18 задач на сортировку»
Перед первой задачей
Почему сортировка — это не косметика
ORDER BY часто воспринимают как украшение отчёта, но на самом деле он меняет то, какие строки попадут в топ, какую страницу увидит менеджер и какой заказ будет считаться последним.
LIMIT без понятной сортировки почти всегда опасен: база может вернуть любые первые строки, и отчёт будет выглядеть стабильным только случайно.
В этой книге каждая задача показывает маленькую рабочую ситуацию, где порядок строк влияет на решение: кого проверить, что продвигать, какой товар считать лидером.
Как проверять себя
Перед запуском запроса выпишите вручную ключ сортировки для каждой строки: сумма, дата, приоритет, вычисленная маржа или номер страницы.
Если у двух строк одинаковый главный ключ, проверьте вторичный ORDER BY. Именно он делает результат воспроизводимым, а не зависящим от внутреннего порядка базы.
Все запросы рассчитаны на SQLite. Приёмы ORDER BY, LIMIT, OFFSET, CASE и сортировки выражений полезны почти в любой SQL-системе.
Маршрут по задачам
1. Показать заказы от самого крупного
2. Добавить вторичную сортировку
3. Взять топ-3 товара по выручке
4. Получить вторую страницу каталога
5. Сортировать по сумме строки заказа
6. Сортировать статусы по приоритету
7. Поставить NULL в конец списка
8. Выбрать самый дорогой товар в категории
9. Показать последние события
10. Сортировать категории по суммарной выручке
11. Сортировать текст без учёта регистра
12. Сортировать числовые строки как числа
13. Найти товары с самым низким остатком
14. Взять топ после фильтра
15. Стабилизировать лидерборд
16. Сортировать по алиасу агрегата
17. Выбрать нижний хвост продаж
18. Собрать финальный топ по марже
Практические задачи
Задача 1. Показать заказы от самого крупного
Рабочий вопрос
Нужно вывести заказы так, чтобы менеджер сначала увидел самые дорогие покупки.
Данные
CREATE TABLE orders(id INTEGER, total INTEGER);
INSERT INTO orders VALUES (1,300),(2,900),(3,500),(4,1200);
Запрос
SELECT id, total
FROM orders
ORDER BY total DESC;
Ожидаемый результат
[[4, 1200], [2, 900], [3, 500], [1, 300]]
Почему работает
ORDER BY total DESC сортирует суммы от большей к меньшей.
Заказ 4 самый крупный, поэтому он идёт первым.
Заказ 1 самый маленький и оказывается внизу.
Где легко ошибиться
Без DESC сортировка пошла бы по возрастанию, и отчёт начал бы показывать самые маленькие заказы.
Самостоятельная проверка
Добавьте заказ на 700. Между какими строками он окажется?
Ответ: Он окажется между 900 и 500, потому что сортировка идёт по убыванию total.