LIMIT — это команда «верни мне не больше N строк». Простая и невероятно полезная.
Представь, что в таблице 50 000 видео. Когда ты открываешь YouTube, тебе не показывают все 50 000 — на главной ты видишь только 12-20 рекомендаций. Это и есть LIMIT. То же самое для пагинации в e-commerce, лидербордов в играх, фидов в соцсетях, превью в админке.
Зачем нужен LIMIT
Три классических сценария:
- Топ-N: топ-10 продаж за неделю, топ-3 поста по лайкам.
- Пагинация: «страница 2 из 100», по 20 товаров на страницу.
- Превью / 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, фичи дня и так далее):
SELECT * FROM products ORDER BY RANDOM() LIMIT 1;
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-пагинация.
LIMIT— это команда «верни мне не больше N строк». Простая и невероятно полезная.Представь, что в таблице 50 000 видео. Когда ты открываешь YouTube, тебе не показывают все 50 000 — на главной ты видишь только 12-20 рекомендаций. Это и есть
LIMIT. То же самое для пагинации в e-commerce, лидербордов в играх, фидов в соцсетях, превью в админке.Зачем нужен LIMIT
Три классических сценария:
Без
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
Запрос: топ-3 самых просматриваемых.
SELECT title, views FROM videos ORDER BY views DESC LIMIT 3;Результат:
Из семи строк осталось три. Те, что выше всех по
views.OFFSET — пропустить первые N строк
Парный с
LIMITоператор —OFFSET. Он пропускает N строк перед тем, как начать возвращать.SELECT title, views FROM videos ORDER BY views DESC LIMIT 3 OFFSET 3;Переводится как: «отсортируй по
viewsубывающее, пропусти 3 строки, верни следующие 3».Результат для нашей таблицы (4-6 место по просмотрам):
Это и есть пагинация. Страница 1 —
LIMIT 3 OFFSET 0. Страница 2 —LIMIT 3 OFFSET 3. Страница 3 —LIMIT 3 OFFSET 6.Формула пагинации:
LIMIT page_size OFFSET (page_number - 1) * page_sizePostgreSQL и MySQL — синтаксис почти одинаковый
И PostgreSQL, и MySQL понимают
LIMIT NиLIMIT N OFFSET M. Вот короткие отличия:LIMIT M, N— пропусти M, верни N. Считается легаси, лучше использоватьLIMIT N OFFSET M.FETCH FIRST 10 ROWS ONLY(вместоLIMIT 10) иOFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Многословно, но это часть стандарта SQL:2008. На практике чаще пишут простоLIMIT/OFFSET.Для начинающих: запомни
LIMIT N OFFSET M— работает в обеих БД.Большой пример: пагинация интернет-магазина
Таблица
products:Задача: показать страницу 2 (по 4 товара на страницу), сортировка по популярности.
SELECT id, name, popularity FROM products ORDER BY popularity DESC LIMIT 4 OFFSET 4;Результат:
Страница 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— иначе порядок непредсказуем.