Wróć do: Bazy danych
średni SQLTOPLIMITmatura rozszerzona z informatyki

TOP i LIMIT – pierwsze wiersze

Ograniczanie wyniku do kilku pierwszych wierszy klauzulą TOP w Accessie i LIMIT w innych bazach oraz zachowanie TOP przy wartościach równych.

01

Opis

Polecenia typu „podaj trzech najlepszych uczniów" albo „wypisz pięć najdroższych produktów" wymagają dwóch rzeczy naraz: uporządkowania wyniku i obcięcia go do kilku pierwszych wierszy. Pierwsze robi ORDER BY, drugie – klauzula ograniczająca liczbę wierszy.

Bez sortowania to nie ma sensu. „Trzy pierwsze wiersze" nieuporządkowanego wyniku to trzy przypadkowe wiersze, bo kolejność bez ORDER BY nie jest określona. Te dwie klauzule chodzą w parze i użycie jednej bez drugiej jest niemal zawsze błędem.

Access używa TOP, wstawianego zaraz po SELECT, przed listą kolumn. Liczba po TOP musi być całkowita. Dopisanie słowa PERCENT zmienia znaczenie z „tylu wierszy" na „tyle procent wszystkich wierszy".

Większość pozostałych baz używa LIMIT – dopisywanego na samym końcu zapytania, za ORDER BY. Efekt jest ten sam, miejsce w zapytaniu i słowo kluczowe – inne.

Najważniejsza różnica w zachowaniu: TOP nie rozstrzyga remisów. Jeśli poprosisz o trzy wiersze, a trzeci i czwarty mają w kolumnie sortowania identyczną wartość, Access zwróci cztery wiersze – wszystkie remisujące. Nie potrafi arbitralnie wybrać jednego z równych sobie, więc woli oddać komplet. LIMIT zachowuje się odwrotnie: zwróci dokładnie tyle wierszy, ile poprosiłeś, ucinając remis w przypadkowym miejscu.

To znaczy, że zapytanie z TOP 3 może zwrócić więcej niż 3 wiersze – i nie jest to błąd, tylko udokumentowane zachowanie. Jeśli musisz mieć dokładnie trzy, trzeba dołożyć do ORDER BY drugą kolumnę, która remisy rozstrzygnie.

02

Dialekt

W AccessieStandardowy SQLZnaczenie
SELECT TOP 3 ... ... LIMIT 3 trzy pierwsze wiersze wyniku
SELECT TOP 10 PERCENT ... (brak prostego odpowiednika) pierwsze 10% wierszy
(zwraca remisujące) (ucina dokładnie) zachowanie przy równych wartościach
03

Zapytanie

-- Trzej uczniowie z najwyższą średnią (zapis Accessa)
SELECT TOP 3 nazwisko, srednia
FROM uczniowie
ORDER BY srednia DESC
Wynik zapytania
nazwiskosrednia
Wiśniewski5.10
Kowalska4.75
Dąbrowski4.10
-- To samo w bazach używających LIMIT - klauzula idzie na koniec
SELECT nazwisko, srednia
FROM uczniowie
ORDER BY srednia DESC
LIMIT 3
Wynik zapytania
nazwiskosrednia
Wiśniewski5.10
Kowalska4.75
Dąbrowski4.10
-- Uczeń z najniższą średnią: to samo TOP, odwrotny kierunek sortowania
SELECT TOP 1 nazwisko, srednia
FROM uczniowie
ORDER BY srednia
Wynik zapytania
nazwiskosrednia
Nowak3.20

Na maturze

Sprawdź kierunek sortowania. „Trzej najlepsi" to ORDER BY ... DESC plus TOP 3. „Trzej najsłabsi" to to samo TOP 3, ale sortowanie rosnąco. Sama klauzula TOP nigdy nie decyduje o tym, z którego końca bierzemy wiersze – robi to wyłącznie ORDER BY.

Nie panikuj, gdy wierszy wyjdzie więcej, niż prosiłeś. Przy TOP to normalne zachowanie przy remisach. Jeśli zadanie wprost wymaga konkretnej liczby wierszy, rozstrzygnij remis drugą kolumną w ORDER BY – na przykład nazwiskiem alfabetycznie.

Uważaj też na TOP w połączeniu z łączeniem zapytań przez UNION – tam kolejność i obcinanie zaczynają na siebie wpływać w sposób, który potrafi po cichu dać zły wynik.

05

Najczęściej zadawane pytania

Czy TOP działa bez ORDER BY?

Składniowo tak, ale wynik jest bezużyteczny – dostaniesz kilka przypadkowych wierszy. Traktuj TOP bez ORDER BY jako sygnał, że w zapytaniu czegoś brakuje.

Czy TOP 0 zwróci pustą tabelę?

Tak, choć trudno wskazać sensowne zastosowanie. Wartość po TOP musi być liczbą całkowitą – ułamek zostanie odrzucony jako błąd składni.

Jak wybrać wiersze od czwartego do dziesiątego?

W Accessie nie ma na to prostego zapisu i trzeba się posiłkować podzapytaniem. Bazy z LIMIT mają do tego dodatkowy parametr przesunięcia (OFFSET), który pozwala pominąć zadaną liczbę początkowych wierszy.

Powiązane zagadnienia