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