0Pricing
SQL Interview Prep · Урок

LIMIT, OFFSET и FETCH FIRST

Синтаксис разбиения на страницы в MySQL, Postgres и SQL Server.

«LIMIT, OFFSET и FETCH FIRST» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.

Разбиение на страницы — вопрос, зависящий от диалекта

Вопрос «Как получить первые 10 строк?» кажется простым, пока собеседник не добавит «и сделать это на стандартном языке запросов» или «а теперь на сервере SQL». Синтаксис ограничения числа строк — одна из самых разнородных возможностей разных баз данных.

В этом уроке рассматриваются три основных варианта: LIMIT (MySQL/PostgreSQL/Сиклайт), OFFSET ... FETCH (стандарт ANSI, сервер SQL) и более старый TOP (сервер SQL).

LIMIT в MySQL и PostgreSQL

Наиболее распространённая форма — LIMIT n, которая ограничивает результат числом n строк. Она поддерживается в MySQL, PostgreSQL и Сиклайт.

Важно, что LIMIT применяется после ORDER BY в логическом порядке выполнения, поэтому их почти всегда используют вместе. Ограничение без сортировки возвращает произвольный набор строк.

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

OFFSET для пропуска строк

Для разбиения на страницы нужен отступ, позволяющий пропустить предыдущие страницы. OFFSET m пропускает первые m строк, после чего применяется ограничение.

Чтобы получить третью страницу размером 10 строк, нужно пропустить 20 строк и взять 10. Общая формула: OFFSET = (page - 1) * page_size.

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

Запись с запятой в MySQL

MySQL также принимает форму с двумя аргументами через запятую: LIMIT offset, count. Обратите внимание: порядок аргументов отличается от формы с ключевыми словами, из-за чего здесь часто ошибаются.

LIMIT 20, 10 означает «пропустить 20, затем взять 10» и эквивалентно LIMIT 10 OFFSET 20. На собеседованиях для ясности лучше использовать форму с ключевыми словами.

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

Стандарт ANSI: FETCH FIRST

Стандарт использует конструкцию OFFSET ... ROWS FETCH FIRST ... ROWS ONLY. PostgreSQL, Оракл 12c+, ДБ2 и сервер SQL 2012+ поддерживают её.

Она выглядит многословно, но является переносимым вариантом. ROW и ROWS взаимозаменяемы; FIRST и NEXT — синонимы.

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

TOP в SQL Server

В старом коде SQL Server конструкция TOP n используется сразу после SELECT. В ней нет встроенного смещения, поэтому сама по себе она не позволяет разбивать результаты на страницы дальше первой.

На собеседовании Вас могут попросить преобразовать TOP в стандартную форму. SELECT TOP 10 с ORDER BY эквивалентна конструкции FETCH FIRST 10 ROWS ONLY.

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

TOP WITH TIES

Полезная возможность SQL Server: TOP n WITH TIES возвращает дополнительные строки, если они совпадают с последней строкой по ключу ORDER BY.

Если три человека получают одинаковую зарплату, занимающую 10-е место сверху, TOP 10 WITH TIES вернёт их всех — возможно, всего 12 строк. В стандарте этому соответствует FETCH FIRST ... WITH TIES.

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

ORDER BY обязателен для детерминированной пагинации

Главный момент для собеседования: использование OFFSET/LIMIT без детерминированного ORDER BY небезопасно. СУБД может выбрать для «страницы 2» не те строки, что для «страницы 1», поскольку исходный порядок не определён.

Всегда сортируйте по набору уникальных или практически уникальных ключей. Если в столбце сортировки есть дубликаты, добавьте первичный ключ как дополнительный критерий, чтобы страницы не пересекались и строки не пропускались.

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

Почему пагинация с OFFSET плохо масштабируется

Опытные интервьюеры проверяют понимание производительности. Большое значение OFFSET всё равно заставляет базу данных сформировать и отбросить все пропущенные строки. OFFSET 100000 LIMIT 10 считывает 100 010 строк, чтобы вернуть 10.

Стоимость растёт линейно с номером страницы, поэтому переход к глубоким страницам больших таблиц выполняется медленно.

Пагинация по ключу (метод поиска)

Масштабируемая альтернатива — пагинация по ключу: вместо пропуска строк по количеству Вы отбираете строки после последнего увиденного значения. Такой подход использует диапазонное сканирование индекса и остаётся быстрым на любой глубине.

Запомните ключ сортировки последней строки предыдущей страницы и запросите строки после него. Упоминание пагинации по ключу — сильный признак высокого уровня кандидата.

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

Шпаргалка по диалектам

Запомните эту таблицу, чтобы быстро отвечать на собеседовании:

  • MySQL / Postgres / SQLite: LIMIT n OFFSET m
  • Стандарт SQL / SQL Server 2012+ / Oracle 12c+: OFFSET m ROWS FETCH FIRST n ROWS ONLY
  • Старый SQL Server: SELECT TOP n (без смещения)
  • Старый Oracle (до 12c): фильтрация по ROWNUM во вложенном запросе

Быстрая проверка

Выберите правильный запрос для 3-й страницы при размере страницы 10.

Итоги

Основы пагинации:

  • LIMIT/OFFSET используются в MySQL, Postgres и SQLite; OFFSET ... FETCH FIRST — в стандарте и современных версиях SQL Server; TOP — в устаревших версиях SQL Server.
  • OFFSET = (page - 1) * page_size.
  • Всегда используйте вместе с детерминированным ORDER BY, добавляя уникальный дополнительный ключ.
  • Большие смещения работают медленно; для глубоких страниц предпочтительнее пагинация по ключу.

Часто задаваемые вопросы

Урок «LIMIT, OFFSET и FETCH FIRST» бесплатный?

Да — полный текст урока «LIMIT, OFFSET и FETCH FIRST» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «LIMIT, OFFSET и FETCH FIRST»?

Синтаксис разбиения на страницы в MySQL, Postgres и SQL Server. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Interview Prep?

Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «LIMIT, OFFSET и FETCH FIRST»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Interview Prep?

Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сортировка по нескольким столбцам и размещение NULL
  2. LIMIT, OFFSET и FETCH FIRST
  3. Надёжное получение первых N строк
  4. Сортировка по выражениям и псевдонимам
← Назад к SQL Interview Prep