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

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

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

MySQL
SELECT поля_таблиц FROM список_таблиц
ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]];

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

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

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

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

MySQL
SELECT поля_таблиц FROM список_таблиц
ORDER BY столбец_1 [ASC | DESC], столбец_2 [ASC | DESC];

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

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

ORDER BY столбец_1, столбец_2 DESC
не то же самое, что
ORDER BY столбец_1 DESC, столбец_2 DESC

Примеры использования

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

MySQL
SELECT name FROM Company
ORDER BY name;

Сортировка строковых данных осуществляется в лексикографическом (алфавитном) порядке.

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

MySQL
SELECT * FROM Trip
ORDER BY time_out, time_in DESC;

В данном примере в начале отсортировывается информация по времени вылета. Затем там, где время вылета совпадает, отсортировывается по времени прилёта.

Выведем все данные о покупках, совершенных Headley Quincey, отсортировав их в порядке убывания стоимости товаров:

1. Сначала нужно узнать идентификатор Headley Quincey в таблице FamilyMembers:

MySQL
SELECT member_id from FamilyMembers
WHERE member_name = 'Headley Quincey';

2. Выведем все данные о покупках, совершенных Headley Quincey, из таблицы Payments:

MySQL
SELECT * FROM Payments
WHERE family_member = (
    SELECT member_id from FamilyMembers
    WHERE member_name = 'Headley Quincey'
);

3. Отсортируем получившиеся данные в порядке убывания стоимости товара:

MySQL
SELECT * FROM Payments
WHERE family_member = (
    SELECT member_id from FamilyMembers
    WHERE member_name = 'Headley Quincey'
) ORDER BY unit_price DESC;

Задания для самопроверки

Условный оператор WHERE
Группировка, агрегатные функции