SQLLIMITtutorialbeginner

Что такое LIMIT в SQL?

LIMIT обрезает результат до N строк. Незаменим для пагинации, топ-N запросов, превью таблиц. Разбираем синтаксис, OFFSET, отличия PostgreSQL и MySQL, частые ошибки и три задачи на тренировку.

13 мин чтенияСправочникSQL · LIMIT · tutorial · beginner

LIMIT — это команда SQL, которая говорит базе данных: «верни не больше такого-то количества строк».

Представь, что в таблице лежит 50 000 видео. Когда ты открываешь главную страницу видеосервиса, тебе не показывают сразу все 50 000 роликов. Ты видишь первые 10–20 рекомендаций, потом можешь пролистать дальше.

Вот для этого и нужен LIMIT: взять не весь огромный результат, а только маленький, нужный кусок.

LIMIT используют везде:

  • в интернет-магазинах — показать 20 товаров на странице;
  • в соцсетях — вывести первые посты ленты;
  • в админках — быстро посмотреть несколько записей;
  • в аналитике — получить топ-10 клиентов, товаров или статей;
  • в тренажёрах и тестах — проверить первые строки результата.

Без LIMIT запрос может вернуть всё, что нашёл. А «всё» в реальной базе — это иногда миллионы строк.

Зачем нужен LIMIT

У LIMIT есть три главных сценария.

Первый — топ-N.

Например:

  • топ-10 самых популярных товаров;
  • топ-5 авторов по просмотрам;
  • топ-3 клиента по сумме заказов;
  • 20 последних комментариев.

Второй — пагинация.

Это когда данные показываются страницами: по 10, 20, 50 строк. Например, каталог товаров, список пользователей, история заказов.

Третий — быстрый просмотр данных.

Когда ты только открыл незнакомую таблицу, часто не хочется сразу выгружать тысячи строк. Хочется спокойно посмотреть первые 5–10 записей и понять, что там вообще хранится.

SELECT *
FROM users
LIMIT 10;

Такой запрос удобен как первый взгляд на таблицу.

Но важно помнить: LIMIT не делает результат «первым» в человеческом смысле, если ты не указал сортировку. Он просто ограничивает количество строк.

Базовый синтаксис LIMIT

Самая простая форма:

SELECT column_1, column_2
FROM table_name
LIMIT 5;

Это значит: верни не больше 5 строк.

Например, есть таблица videos.

SELECT title, views
FROM videos
LIMIT 5;

Запрос вернёт максимум 5 строк из таблицы videos.

Но какие именно 5 строк? Без ORDER BY на это лучше не рассчитывать.

База данных не обязана возвращать строки в порядке добавления, по id, по дате или «как красиво выглядит». Если порядок важен, его нужно указать явно.

LIMIT почти всегда используют с ORDER BY

LIMIT отвечает на вопрос: «сколько строк вернуть?»

ORDER BY отвечает на вопрос: «в каком порядке их расположить?»

Если тебе нужны 5 самых популярных видео, одного LIMIT недостаточно.

Плохо:

SELECT title, views
FROM videos
LIMIT 5;

Такой запрос означает: «дай какие-нибудь 5 строк». Он не означает «дай топ-5».

Правильно:

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 5;

Вот теперь смысл точный: сначала отсортировать видео по просмотрам от большего к меньшему, потом взять первые 5 строк.

Запомни простое правило:

если важен порядок строк, всегда пиши ORDER BY.

LIMIT без ORDER BY можно использовать для быстрого просмотра таблицы при разработке, но не для отчётов, страниц сайта и бизнес-логики.

Пример: топ-3 видео по просмотрам

Допустим, есть таблица videos.

id title author views likes
1 SQL in 30 minutes Code Academy 250000 12000
2 Cats compile code Funny Devs 1200000 95000
3 JOIN explained simply DB Guru 80000 4500
4 Cooking borscht for devs Tech Cooks 30000 1800
5 10 SELECT mistakes DB Guru 150000 8900
6 React hooks top Web Dev 500000 25000
7 Linux history OS Lessons 90000 5500

