Вы делаете пагинацию так: SELECT product_id FROM products LIMIT 20 OFFSET 20. В чём главный риск такого подхода для аналитической витрины/интерфейса, если нет ORDER BY?
AЗапрос обязательно вернёт пустой результат, потому что
OFFSET нельзя использовать без ORDER BYB
OFFSET считает строки с 1, поэтому будет пропущена 21-я строкаCПорядок строк не определён, поэтому страницы могут пересекаться или «скакать» между запросами
D
LIMIT и OFFSET игнорируются, если не указать WHEREПравильный ответ.
LIMIT/OFFSET зависят от порядка строк, поэтому без ORDER BY страницы не стабильны.Разбор
OFFSET означает «пропусти N первых строк», но понятие «первых» появляется только при заданном порядке. Без ORDER BY СУБД не обязана возвращать строки в одном и том же порядке, поэтому при повторных запросах вы можете увидеть дубликаты на разных страницах или пропуски. Для стабильной пагинации нужен явный ORDER BY (и желательно детерминированный).
Проверь себя · 1/3разбор после ответа
Нужно вывести только оплаченные заказы (
status = 'paid') и отсортировать их по времени создания от новых к старым. Какой запрос соответствует задаче?Ещё вопросы по теме «Основы SQL-запросов»
- В таблице `users` нужно выбрать только активных пользователей из России или Казахстана. Какой `WHERE` соответствует требованию?
- Для отчёта по регистрациям вам нужны только `user_id` и `signup_at` из таблицы `users`. Какой запрос лучше соответствует задаче и не тянет лишние поля?
- Нужно получить 20 самых новых событий из таблицы `events` (по времени `event_time`) и показать их в выдаче сверху. Какой запрос верный?
- Вы строите выдачу «последние заказы» и используете `LIMIT 50`. Поле `created_at` не уникально (много заказов в одну секунду). Какой `ORDER BY` лучше, чтобы порядок был детерминированным?
- Что можно корректно утверждать про результат запроса `SELECT user_id FROM users LIMIT 10`, если в запросе нет `ORDER BY`?
- Все вопросы по «Основы SQL-запросов» →