Что такое offset в контексте баз данных и SQL?

«Что такое offset в контексте баз данных и SQL?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В SQL OFFSET — это ключевое слово, используемое в предложении LIMIT для указания количества строк, которые нужно пропустить перед началом возврата результатов из запроса. Это основа для реализации постраничной навигации (пагинации).

Синтаксис:

SELECT * FROM `products`
ORDER BY `created_at` DESC
LIMIT 10 OFFSET 20; -- Пропустить 20 строк, вернуть следующие 10

Эквивалентная запись (более распространенная):

SELECT * FROM `products`
ORDER BY `created_at` DESC
LIMIT 20, 10; -- LIMIT offset, row_count (пропустить 20, взять 10)

Практический пример пагинации на PHP/PDO:

$itemsPerPage = 10;
$page = (int) ($_GET['page'] ?? 1);
$offset = ($page - 1) * $itemsPerPage;

$stmt = $pdo->prepare("SELECT id, name, price FROM products LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $itemsPerPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$products = $stmt->fetchAll();

Важные замечания:

  • Производительность: На больших OFFSET (например, 10000) запрос может работать медленно, так как СУБД все равно должна отсчитать пропускаемые строки. Для глубокой пагинации лучше использовать ключи (WHERE id > :last_id).
  • Совместимость: LIMIT X OFFSET Y — стандартный SQL, в то время как LIMIT Y, X — синтаксис MySQL.
  • Использование с ORDER BY: Всегда используйте OFFSET вместе с ORDER BY, иначе порядок строк не гарантирован, и пагинация будет некорректной.