Нужно получить три самых просматриваемых видео.

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3;

Результат:

title views
Cats compile code 1200000
React hooks top 500000
SQL in 30 minutes 250000

Что произошло:

  1. SQL взял строки из videos.
  2. Отсортировал их по views по убыванию.
  3. Оставил только первые 3 строки.

Именно так обычно делают топы: сортировка плюс ограничение.

LIMIT не сортирует данные сам

Это важный момент.

LIMIT 10 не значит:

  • первые 10 по id;
  • последние 10 по дате;
  • самые новые 10;
  • самые популярные 10.

Он значит только одно: вернуть не больше 10 строк.

Порядок задаёт только ORDER BY.

Например, последние 10 заказов:

SELECT id, customer_id, created_at, amount
FROM orders
ORDER BY created_at DESC
LIMIT 10;

Самые дорогие 10 заказов:

SELECT id, customer_id, created_at, amount
FROM orders
ORDER BY amount DESC
LIMIT 10;

Первые 10 пользователей по id:

SELECT id, email, created_at
FROM users
ORDER BY id ASC
LIMIT 10;

Три разных вопроса — три разных сортировки.

OFFSET: пропустить первые строки

Рядом с LIMIT часто используют OFFSET.

OFFSET говорит: «пропусти столько-то строк, а потом начинай возвращать результат».

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3 OFFSET 3;

Читается так:

«Отсортируй видео по просмотрам по убыванию, пропусти первые 3 строки и верни следующие 3».

Если первая страница показывает места 1–3, то такой запрос покажет места 4–6.

Для нашей таблицы результат будет таким:

title views
10 SELECT mistakes 150000
Linux history 90000
JOIN explained simply 80000

OFFSET 3 пропустил первые три строки рейтинга:

  1. Cats compile code
  2. React hooks top
  3. SQL in 30 minutes

А LIMIT 3 взял следующие три.

LIMIT и OFFSET для пагинации

Пагинация — это показ данных страницами.

Например, в интернет-магазине на одной странице показывается 20 товаров.

Тогда:

  • страница 1: пропустить 0, взять 20;
  • страница 2: пропустить 20, взять 20;
  • страница 3: пропустить 40, взять 20;
  • страница 4: пропустить 60, взять 20.

Формула такая:

LIMIT page_size OFFSET (page_number - 1) * page_size

Для страницы 1 при размере страницы 20:

LIMIT 20 OFFSET 0

Для страницы 2:

LIMIT 20 OFFSET 20

Для страницы 3:

LIMIT 20 OFFSET 40

Пример запроса:

SELECT id, name, price
FROM products
ORDER BY id ASC
LIMIT 20 OFFSET 40;

Это третья страница товаров, если на странице 20 товаров.

Пример: пагинация в интернет-магазине

Допустим, есть таблица products.

id name category price popularity
1 iPhone 15 Electronics 90000 980
2 Bosch kettle Home 4500 320
3 Clean Code Books 2000 850
4 DeLonghi coffee machine Home 35000 410
5 MacBook Air Electronics 130000 920
6 SQL in one month Books 1500 670
7 Pixel 8 Electronics 75000 740
8 LG fridge Home 65000 280
9 Multicooker Home 8000 560
10 JavaScript guide Books 1800 510

Нужно показать вторую страницу каталога: по 4 товара на странице, сортировка по популярности.

Первая страница — первые 4 товара.

Вторая страница — пропускаем 4 товара и берём следующие 4.

SELECT id, name, popularity
FROM products
ORDER BY popularity DESC
LIMIT 4 OFFSET 4;

Результат:

id name popularity
6 SQL in one month 670
9 Multicooker 560
10 JavaScript guide 510
4 DeLonghi coffee machine 410

