SQL
ORDER BY SQL: как сортировать результат запроса
ORDER BY в SQL сортирует строки в результате запроса. Без ORDER BY база данных не обязана возвращать строки в том порядке, в котором они были добавлены, поэтому для отчетов, списков и выгрузок сортировку нужно указывать явно
Простой пример:
SELECT name, price
FROM products
ORDER BY price DESC;
Запрос покажет товары от дорогих к дешевым. DESC означает сортировку по убыванию
Сортировка по возрастанию и убыванию
По умолчанию ORDER BY сортирует по возрастанию. Можно написать ASC, но часто его опускают
SELECT name, price
FROM products
ORDER BY price ASC;
Для обратного порядка используют DESC
SELECT name, price
FROM products
ORDER BY price DESC;
Для текста сортировка идет по алфавиту, для чисел — по числовому значению, для дат — от ранних к поздним или наоборот
Сортировка по нескольким столбцам
Можно сортировать по нескольким полям. Например, сначала по категории, а внутри категории по цене
SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC;
Такой запрос сгруппирует товары по категориям в алфавитном порядке, а внутри каждой категории покажет самые дорогие товары выше
Сортировка по вычисленному полю
Если в запросе есть вычисление, ему можно дать псевдоним и отсортировать результат по нему
SELECT
client_id,
SUM(amount) AS total_amount
FROM orders
GROUP BY client_id
ORDER BY total_amount DESC;
Этот запрос показывает клиентов с самой большой суммой заказов вверху
Как сортируются NULL
NULL — это отсутствие значения, и разные базы могут располагать такие строки по-разному. Где-то NULL окажется в начале, где-то в конце. В PostgreSQL можно явно написать NULLS FIRST или NULLS LAST
SELECT name, closed_at
FROM tasks
ORDER BY closed_at DESC NULLS LAST;
В SQL Server такого синтаксиса нет, и часто используют выражение через CASE, если нужно жестко управлять местом пустых значений
Мини-практика
Создайте таблицу товаров и отсортируйте результат по двум полям
CREATE TABLE products (
id INTEGER,
category TEXT,
name TEXT,
price INTEGER
);
INSERT INTO products (id, category, name, price) VALUES
(1, 'Техника', 'Монитор', 18000),
(2, 'Техника', 'Клавиатура', 2500),
(3, 'Книги', 'SQL для начинающих', 900),
(4, 'Книги', 'Справочник SQL', 1200);
SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC;
Проверьте, что категории идут по алфавиту, а внутри категории более дорогой товар стоит выше
Частые ошибки
Первая ошибка — ожидать стабильный порядок без ORDER BY. Даже если база сегодня вернула строки «как надо», завтра порядок может измениться
Вторая ошибка — сортировать числа, которые хранятся как текст. Тогда 100 может оказаться раньше 20, потому что база сравнивает строки, а не числа
Третья ошибка — забывать направление сортировки для каждого столбца. Если нужно category ASC, price DESC, оба направления лучше писать явно
Что почитать дальше по SQL
Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:
- Как вызвать функцию в PostgreSQL: SELECT, параметры и результат
- ALTER TABLE в SQL: как добавить, изменить и удалить столбец
- BETWEEN SQL: как выбрать значения в диапазоне
- CREATE TABLE SQL: как создать таблицу запросом