0Pricing
Coding Interview Prep · Lekcja

LIMIT, OFFSET i FETCH FIRST

Składnia stronicowania w MySQL, Postgres i SQL Server

LIMIT, OFFSET i FETCH FIRST to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 2 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 Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Stronicowanie zależy od dialektu

„Jak pobrać pierwsze 10 wierszy?” brzmi banalnie, dopóki osoba prowadząca rozmowę nie doda: „i zrobić to w standardowym SQL” albo „a teraz w SQL Server”. Składnia ograniczania liczby wierszy jest jedną z najbardziej zróżnicowanych między bazami danych.

Ta lekcja omawia trzy główne formy: LIMIT (MySQL/Postgres/SQLite), OFFSET ... FETCH (standard ANSI, SQL Server) oraz starsze TOP (SQL Server).

LIMIT w MySQL i PostgreSQL

Najczęściej stosuje się formę LIMIT n, która ogranicza wynik do maksymalnie n wierszy. Jest obsługiwana przez MySQL, PostgreSQL i SQLite.

Co istotne, LIMIT jest stosowane po ORDER BY w logicznej kolejności wykonywania zapytania, dlatego niemal zawsze używa się ich razem. Ograniczenie liczby wierszy bez sortowania zwraca losowy zestaw wierszy.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10;

OFFSET do pomijania wierszy

Stronicowanie wymaga przesunięcia, aby pominąć wcześniejsze strony. OFFSET m pomija pierwszych m wierszy, zanim zostanie zastosowany limit.

Aby pobrać stronę 3 przy rozmiarze strony równym 10, należy pominąć 20 wierszy i pobrać 10. Ogólny wzór to OFFSET = (page - 1) * page_size.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10 OFFSET 20;

Składnia MySQL z przecinkiem

MySQL akceptuje również dwuargumentową składnię z przecinkiem: LIMIT offset, count. Należy zwrócić uwagę, że kolejność argumentów jest odwrotna niż w składni słów kluczowych, co często prowadzi do pomyłek.

LIMIT 20, 10 oznacza pominięcie 20 wierszy, a następnie pobranie 10 — dokładnie tak samo jak LIMIT 10 OFFSET 20. Podczas rozmów kwalifikacyjnych lepiej użyć składni słów kluczowych, ponieważ jest bardziej czytelna.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 20, 10;

Standard ANSI: FETCH FIRST

Standard SQL wykorzystuje składnię OFFSET ... ROWS FETCH FIRST ... ROWS ONLY. Obsługują ją PostgreSQL, Oracle 12c+, DB2 i SQL Server 2012+.

Jest rozwlekła, ale stanowi przenośny wybór. ROW i ROWS są wymienne, a FIRST i NEXT to synonimy.

SELECT name, salary
FROM employees
ORDER BY salary DESC
OFFSET 20 ROWS
FETCH FIRST 10 ROWS ONLY;

TOP w SQL Server

Starszy kod SQL Server umieszcza TOP n zaraz po SELECT. Nie ma on wbudowanej obsługi offsetu, więc samodzielnie nie umożliwia stronicowania poza pierwszą stronę.

Podczas rozmowy kwalifikacyjnej może paść prośba o przekształcenie TOP do standardowej postaci. SELECT TOP 10 z ORDER BY jest równoważne FETCH FIRST 10 ROWS ONLY.

SELECT TOP 10 name, salary
FROM employees
ORDER BY salary DESC;

TOP WITH TIES

Przydatna funkcja SQL Server: TOP n WITH TIES zwraca dodatkowe wiersze, jeśli mają taką samą wartość klucza ORDER BY jak ostatni zwrócony wiersz.

Jeśli trzy osoby mają dziesiąte najwyższe wynagrodzenie, TOP 10 WITH TIES zwróci wszystkie te osoby, czyli być może 12 wierszy. Odpowiednikiem tego rozwiązania w standardzie jest FETCH FIRST ... WITH TIES.

SELECT TOP 10 WITH TIES name, salary
FROM employees
ORDER BY salary DESC;