Почему именно они?

Полный порядок по популярности такой:

position name popularity
1 iPhone 15 980
2 MacBook Air 920
3 Clean Code 850
4 Pixel 8 740
5 SQL in one month 670
6 Multicooker 560
7 JavaScript guide 510
8 DeLonghi coffee machine 410
9 Bosch kettle 320
10 LG fridge 280

OFFSET 4 пропустил первые четыре строки. LIMIT 4 взял строки с пятой по восьмую.

Для пагинации нужен стабильный порядок

Пагинация без нормального ORDER BY — источник странных багов.

Пользователь открывает первую страницу, видит одни товары. Потом открывает вторую — и внезапно там повторяется товар с первой страницы. Или какой-то товар пропадает между страницами.

Так бывает, когда порядок нестабильный.

Плохо:

SELECT id, name, price
FROM products
LIMIT 20 OFFSET 20;

Здесь нет сортировки. База может вернуть строки в одном порядке сегодня и в другом завтра.

Лучше:

SELECT id, name, price
FROM products
ORDER BY id ASC
LIMIT 20 OFFSET 20;

Ещё лучше, если сортируешь по колонке, где могут быть одинаковые значения, добавлять уникальный ключ.

Например, у нескольких товаров может быть одинаковая популярность.

SELECT id, name, popularity
FROM products
ORDER BY popularity DESC, id ASC
LIMIT 20 OFFSET 20;

Так порядок становится стабильным: сначала сортируем по популярности, а если популярность одинаковая — по id.

Для страниц сайта это особенно важно. Пользователь не должен видеть «прыгающие» строки.

LIMIT 1: найти одну строку

Очень частый случай — получить одну строку.

Например, самый дорогой товар:

SELECT id, name, price
FROM products
ORDER BY price DESC
LIMIT 1;

Последний зарегистрированный пользователь:

SELECT id, email, created_at
FROM users
ORDER BY created_at DESC, id DESC
LIMIT 1;

Первый заказ клиента:

SELECT id, customer_id, created_at, amount
FROM orders
WHERE customer_id = 7
ORDER BY created_at ASC, id ASC
LIMIT 1;

LIMIT 1 хорош, когда тебе действительно нужна одна строка: самая новая, самая старая, самая дорогая, первая по рейтингу.

Но снова важна сортировка. Без ORDER BY запрос «дай одну строку» не означает «дай правильную одну строку».

LIMIT 0: зачем возвращать ноль строк

LIMIT 0 выглядит странно, но иногда полезен.

SELECT id, email, created_at
FROM users
LIMIT 0;

Такой запрос вернёт ноль строк.

Зачем это нужно?

Иногда так проверяют структуру результата: какие колонки вернёт запрос, не выгружая сами данные. Это может быть полезно в инструментах, генераторах отчётов, админках и при отладке сложных запросов.

Для обычной работы новичку LIMIT 0 нужен редко, но знать о нём полезно: это не ошибка, а валидный запрос.

LIMIT после фильтрации

Важно понимать порядок смысла запроса.

Например:

SELECT id, name, price
FROM products
WHERE category = 'Books'
ORDER BY price ASC
LIMIT 5;

Читается так:

  1. Взять товары.
  2. Оставить только категорию Books.
  3. Отсортировать книги по цене от дешёвых к дорогим.
  4. Вернуть первые 5.

LIMIT применяется не к исходной таблице целиком, а к результату запроса после фильтрации и сортировки.

То есть это не «возьми первые 5 товаров, а потом выбери книги». Это «выбери книги, отсортируй их и возьми первые 5».

LIMIT с агрегатами

LIMIT часто используют после GROUP BY, чтобы получить топ групп.

Например, топ-5 клиентов по сумме заказов:

SELECT
  customer_id,
  SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
ORDER BY total_amount DESC
LIMIT 5;

