ORDER BY и LIMIT / OFFSET
Содержание курса
Фиксированный порядок предложений: SELECT … FROM … WHERE … ORDER BY … LIMIT … OFFSET
SQL — декларативный язык: вы описываете, что хотите получить, а не как именно это вычислить. Но синтаксис жёстко фиксирует, в каком порядке должны стоять предложения запроса. Нарушение порядка немедленно даёт синтаксическую ошибку — парсер просто не распознаёт конструкцию.
Правильная последовательность:
SELECT …
FROM …
WHERE …
ORDER BY …
LIMIT …
OFFSET …
Выше показан синтаксический порядок записи предложений. Упрощённая логическая модель обработки выглядит иначе:
- FROM определяет источник строк.
- WHERE отбирает строки.
- SELECT формирует столбцы результата.
- ORDER BY упорядочивает результат.
- 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 (сколько и с какого места).
