Сортировка по нескольким столбцам и размещение NULL
Смешивание ASC и DESC и различия NULLS FIRST и NULLS LAST в разных базах данных.
«Сортировка по нескольким столбцам и размещение NULL» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.
Почему сортировка появляется на собеседованиях
На собеседованиях рано или поздно спрашивают о ORDER BY, потому что это показывает, понимаете ли вы: результирующий набор данных по умолчанию не упорядочен. Без явной сортировки база данных вправе вернуть строки в любом удобном для неё порядке.
Распространённая формулировка: «Как гарантировать, что строки вернутся в определённом порядке?» Единственный правильный ответ — явное предложение ORDER BY. Полагаться на порядок вставки, порядок первичного ключа или порядок индекса — классическая ошибка начинающего специалиста.
В этом уроке вы освоите сортировку по нескольким столбцам и разберёте непростой вопрос о том, куда попадают значения NULL.
Основы ASC и DESC
ORDER BY по умолчанию сортирует по возрастанию (ASC). Чтобы изменить направление на обратное, нужен DESC. Направление задаётся для каждого столбца отдельно, а не для всего предложения.
Совет для собеседования: укажите, что ASC является неявным значением по умолчанию, поэтому его необязательно писать. Многие кандидаты ошибочно считают, что один DESC меняет направление сортировки всех столбцов.
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;Сортировка по нескольким столбцам
Перечислите несколько столбцов через запятую. SQL сортирует сначала по первому столбцу, затем разрешает совпадения по второму и так далее. Представляйте это как цепочку дополнительных критериев.
В примере сначала выполняется сортировка по отделу в алфавитном порядке, а внутри каждого отдела — по зарплате от большей к меньшей.
- Основная сортировка:
departmentпо возрастанию - Дополнительный критерий:
salaryпо убыванию
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;Сочетание ASC и DESC
Частая ловушка на собеседовании: каждый столбец получает собственное направление. Запись ORDER BY a, b DESC сортирует a по возрастанию, а b по убыванию, а не оба столбца по убыванию.
Если нужно отсортировать оба столбца по убыванию, необходимо написать ORDER BY a DESC, b DESC. Если в вопросе направления различаются, указывайте их явно.
SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;Куда попадают NULL
Это центральная тема урока. NULL означает неизвестное значение, поэтому стандарт не задаёт для него определённую позицию, а СУБД используют разные значения по умолчанию:
- PostgreSQL & Оракл: значения NULL располагаются в конце при
ASCи в начале приDESC. - MySQL & сервер SQL: значения NULL располагаются в начале при
ASCи в конце приDESC(рассматриваются как наименьшее значение).
На собеседованиях любят спрашивать: «Куда попадут значения NULL при такой сортировке?» Честный ответ: это зависит от движка, если не задать порядок явно.
Явное управление расположением NULL
Чтобы расположение не зависело от значений по умолчанию в конкретном движке, используйте NULLS FIRST или NULLS LAST. PostgreSQL, Оракл и Сиклайт поддерживают этот синтаксис напрямую.
Запрос ниже принудительно помещает неизвестные даты приёма на работу в конец, хотя столбец сортируется по возрастанию.
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;Эмуляция NULLS LAST в MySQL
MySQL не поддерживает ключевое слово NULLS LAST. Переносимое решение — добавить первым ключом сортировки признак того, является ли значение NULL.
Выражение hire_date IS NULL возвращает 0 для настоящих дат и 1 для значений NULL. Сортировка по нему по возрастанию перемещает значения NULL в конец, после чего второй ключ сортирует настоящие даты.
SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;Эмуляция NULLS FIRST в сервере SQL
В сервере SQL также нет NULLS FIRST/LAST. Используйте выражение CASE как первый ключ сортировки. Здесь значения NULL получают ранг 0 и поэтому оказываются в начале.
Этот шаблон стоит запомнить: вычисляемый столбец-признак, помещённый перед настоящим столбцом сортировки, даёт полный контроль над расположением NULL в любом диалекте.
SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
hire_date ASC;Разбор примера: таблица лидеров
Представим, что вы создаёте таблицу лидеров: сначала идут игроки с наибольшим результатом, а при одинаковых результатах выше оказывается тот, кто раньше зарегистрировался. Игроки, которые ни разу не набрали очков (результат NULL), должны находиться внизу.
Для сортировки нужны три ключа: признак NULL, результат по убыванию и дата регистрации по возрастанию как дополнительный критерий.
SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
score DESC,
signup_date ASC;Оговорка о стабильности сортировки
Ещё один любимый вопрос: «Если две строки совпадают по каждому ключу ORDER BY, в каком порядке они вернутся?»
Ответ: порядок не определён. SQL-сортировки не обязаны быть стабильными, поэтому одинаковые строки могут появиться в любом взаимном порядке, который также может измениться между запусками или после изменения индекса.
Исправление — добавить полностью уникальный дополнительный критерий, обычно первичный ключ, чтобы результат был воспроизводимым.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;О производительности сортировки
Сортировка может быть затратной. Если ORDER BY соответствует существующему индексу с тем же порядком столбцов и направлениями, движок может прочитать строки уже отсортированными и пропустить отдельный этап сортировки.
Несовпадающие направления (например, индекс полностью отсортирован по возрастанию, а один столбец сортируется по убыванию) обычно лишают эту возможность, заставляя выполнять сортировку в памяти или на диске. Упоминание связи между порядком в индексе и стоимостью сортировки показывает собеседнику зрелое понимание темы.
Быстрая проверка
Проверьте понимание правил направления при сортировке по нескольким столбцам.
Итоги
Основные выводы о сортировке по нескольким столбцам и расположении NULL:
- Результирующие наборы не упорядочены, если не добавить
ORDER BY. - Направление задаётся для каждого столбца отдельно;
ASCиспользуется по умолчанию. - Расположение NULL зависит от движка: в конце при ASC для PostgreSQL и Оракл, в начале при ASC для MySQL и сервера SQL.
- Используйте
NULLS FIRST/LASTтам, где это поддерживается, а в остальных случаях — ведущий признакIS NULLилиCASE. - Добавляйте уникальный дополнительный критерий (например, первичный ключ), чтобы порядок был воспроизводимым.
Часто задаваемые вопросы
Урок «Сортировка по нескольким столбцам и размещение NULL» бесплатный?
Да — полный текст урока «Сортировка по нескольким столбцам и размещение NULL» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Сортировка по нескольким столбцам и размещение NULL»?
Смешивание ASC и DESC и различия NULLS FIRST и NULLS LAST в разных базах данных. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Interview Prep?
Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Сортировка по нескольким столбцам и размещение NULL»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Interview Prep?
Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка по нескольким столбцам и размещение NULL
- LIMIT, OFFSET и FETCH FIRST
- Надёжное получение первых N строк
- Сортировка по выражениям и псевдонимам