Что здесь происходит:

  1. Заказы группируются по клиенту.
  2. Для каждого клиента считается сумма заказов.
  3. Клиенты сортируются по сумме от большей к меньшей.
  4. Возвращаются первые 5 клиентов.

Это один из самых популярных видов аналитических запросов.

Ещё пример: топ-10 товаров по количеству покупок.

SELECT
  product_id,
  COUNT(*) AS purchases_count
FROM order_items
GROUP BY product_id
ORDER BY purchases_count DESC
LIMIT 10;

LIMIT здесь ограничивает уже готовый рейтинг.

LIMIT и одинаковые значения в сортировке

Представь, что мы ищем топ-3 товаров по продажам.

SELECT product_id, sales_count
FROM product_stats
ORDER BY sales_count DESC
LIMIT 3;

А в таблице такие данные:

product_id sales_count
1 100
2 90
3 80
4 80
5 80

Формально топ-3 вернёт только три строки. Но товаров с одинаковым результатом 80 несколько.

Какой из них попадёт третьим? Если сортировка только по sales_count, порядок между товарами с одинаковым значением может быть нестабильным.

Поэтому для предсказуемости добавляют второй критерий:

SELECT product_id, sales_count
FROM product_stats
ORDER BY sales_count DESC, product_id ASC
LIMIT 3;

Теперь при равном sales_count база отсортирует строки по product_id.

Это особенно важно для тестов, отчётов и задач в SQL-тренажёрах, где ожидается стабильный результат.

LIMIT в PostgreSQL и MySQL

В PostgreSQL и MySQL базовый синтаксис очень похож.

SELECT id, name
FROM products
ORDER BY id
LIMIT 10 OFFSET 20;

Это работает в обеих базах.

В MySQL есть ещё короткая форма:

SELECT id, name
FROM products
ORDER BY id
LIMIT 20, 10;

Она означает: пропусти 20 строк и верни 10.

Но для читаемости новичку лучше привыкать к форме:

LIMIT 10 OFFSET 20

Она понятнее: сначала сколько вернуть, потом сколько пропустить.

В PostgreSQL также есть стандартный SQL-синтаксис:

SELECT id, name
FROM products
ORDER BY id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

Или:

SELECT id, name
FROM products
ORDER BY id
FETCH FIRST 10 ROWS ONLY;

Это более официальная и многословная форма. На практике в PostgreSQL часто пишут проще:

LIMIT 10 OFFSET 20

Для начинающего достаточно уверенно знать LIMIT и OFFSET.

Случайная строка через LIMIT

Иногда хочется получить случайную строку: случайный товар дня, случайный вопрос, случайную задачу.

В PostgreSQL:

SELECT id, name
FROM products
ORDER BY RANDOM()
LIMIT 1;

В MySQL:

SELECT id, name
FROM products
ORDER BY RAND()
LIMIT 1;

Работает красиво: база перемешивает строки случайным образом и берёт первую.

Но есть важный нюанс. На больших таблицах это может быть медленно.

Почему? Потому что базе нужно для каждой строки сгенерировать случайное значение, отсортировать строки по этому значению и только потом взять одну.

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

Большой OFFSET может быть медленным

OFFSET удобен для простой пагинации, но у него есть слабое место.

Запрос:

SELECT id, name
FROM products
ORDER BY id
LIMIT 20 OFFSET 1000000;

выглядит так, будто база должна сразу прыгнуть к строке после миллиона.

Но часто ей всё равно приходится пройти много строк, отсортировать или прочитать их, пропустить первый миллион и только потом вернуть 20.

То есть большой OFFSET может быть дорогим.

Для первых страниц это обычно нормально:

LIMIT 20 OFFSET 0
LIMIT 20 OFFSET 20
LIMIT 20 OFFSET 40

Но для очень глубоких страниц, например OFFSET 500000, запрос может заметно тормозить.

Keyset-пагинация: альтернатива большому OFFSET

