Sortowanie według wielu kolumn i rozmieszczanie wartości NULL
Łączenie ASC i DESC oraz różnice w działaniu NULLS FIRST/LAST w poszczególnych bazach danych
Sortowanie według wielu kolumn i rozmieszczanie wartości NULL to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Dlaczego sortowanie pojawia się na rozmowach kwalifikacyjnych
Osoby prowadzące rozmowy kwalifikacyjne często szybko przechodzą do ORDER BY, ponieważ pokazuje ono, czy rozumieją Państwo, że zbiór wyników SQL jest domyślnie nieuporządkowany. Bez jawnego sortowania baza danych może zwrócić wiersze w dowolnej kolejności.
Często pada pytanie: "Jak zagwarantować, że wiersze zostaną zwrócone w określonej kolejności?" Jedyną poprawną odpowiedzią jest jawna klauzula ORDER BY. Poleganie na kolejności wstawiania, kolejności klucza głównego lub kolejności indeksu to klasyczny błąd osoby początkującej.
W tej lekcji opanują Państwo sortowanie według wielu kolumn oraz podchwytliwe pytanie o to, gdzie znajdą się wartości NULL.
Podstawy ASC i DESC
ORDER BY sortuje rosnąco (ASC) domyślnie. DESC jest potrzebne tylko do odwrócenia kolejności. Kierunek dotyczy każdej kolumny z osobna, a nie całej klauzuli.
Wskazówka na rozmowę kwalifikacyjną: warto zaznaczyć, że ASC jest niejawną wartością domyślną, więc nie trzeba go zapisywać. Wielu kandydatów błędnie uważa, że jedno DESC odwraca kolejność wszystkich kolumn.
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;Sortowanie według wielu kolumn
Wymień kilka kolumn, oddzielając je przecinkami. SQL sortuje według pierwszej kolumny, następnie rozstrzyga remisy za pomocą drugiej i tak dalej. Można myśleć o tym jak o łańcuchu kluczy rozstrzygających remisy.
Przykład sortuje według działu alfabetycznie, a w obrębie każdego działu według wynagrodzenia — od najwyższego.
- Sortowanie główne:
departmentrosnąco - Klucz rozstrzygający remis:
salarymalejąco
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;Łączenie ASC i DESC
Częsta pułapka na rozmowach kwalifikacyjnych: każda kolumna ma swój własny kierunek. Zapis ORDER BY a, b DESC sortuje a rosnąco, a b malejąco — nie sortuje obu kolumn malejąco.
Jeśli obie kolumny mają być sortowane malejąco, należy zapisać ORDER BY a DESC, b DESC. Gdy pytanie łączy różne kierunki, warto określić je jawnie.
SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;Gdzie trafiają wartości NULL
To najważniejszy punkt tej lekcji. NULL oznacza nieznaną wartość, dlatego standard nie narzuca jego pozycji, a bazy danych różnią się w kwestii wartości domyślnych:
- PostgreSQL & Oracle: wartości NULL są sortowane na końcu przy
ASCi na początku przyDESC. - MySQL & SQL Server: wartości NULL są sortowane na początku przy
ASCi na końcu przyDESC(są traktowane jako najmniejsza wartość).
Osoby prowadzące rozmowy kwalifikacyjne uwielbiają pytać: "Gdzie pojawią się wartości NULL podczas tego sortowania?" Uczciwa odpowiedź brzmi: zależy to od silnika, chyba że położenie zostanie określone jawnie.
Jawne sterowanie położeniem wartości NULL
Aby niezależnie od domyślnych zasad silnika zagwarantować określone położenie, należy użyć NULLS FIRST lub NULLS LAST. PostgreSQL, Oracle i SQLite obsługują te opcje bezpośrednio.
Poniższe zapytanie umieszcza nieznane daty zatrudnienia na końcu, mimo że kolumna jest sortowana rosnąco.
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;Emulowanie NULLS LAST w MySQL
MySQL nie obsługuje słowa kluczowego NULLS LAST. Przenośnym rozwiązaniem jest użycie klucza sortowania umieszczonego na początku, który wskazuje, czy wartość jest NULL.
Wyrażenie hire_date IS NULL zwraca 0 dla rzeczywistych dat i 1 dla wartości NULL. Sortowanie tego wyrażenia rosnąco przesuwa wartości NULL na koniec, a następnie drugi klucz sortuje rzeczywiste daty.
SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;Emulowanie NULLS FIRST w SQL Server
SQL Server również nie obsługuje NULLS FIRST/LAST. Należy użyć wyrażenia CASE jako klucza sortowania umieszczonego na początku. W tym przypadku wartości NULL otrzymują rangę 0, więc pojawiają się jako pierwsze.
Warto zapamiętać ten schemat: obliczana flaga umieszczona przed właściwą kolumną sortowania zapewnia pełną kontrolę nad położeniem wartości NULL w dowolnym dialekcie.
SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
hire_date ASC;Przykład: tabela wyników
Załóżmy, że tworzona jest tabela wyników: najpierw wyświetlany jest najwyższy wynik, a w przypadku remisu wyżej plasuje się gracz, który najwcześniej się zarejestrował. Gracze, którzy nigdy nie zdobyli punktów (wynik NULL), powinni znaleźć się na dole.
Sortowanie wymaga trzech kluczy: flagi NULL, wyniku sortowanego malejąco oraz daty rejestracji sortowanej rosnąco jako klucza rozstrzygającego remis.
SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
score DESC,
signup_date ASC;Uwaga dotycząca stabilności sortowania
Inne ulubione pytanie brzmi: "Jeśli dwa wiersze mają identyczne wartości dla każdego klucza ORDER BY, w jakiej kolejności zostaną zwrócone?"
Odpowiedź: nieokreślonej. Nie ma gwarancji, że sortowanie SQL będzie stabilne, więc identyczne wiersze mogą pojawić się w dowolnej kolejności względem siebie, a kolejność ta może zmienić się między uruchomieniami lub po zmianie indeksu.
Rozwiązaniem jest dodanie całkowicie unikatowego klucza rozstrzygającego remis, zwykle klucza głównego, aby wynik był powtarzalny.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;Uwagi dotyczące wydajności sortowania
Sortowanie może być kosztowne. Jeśli ORDER BY odpowiada istniejącemu indeksowi pod względem kolejności i kierunków kolumn, silnik może odczytać wiersze już posortowane i pominąć osobny etap sortowania.
Niezgodne kierunki (na przykład gdy indeks składa się wyłącznie z kolumn sortowanych rosnąco, a jedna kolumna jest sortowana malejąco) zwykle uniemożliwiają takie użycie indeksu i wymuszają sortowanie w pamięci lub na dysku. Wspomnienie o związku między kolejnością indeksu a kosztem sortowania świadczy o dojrzałości technicznej podczas rozmowy kwalifikacyjnej.
Szybkie sprawdzenie
Sprawdź znajomość zasad kierunków sortowania według wielu kolumn.
Podsumowanie
Najważniejsze informacje dotyczące sortowania według wielu kolumn i położenia wartości NULL:
- Zbiory wyników są nieuporządkowane, chyba że zostanie dodane
ORDER BY. - Kierunek sortowania dotyczy każdej kolumny z osobna;
ASCjest wartością domyślną. - Położenie wartości NULL zależy od silnika: przy ASC są na końcu w Postgres/Oracle i na początku w MySQL/SQL Server.
- Jeśli jest obsługiwane, należy użyć
NULLS FIRST/LAST, a w pozostałych przypadkach wiodącej flagiIS NULL/CASE. - Aby uzyskać powtarzalną kolejność, należy dodać unikatowy klucz rozstrzygający remis, na przykład klucz główny.
Często zadawane pytania
Czy lekcja „Sortowanie według wielu kolumn i rozmieszczanie wartości NULL” jest bezpłatna?
Tak — pełny tekst „Sortowanie według wielu kolumn i rozmieszczanie wartości NULL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Sortowanie według wielu kolumn i rozmieszczanie wartości NULL”?
Łączenie ASC i DESC oraz różnice w działaniu NULLS FIRST/LAST w poszczególnych bazach danych Ćwiczysz SQL Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Interview Prep?
Nie wymagamy żadnego doświadczenia. SQL Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Sortowanie według wielu kolumn i rozmieszczanie wartości NULL”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Interview Prep?
Tak. Każda lekcja SQL Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Sortowanie według wielu kolumn i rozmieszczanie wartości NULL
- LIMIT, OFFSET i FETCH FIRST
- Niezawodne zwracanie wierszy Top-N
- Sortowanie według wyrażeń i aliasów