Вопросы по SQL на собеседовании аналитика
support_tickets поле resolved_at равно NULL, если тикет ещё не решён. Нужно вывести сначала нерешённые тикеты, а внутри них — по created_at по возрастанию (самые старые сверху). Какой ORDER BY подойдёт лучше всего?Что спрашивают по SQL
SQL — обязательный блок почти любого собеседования в аналитику. Не важно, идёте вы в продуктовую команду, маркетинговую аналитику или дата-инжиниринг — без SQL не пройти ни один цикл. На junior- и middle-позициях это часто самая весомая секция: именно по SQL отсеивают тех, кто «знает теорию», но не умеет читать и писать запросы под задачу.
Хорошая новость в том, что набор тем конечен и из года в год повторяется. Если разобрать ключевые конструкции и довести типичные ловушки до автоматизма, SQL-секция превращается из стресса в самую предсказуемую часть собеседования.
Вопросы делятся по уровням сложности — и интервьюер обычно идёт снизу вверх, пока вы не начнёте плыть.
Junior. Базовые конструкции и понимание того, как запрос исполняется. Здесь проверяют не скорость, а отсутствие дыр в фундаменте.
- Разница между WHERE и HAVING
- Типы JOIN и когда какой использовать
- GROUP BY и агрегатные функции
- DISTINCT, ORDER BY, LIMIT
- NULL и его поведение в сравнениях
Middle. Оконные функции и умение собрать многошаговый запрос. Это уровень, на котором отсеивается большинство кандидатов «с курсов».
- Оконные функции: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD
- Подзапросы vs CTE (WITH)
- Разница между UNION и UNION ALL
- Индексы и их влияние на производительность
- Оптимизация и чтение плана запроса
Senior. Производительность, нюансы движка и архитектурные решения. Здесь важнее объяснить trade-off, чем вспомнить синтаксис.
- Планы выполнения запросов (EXPLAIN)
- Партиционирование и шардинг
- Транзакции и уровни изоляции
- Рекурсивные CTE
- Оконные фреймы (ROWS BETWEEN, RANGE)
Как проходит SQL-секция
Формат зависит от компании, но сводится к нескольким сценариям, и к каждому стоит готовиться по-разному.
Live-coding по шарингу экрана. Самый частый вариант: вам дают схему из двух-трёх таблиц и просят написать запрос вслух. Оценивают не только итоговый код, но и ход мысли — проговаривайте, почему берёте LEFT JOIN, а не INNER, и что будет с NULL.
Тестовое или асинхронная задача. Несколько запросов на дом или в тренажёре платформы. Здесь важна аккуратность: правильные джойны, безопасное деление, корректная работа с датами.
Устный разбор без кода. Интервьюер спрашивает «в чём разница между RANK и ROW_NUMBER» или «что вернёт LEFT JOIN с фильтром на правой таблице». Проверяют понимание, а не память — поэтому заучивать определения бесполезно, нужно понимать механику.
В любом из форматов выигрывает не тот, кто пишет длинные запросы, а тот, кто не делает базовых ошибок и объясняет решения.
Почему SQL проваливают
Большинство кандидатов знают теорию, но спотыкаются на нюансах. Типичные ловушки повторяются из собеседования в собеседование:
- RANK vs ROW_NUMBER — не могут объяснить разницу при одинаковых значениях в окне.
- NULL в WHERE — забывают, что
NULL != NULL, аNOT INс NULL в подзапросе молча возвращает пустой результат. - HAVING без понимания порядка — путают, что фильтруется до группировки, а что после.
- LEFT JOIN + WHERE на правой таблице — фильтр в WHERE превращает LEFT JOIN в INNER и тихо теряет строки.
- Целочисленное деление —
count_a / count_bв Postgres даёт 0; забывают про::NUMERIC.
Эти ошибки стоят оффера чаще, чем незнание сложных тем. Их нужно один раз разобрать и больше не повторять.
Примеры вопросов с разбором
Попробуйте ответить без подсказок, прежде чем читать разбор.
Что делает оператор DISTINCT? Убирает дубликаты строк в выборке. Не сортирует и не группирует — просто оставляет уникальные комбинации значений по всем выбранным колонкам.
Чем отличается ROW_NUMBER() от RANK()? ROW_NUMBER даёт уникальный номер без пропусков даже при одинаковых значениях. RANK присвоит одинаковым значениям один ранг и пропустит следующие номера (1, 1, 3). DENSE_RANK — тоже одинаковый ранг, но без пропусков (1, 1, 2).
В чём разница между WHERE и HAVING? WHERE фильтрует строки до группировки, HAVING — группы после GROUP BY. В HAVING можно использовать агрегатные функции (
HAVING COUNT(*) > 5), в WHERE — нет.Что вернёт LEFT JOIN, если в правой таблице нет совпадения? Строку из левой таблицы со значениями NULL вместо колонок правой. Если потом отфильтровать
WHERE right.col = 'x', эти NULL-строки отпадут и джойн фактически станет INNER.Когда UNION ALL лучше UNION? Когда дубликаты не мешают. UNION удаляет дубликаты и потому сортирует результат — это дороже. UNION ALL просто склеивает выборки и работает быстрее.
Как посчитать долю, чтобы не получить 0? Приводить к дробному типу и защищать делитель:
SUM(x)::NUMERIC / NULLIF(COUNT(*), 0). Без::NUMERICцелочисленное деление усечёт результат, безNULLIF— упадёте на делении на ноль.Что считает
COUNT(column)противCOUNT(*)?COUNT(*)считает все строки,COUNT(column)— только строки, где колонка не NULL. Классическая ловушка на колонках с пропусками.Зачем нужен CTE (WITH), если есть подзапросы? CTE делает многошаговый запрос читаемым и позволяет ссылаться на промежуточный результат несколько раз. Для рекурсии (иерархии, графы) CTE — единственный способ.
Как взять второе по величине значение зарплаты? Через оконную функцию:
DENSE_RANK() OVER (ORDER BY salary DESC)и фильтр по рангу в обёртке-CTE. Оконные функции нельзя использовать прямо в WHERE — только через подзапрос или CTE.Почему оконную функцию нельзя положить в WHERE? Окна вычисляются после WHERE и GROUP BY в порядке выполнения запроса. Чтобы отфильтровать по результату окна, нужно завернуть его в CTE или подзапрос и фильтровать снаружи.
Подробные разборы по подтемам
- Оконные функции: ROW_NUMBER, RANK, LAG, LEAD
- JOIN: INNER, LEFT, FULL, CROSS — когда какой
- GROUP BY и HAVING — разница и ловушки
- Подзапросы и CTE (WITH) — когда что использовать
- NULL в SQL — поведение, ловушки, типичные вопросы
- UNION и UNION ALL — разница и производительность
- Индексы и оптимизация запросов
- Порядок выполнения SQL-запроса
- Работа с датами в SQL
- DISTINCT и дедупликация
Как готовиться к SQL-части
Разберите порядок выполнения запроса — FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Это основа, которая снимает 80% путаницы с WHERE/HAVING и оконными функциями.
Освойте оконные функции — самый частый «средний» вопрос. ROW_NUMBER, RANK/DENSE_RANK, LAG/LEAD, SUM OVER — must have. Именно они отделяют middle от junior.
Практикуйтесь на коротких вопросах, а не на ETL. На собеседовании проверяют понимание концепций, а не способность написать запрос на 40 строк. Решайте много мелких задач с быстрым разбором — так паттерны закрепляются лучше всего. Удобно гонять их в SQL-тренажёре: короткие вопросы с моментальным объяснением.
Разбирайте ошибки. После неправильного ответа прочитайте объяснение и запомните паттерн ловушки — в Карьернике разбор показывается сразу после ответа, поэтому ошибка превращается в выученный кейс, а не в случайный промах.
Частые ошибки на собеседовании
Главная ошибка — молчать и сразу писать код. Интервьюер хочет услышать рассуждение: уточните схему, проговорите, какие джойны берёте и почему, отдельно проговорите поведение NULL. Вторая частая ошибка — переусложнять: если задачу решает GROUP BY с HAVING, не нужно тащить оконные функции ради впечатления. Третья — игнорировать edge-кейсы: пустые таблицы, дубликаты, деление на ноль, NULL в ключах джойна. Кандидат, который сам проговаривает эти случаи, выглядит сильнее того, кто написал «правильный» запрос, но не подумал о краях.
Другие темы
- Подготовка к собеседованию аналитика данных
- Вопросы по Python на собеседовании
- A/B тестирование: вопросы на собеседовании
- Продуктовая аналитика: собеседование
- Статистика и вероятности
- Задачи на логику для аналитика
FAQ
Какие вопросы по SQL задают на собеседовании аналитика?
Чаще всего: оконные функции (ROW_NUMBER, RANK, LAG), типы JOIN, GROUP BY и HAVING, подзапросы vs CTE, поведение NULL. На senior-уровне добавляются вопросы по оптимизации, индексам и планам выполнения.
Хватит ли знания SELECT, WHERE, GROUP BY для junior-позиции?
Для входа — да, но конкуренция высокая. Оконные функции и понимание порядка выполнения запроса выделят вас среди других кандидатов. В Карьернике вопросы идут от простых к сложным — можно начать с основ и постепенно дойти до окон.
Какой формат SQL-секции встречается чаще всего?
Live-coding по шарингу экрана: дают схему и просят написать запрос вслух. Поэтому важно не только получить правильный результат, но и проговаривать ход мысли — это половина оценки.
Нужно ли знать конкретную СУБД — Postgres, ClickHouse, MySQL?
Базовый SQL переносится между ними, и большинство вопросов универсальны. Но стоит знать диалект работодателя: в Postgres — нюансы NULL и приведения типов, в ClickHouse — особенности агрегаций и отсутствие части оконных конструкций.
Сколько вопросов по SQL в Карьернике?
200+ вопросов, разбитых по подтемам: основы, JOIN, агрегации, оконные функции, подзапросы, оптимизация. Каждый — с подробным разбором сразу после ответа.