CodeGym /Kursy /SQL SELF /Sortowanie po kilku kolumnach: kolejność sortowania i pri...

Sortowanie po kilku kolumnach: kolejność sortowania i priorytety

SQL SELF
Poziom 6 , Lekcja 2
Dostępny

Wyobraź sobie, że pracujesz z ogromną bazą danych o studentach. Sortowanie tylko po nazwiskach — to już coś, ale pomyśl, że w twojej tabeli są studenci z tym samym nazwiskiem. Wtedy, żeby wynik był bardziej czytelny, możesz dodać sortowanie po imieniu. Albo inny przykład: chcesz uporządkować listę zamówień najpierw po dacie, a potem po całkowitej kwocie zamówienia. I tu właśnie przydaje się sortowanie po kilku kolumnach.

Sortowanie po kilku kolumnach pozwala: 1. Uporządkować dane w dokładnie określonej kolejności; 2. Zarządzać priorytetami sortowania (najpierw po jednej kolumnie, potem po drugiej); 3. Wyświetlać dane w bardziej uporządkowany i czytelny sposób.

Składnia sortowania po kilku kolumnach

Żeby sortować dane po kilku kolumnach, używasz znanego operatora ORDER BY, ale teraz wypisujesz kilka kolumn po przecinku. PostgreSQL sortuje najpierw po pierwszej kolumnie, potem (jeśli wartości są takie same) po drugiej, i tak dalej.

Ogólna składnia wygląda tak:

SELECT kolumny
FROM tabela
ORDER BY kolumna1 kierunek1,  kolumna2 kierunek2, ... ;

Gdzie:

  • kolumna1, kolumna2, ... — to kolumny, po których chcesz sortować.
  • kierunek1, kierunek2, ... — to kierunek sortowania (ASC — rosnąco, DESC — malejąco).
  • Ten parametr jest opcjonalny, domyślnie używany jest ASC.

Przykład 1: Sortowanie studentów po nazwisku, potem po imieniu

Wyobraź sobie tabelę students z danymi o studentach:

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

Nasze zadanie — posortować studentów najpierw po nazwisku (last_name), a potem po imieniu (first_name).

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

Wynik:

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

Jak widać, wiersze są uporządkowane najpierw po nazwisku (Kim, potem Lin), a potem po imieniu (Anna, Maria itd.). To szczególnie przydatne, gdy chcesz szybko znaleźć osobę na liście albo posortować dziennik.

Przykład 2: Sortowanie zamówień po dacie i kwocie

Wyobraź sobie tabelę orders z danymi o zamówieniach:

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

Chcemy posortować zamówienia najpierw po dacie order_date, a potem po kwocie zamówienia total malejąco.

Zapytanie SQL:

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

Wynik:

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

Jak widać, zamówienia z tą samą datą są też sortowane po kwocie.

Praca z NULL przy sortowaniu: NULLS FIRST i NULLS LAST

W SQL jest specjalna wartość - NULL, która oznacza brak wartości. O tym, jak z nią pracować, pogadamy szerzej za kilka poziomów. Ale już teraz warto pokazać, jak można nią sterować przy sortowaniu.

Kiedy sortujesz kolumny, które zawierają NULL, PostgreSQL musi zdecydować, gdzie umieścić puste wartości: na początku czy na końcu.

Domyślnie:

  • Przy ORDER BY ... ASC: NULL idą na końcu (NULLS LAST)
  • Przy ORDER BY ... DESC: NULL idą na początku (NULLS FIRST)

Czasem to zachowanie jest niewygodne — i możesz nim sterować jawnie za pomocą NULLS FIRST albo NULLS LAST.

Składnia:

ORDER BY kolumna ASC NULLS FIRST
ORDER BY kolumna DESC NULLS LAST

Przykład: sortowanie po ocenach, gdzie NULL — "ocena jeszcze nie wystawiona"

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

W ten sposób najpierw dostaniesz najlepszych studentów, potem słabszych, a na samym końcu — tych, którzy jeszcze nie mają oceny (NULL).

Przykład: odwrotnie — pokazać studentów bez oceny na początku

Załóżmy, że mamy tabelę grades, gdzie niektórzy studenci jeszcze nie dostali oceny (NULL):

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

Chcemy najpierw wyświetlić studentów bez oceny, a potem resztę rosnąco po ocenach.

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

Wynik:

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

Operator NULLS FIRST razem z ORDER BY grade ASC gwarantuje, że rekordy z NULL będą na początku, a potem oceny rosnąco.

O szczegółach i typowych błędach

Początkujący często zapominają podać kierunek sortowania dla każdej kolumny. Jeśli nie podasz kierunku, PostgreSQL domyślnie użyje ASC. Często też zapomina się, że kolejność kolumn w ORDER BY ma znaczenie: najpierw dane są sortowane po pierwszej kolumnie, a dopiero potem po drugiej, jeśli wartości pierwszej są równe.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION