Ograniczanie wyniku do kilku pierwszych wierszy klauzulą TOP w Accessie i LIMIT w innych bazach oraz zachowanie TOP przy wartościach równych.
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.
| W Accessie | Standardowy SQL | Znaczenie |
|---|---|---|
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 |
-- Trzej uczniowie z najwyższą średnią (zapis Accessa) SELECT TOP 3 nazwisko, srednia FROM uczniowie ORDER BY srednia DESC
| nazwisko | srednia |
|---|---|
| Wiśniewski | 5.10 |
| Kowalska | 4.75 |
| Dąbrowski | 4.10 |
-- To samo w bazach używających LIMIT - klauzula idzie na koniec SELECT nazwisko, srednia FROM uczniowie ORDER BY srednia DESC LIMIT 3
| nazwisko | srednia |
|---|---|
| Wiśniewski | 5.10 |
| Kowalska | 4.75 |
| Dąbrowski | 4.10 |
-- Uczeń z najniższą średnią: to samo TOP, odwrotny kierunek sortowania SELECT TOP 1 nazwisko, srednia FROM uczniowie ORDER BY srednia
| nazwisko | srednia |
|---|---|
| Nowak | 3.20 |
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.
Składniowo tak, ale wynik jest bezużyteczny – dostaniesz kilka przypadkowych wierszy. Traktuj TOP bez ORDER BY jako sygnał, że w zapytaniu czegoś brakuje.
Tak, choć trudno wskazać sensowne zastosowanie. Wartość po TOP musi być liczbą całkowitą – ułamek zostanie odrzucony jako błąd składni.
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.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: