0Pricing
Coding Interview Prep · Урок

Сортировка по нескольким столбцам и размещение NULL

Смешивание ASC и DESC и различия NULLS FIRST и NULLS LAST в разных базах данных.

«Сортировка по нескольким столбцам и размещение NULL» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding 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) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Сортировка по нескольким столбцам и размещение NULL»?

Смешивание ASC и DESC и различия NULLS FIRST и NULLS LAST в разных базах данных. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Сортировка по нескольким столбцам и размещение NULL»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сортировка по нескольким столбцам и размещение NULL
  2. LIMIT, OFFSET и FETCH FIRST
  3. Надёжное получение первых N строк
  4. Сортировка по выражениям и псевдонимам
← Назад к Coding Interview Prep