LIMIT и OFFSET
Ограничение количества строк а результате
Теория
Иногда запрос возвращает очень много строк. Таблица большая, данных много, а вам сейчас нужно быстро посмотреть только небольшой фрагмент результата. Например, 5 самых дорогих товаров, 3 последних заказа или просто первые несколько строк таблицы.
Для этого в PostgreSQL существует оператор LIMIT. Он ограничивает количество строк в результате на указанное вами значение. Важный нюанс: LIMIT сам не решает, какие именно строки попадут в выдачу. Он только обрезает результат и выдает указанное количество первых попавшихся строк. Поэтому на практике LIMIT часто используют вместе с ORDER BY. Сначала вы определяете порядок строк, потом говорите СУБД, сколько строк взять сверху.
OFFSET нужен в другой ситуации: когда надо не просто взять первые строки, а сначала пропустить часть результата. Это удобно, когда вы смотрите данные не с самого начала:
• сначала отсортировали данные;
• потом пропустили первые 10 строк через OFFSET 10;
• затем взяли следующие 10 строк через LIMIT 10.
Для более простого запоминания:
• LIMIT — сколько строк показать;
• OFFSET — сколько строк пропустить перед этим.
Для этого в PostgreSQL существует оператор LIMIT. Он ограничивает количество строк в результате на указанное вами значение. Важный нюанс: LIMIT сам не решает, какие именно строки попадут в выдачу. Он только обрезает результат и выдает указанное количество первых попавшихся строк. Поэтому на практике LIMIT часто используют вместе с ORDER BY. Сначала вы определяете порядок строк, потом говорите СУБД, сколько строк взять сверху.
OFFSET нужен в другой ситуации: когда надо не просто взять первые строки, а сначала пропустить часть результата. Это удобно, когда вы смотрите данные не с самого начала:
• сначала отсортировали данные;
• потом пропустили первые 10 строк через OFFSET 10;
• затем взяли следующие 10 строк через LIMIT 10.
Для более простого запоминания:
• LIMIT — сколько строк показать;
• OFFSET — сколько строк пропустить перед этим.
Синтаксис
SELECT column1, column2, ...
FROM table_name
ORDER BY sort_column
LIMIT n [OFFSET m];
SQL
LIMIT и OFFSET пишутся в самом конце запроса, после ORDER BY.
Сначала идёт LIMIT — сколько строк вернуть. После него можно указать OFFSET — сколько строк пропустить. Но в PostgreSQL можно менять эти ключевые слова местами без влияния на результат.
Например:
• LIMIT 5 — взять только первые 5 строк результата;
• LIMIT 5 OFFSET 5 — пропустить первые 5 и взять следующие 5.
Если OFFSET не указан, LIMIT начинает с первой строки. Если ORDER BY не указан, то «первые строки» могут быть непредсказуемыми, потому что порядок результата не зафиксирован.
Сначала идёт LIMIT — сколько строк вернуть. После него можно указать OFFSET — сколько строк пропустить. Но в PostgreSQL можно менять эти ключевые слова местами без влияния на результат.
Например:
• LIMIT 5 — взять только первые 5 строк результата;
• LIMIT 5 OFFSET 5 — пропустить первые 5 и взять следующие 5.
Если OFFSET не указан, LIMIT начинает с первой строки. Если ORDER BY не указан, то «первые строки» могут быть непредсказуемыми, потому что порядок результата не зафиксирован.
Примеры
1. Пять самых дорогих товаров
Сначала отсортируем товары по цене от большей к меньшей, а потом оставляем только первые 5 строк. Именно так LIMIT обычно и применяется в работе.
🔄 Попробуйте изменить запрос:
- • Поменяйте LIMIT 5 на LIMIT 10
- • Попробуйте убрать сортировку
2. Три самых новых пользователя по дате регистрации
Здесь логика та же самая: сначала фиксируем порядок по дате регистрации, затем выбираем только верхнюю часть результата.
🔄 Попробуйте изменить запрос:
- • Увеличьте количество строк: LIMIT 7
- • Попробуйте сортировку по возрастанию даты: registration_date ASC
3. Пропускаем первые 5 товаров и смотрим следующие
Добавляем OFFSET. Сначала товары сортируются по названию, потом SQL пропускает первые 5 строк и показывает следующие 5.
🔄 Попробуйте изменить запрос:
- • Уберите OFFSET 5 и сравните результат
- • Замените OFFSET 5 на OFFSET 10
4. Берём несколько строк после более точной сортировки
Здесь LIMIT применяется после сортировки по двум столбцам. Сначала заказы упорядочиваются по статусу, а внутри статуса — по дате от более поздней к более ранней. Потом SQL оставляет только первые 4 строки.
🔄 Попробуйте изменить запрос:
- • Поменяйте LIMIT 4 на LIMIT 8
- • Уберите первый столбец из сортировки и сравните результат
Типичные ошибки
Используют LIMIT без ORDER BY, когда нужен конкретный набор строк
Если порядок не зафиксирован, то «первые 5 строк» — это просто какие-то первые 5 строк, а не обязательно самые новые, самые дорогие или самые важные.
Путают роль LIMIT и OFFSET
LIMIT отвечает за количество возвращаемых строк, а OFFSET — за количество пропущенных строк перед этим.
Думают, что OFFSET 10 означает «взять 10 строк»
Нет. Это значит «пропустить первые 10 строк результата». Количество строк по-прежнему задаёт только LIMIT.
Практика
Проверь себя
Ответьте на вопросы, чтобы закрепить материал:
1
Есть запрос: SELECT product_name, price FROM products LIMIT 5; Что он вернёт?
2
Что делает OFFSET в запросе?
3
Сколько строк вернёт запрос с LIMIT 7 OFFSET 14, если строк в результате достаточно много? (введите число)
4
Напишите запрос, который выведет department_name из таблицы departments в алфавитном порядке и покажет только первые 4 строки.
5
Есть запрос: SELECT first_name, city FROM users ORDER BY first_name ASC LIMIT 5 OFFSET 5; Что он сделает?
6
Почему запрос SELECT order_id, order_date FROM orders LIMIT 3; нельзя считать запросом на «три последних заказа»?
7
Напишите запрос, который выведет worker_id, first_name, salary из таблицы workers, отсортирует сотрудников по зарплате от большей к меньшей и пропустит первые 3 строки, чтобы показать следующие 4.
8
Какой вариант правильно записывает идею: «покажи 6 строк после первых 12»?