SQLLIMITtutorialbeginner

Что такое LIMIT в SQL? Ограничение количества строк для начинающих

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

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

LIMIT — это команда «верни мне не больше N строк». Простая и невероятно полезная.

Представь, что в таблице 50 000 видео. Когда ты открываешь YouTube, тебе не показывают все 50 000 — на главной ты видишь только 12-20 рекомендаций. Это и есть LIMIT. То же самое для пагинации в e-commerce, лидербордов в играх, фидов в соцсетях, превью в админке.

Зачем нужен LIMIT

Три классических сценария:

  1. Топ-N: топ-10 продаж за неделю, топ-3 поста по лайкам.
  2. Пагинация: «страница 2 из 100», по 20 товаров на страницу.
  3. Превью / sanity-check: при отладке хочется глянуть первые 5 строк, чтобы понять структуру.

Без LIMIT запрос вернёт всё. На больших таблицах это:

  • Долго — миллионы строк через сеть.
  • Ненужно — пользователю всё равно столько не покажешь.
  • Опасно — приложение может упасть от нехватки памяти.

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

SELECT *
FROM таблица
LIMIT N;

Пример: стриминговый сервис, таблица videos.

SELECT title, views
FROM videos
LIMIT 5;

Вернёт первые 5 строк. Какие именно — без ORDER BY непредсказуемо. База берёт «как лежит».

Почти всегда LIMIT идёт с ORDER BY

Если тебя интересует «топ-5 по просмотрам», LIMIT без сортировки даст случайные 5 строк. Нужно явно сказать порядок:

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

Теперь это «5 самых просматриваемых видео». Сначала база сортирует, потом обрезает.

Запомни правило: LIMIT без ORDER BY имеет смысл только в трёх случаях — превью при разработке, выборка случайной строки (через ORDER BY RANDOM()), отладка. Во всех остальных случаях — пиши ORDER BY.

Пример: стриминг, таблица videos

id title author views likes
1 Учим SQL за 30 минут Code Academy 250000 12000
2 Котики компилируют код Funny Devs 1200000 95000
3 Разбор JOIN на пальцах DB Guru 80000 4500
4 Рецепт борща от программиста Tech Cooks 30000 1800
5 10 ошибок в SELECT DB Guru 150000 8900
6 Топ React-хуков 2024 Web Dev 500000 25000
7 История Linux OS Lessons 90000 5500

Запрос: топ-3 самых просматриваемых.

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

Результат:

title views
Котики компилируют код 1200000
Топ React-хуков 2024 500000
Учим SQL за 30 минут 250000

Из семи строк осталось три. Те, что выше всех по views.

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

Парный с LIMIT оператор — OFFSET. Он пропускает N строк перед тем, как начать возвращать.

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

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

Результат для нашей таблицы (4-6 место по просмотрам):

title views
Учим SQL за 30 минут 250000
10 ошибок в SELECT 150000
История Linux 90000

Это и есть пагинация. Страница 1 — LIMIT 3 OFFSET 0. Страница 2 — LIMIT 3 OFFSET 3. Страница 3 — LIMIT 3 OFFSET 6.

Формула пагинации:

LIMIT page_size OFFSET (page_number - 1) * page_size

PostgreSQL и MySQL — синтаксис почти одинаковый

И PostgreSQL, и MySQL понимают LIMIT N и LIMIT N OFFSET M. Вот короткие отличия:

  • MySQL дополнительно поддерживает короткую форму LIMIT M, N — пропусти M, верни N. Считается легаси, лучше использовать LIMIT N OFFSET M.
  • PostgreSQL также понимает SQL-стандартный синтаксис: FETCH FIRST 10 ROWS ONLY (вместо LIMIT 10) и OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Многословно, но это часть стандарта SQL:2008. На практике чаще пишут просто LIMIT/OFFSET.

Для начинающих: запомни LIMIT N OFFSET M — работает в обеих БД.

Большой пример: пагинация интернет-магазина

Таблица products:

id name category price popularity
1 iPhone 15 Электроника 90000 980
2 Чайник Bosch Бытовая 4500 320
3 Книга «Чистый код» Книги 2000 850
4 Кофеварка DeLonghi Бытовая 35000 410
5 MacBook Air Электроника 130000 920
6 Книга «SQL за месяц» Книги 1500 670
7 Pixel 8 Электроника 75000 740
8 Холодильник LG Бытовая 65000 280
9 Мульти­варка Бытовая 8000 560
10 Книга «JavaScript» Книги 1800 510

Задача: показать страницу 2 (по 4 товара на страницу), сортировка по популярности.

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

Результат:

id name popularity
7 Pixel 8 740
6 Книга «SQL за месяц» 670
9 Мульти­варка 560
10 Книга «JavaScript» 510

Страница 1 (товары 1-4 по популярности): iPhone 15, MacBook Air, Книга «Чистый код», Pixel 8 — но Pixel 8 уже на странице 2 в нашем результате, потому что мы сортировали и брали средние позиции. Полная пагинация: первая страница OFFSET 0, вторая OFFSET 4, третья OFFSET 8.

Случайная выборка

Комбо для рандомной строки (полезно для daily-task, фичи дня и так далее):

-- PostgreSQL
SELECT * FROM products ORDER BY RANDOM() LIMIT 1;

-- MySQL
SELECT * FROM products ORDER BY RAND() LIMIT 1;

Внимание: на больших таблицах RANDOM() / RAND() тяжёлый — база должна сгенерить случайное число для каждой строки и отсортировать. Для маленьких таблиц ОК, для миллионных — лучше другие подходы (например, WHERE id = ROUND(RANDOM() * (SELECT MAX(id) FROM products))).

Частые ошибки новичков

1. LIMIT без ORDER BY и ожидание определённого порядка. Думают «база ведь возвращает в порядке вставки». Не возвращает. Нужен порядок — пиши ORDER BY.

2. Пагинация без ORDER BY. Самый коварный баг. Без сортировки страница 2 может содержать строки со страницы 1, и пользователь увидит дубликаты. Всегда сортируй по уникальной колонке (например, по id).

3. OFFSET на огромных значениях. OFFSET 1000000 заставляет базу сгенерировать миллион строк, а потом выкинуть их. Это медленно. На больших таблицах вместо OFFSET-пагинации используют keyset-пагинацию: WHERE id > последний_id_предыдущей_страницы LIMIT N.

4. LIMIT с UNION. Если хочешь применить LIMIT ко всему результату UNION — нужны скобки или ORDER BY/LIMIT в самом конце:

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

5. Отрицательный LIMIT или LIMIT 0. LIMIT 0 валидно, вернёт 0 строк (иногда полезно для проверки структуры запроса без получения данных). Отрицательные числа — ошибка.

6. LIMIT в UPDATE/DELETE — не во всех БД. В MySQL можно UPDATE … LIMIT 100, в PostgreSQL такого синтаксиса нет — нужно использовать подзапрос или CTE.

Мини-резюме

  • LIMIT N — вернуть не больше N строк.
  • OFFSET M — пропустить M строк перед началом.
  • Почти всегда идёт в паре с ORDER BY — иначе порядок непредсказуем.
  • Используется для топ-N, пагинации, превью.
  • В обеих популярных БД (PostgreSQL, MySQL) синтаксис одинаковый.
  • На больших OFFSET — медленно, лучше keyset-пагинация.

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

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

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