Как вывести не более трех сотрудников?
Что проверяют
Базовый SQL, которым тестировщик пользуется каждый день: заглянуть в таблицу и проверить, что записалось. Настоящий вопрос спрятан во второй половине: каких именно трёх сотрудников вы получите. Следом обычно просят «трёх самых высокооплачиваемых» или «по три из каждого отдела».
Как отвечать
Синтаксис ограничения зависит от СУБД, и хорошо показать, что вы это знаете:
LIMIT 3: PostgreSQL, MySQL, SQLite, ClickHouse;FETCH FIRST 3 ROWS ONLY: стандарт SQL, работает в PostgreSQL, Oracle начиная с 12c и SQL Server в связке сOFFSET;SELECT TOP 3: SQL Server;ROWNUM <= 3: старый Oracle. Номер присваивается до сортировки, поэтому сORDER BYзапрос оборачивают в подзапрос.
Главное дальше: без ORDER BY порядок строк не гарантирован. База вернёт те три, что прочитала первыми, и после VACUUM, вставки или смены плана это будут уже другие строки. Для проверки, которую прогоняют повторно, это нестабильный результат. Поэтому пишите ORDER BY salary DESC, id LIMIT 3: второй ключ сортировки делает порядок однозначным при равных зарплатах.
Слово «не более» тоже стоит заметить: если в таблице две записи, запрос вернёт две и не упадёт. Если нужно включить всех, кто делит третье место, есть FETCH FIRST 3 ROWS WITH TIES в PostgreSQL 13+ и Oracle и TOP 3 WITH TIES в SQL Server. «По три на отдел» решается оконной функцией ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) и фильтром <= 3.
Для QA добавьте практику: LIMIT с OFFSET это ровно то, как бэкенд отдаёт страницы списка, и на границах страниц (пустая, неполная последняя, дубли при сортировке по неуникальному полю) баги ловятся чаще всего.
Где спотыкаются
Пишут LIMIT 3 без ORDER BY и считают, что получат «первых трёх». Тест, построенный на таком запросе, начинает мигать.
Сортируют по неуникальному полю, например по имени, и удивляются, что при равных значениях строки меняются местами между прогонами.
Знают только LIMIT и теряются, когда на проекте SQL Server или Oracle. Хватит сказать, что синтаксис отличается, и назвать аналог.