📥 Гайд по LIMIT и OFFSET
Когда вы работаете с большими таблицами, часто не нужны все строки сразу. Например, вы хотите:
➖ показать топ-10 самых дорогих товаров,
➖ вывести последние 20 заказов,
➖ сделать постраничную навигацию в приложении.
➖ вам просто лень писать фильтры, ведь для анализа/оценки хватит n-строк таблицы. НО учтите что будет полное сканирование таблицы!
Для этого в SQL есть два оператора (точнее clauses): LIMIT и OFFSET.
📥 LIMIT — сколько строк выбрать.
LIMIT ограничивает количество строк, которое вернёт запрос.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5; -- берём только 5 самых дорогих товаров
Что происходит:
➖ ORDER BY price DESC — сортируем товары по убыванию цены.
➖ LIMIT 5 — берём только первые 5 строк после сортировки.
📥 Советы:
➖ Без ORDER BY LIMIT вернёт произвольные строки — на больших таблицах результат может быть сомнительным.
➖ LIMIT экономит ресурсы: не нужно считывать все данные, когда вам нужны только несколько строк.
📥 OFFSET — с какой строки начать.
OFFSET пропускает указанное количество строк перед выборкой.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5 OFFSET 5; -- берём строки с 6 по 10
Что происходит:
➖ Сортируем товары по цене (ORDER BY price DESC).
➖ Пропускаем первые 5 строк (OFFSET 5).
➖ Берём следующие 5 строк (LIMIT 5).
🪙 Практическое применение: пагинация
LIMIT + OFFSET идеально подходят для страниц сайта или приложения (бэк UI), но можно юзать и при подготовке отчетности, если ложиться в условия ее формирования.
-- Страница 1
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 0;
-- Страница 2
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 20;
-- Страница 3
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 40;
Каждый раз вы берёте новую порцию данных без лишней нагрузки на базу.
🪙 Стоит упомянуть:
Случайные строки с LIMIT.
Чтобы взять случайные строки из таблицы:
SELECT *
FROM users
ORDER BY RANDOM() -- в разных СУБД отличается
LIMIT 5;
LIMIT в подзапросах.
Можно использовать LIMIT для выборки топ-N в подзапросах:
SELECT *
FROM users
WHERE id IN (
SELECT id
FROM users
ORDER BY created_at DESC
LIMIT 10
);
Всегда используйте ORDER BY с LIMIT. Иначе “первые N” строки могут быть случайными.
🪙 Итог
LIMIT n — Берёт первые n строк
OFFSET m — Пропускает первые m строк
LIMIT n OFFSET m — Берёт n строк, пропустив первые m
Запомните: LIMIT — сколько строк грузить, OFFSET — с какой строки грузить.
#SQL #LIMIT #OFFSET
📱 Подписаться на канал
💻 Курс автора по SQL DDL
🌎 Мой ИТ-стартап
Когда вы работаете с большими таблицами, часто не нужны все строки сразу. Например, вы хотите:
➖ показать топ-10 самых дорогих товаров,
➖ вывести последние 20 заказов,
➖ сделать постраничную навигацию в приложении.
➖ вам просто лень писать фильтры, ведь для анализа/оценки хватит n-строк таблицы. НО учтите что будет полное сканирование таблицы!
Для этого в SQL есть два оператора (точнее clauses): LIMIT и OFFSET.
📥 LIMIT — сколько строк выбрать.
LIMIT ограничивает количество строк, которое вернёт запрос.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5; -- берём только 5 самых дорогих товаров
Что происходит:
➖ ORDER BY price DESC — сортируем товары по убыванию цены.
➖ LIMIT 5 — берём только первые 5 строк после сортировки.
📥 Советы:
➖ Без ORDER BY LIMIT вернёт произвольные строки — на больших таблицах результат может быть сомнительным.
➖ LIMIT экономит ресурсы: не нужно считывать все данные, когда вам нужны только несколько строк.
📥 OFFSET — с какой строки начать.
OFFSET пропускает указанное количество строк перед выборкой.
Пример:
SELECT *
FROM products
ORDER BY price DESC
LIMIT 5 OFFSET 5; -- берём строки с 6 по 10
Что происходит:
➖ Сортируем товары по цене (ORDER BY price DESC).
➖ Пропускаем первые 5 строк (OFFSET 5).
➖ Берём следующие 5 строк (LIMIT 5).
🪙 Практическое применение: пагинация
LIMIT + OFFSET идеально подходят для страниц сайта или приложения (бэк UI), но можно юзать и при подготовке отчетности, если ложиться в условия ее формирования.
-- Страница 1
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 0;
-- Страница 2
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 20;
-- Страница 3
SELECT * FROM orders ORDER BY order_date DESC LIMIT 20 OFFSET 40;
Каждый раз вы берёте новую порцию данных без лишней нагрузки на базу.
🪙 Стоит упомянуть:
Случайные строки с LIMIT.
Чтобы взять случайные строки из таблицы:
SELECT *
FROM users
ORDER BY RANDOM() -- в разных СУБД отличается
LIMIT 5;
LIMIT в подзапросах.
Можно использовать LIMIT для выборки топ-N в подзапросах:
SELECT *
FROM users
WHERE id IN (
SELECT id
FROM users
ORDER BY created_at DESC
LIMIT 10
);
Всегда используйте ORDER BY с LIMIT. Иначе “первые N” строки могут быть случайными.
🪙 Итог
LIMIT n — Берёт первые n строк
OFFSET m — Пропускает первые m строк
LIMIT n OFFSET m — Берёт n строк, пропустив первые m
Запомните: LIMIT — сколько строк грузить, OFFSET — с какой строки грузить.
#SQL #LIMIT #OFFSET
📱 Подписаться на канал
💻 Курс автора по SQL DDL
🌎 Мой ИТ-стартап