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

ORDER BY и LIMIT / OFFSET

Содержание курса

Фиксированный порядок предложений: SELECT … FROM … WHERE … ORDER BY … LIMIT … OFFSET

SQL — декларативный язык: вы описываете, что хотите получить, а не как именно это вычислить. Но синтаксис жёстко фиксирует, в каком порядке должны стоять предложения запроса. Нарушение порядка немедленно даёт синтаксическую ошибку — парсер просто не распознаёт конструкцию.

Правильная последовательность:

SELECTFROMWHEREORDER BY …
LIMIT   …
OFFSET

Выше показан синтаксический порядок записи предложений. Упрощённая логическая модель обработки выглядит иначе:

  1. FROM определяет источник строк.
  2. WHERE отбирает строки.
  3. SELECT формирует столбцы результата.
  4. ORDER BY упорядочивает результат.
  5. OFFSET / LIMIT пропускают начало и ограничивают число строк.

Это модель для чтения запроса, а не буквальный физический план: оптимизатор может переставлять операции, сохраняя результат. Написать ORDER BY перед WHERE нельзя из-за грамматики SQL.

Попробуйте мысленно переставить LIMIT перед ORDER BY:

-- Неверно: так написать нельзя, будет ошибка
SELECT title, price FROM products LIMIT 5 ORDER BY price;

Даже если бы синтаксис это допускал, смысл стал бы другим: LIMIT взял бы пять произвольных строк, и только потом их отсортировали. Результат — не «пять самых дешёвых», а «пять случайных, упорядоченных по цене».

В запросах к таблице используется FROM, а WHERE и ORDER BY необязательны. SQLite также допускает SELECT без FROM, когда нужно вычислить выражение или вернуть константу, например SELECT 1;. Но если оба присутствуют, WHERE всегда идёт первым. Запрос без WHERE, но с ORDER BY корректен: СУБД просто сортирует все строки таблицы.

Практический ориентир: когда пишете запрос, двигайтесь сверху вниз — сначала FROM (откуда), затем WHERE (какие строки), затем ORDER BY (в каком порядке), затем LIMIT/OFFSET (сколько и с какого места).