ORDER BY jest konieczne do deterministycznego stronicowania

Najważniejsza kwestia na rozmowie kwalifikacyjnej: OFFSET/LIMIT bez deterministycznego ORDER BY jest niebezpieczne. Silnik może wybrać inne wiersze dla „strony 2” niż dla „strony 1”, ponieważ kolejność bazowa nie jest określona.

Zawsze należy sortować według unikatowego lub wystarczająco unikatowego zestawu kluczy. Jeśli kolumna sortowania zawiera duplikaty, należy dodać klucz główny jako rozstrzygający, aby strony nie nakładały się na siebie i nie pomijały wierszy.

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 10 OFFSET 20;

Dlaczego stronicowanie z OFFSET skaluje się słabo

Doświadczeni rekruterzy zwracają uwagę na wydajność. Duży OFFSET nadal zmusza bazę danych do wygenerowania i odrzucenia wszystkich pominiętych wierszy. OFFSET 100000 LIMIT 10 odczytuje 100 010 wierszy, aby zwrócić 10.

Koszt rośnie liniowo wraz z numerem strony, przez co głębokie stronicowanie staje się powolne w przypadku dużych tabel.

Stronicowanie kluczowe (seek)

Skalowalną alternatywą jest stronicowanie typu keyset: zamiast pomijać wiersze według ich liczby filtruje się dane na podstawie wartości znajdującej się za ostatnią poznaną wartością. Dzięki temu wykorzystywane jest skanowanie zakresu indeksu, a wydajność pozostaje dobra niezależnie od głębokości stronicowania.

Należy zapamiętać klucz sortowania ostatniego wiersza z poprzedniej strony i poprosić o wiersze znajdujące się za nim. Wspomnienie o keyset pagination jest mocnym sygnałem doświadczenia na poziomie senior.

SELECT id, name, created_at
FROM events
WHERE created_at < '2026-01-01 10:00:00'
ORDER BY created_at DESC
LIMIT 10;

Ściągawka według dialektu

Warto zapamiętać tę tabelę, aby szybko przypomnieć sobie składnię podczas rozmowy:

  • MySQL / Postgres / SQLite: LIMIT n OFFSET m
  • Standard SQL / SQL Server 2012+ / Oracle 12c+: OFFSET m ROWS FETCH FIRST n ROWS ONLY
  • Starszy SQL Server: SELECT TOP n (bez offsetu)
  • Starszy Oracle (sprzed 12c): filtrowanie według ROWNUM w podzapytaniu

Szybki test

Wybierz prawidłowe zapytanie dla strony 3 przy rozmiarze strony 10.

Podsumowanie

Podstawy stronicowania:

  • LIMIT/OFFSET w MySQL, Postgres i SQLite; OFFSET ... FETCH FIRST w standardzie i nowoczesnym SQL Server; TOP w starszym SQL Server.
  • OFFSET = (page - 1) * page_size.
  • Zawsze należy używać deterministycznego ORDER BY, dodając unikatowy element rozstrzygający.
  • Duże wartości offsetu działają powoli; w przypadku głębokiego stronicowania lepiej użyć keyset pagination.

Często zadawane pytania

Czy lekcja „LIMIT, OFFSET i FETCH FIRST” jest bezpłatna?

Tak — pełny tekst „LIMIT, OFFSET i FETCH FIRST” 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 Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „LIMIT, OFFSET i FETCH FIRST”?

Składnia stronicowania w MySQL, Postgres i SQL Server Ćwiczysz Coding 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ąć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding 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 2 z 4.

Ile czasu zajmuje lekcja „LIMIT, OFFSET i FETCH FIRST”?

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 Coding Interview Prep?

Tak. Każda lekcja Coding 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

  1. Sortowanie według wielu kolumn i rozmieszczanie wartości NULL
  2. LIMIT, OFFSET i FETCH FIRST
  3. Niezawodne zwracanie wierszy Top-N
  4. Sortowanie według wyrażeń i aliasów
← Powrót do Coding Interview Prep