🚀 Начался ноябрь! SQLtest.online остаётся бесплатным благодаря донатам таких людей, как вы. Помогите собрать сумму этого месяца пораньше, чтобы сайт работал без перебоев. Поддержать сейчас →
SQL код скопирован в буфер обмена

SQL ORDER BY: сортировка результатов запроса

Урок 2.6 · Время чтения: ~6 мин · Задачи для практики ↓

Предложение ORDER BY в SQL сортирует строки результата запроса по одному или нескольким столбцам или выражениям. В этом уроке вы изучите сортировку по возрастанию и убыванию, сортировку по нескольким столбцам, по выражениям и псевдонимам, а также узнаете, как упорядочиваются NULL-значения.

У таблицы нет встроенного порядка строк. Без ORDER BY база данных возвращает строки в том порядке, который удобнее ей самой, и от запуска к запуску он может меняться. Если порядок важен - для отчёта, топ-списка или хронологического журнала, - его нужно запросить явно.

SQL ORDER BY: сортировка по возрастанию и убыванию, сортировка по нескольким столбцам, где совпадения упорядочивает следующий столбец, и место NULL-значений

Предложение ORDER BY

ORDER BY записывается в конце оператора SELECT и перечисляет ключи сортировки.

Базовый синтаксис

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
  • ASC сортирует по возрастанию: от меньшего к большему, от A до Z, от ранних дат к поздним. Это порядок по умолчанию.
  • DESC сортирует по убыванию.

Сортировка по одному столбцу

SELECT first_name, last_name
FROM actor
ORDER BY last_name;

Результат: все актёры в алфавитном порядке фамилий.

Чтобы изменить порядок на обратный, добавьте DESC:

SELECT title, length
FROM film
ORDER BY length DESC;

Результат: фильмы от самого длинного к самому короткому.


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

Когда у первого ключа сортировки значения совпадают, база данных упорядочивает такие строки по второму ключу, затем по третьему и так далее:

SELECT first_name, last_name
FROM actor
ORDER BY last_name, first_name;

Результат: актёры отсортированы по фамилии, а актёры с одинаковой фамилией - по имени.

У каждого столбца своё направление. ASC или DESC относится только к столбцу, после которого записано:

SELECT title, rating, length
FROM film
ORDER BY rating, length DESC;

Результат: фильмы сгруппированы по рейтингу; внутри каждого рейтинга первыми идут самые длинные.


Сортировка по выражениям

Сортировать можно не только по хранимому столбцу, но и по вычисленному значению. Выражение вычисляется для каждой строки, и строки сортируются по результату:

SELECT title, rental_rate, rental_duration
FROM film
ORDER BY rental_rate * rental_duration DESC;

Результат: фильмы, отсортированные по стоимости аренды на весь срок, самые дорогие - первыми.

Ключом сортировки может быть и сравнение. Это удобно, чтобы поднять определённые строки наверх:

SELECT title, rating
FROM film
ORDER BY rating = 'G' DESC, title;

Результат: фильмы с рейтингом G наверху, затем все остальные; каждая группа отсортирована по названию.

В MySQL и MariaDB сравнение возвращает 1 или 0, поэтому DESC ставит подходящие строки первыми. Не каждая СУБД умеет сортировать по сравнению; переносимый способ использует CASE, который вы изучите в уроке 3.5.


Сортировка по псевдонимам и номерам столбцов

ORDER BY обрабатывается после SELECT, поэтому в нём можно использовать заданные там псевдонимы:

SELECT title, rental_rate * rental_duration AS full_rental_cost
FROM film
ORDER BY full_rental_cost DESC;

Можно также сортировать по номеру столбца в списке SELECT:

SELECT first_name, last_name
FROM actor
ORDER BY 2, 1;

Результат: актёры отсортированы по второму столбцу (last_name), затем по первому (first_name).

Сортировка по номеру удобна в быстрых запросах, но незаметно ломается, когда кто-то меняет список столбцов. В сохраняемых запросах используйте имена или псевдонимы.


Сортировка и NULL-значения

NULL означает «нет значения», поэтому база данных должна решить, куда ставить такие строки. В MySQL, MariaDB и SQL Server значения NULL при сортировке по возрастанию идут первыми, а по убыванию - последними. В PostgreSQL и Oracle - наоборот.

SELECT rental_id, rental_date, return_date
FROM rental
ORDER BY return_date
LIMIT 10;

Результат: в MySQL первыми идут аренды, по которым фильм ещё не вернули (return_date равен NULL).


Ключевые выводы:

  • Без ORDER BY порядок строк в результате не гарантирован.
  • ASC (по умолчанию) сортирует по возрастанию, DESC - по убыванию.
  • При нескольких ключах сортировки каждый следующий упорядочивает строки, равные по предыдущему.
  • ASC и DESC применяются к каждому столбцу отдельно.
  • Сортировать можно по выражениям, псевдонимам и номерам столбцов; имена и псевдонимы надёжнее номеров.
  • Место NULL-значений зависит от СУБД.

Часто задаваемые вопросы

Какой порядок сортировки в SQL по умолчанию?

По возрастанию (ASC). ORDER BY last_name и ORDER BY last_name ASC возвращают одинаковый результат.

Как отсортировать по нескольким столбцам в разных направлениях?

Укажите направление после каждого столбца: ORDER BY rating ASC, length DESC. Направление относится только к столбцу, после которого записано.

Можно ли использовать псевдоним столбца в ORDER BY?

Да. ORDER BY обрабатывается после SELECT, поэтому псевдонимы из списка SELECT в нём доступны. В этом отличие от WHERE, где псевдонимы использовать нельзя.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

  1. Какое направление сортировки в ORDER BY по умолчанию?
  2. Упорядоченный список фильмов
  3. Упорядоченный список языков
  4. Получить список клиентов
  5. Получить данные аэропортов