SQL собеседование: вопросы и задачи с разбором
SQL собеседование обычно проверяет не только знание синтаксиса, но и способность построить запрос и объяснить ход решения. В задачах часто приходится сочетать JOIN, группировки, подзапросы и оконные функции.
Обновлено · Команда SQL Arena
Что потренируете
- Решать top-N внутри каждой группы
- Искать второй максимум без хрупких решений
- Находить дубли и отсутствующие связанные строки
- Работать с последовательностями и разрывами дат
- Писать запрос под ограничение времени
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
Для каждого отдела региона North выведите двух сотрудников с наибольшей зарплатой. Верните department_name, employee_name и salary. Если зарплаты совпадают, порядок должен определяться employee_id.
WITH ranked AS ( SELECT e.*, ROW_NUMBER() OVER ( PARTITION BY department_id ORDER BY salary DESC, employee_id ) AS rn FROM employees e ) SELECT d.department_name, r.employee_name, r.salary FROM ranked r JOIN departments d ON d.id = r.department_id WHERE d.region = 'North' AND r.rn <= 2 ORDER BY d.department_name, r.rn;
| # | department_name | employee_name | salary |
|---|---|---|---|
| 1 | Analytics | Noah | 108000 |
| 2 | Analytics | Liam | 99000 |
| 3 | Platform | Emma | 115000 |
| 4 | Platform | Sofia | 104000 |
Для каждого отдела региона North выведите двух сотрудников с наибольшей зарплатой. Верните department_name, employee_name и salary. Если зарплаты совпадают, порядок должен определяться employee_id.
WITH ranked AS ( SELECT e.*, ROW_NUMBER() OVER ( PARTITION BY department_id ORDER BY salary DESC, employee_id ) AS rn FROM employees e ) SELECT d.department_name, r.employee_name, r.salary FROM ranked r JOIN departments d ON d.id = r.department_id WHERE d.region = 'North' AND r.rn <= 2 ORDER BY d.department_name, r.rn;
SQL задача с собеседования: пошаговый разбор
Главная ловушка здесь — формулировка «для каждого отдела». Обычный ORDER BY salary DESC LIMIT 2 найдёт двух сотрудников во всей таблице, а не двух внутри каждого отдела. Поэтому сначала нужна нумерация строк отдельно для каждой группы. ROW_NUMBER() с PARTITION BY department_id запускает счётчик заново при переходе к следующему отделу.
Внутри окна строки сортируются по salary DESC, поэтому сотрудник с самой высокой зарплатой получает rn = 1, следующий — rn = 2. employee_id добавлен вторым ключом сортировки. Без него две одинаковые зарплаты могли бы получать порядок, который запрос явно не определяет. После CTE уже можно оставить строки с rn <= 2.
JOIN с departments нужен для названия отдела и фильтра region = 'North'. Внешний ORDER BY сортирует готовый ответ сначала по department_name, затем по вычисленному номеру внутри отдела. Получаются четыре строки: по два сотрудника для Analytics и Platform. Этот паттерн регулярно полезен в SQL interview practice, потому что проверяет и оконную функцию, и понимание уровня, на котором должно применяться ограничение.
Вопросы на SQL собеседовании удобно разделять на два типа. Теоретические проверяют понимание JOIN, NULL, GROUP BY, индексов, подзапросов и других концепций. Практические задачи требуют написать запрос по схеме таблиц и условию. В сложных SQL задачах с собеседований часто недостаточно одной конструкции: например, сначала нужно пронумеровать строки оконной функцией, затем отфильтровать результат или соединить его с другой таблицей. Важно уметь не только получить ответ, но и объяснить, почему запрос работает именно так.
WITH ranked AS ( SELECT e.*, ROW_NUMBER() OVER ( PARTITION BY department_id ORDER BY salary DESC, employee_id ) AS rn FROM employees e ) SELECT d.department_name, r.employee_name, r.salary FROM ranked r JOIN departments d ON d.id = r.department_id WHERE d.region = 'North' AND r.rn <= 2 ORDER BY d.department_name, r.rn;
| department_name | employee_name | salary |
|---|---|---|
| Analytics | Noah | 108000 |
| Analytics | Liam | 99000 |
| Platform | Emma | 115000 |
| Platform | Sofia | 104000 |
Типичные ошибки в SQL задачах на собеседовании
LIMIT применяется ко всей выборке
ORDER BY salary DESC LIMIT 2 возвращает только две строки из всей таблицы employees. Задача просит две строки на каждый отдел, поэтому ограничение должно применяться после ранжирования внутри PARTITION BY.
Нет детерминированного порядка при равных значениях
Если сортировать окно только по salary DESC, две одинаковые зарплаты не имеют заданного порядка. На собеседовании полезно явно проговорить правило для ничьей и добавить стабильный второй ключ, если условие его допускает.
Фильтр по номеру строки помещён в тот же WHERE
В PostgreSQL результат ROW_NUMBER нельзя напрямую использовать в WHERE того же уровня SELECT. Оконная функция вычисляется позже. Поэтому ранжирование обычно выносят в CTE или подзапрос, а rn фильтруют уже снаружи.
Задачи по теме в тренажёре
Трек «Подготовка к собеседованию»Подготовка к SQL-собеседованию становится полезнее, когда задачи меняют форму, а не повторяют один и тот же шаблон. После top-N стоит отдельно прорешать второй максимум, поиск дублей, anti-join, пропуски и разрывы в датах, накопительные показатели и ранжирование. В SQL Arena есть задачи от простых проверок связанных записей до более сложных запросов с историческими данными. Например, можно потренироваться находить клиентов с активными заявками, страницы без лайков или детали с незавершённой сборкой, а затем перейти к задачам на историю нахождения объектов в наборе, ранжирование по длительности и динамику стоимости. В режиме «Собеседование» действует серверный таймер, подсказки отключены, а после сессии формируется отчёт. Бесплатно режим можно запускать один раз в день. Это позволяет отдельно проверить навык решения без AI-ментора и подсказок редактора. Для обычной подготовки доступны ER-диаграммы схем, EXPLAIN и AI-ментор, который объясняет ошибки и может дать подсказку; бесплатно предусмотрено 10 обращений. Ответы в задачах сверяются с эталоном на скрытых данных, поэтому решение должно быть обобщённым. Всего в SQL Arena 1 192 задачи и четыре диалекта: PostgreSQL, MySQL, ClickHouse и BigQuery. Бесплатно доступны 292 задачи без карты, более сложные задачи открываются в Premium. Если нужна последовательная подборка именно перед интервью, дальше можно перейти в трек «Подготовка к собеседованию». Он позволяет не искать темы вручную среди общего каталога.
- EasyбесплатноКлиенты с активными заявкамиpostgresqlmysqlclickhouse
- EasyбесплатноСтраницы без лайковpostgresqlmysqlclickhouse
- EasyбесплатноДетали с незавершённой сборкойpostgresqlmysqlclickhouse
- EasyбесплатноПросмотры с ноутбуков и мобильных устройствpostgresqlmysqlclickhouse
- MediumPremiumОблигации, которые были в портфеле банкаpostgresqlmysqlclickhouse
- MediumPremiumОблигации, которые ни разу не входили в портфельpostgresqlmysqlclickhouse
- MediumPremiumРейтинг облигаций по числу дней в портфелеpostgresqlmysqlclickhouse
- MediumPremiumДинамика рыночной стоимости портфеляpostgresqlmysqlclickhouse
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Какие SQL вопросы задают на собеседовании?
Часто спрашивают про JOIN, GROUP BY, агрегатные функции, NULL, подзапросы и оконные функции. Уровень вопросов зависит от роли и ожидаемой глубины работы с данными.
Какие SQL задачи дают на собеседовании?
Типичные задачи требуют соединить несколько таблиц, посчитать агрегаты, найти строки внутри групп или выбрать записи по сложному условию. Часто проверяется не отдельная команда, а комбинация нескольких приёмов.
Как готовиться к SQL собеседованию?
Решайте задачи без подсказок и после решения объясняйте каждый этап запроса. Полезно отдельно тренировать JOIN, группировки, подзапросы и оконные функции, а затем переходить к задачам, где они сочетаются.
Что нужно объяснять при решении SQL задачи на собеседовании?
Стоит проговорить, какие таблицы нужны, как они соединяются, на каком этапе применяются фильтры и почему выбран конкретный способ группировки или ранжирования. Это показывает понимание логики запроса, а не только знание синтаксиса.
Какие SQL задачи с собеседований считаются сложными?
Обычно сложнее задачи на top-N внутри каждой группы, оконные функции, несколько уровней агрегации, антиджойны и комбинации JOIN с подзапросами. Сложность часто возникает из-за порядка преобразования данных, а не из-за редкого синтаксиса.
Потренируйте SQL перед собеседованием
Решайте задачи разных типов, а затем запускайте режим «Собеседование», чтобы проверить, получается ли построить запрос самостоятельно и уложиться в ограниченное время без подсказок.
Практиковаться перед собеседованием