Сортировка, оператор ORDER BY

При выполнении SELECT запроса, строки по умолчанию возвращаются в неопределённом порядке. Фактический порядок строк в этом случае зависит от плана соединения и сканирования, а также от порядка расположения данных на диске, поэтому полагаться на него нельзя. Для упорядочивания записей используется конструкция ORDER BY.

Общая структура запроса с оператором ORDER BY

MySQL
SELECT поля_таблиц FROM наименование_таблицы
WHERE ...
ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]]

Где ASC и DESC - направление сортировки:

  • ASC - сортировка по возрастанию (по умолчанию)
  • DESC - сортировка по убыванию

Например, выведем названия авиакомпаний в алфавитном порядке из таблицы Company:

MySQL
SELECT name FROM Company ORDER BY name;
name
Aeroflot
air_France
British_AW
Dale_avia
Don_avia

Сортировка по возрастанию и убыванию для основных типов

Тип данныхASC (по возрастанию)DESC (по убыванию)
Строковый типЛексикографический (алфавитный) порядок от «A» до «Z» (или от «А» до «Я»)

Сначала идут записи, начинающиеся на «a», затем на «b» и т.д.
Лексикографический порядок от «Z» до «A» (или от «Я» до «А»)

Сначала идут записи, начинающиеся на «z», «y» и т.д.
Числовой типОт меньшего к большемуОт большего к меньшему
Дата и времяОт более ранней даты/времени к более поздней

Например, сначала 01.01.2024, затем 01.02.2024
От более поздней даты/времени к более ранней

Например, сначала 01.02.2024, затем 01.01.2024
Булевый типFalse идёт перед TrueTrue идёт перед False

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

Для сортировки результатов по двум или более столбцам их следует указывать через запятую.

MySQL
...ORDER BY столбец_1 [ASC | DESC], столбец_2 [ASC | DESC];

Данные будут сортироваться по первому столбцу, но в случае если попадаются несколько записей с совпадающими значениями в первом столбце, то они сортируются по второму столбцу. Количество столбцов, по которым можно отсортировать, не ограничено.

Правило сортировки применяется только к тому столбцу, за которым оно следует.

ORDER BY столбец_1, столбец_2 DESC

не то же самое, что

ORDER BY столбец_1 DESC, столбец_2 DESC

Выведем информацию о полётах, отсортированную по городу вылета самолёта в порядке возрастания и по городу прибытия в аэропорт в порядке убывания, из таблицы Trip:

MySQL
SELECT DISTINCT town_from, town_to FROM Trip
ORDER BY town_from, town_to DESC;
town_fromtown_to
LondonSingapore
LondonParis
MoscowRostov
ParisRostov
RostovVladivostok
RostovParis
RostovMoscow
SingaporeLondon
VladivostokRostov

В данном примере в начале записи сортируются по полю town_from. Затем отрабатывает обратная сортировка по полю town_to для групп строк, у которых в столбце town_from одинаковое значение.

Демонстрация работы сортировки