SQL ORDER BY: сортировка результатов запроса
Урок 2.6 · Время чтения: ~6 мин · Задачи для практики ↓
Предложение ORDER BY в SQL сортирует строки результата запроса по одному или нескольким столбцам или выражениям. В этом уроке вы изучите сортировку по возрастанию и убыванию, сортировку по нескольким столбцам, по выражениям и псевдонимам, а также узнаете, как упорядочиваются NULL-значения.
У таблицы нет встроенного порядка строк. Без ORDER BY база данных возвращает строки в том порядке, который удобнее ей самой, и от запуска к запуску он может меняться. Если порядок важен - для отчёта, топ-списка или хронологического журнала, - его нужно запросить явно.
Предложение 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, где псевдонимы использовать нельзя.