Как вывести первые десять значений в SQL
Что проверяют
Базовое владение SQL и понимание, что у таблицы нет «первых» строк, пока вы не задали порядок. Тестировщику это нужно каждый день: посмотреть последние созданные заказы, проверить пагинацию, найти тестовые данные. Следом часто просят вывести вторую десятку или топ по каждой группе.
Как отвечать
Сразу уточните, что значит «первые»: по дате создания, по id, по сумме. Потом синтаксис с поправкой на СУБД:
LIMIT 10: PostgreSQL, MySQL, SQLite, ClickHouse. Например,SELECT * FROM orders ORDER BY created_at DESC LIMIT 10;FETCH FIRST 10 ROWS ONLY: вариант из стандарта SQL, работает в PostgreSQL и в Oracle начиная с 12c;TOP 10: SQL Server, пишется сразу послеSELECT. Там же естьOFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY, но только вместе сORDER BY;ROWNUM <= 10: старый способ в Oracle, с оговоркой ниже.
Вторая десятка это LIMIT 10 OFFSET 10. Стоит сказать, что большой OFFSET медленный: база всё равно читает и отбрасывает пропущенные строки, поэтому в продукте часто делают курсорную пагинацию через WHERE id > :last_id.
Если по значению бывают ничьи, упомяните WITH TIES: десятое место делят три строки, и вернутся все три. Топ-N внутри группы решается оконной функцией: ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) в подзапросе и фильтр по номеру снаружи.
Для QA добавьте, как это идёт в тесты: при сортировке по неуникальной колонке строки не должны дублироваться и теряться между страницами.
Где спотыкаются
Пишут LIMIT без ORDER BY и считают результат стабильным. Порядок не гарантирован и меняется после обновлений строк или смены плана запроса.
В Oracle ставят WHERE ROWNUM <= 10 и ORDER BY в один запрос. ROWNUM назначается до сортировки, и вы получаете десять случайных строк, отсортированных между собой.
Путают порядок частей запроса и ставят LIMIT перед ORDER BY или WHERE, после чего запрос просто не выполняется.