Porządkowanie wyniku zapytania klauzulą ORDER BY – kierunek ASC i DESC oraz sortowanie po kilku kolumnach naraz.
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.
-- Bez ORDER BY kolejność wierszy jest nieokreślona SELECT nazwisko, srednia FROM uczniowie ORDER BY srednia DESC
| nazwisko | srednia |
|---|---|
| Wiśniewski | 5.10 |
| Kowalska | 4.75 |
| Dąbrowski | 4.10 |
| Zając | 3.90 |
| Nowak | 3.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
| klasa | nazwisko | srednia |
|---|---|---|
| 3A | Wiśniewski | 5.10 |
| 3A | Kowalska | 4.75 |
| 3B | Dąbrowski | 4.10 |
| 3B | Nowak | 3.20 |
| 3C | Zając | 3.90 |
-- ORDER BY zawsze po WHERE SELECT nazwisko, srednia FROM uczniowie WHERE srednia >= 4.00 ORDER BY nazwisko
| nazwisko | srednia |
|---|---|
| Dąbrowski | 4.10 |
| Kowalska | 4.75 |
| Wiśniewski | 5.10 |
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.
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.
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.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: