Сортировка по выражениям и псевдонимам
Узнайте, где в ORDER BY допустимы ссылки на псевдонимы и как сортировать по вычисляемой логике.
«Сортировка по выражениям и псевдонимам» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
ORDER BY гибче, чем Вы думаете
Удивительно большое число кандидатов считает, что ORDER BY может обращаться только к обычным столбцам. На самом деле сортировать можно по выражениям, псевдонимам, позициям столбцов и логике CASE.
Интервьюеры используют это, чтобы проверить понимание логического порядка выполнения запроса: ORDER BY выполняется после SELECT, поэтому псевдонимы работают здесь, но не работают в WHERE.
Почему псевдонимы допустимы в ORDER BY
Вспомните логический порядок выполнения: FROM, WHERE, GROUP BY, HAVING, SELECT, затем ORDER BY. Поскольку SELECT выполняется раньше ORDER BY, псевдонимы столбцов, определённые в SELECT, уже существуют в момент вычисления ORDER BY.
Именно поэтому псевдоним работает в ORDER BY, но не работает в WHERE — это точная причина, которую интервьюеры любят связывать с порядком выполнения.
SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY annual_pay DESC;Сортировка по исходному выражению
Вместо псевдонима можно повторить полное выражение в ORDER BY. Оба варианта допустимы и дают одинаковый результат.
Использовать псевдоним проще и не приходится дублировать логику, но некоторые команды предпочитают явное выражение для большей ясности. На собеседовании приемлем любой вариант, если Вы можете его обосновать.
SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY salary * 12 DESC;Сортировка по позиции столбца (порядковому номеру)
Можно сортировать по порядковой позиции элемента списка выборки: ORDER BY 2 сортирует по второму выбранному столбцу. Это кратко, но ненадёжно: перестановка списка SELECT незаметно меняет сортировку.
Совет для собеседования: знайте, что такая возможность существует, но обычно в рабочем коде её не рекомендуют из соображений читаемости и безопасности.
SELECT name, hire_date
FROM employees
ORDER BY 2 DESC;Сортировка по вычисляемому CASE
Мощный шаблон — сортировка по выражению CASE, задающая пользовательский порядок, не совпадающий с алфавитным. Здесь мы выводим сначала сотрудников с высокой зарплатой, используя вычисляемый приоритет.
CASE формирует ранг сортировки, у которого нет отдельного столбца; СУБД вычисляет его исключительно для упорядочивания.
SELECT name, salary
FROM employees
ORDER BY CASE WHEN salary >= 100000 THEN 0 ELSE 1 END,
salary DESC;Пользовательский порядок категорий
Столбцы со статусами редко имеют разумный алфавитный порядок. Значения «активен, ожидает, закрыт» по алфавиту располагаются как «активен, закрыт, ожидает», что неверно. CASE сопоставляет каждому значению заданный вручную ранг.
Это частое требование к отчётам и удобный способ показать, что Вы умеете управлять порядком не только с помощью естественной сортировки.
SELECT id, status
FROM orders
ORDER BY CASE status
WHEN 'active' THEN 1
WHEN 'pending' THEN 2
WHEN 'closed' THEN 3
ELSE 4
END;Сортировка по результату функции
В ORDER BY можно использовать любую скалярную функцию. Например, выполняйте сортировку без учёта регистра с помощью LOWER, по длине строки или по части даты.
Обратите внимание: оборачивание столбца в функцию при сортировке может помешать СУБД использовать индекс этого столбца — так же, как в WHERE.
SELECT name
FROM employees
ORDER BY LOWER(name) ASC;Псевдонимы и агрегаты в запросах с GROUP BY
В сгруппированном запросе часто требуется сортировать по агрегату. В ORDER BY можно обратиться к псевдониму агрегата, опять же потому, что SELECT выполняется первым.
Приведённый ниже запрос подсчитывает заказы каждого клиента и сортирует результат по этому количеству в порядке убывания, используя псевдоним order_count.
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;Подводный камень совпадения имени псевдонима
Любимый интервьерами крайний случай: что, если псевдоним имеет то же имя, что и реальный столбец? Большинство СУБД разрешает одиночное имя в ORDER BY сначала как псевдоним из списка выборки, что может привести к неожиданностям.
Если задать псевдоним salary * 2 AS salary, а затем написать ORDER BY salary, сортировка будет выполняться по удвоенному значению, а не по исходному столбцу. Не используйте имена столбцов повторно в качестве псевдонимов, чтобы избежать такой неоднозначности.
SELECT salary * 2 AS salary
FROM employees
ORDER BY salary;Сочетание выражений и направлений сортировки
В одном предложении можно сочетать всё это: выражение, затем псевдоним, затем обычный столбец — каждый со своим направлением сортировки. В примере сначала выполняется сортировка по вычисляемому уровню бонуса в порядке убывания, а затем по имени в порядке возрастания как по дополнительному ключу.
Такое объединение ключей — основа запросов для реальных отчётов.
SELECT name, salary,
salary * 0.1 AS bonus
FROM employees
ORDER BY bonus DESC, name ASC;Оговорки о переносимости
Хотя выражения и псевдонимы в ORDER BY поддерживаются большинством СУБД, на собеседованиях стоит помнить о нескольких моментах:
- Порядковые позиции (
ORDER BY 2) предусмотрены стандартом, но не рекомендуются. - Видимость псевдонимов в
ORDER BYединообразна в основных СУБД, в отличие отWHERE/HAVING. SELECT DISTINCTнакладывает ограничение: сортировать с помощьюORDER BYможно только по выражениям, присутствующим в списке выборки.
Быстрая проверка
Свяжите видимость псевдонимов с порядком выполнения.
Итоги
Сортировка по выражениям и псевдонимам:
ORDER BYпринимает псевдонимы, исходные выражения, функции, логикуCASEи порядковые позиции.- Псевдонимы работают, потому что в логическом порядке
ORDER BYвыполняется послеSELECT. - Используйте
CASEдля особого порядка категорий. - Избегайте имён псевдонимов, совпадающих с реальными столбцами, чтобы не допустить неоднозначности.
- Функции в ключе сортировки могут помешать использованию индекса.
Изучай Coding Interview Prep с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 90
- Уроки
- 360
Часто задаваемые вопросы
Урок «Сортировка по выражениям и псевдонимам» бесплатный?
Да — полный текст урока «Сортировка по выражениям и псевдонимам» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Сортировка по выражениям и псевдонимам»?
Узнайте, где в ORDER BY допустимы ссылки на псевдонимы и как сортировать по вычисляемой логике. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Сортировка по выражениям и псевдонимам»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка по нескольким столбцам и размещение NULL
- LIMIT, OFFSET и FETCH FIRST
- Надёжное получение первых N строк
- Сортировка по выражениям и псевдонимам