Представьте, что вы работаете с огромной базой данных о студентах. Сортировать их только по фамилиям — это уже полезно, но представьте, что в вашей таблице есть студенты с одинаковыми фамилиями. В таком случае, чтобы сделать вывод более читаемым, можно добавить сортировку по имени. Или другой пример: вы хотите упорядочить список заказов сначала по дате, а затем по общей сумме заказа. И вот тут на помощь приходит сортировка по нескольким столбцам.
Сортировка по нескольким столбцам позволяет: 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 имеет значение: сначала сортируются данные по первому столбцу, а уже потом применяется сортировка по второму, если значения первого столбца равны.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