Wskaż kwerendę, która z tabeli klienci wybierze nazwiska pięciu klientów mających najmniej punktów na swoim koncie (pole całkowite punkty).
A.
SELECT nazwisko FROM klienci ORDER BY punkty DESC LIMIT 5;
B.
SELECT LIMIT 5 nazwisko FROM klienci ORDER BY punkty ASC;
C.
SELECT nazwisko FROM klienci LIMIT 5;
D.
SELECT nazwisko FROM klienci ORDER BY punkty ASC LIMIT 5;
Ta kwerenda spełnia warunek zadania, bo najpierw wybiera tylko kolumnę nazwisko z tabeli klienci, a potem porządkuje rekordy według pola punkty rosnąco, czyli od najmniejszej wartości do największej. Fragment ORDER BY punkty ASC jest tutaj kluczowy: ASC oznacza sortowanie ascending, więc na początku wyniku znajdą się klienci z najmniejszą liczbą punktów. Dopiero po takim uporządkowaniu działa LIMIT 5, który ucina wynik do pięciu pierwszych rekordów. W praktyce taka konstrukcja jest typowa np. przy wyszukiwaniu pięciu najsłabszych wyników, najtańszych produktów albo najstarszych zgłoszeń w systemie. Z mojego doświadczenia warto też pamiętać, że w MySQL i MariaDB LIMIT zapisuje się na końcu zapytania. Dobra praktyka przy produkcyjnych bazach to dodanie drugiego kryterium sortowania, np. ORDER BY punkty ASC, nazwisko ASC, żeby wynik był bardziej przewidywalny, gdy kilku klientów ma tyle samo punktów. Przy dużych tabelach sensowny byłby też indeks na kolumnie punkty, bo baza może wtedy szybciej znaleźć najmniejsze wartości bez ciężkiego sortowania całej tabeli.
W tym zadaniu łatwo pomylić samo ograniczenie liczby rekordów z wyborem rekordów spełniających konkretny warunek porządku. LIMIT 5 nie oznacza automatycznie pięciu klientów z najmniejszą liczbą punktów. On tylko mówi bazie danych, że ma zwrócić maksymalnie pięć wierszy z aktualnie przygotowanego wyniku. Jeżeli nie ma ORDER BY, kolejność rekordów nie jest gwarantowana. Czasem może wyglądać tak, jakby baza zwracała dane według kolejności dodania albo według klucza głównego, ale to nie jest reguła, na której wolno polegać. SQL jako język relacyjny nie traktuje tabeli jak arkusza Excela z naturalną kolejnością wierszy. Moim zdaniem to jeden z częstszych błędów początkujących, bo wynik na małej testowej tabeli bywa pozornie dobry, a później na prawdziwych danych robi się bałagan. Ważna jest też składnia: w MySQL poprawny porządek klauzul to SELECT lista_kolumn FROM tabela ORDER BY kolumna kierunek LIMIT liczba. Wstawienie LIMIT zaraz po SELECT, przed nazwą kolumny, nie jest poprawną składnią takiego zapytania. Trzeba również uważać na kierunek sortowania. DESC ustawia największe wartości na początku, więc wybrałoby klientów z największą liczbą punktów, a nie z najmniejszą. Żeby dostać pięć najniższych wyników, potrzebne jest sortowanie rosnące po polu punkty i dopiero potem ograniczenie wyniku do pięciu wierszy.