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 має значення: спочатку сортуються дані за першим стовпцем, а вже потім застосовується сортування за другим, якщо значення першого стовпця однакові.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