ORDER BY
Сортировка результатов запроса
Теория
ORDER BY нужен, когда вы хотите получить предсказуемый результат. Например:
• показать работников с самой высокой зарплатой вверху;
• отсортировать товары по цене от меньшей к большей;
• вывести последние заказы первыми;
• внутри каждого города отсортировать пользователей по дате регистрации.
Сортировка бывает двух типов:
• ASC — по возрастанию (это значение по умолчанию);
• DESC — по убыванию.
Сортировать можно и по нескольким столбцам. В этом случае получается многоуровневая сортировка: сначала по первому столбцу, а если значения первого столбца одинаковые — по второму внутри групп одинаковых значений первого.
Синтаксис
SELECT column1, column2, ...
FROM table_name
ORDER BY sort_column [ASC|DESC];
SQL
Если нужно отсортировать в порядке убывания, пишите после столбца ключевое слово DESC. Например, для зарплаты это обычно означает: самые большие значения будут первыми.
Можно указать несколько столбцов через запятую. Тогда сортировка идёт по шагам:
• сначала по первому столбцу;
• при одинаковых значениях первого столбца — по второму;
• затем по третьему, если он есть.
В ORDER BY можно использовать:
• псевдоним, который вы сами задали в этом же SELECT через AS, например price * 2 AS double_price, а затем ORDER BY double_price DESC;
• порядковый номер столбца в выдаче, например ORDER BY 3 DESC отсортирует результат по столбцу, который находится на третьей позиции в SELECT.
Чтобы не было путаницы с реальными столбцами таблицы, задавайте псевдонимам понятные и уникальные имена. И помните: псевдонимы удобны для сортировки, но в других частях запроса они доступны не всегда.
В PostgreSQL важно помнить и про NULL. NULL - это неопределенное значение (тема с NULL будет разобрана подробно в следующих темах). Их поведение в сортировке можно явно контролировать через NULLS FIRST или NULLS LAST, чтобы порядок не удивлял.
Примеры
1. Работники по зарплате: от большей к меньшей
🔄 Попробуйте изменить запрос:
- • Поменяйте DESC на ASC и сравните порядок
- • Добавьте в выборку position
2. Товары: сначала категория, внутри категории — цена
🔄 Попробуйте изменить запрос:
- • Поменяйте второй столбец в сортировке на price ASC
- • Добавьте третий столбец: product_name ASC
3. Заказы по дате: новые выше, старые ниже
🔄 Попробуйте изменить запрос:
- • Добавьте второй столбец в сортировку: user_id ASC
- • Попробуйте сортировку по возрастанию даты: order_date ASC
4. Пользователи по городу и дате регистрации
🔄 Попробуйте изменить запрос:
- • Поменяйте порядок столбцов: сначала registration_date, потом city
5. Сортировка по вычисляемому выражению
🔄 Попробуйте изменить запрос:
- • Поменяйте сортировку на double_price ASC
- • Замените ORDER BY double_price DESC на ORDER BY 3 DESC и сравните результат
6. Демонстрация NULLS FIRST и NULLS LAST
🔄 Попробуйте изменить запрос:
- • Замените на NULLS FIRST и сравните результат
- • Уберите NULLS FIRST или NULLS LAST и проверьте поведение по умолчанию и поведение с DESC
Типичные ошибки
Надеются на «естественный» порядок без ORDER BY
Без явной сортировки СУБД не обязана возвращать строки в стабильной последовательности. Сегодня порядок один, после изменений в данных может стать другим.
Путают направление сортировки
ASC — по возрастанию, DESC — по убыванию. Если направление не указано, используется по умолчанию ASC.
Неверно понимают многоуровневую сортировку
В запросе ORDER BY city, registration_date DESC второй столбец сортировки применяется только внутри одинаковых city. Это не «две независимые сортировки».
Забывают про одинаковые значения и «скачущий» порядок
Если у нескольких строк есть одинаковые значения столбца сортировки, их взаимный порядок не гарантирован. Для стабильности добавляйте второй столбец сортировки, например ORDER BY salary DESC, worker_id ASC.
Не управляют положением NULL
Чтобы получить нужный результат, явно задавайте NULLS FIRST или NULLS LAST, особенно в отчетах.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал: