ORDER BY и LIMIT / OFFSET
Содержание курса
LIMIT и OFFSET: ограничение и пропуск строк, предсказуемость результата
ORDER BY определяет порядок — LIMIT говорит, сколько строк из этого порядка вернуть.
SELECT product_id, title, price
FROM products
ORDER BY price DESC, product_id ASC
LIMIT 3;
Запрос вернёт не более трёх строк. Если товаров как минимум три, это будут три самых дорогих товара. СУБД сначала сортирует весь результат, потом отрезает всё, кроме первых трёх строк.
Теперь о важном ограничении: LIMIT без ORDER BY — ловушка. Если порядок строк не зафиксирован, СУБД выберет любые три строки, и какие именно — зависит от внутреннего устройства хранилища, которое вы не контролируете. Два одинаковых запроса в разные моменты могут вернуть разный набор. Поэтому правило простое: если LIMIT нужен для конкретного отбора (топ-5, самый свежий, три самых дешёвых), ORDER BY обязателен.
OFFSET дополняет LIMIT: он говорит, сколько строк пропустить перед тем, как начать возвращать результат.
SELECT product_id, title, price
FROM products
ORDER BY price DESC, product_id ASC
LIMIT 3 OFFSET 3;
Здесь СУБД сортирует все строки по убыванию цены, пропускает первые три (строки 1–3) и возвращает следующие три (строки 4–6). Именно на этом строится постраничный вывод: каждая страница — это окно фиксированного размера, сдвинутое на нужное число строк. Второй критерий product_id ASC нужен для товаров с одинаковой ценой: уникальный идентификатор полностью определяет их взаимный порядок. Без такого критерия строки с равным price могут менять места и попадать на соседние страницы.
Формула смещения для произвольной страницы:
OFFSET = (номер_страницы - 1) × размер_страницы
При размере страницы 10 строк:
- страница 1:
LIMIT 10 OFFSET 0 - страница 2:
LIMIT 10 OFFSET 10 - страница 5:
LIMIT 10 OFFSET 40
OFFSET 0 — это то же самое, что не писать OFFSET вовсе, поэтому для первой страницы его обычно опускают.
Один нюанс: OFFSET не делает запрос быстрее — СУБД всё равно просматривает и отбрасывает первые m строк. При очень больших значениях OFFSET это заметно по скорости, но для начального уровня важнее понять сам механизм.

