Основы выборки: SELECT, фильтрация и сортировка

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 это заметно по скорости, но для начального уровня важнее понять сам механизм.

Анимация сортировки товаров по цене по убыванию и последующего ограничения результата тремя строками через LIMIT
ORDER BY выполняется до LIMIT