Для больших таблиц часто используют keyset-пагинацию. Её ещё называют seek pagination.

Идея простая: вместо «пропусти 100000 строк» мы говорим: «дай следующие строки после последнего значения, которое я уже видел».

Например, первая страница:

SELECT id, name
FROM products
ORDER BY id ASC
LIMIT 20;

Допустим, последний товар на странице имеет id = 120.

Тогда следующая страница:

SELECT id, name
FROM products
WHERE id > 120
ORDER BY id ASC
LIMIT 20;

Так базе не нужно пропускать огромное количество строк через OFFSET. Она может идти дальше от известного ключа.

Для сортировки по дате часто используют пару created_at и id, чтобы порядок был стабильным.

SELECT id, title, created_at
FROM posts
WHERE (created_at, id) < ('2026-01-10 12:00:00', 500)
ORDER BY created_at DESC, id DESC
LIMIT 20;

Такой подход сложнее, чем обычный LIMIT OFFSET, но на больших таблицах часто работает лучше.

Для новичка достаточно понять разницу:

  • OFFSET удобен и прост для обычных страниц;
  • keyset-пагинация лучше подходит для больших лент и глубокого скролла.

LIMIT с UNION

LIMIT можно использовать вместе с UNION, но важно понимать, к чему он применяется.

Например:

SELECT name
FROM authors

UNION

SELECT name
FROM editors

ORDER BY name
LIMIT 10;

Здесь LIMIT 10 применяется ко всему итоговому результату после объединения.

То есть SQL сначала объединит имена авторов и редакторов, затем отсортирует общий список, а потом возьмёт 10 строк.

Если нужно ограничить каждую часть отдельно, используют скобки или подзапросы.

(SELECT name
 FROM authors
 ORDER BY name
 LIMIT 10)

UNION ALL

(SELECT name
 FROM editors
 ORDER BY name
 LIMIT 10);

В таком случае каждая часть сначала берёт свои 10 строк, а потом результаты объединяются.

Это разные задачи:

  • LIMIT в самом конце — ограничить общий результат;
  • LIMIT внутри частей — ограничить каждый отдельный запрос.

LIMIT в UPDATE и DELETE

В обычных SELECT с LIMIT всё просто. Но с UPDATE и DELETE есть отличия между базами.

В MySQL можно написать:

DELETE FROM logs
WHERE created_at < '2024-01-01'
LIMIT 100;

Это удалит не больше 100 строк.

В PostgreSQL такого синтаксиса для DELETE ... LIMIT нет. Обычно используют подзапрос или CTE.

Например, удалить 100 старых логов в PostgreSQL:

WITH rows_to_delete AS (
  SELECT id
  FROM logs
  WHERE created_at < '2024-01-01'
  ORDER BY id
  LIMIT 100
)
DELETE FROM logs
WHERE id IN (
  SELECT id
  FROM rows_to_delete
);

С UPDATE похожая история: в PostgreSQL прямого UPDATE ... LIMIT нет, но можно сначала выбрать нужные id, а потом обновить строки по ним.

WITH rows_to_update AS (
  SELECT id
  FROM tasks
  WHERE status = 'new'
  ORDER BY id
  LIMIT 100
)
UPDATE tasks
SET status = 'processing'
WHERE id IN (
  SELECT id
  FROM rows_to_update
);

Для начинающего главный вывод такой: LIMIT в SELECT есть почти везде, а вот LIMIT в UPDATE и DELETE зависит от конкретной СУБД.

Как читать запрос с LIMIT

Посмотрим на запрос:

SELECT id, title, views
FROM videos
WHERE status = 'published'
ORDER BY views DESC, id ASC
LIMIT 10 OFFSET 20;

Читать его можно так:

«Возьми опубликованные видео, отсортируй их по просмотрам от большего к меньшему, при одинаковых просмотрах — по id. Пропусти первые 20 строк и верни следующие 10».

