Вопросы по SQL на собеседовании аналитика

Проверь себя · 1/3разбор после ответа
В таблице support_tickets поле resolved_at равно NULL, если тикет ещё не решён. Нужно вывести сначала нерешённые тикеты, а внутри них — по created_at по возрастанию (самые старые сверху). Какой ORDER BY подойдёт лучше всего?

Что спрашивают по SQL

SQL — обязательный блок почти любого собеседования в аналитику. Не важно, идёте вы в продуктовую команду, маркетинговую аналитику или дата-инжиниринг — без SQL не пройти ни один цикл. На junior- и middle-позициях это часто самая весомая секция: именно по SQL отсеивают тех, кто «знает теорию», но не умеет читать и писать запросы под задачу.

Хорошая новость в том, что набор тем конечен и из года в год повторяется. Если разобрать ключевые конструкции и довести типичные ловушки до автоматизма, SQL-секция превращается из стресса в самую предсказуемую часть собеседования.

Типы SQL JOIN

Вопросы делятся по уровням сложности — и интервьюер обычно идёт снизу вверх, пока вы не начнёте плыть.

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.

Эти ошибки стоят оффера чаще, чем незнание сложных тем. Их нужно один раз разобрать и больше не повторять.

Примеры вопросов с разбором

Попробуйте ответить без подсказок, прежде чем читать разбор.

  1. Что делает оператор DISTINCT? Убирает дубликаты строк в выборке. Не сортирует и не группирует — просто оставляет уникальные комбинации значений по всем выбранным колонкам.

  2. Чем отличается ROW_NUMBER() от RANK()? ROW_NUMBER даёт уникальный номер без пропусков даже при одинаковых значениях. RANK присвоит одинаковым значениям один ранг и пропустит следующие номера (1, 1, 3). DENSE_RANK — тоже одинаковый ранг, но без пропусков (1, 1, 2).

  3. В чём разница между WHERE и HAVING? WHERE фильтрует строки до группировки, HAVING — группы после GROUP BY. В HAVING можно использовать агрегатные функции (HAVING COUNT(*) > 5), в WHERE — нет.

  4. Что вернёт LEFT JOIN, если в правой таблице нет совпадения? Строку из левой таблицы со значениями NULL вместо колонок правой. Если потом отфильтровать WHERE right.col = 'x', эти NULL-строки отпадут и джойн фактически станет INNER.

  5. Когда UNION ALL лучше UNION? Когда дубликаты не мешают. UNION удаляет дубликаты и потому сортирует результат — это дороже. UNION ALL просто склеивает выборки и работает быстрее.

  6. Как посчитать долю, чтобы не получить 0? Приводить к дробному типу и защищать делитель: SUM(x)::NUMERIC / NULLIF(COUNT(*), 0). Без ::NUMERIC целочисленное деление усечёт результат, без NULLIF — упадёте на делении на ноль.

  7. Что считает COUNT(column) против COUNT(*)? COUNT(*) считает все строки, COUNT(column) — только строки, где колонка не NULL. Классическая ловушка на колонках с пропусками.

  8. Зачем нужен CTE (WITH), если есть подзапросы? CTE делает многошаговый запрос читаемым и позволяет ссылаться на промежуточный результат несколько раз. Для рекурсии (иерархии, графы) CTE — единственный способ.

  9. Как взять второе по величине значение зарплаты? Через оконную функцию: DENSE_RANK() OVER (ORDER BY salary DESC) и фильтр по рангу в обёртке-CTE. Оконные функции нельзя использовать прямо в WHERE — только через подзапрос или CTE.

  10. Почему оконную функцию нельзя положить в WHERE? Окна вычисляются после WHERE и GROUP BY в порядке выполнения запроса. Чтобы отфильтровать по результату окна, нужно завернуть его в CTE или подзапрос и фильтровать снаружи.

Подробные разборы по подтемам

Как готовиться к SQL-части

  1. Разберите порядок выполнения запроса — FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Это основа, которая снимает 80% путаницы с WHERE/HAVING и оконными функциями.

  2. Освойте оконные функции — самый частый «средний» вопрос. ROW_NUMBER, RANK/DENSE_RANK, LAG/LEAD, SUM OVER — must have. Именно они отделяют middle от junior.

  3. Практикуйтесь на коротких вопросах, а не на ETL. На собеседовании проверяют понимание концепций, а не способность написать запрос на 40 строк. Решайте много мелких задач с быстрым разбором — так паттерны закрепляются лучше всего. Удобно гонять их в SQL-тренажёре: короткие вопросы с моментальным объяснением.

  4. Разбирайте ошибки. После неправильного ответа прочитайте объяснение и запомните паттерн ловушки — в Карьернике разбор показывается сразу после ответа, поэтому ошибка превращается в выученный кейс, а не в случайный промах.

Частые ошибки на собеседовании

Главная ошибка — молчать и сразу писать код. Интервьюер хочет услышать рассуждение: уточните схему, проговорите, какие джойны берёте и почему, отдельно проговорите поведение NULL. Вторая частая ошибка — переусложнять: если задачу решает GROUP BY с HAVING, не нужно тащить оконные функции ради впечатления. Третья — игнорировать edge-кейсы: пустые таблицы, дубликаты, деление на ноль, NULL в ключах джойна. Кандидат, который сам проговаривает эти случаи, выглядит сильнее того, кто написал «правильный» запрос, но не подумал о краях.

Другие темы

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, агрегации, оконные функции, подзапросы, оптимизация. Каждый — с подробным разбором сразу после ответа.