LIMIT и OFFSET
Получайте первые N строк и реализуйте постраничную загрузку
«LIMIT и OFFSET» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Получение нескольких строк
Иногда нужны не все подходящие строки, а только первые несколько. LIMIT ограничивает количество строк, возвращаемых запросом.
Этот запрос возвращает не более 5 товаров.
SELECT name, price
FROM products
LIMIT 5;LIMIT без ORDER BY даёт случайный результат
Само по себе LIMIT возвращает какие-то строки, но какие именно — не определено. Всегда объединяйте его с ORDER BY, чтобы результат был осмысленным и повторяемым.
-- The 5 newest orders, deterministically
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 5;Пропуск строк с OFFSET
OFFSET указывает базе данных пропустить определённое количество строк перед возвратом результата. В сочетании с LIMIT это основа разбиения на страницы.
Так пропускаются первые 10 строк и возвращаются следующие 5.
SELECT name, price
FROM products
ORDER BY name
LIMIT 5 OFFSET 10;Формирование страниц
При размере страницы 10 номера страниц соответствуют таким смещениям:
- Страница 1:
OFFSET 0 - Страница 2:
OFFSET 10 - Страница 3:
OFFSET 20
Формула: OFFSET = (page - 1) * page_size.
-- Page 3 with 10 rows per page
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;Порядок выполнения
База данных применяет предложения в таком порядке: фильтрует с помощью WHERE, сортирует с помощью ORDER BY, затем ограничивает результат с помощью OFFSET и LIMIT.
Таким образом, вы всегда разбиваете на страницы отфильтрованный результат, отсортированный в нужном порядке.
SELECT name, price
FROM products
WHERE price > 0
ORDER BY price DESC
LIMIT 10 OFFSET 0;LIMIT ALL и OFFSET 0
LIMIT ALL означает «без ограничений» (то же самое, что не указывать LIMIT), а OFFSET 0 ничего не пропускает. Они иногда полезны, когда значение формируется динамически.
SELECT name
FROM products
ORDER BY name
LIMIT ALL OFFSET 0;Стандартный синтаксис FETCH
PostgreSQL также поддерживает форму, соответствующую стандарту SQL: OFFSET n ROWS FETCH NEXT m ROWS ONLY. Она делает ровно то же, что и LIMIT/OFFSET, только более многословно.
SELECT name, price
FROM products
ORDER BY name
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;Почему большие значения OFFSET работают медленно
Большое значение OFFSET по-прежнему заставляет базу данных просматривать и отбрасывать каждую пропущенную строку. OFFSET 100000 читает 100 000 строк только для того, чтобы отбросить их, поэтому на глубоких страницах работа замедляется.
-- Reads 100000 rows then discards them
SELECT id, name
FROM products
ORDER BY id
LIMIT 10 OFFSET 100000;Постраничная навигация по ключу
Более быстрый вариант — постраничная навигация по ключу (с переходом по индексу). Вместо смещения запомните последнюю просмотренную строку и запросите строки после неё.
Это позволяет с помощью индекса сразу перейти к следующей странице, не пропуская строки.
-- Next page after the last seen id (e.g. 5000)
SELECT id, name
FROM products
WHERE id > 5000
ORDER BY id
LIMIT 10;Для стабильных страниц нужна стабильная сортировка
Если в вашем ORDER BY есть одинаковые значения, строки могут меняться местами при загрузке страниц, и вы можете увидеть дубликаты или пропуски. Завершите сортировку уникальным ключом, например первичным ключом, чтобы постраничная навигация оставалась согласованной.
SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 10 OFFSET 20;Одна первая строка
LIMIT 1 — быстрый способ получить одну строку, например самый дорогой товар или последний заказ. Объедините его с подходящим ORDER BY.
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 1;Быстрая проверка
На каждой странице отображаются 10 строк. Какая конструкция возвращает третью страницу?
Повторение
Теперь вы умеете разбивать результаты на части:
LIMIT nограничивает количество строкOFFSET mпропускает строки;OFFSET = (page-1)*size- Всегда объединяйте с
ORDER BY, чтобы страницы формировались предсказуемо - Для повышения скорости отдавайте предпочтение постраничной навигации по ключу, а не большим смещениям
Далее вы воспользуетесь этими инструментами, чтобы находить N лучших записей.
SELECT name, price
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;Часто задаваемые вопросы
Урок «LIMIT и OFFSET» бесплатный?
Да — полный текст урока «LIMIT и OFFSET» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «LIMIT и OFFSET»?
Получайте первые N строк и реализуйте постраничную загрузку Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «LIMIT и OFFSET»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка с помощью ORDER BY
- Сортировка по нескольким столбцам
- LIMIT и OFFSET
- Поиск записей с максимальными и минимальными значениями