Это уже не просто набор SQL-слов, а понятная инструкция.

WHERE отвечает за фильтр.

ORDER BY отвечает за порядок.

OFFSET отвечает за то, сколько строк пропустить.

LIMIT отвечает за то, сколько строк вернуть.

Частые ошибки с LIMIT

Использовать LIMIT без ORDER BY и ждать стабильный результат

Плохой вариант:

SELECT id, email
FROM users
LIMIT 10;

Сегодня он может вернуть одни 10 строк, завтра другие. Особенно если таблица меняется, добавляются индексы или база выбирает другой план выполнения.

Если порядок важен, пиши явно:

SELECT id, email
FROM users
ORDER BY id ASC
LIMIT 10;

Делать пагинацию без стабильной сортировки

Плохо:

SELECT id, name
FROM products
ORDER BY popularity DESC
LIMIT 20 OFFSET 20;

Если у товаров одинаковая популярность, порядок между ними может быть нестабильным.

Лучше:

SELECT id, name
FROM products
ORDER BY popularity DESC, id ASC
LIMIT 20 OFFSET 20;

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

Думать, что OFFSET сразу прыгает к нужной строке

Запрос с большим OFFSET может быть медленным.

SELECT id, name
FROM products
ORDER BY id
LIMIT 20 OFFSET 1000000;

Для глубоких страниц лучше подумать о keyset-пагинации.

Путать порядок LIMIT и OFFSET в MySQL

В MySQL есть форма:

LIMIT 20, 10

Она означает: пропустить 20, вернуть 10.

Но это легко перепутать. Поэтому понятнее писать:

LIMIT 10 OFFSET 20

Так сразу видно: вернуть 10, пропустить 20.

Использовать LIMIT для «случайной» строки без RANDOM или RAND

Такой запрос не выбирает случайную строку:

SELECT id, name
FROM products
LIMIT 1;

Он просто возвращает одну строку без гарантированного порядка.

Если нужна случайная строка в PostgreSQL:

SELECT id, name
FROM products
ORDER BY RANDOM()
LIMIT 1;

Если нужна случайная строка в MySQL:

SELECT id, name
FROM products
ORDER BY RAND()
LIMIT 1;

Забывать, что LIMIT режет уже итоговый результат

Например:

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
ORDER BY total_amount DESC
LIMIT 5;

LIMIT здесь берёт 5 клиентов уже после группировки и сортировки, а не 5 исходных заказов.

Это хорошо, если нужен топ клиентов. Но важно понимать, на каком этапе ты ограничиваешь данные.

Главное про LIMIT

LIMIT ограничивает количество строк в результате.

Базовая форма:

SELECT column_1, column_2
FROM table_name
LIMIT 10;

Но почти всегда вместе с LIMIT нужен ORDER BY.

SELECT column_1, column_2
FROM table_name
ORDER BY column_1
LIMIT 10;

Без ORDER BY база не обязана возвращать строки в понятном и стабильном порядке.

OFFSET позволяет пропустить первые строки.

SELECT id, name
FROM products
ORDER BY id
LIMIT 20 OFFSET 40;

Так обычно делают простую пагинацию: страница 3, если на странице 20 строк.

LIMIT полезен для топов, страниц каталога, лент, админок, быстрых проверок и аналитических рейтингов.

На больших значениях OFFSET запросы могут тормозить, потому что базе приходится пропускать много строк. Для больших лент и глубоких страниц часто используют keyset-пагинацию: не «пропусти миллион строк», а «покажи следующие строки после последнего увиденного значения».

Главная мысль простая: LIMIT — это аккуратный способ не тащить из базы весь мир. Но чтобы результат был правильным, ему почти всегда нужен надёжный порядок через ORDER BY.

Закрепи на практике

Решай задачи в SQL-тренажёре с мгновенной проверкой и подсказками.

Открыть тренажёр