Kiedy pracujesz z bazami danych, często chcesz widzieć jakiś porządek w danych. Na przykład:
- "Pokaż mi top-10 najdroższych produktów."
- "Jakie zamówienia były ostatnie?"
- "Jaki jest wiek uczniów, zaczynając od najmłodszych?"
Chęć uporządkowania danych jest całkiem naturalna: nawet jeśli jesteś mega ogarniętym programistą, przeglądanie chaotycznego zbioru wierszy nie jest najprzyjemniejsze. Właśnie dlatego SQL daje nam narzędzie do sortowania wierszy w zwracanym wyniku — operator ORDER BY.
Podstawy sortowania z ORDER BY
ORDER BY — to taka magiczna różdżka, która pozwala uporządkować wiersze w wyniku. Bez niej dane zwracane są w "losowej" kolejności (to nie jest błąd bazy, po prostu kolejność nie jest gwarantowana).
Tak wygląda składnia ORDER BY:
SELECT kolumna1, kolumna2
FROM tabela
ORDER BY kolumna1 DESC;
kolumna1: nazwa kolumny, po której chcesz sortować.ASC: sortowanie rosnąco (to domyślna wartość, więc możesz ją pominąć).DESC: sortowanie malejąco.
Przykład
Załóżmy, że mamy tabelę students:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
Posortujmy studentów po wieku (rosnąco):
SELECT name, age
FROM students
ORDER BY age ASC;
Wynik:
| name | age |
|---|---|
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
Jeśli zmienisz kierunek sortowania na malejący:
SELECT name, age
FROM students
ORDER BY age DESC;
Wynik będzie taki:
| name | age |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
Sortowanie po kilku kolumnach
Czasem jedna kolumna do sortowania to za mało. Wyobraź sobie, że w bazie jest kilku studentów w tym samym wieku i chcesz dodać dodatkowe uporządkowanie, np. po imieniu.
Sortowanie po kilku kolumnach:
SELECT kolumna1, kolumna2
FROM tabela
ORDER BY kolumna1 DESC, kolumna2 ASC;
Przykład dla poniższej tabeli:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
| 4 | Anna | 19 |
Zapytanie:
SELECT name, age
FROM students
ORDER BY age ASC, name ASC;
Wynik:
| name | age |
|---|---|
| Anna | 19 |
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
Najpierw sortujemy po wieku (rosnąco), a w ramach tego samego wieku — po imieniu alfabetycznie.
Sortowanie z aliasami
Jeśli używasz aliasów (pseudonimów) dla kolumn, możesz też sortować po tych aliasach.
SELECT name AS "Imię", age AS "Wiek"
FROM students
ORDER BY "Wiek" DESC;
Wynik:
| Imię | Wiek |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
Dlaczego to ważne? Bo kiedyś tego nie było i były problemy z sortowaniem po wyliczanych kolumnach.
Sortowanie z wyliczanymi kolumnami
SQL pozwala robić obliczenia bezpośrednio w zapytaniu, a potem sortować po wynikach tych obliczeń.
Przykład 1. Najprostsze obliczenie
SELECT name, age, age * 2 AS doubled_age
FROM students
ORDER BY doubled_age DESC;
Wynik:
| name | age | doubled_age |
|---|---|---|
| Alex | 22 | 44 |
| Otto | 21 | 42 |
| Maria | 19 | 38 |
Przykład 2. Użycie funkcji Załóżmy, że trzymamy ceny produktów w tabeli products:
| product_name | price |
|---|---|
| Produkt A | 100 |
| Produkt B | 200 |
| Produkt C | 150 |
A teraz sortujemy po zaokrąglonej cenie, pomnożonej przez 0.9 (np. z uwzględnieniem zniżki). Funkcja ROUND zwraca liczbę zaokrągloną do wybranego miejsca po przecinku.
SELECT product_name, price, ROUND(price * 0.9, 1) AS discounted_price
FROM products
ORDER BY discounted_price ASC;
Oto wynik:
| product_name | price | discounted_price |
|---|---|---|
| Produkt A | 100 | 90 |
| Produkt C | 150 | 135 |
| Produkt B | 200 | 180 |
Praktyczne zastosowanie sortowania
Sortowanie gra kluczową rolę w takich sytuacjach:
- Tworzenie raportów, np. top-10 najlepszych sprzedaży w miesiącu.
- Wyświetlanie danych w interfejsach użytkownika, np. lista zamówień posortowana po dacie.
- Generowanie list do analityki, np. wyodrębnianie grup według priorytetu.
Typowe błędy przy użyciu ORDER BY
Błędy mogą czaić się na każdym kroku. Oto kilka rzeczy, na które warto uważać:
- Jeśli próbujesz sortować po kolumnie, która nie istnieje, dostaniesz błąd:
column "not_a_column" does not exist. - Sortowanie po aliasie, który jest używany w wyliczanej kolumnie, może być mylące, jeśli alias jest zadany na wyższym poziomie.
- Jeśli przypadkiem zapomnisz podać kierunek sortowania, PostgreSQL domyślnie użyje
ASC. To nie jest błąd, ale może dać nieoczekiwane wyniki.
Teraz już wiesz, jak ogarniać sortowanie w PostgreSQL za pomocą ORDER BY. Pamiętaj, że dobrze uporządkowane dane to połowa sukcesu przy pisaniu efektywnych zapytań SQL. Lecimy do następnego tematu! 😉
GO TO FULL VERSION