JavaRush /Курсы /SQL SELF /Сортировка по нескольким столбцам: порядок сортировки и п...

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

SQL SELF
6 уровень , 2 лекция
Открыта

Представьте, что вы работаете с огромной базой данных о студентах. Сортировать их только по фамилиям — это уже полезно, но представьте, что в вашей таблице есть студенты с одинаковыми фамилиями. В таком случае, чтобы сделать вывод более читаемым, можно добавить сортировку по имени. Или другой пример: вы хотите упорядочить список заказов сначала по дате, а затем по общей сумме заказа. И вот тут на помощь приходит сортировка по нескольким столбцам.

Сортировка по нескольким столбцам позволяет: 1. Упорядочивать данные в четко определенном порядке; 2. Управлять приоритетами сортировки (сначала по одному столбцу, затем по другому); 3. Выводить данные более структурировано и в читабельном виде.

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

Чтобы сортировать данные по нескольким столбцам, используется знакомый оператор ORDER BY, но теперь мы перечисляем несколько столбцов через запятую. PostgreSQL производит сортировку сначала по первому столбцу, затем (в случае одинаковых значений) по второму, и так далее.

Вот общий синтаксис:

SELECT столбцы
FROM таблица
ORDER BY столбец1 направление1,  столбец2 направление2, ... ;

Где:

  • столбец1, столбец2, ... — это столбцы, по которым вы хотите сортировать.
  • направление1, направление2, ... — это направление сортировки (ASC — по возрастанию, DESC — по убыванию).
  • Этот параметр необязательный, по умолчанию используется ASC.

Пример 1: Сортировка студентов по фамилии, затем по имени

Представим таблицу students с данными о студентах:

id first_name last_name age
1 Anna Lin 20
2 Victor Lin 22
3 Maria Kim 21
4 Otto Lin 23
5 Anna Kim 20

Наша задача — отсортировать студентов сначала по фамилии (last_name), а затем по имени (first_name).

SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;

Результат:

id first_name last_name age
5 Anna Kim 20
3 Maria Kim 21
1 Anna Lin 20
4 Otto Lin 23
2 Victor Lin 22

Как видно, строки упорядочены сначала по фамилии (Kim, потом Lin), а затем — по имени (Anna, Maria и т.д.). Это особенно полезно, когда нужно быстро найти человека в списке или отсортировать журнал.

Пример 2: Сортировка заказов по дате и сумме

Представим таблицу orders с данными о заказах:

order_id customer_id order_date total
1 101 2025-10-01 500
2 102 2025-10-03 200
3 103 2025-10-02 300
4 104 2025-10-01 100
5 101 2025-10-03 600

Мы хотим отсортировать заказы сначала по дате order_date, а затем по сумме заказа total в порядке убывания.

SQL-запрос:

SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;

Результат:

order_id customer_id order_date total
1 101 2025-10-01 500
4 104 2025-10-01 100
3 103 2025-10-02 300
5 101 2025-10-03 600
2 102 2025-10-03 200

Как видно, заказы с одинаковыми датами также сортируются по сумме.

Работа с NULL при сортировке: NULLS FIRST и NULLS LAST

В SQL есть специальное значение - NULL, которое обозначает отсутствие значения. Подробнее как с ним работать мы поговорим через пару уровней. Однако сейчас подходящее время, чтобы показать, как им можно управлять при сортировке.

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

По умолчанию:

  • При ORDER BY ... ASC: NULL идут в конце (NULLS LAST)
  • При ORDER BY ... DESC: NULL идут в начале (NULLS FIRST)

Иногда это поведение неудобно — и вы можете управлять им явно с помощью NULLS FIRST или NULLS LAST.

Синтаксис:

ORDER BY колонка ASC NULLS FIRST
ORDER BY колонка DESC NULLS LAST

Пример: сортировка по оценкам, где NULL — "оценка ещё не выставлена"

SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;

Так мы получим сначала лучших студентов, затем слабее, а в самом конце — тех, у кого пока нет оценки (NULL).

Пример: наоборот — показать студентов без оценки первыми

Предположим, у нас есть таблица grades, где некоторые студенты ещё не получили оценку (NULL):

student_id grade
101 NULL
102 85
103 NULL
104 92
105 76

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

SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;

Результат:

student_id grade
101 NULL
103 NULL
105 76
102 85
104 92

Оператор NULLS FIRST в сочетании с ORDER BY grade ASC гарантирует, что записи с NULL окажутся в начале, а потом будут оценки по возрастанию.

Об особенностях и типичных ошибках

Новички часто забывают указать направление сортировки для каждого столбца. Если вы не указали направление, PostgreSQL по умолчанию использует ASC. Также не редкость забыть, что порядок столбцов в ORDER BY имеет значение: сначала сортируются данные по первому столбцу, а уже потом применяется сортировка по второму, если значения первого столбца равны.

2
Задача
SQL SELF, 6 уровень, 2 лекция
Недоступна
Сортировка студентов по возрасту и имени
Сортировка студентов по возрасту и имени
2
Задача
SQL SELF, 6 уровень, 2 лекция
Недоступна
Сортировка заказов по дате и идентификатору клиента
Сортировка заказов по дате и идентификатору клиента
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3535423 Уровень 7
27 января 2026
не совсем понятно, почему во второй задаче при одинаковых датах 2023-10-01 и сортировке по customer_id по DESC сначала идет меньшее значение customer_id, а не большее (101, а не 104)
Анатолий Уровень 28
23 января 2026
Ну очень мало комментариев )))
t0dzi Уровень 11
12 сентября 2025
ЙОу
апецт Уровень 44
19 января 2026
кчау
Anemon Уровень 13 Expert
6 августа 2025
🤓