Wróć do: Bazy danych
podstawowy SQLORDER BYsortowaniematura podstawowa z informatyki

ORDER BY – sortowanie wyników

Porządkowanie wyniku zapytania klauzulą ORDER BY – kierunek ASC i DESC oraz sortowanie po kilku kolumnach naraz.

01

Opis

Wynik zapytania nie ma z góry ustalonej kolejności. Baza zwraca wiersze w takiej, jaka jest dla niej najwygodniejsza – i ta kolejność potrafi się zmienić między jednym a drugim uruchomieniem tego samego zapytania. Jeśli kolejność ma znaczenie, trzeba ją wymusić klauzulą ORDER BY.

To ważniejsze, niż się wydaje. Jeżeli wynik wyszedł „przypadkiem" w dobrej kolejności bez ORDER BY, to jest właśnie przypadek – nie da się na nim polegać.

ORDER BY stawiamy na końcu zapytania, po WHERE. Kolejność jest logiczna: baza najpierw wybiera wiersze spełniające warunek, a dopiero potem układa to, co zostało.

Dwa kierunki sortowania. ASC (od *ascending*) porządkuje rosnąco – od najmniejszej wartości, a przy tekście od początku alfabetu. DESC (*descending*) odwrotnie: od największej, od końca alfabetu. Jeśli nie napiszesz nic, baza przyjmuje ASC – ale przy DESC słowo kluczowe jest obowiązkowe.

Sortowanie po kilku kolumnach. Po ORDER BY można wymienić kilka kolumn po przecinku. Druga kolumna rozstrzyga remisy w pierwszej, trzecia – remisy w drugiej i tak dalej. Zapis ORDER BY klasa, srednia DESC oznacza: najpierw poukładaj klasami rosnąco, a wewnątrz każdej klasy posortuj uczniów od najwyższej średniej. Zwróć uwagę, że DESC dotyczy tylko tej kolumny, przy której stoi – nie całej listy.

Sortowanie działa na tym, co zostało po filtrowaniu klauzulą WHERE, i na kolumnach wybranych w zapytaniu SELECT.

02

Zapytanie

-- Bez ORDER BY kolejność wierszy jest nieokreślona
SELECT nazwisko, srednia
FROM uczniowie
ORDER BY srednia DESC
Wynik zapytania
nazwiskosrednia
Wiśniewski5.10
Kowalska4.75
Dąbrowski4.10
Zając3.90
Nowak3.20
-- Sortowanie po dwóch kolumnach: klasa rosnąco, w niej średnia malejąco
SELECT klasa, nazwisko, srednia
FROM uczniowie
ORDER BY klasa, srednia DESC
Wynik zapytania
klasanazwiskosrednia
3AWiśniewski5.10
3AKowalska4.75
3BDąbrowski4.10
3BNowak3.20
3CZając3.90
-- ORDER BY zawsze po WHERE
SELECT nazwisko, srednia
FROM uczniowie
WHERE srednia >= 4.00
ORDER BY nazwisko
Wynik zapytania
nazwiskosrednia
Dąbrowski4.10
Kowalska4.75
Wiśniewski5.10

Na maturze

Polecenia typu „wypisz uczniów od najlepszego", „podaj listę alfabetycznie", „pierwsze pięć wyników" to zawsze sygnał, że potrzebny jest ORDER BY. Brak sortowania przy takim poleceniu to strata punktu, nawet jeśli same wiersze są poprawne.

Uważaj na kierunek. „Od najlepszego", „od największego", „malejąco" to DESC. „Alfabetycznie", „od najmniejszego", „rosnąco" to ASC, czyli w praktyce – nie trzeba nic dopisywać. Najczęstszy błąd to DESC dopisane odruchowo tam, gdzie zadanie prosiło o kolejność alfabetyczną.

Przy sortowaniu po dwóch kolumnach zwróć uwagę, że ASC/DESC odnosi się do pojedynczej kolumny, przy której stoi. Zapis ORDER BY klasa, srednia DESC nie sortuje malejąco po obu – klasa nadal idzie rosnąco.

04

Najczęściej zadawane pytania

Czy można sortować po kolumnie, której nie ma w SELECT?

W większości baz tak – SELECT nazwisko FROM uczniowie ORDER BY srednia zadziała, mimo że średnia nie jest wyświetlana. Na maturze bezpieczniej jednak dopisać taką kolumnę do SELECT, bo widać wtedy, według czego wynik został ułożony.

Co się stanie z pustymi wartościami przy sortowaniu?

Puste wartości baza grupuje razem – na początku albo na końcu wyniku, zależnie od konkretnego systemu. Nie ma tu jednej reguły wspólnej dla wszystkich baz, więc jeśli zadanie tego dotyka, warto to sprawdzić w programie, w którym pracujesz.

Powiązane zagadnienia