Каждый HR, проводивший SQL-скрининг, видел одни и те же ошибки снова и снова. Некоторые из них технические, некоторые поведенческие. Понимание этих паттернов помогает и нанимателям лучше оценивать кандидатов, и самим кандидатам приходить подготовленными.
Ошибка 1: Писать запрос без уточнения условий
Один из самых надёжных способов провалить техническое интервью — немедленно броситься писать код, не поняв задачу.
Как это выглядит: интервьюер формулирует задачу, кандидат молча начинает печатать. Результат — технически правильный запрос, решающий не ту задачу.
Пример: «Найдите клиентов с наибольшей выручкой». Хороший кандидат спросит: «За какой период? Учитывать отменённые заказы? Нужны топ-N или все выше порога?»
Что ищет интервьюер: умение формализовать бизнес-требование — ключевой навык аналитика.
Как оценить: кандидат, который задаёт уточняющие вопросы, скорее всего, так же будет работать с реальными задачами от бизнеса. Это большой плюс.
Ошибка 2: Неправильное использование NULL
NULL — ловушка, в которую попадает большинство Junior-кандидатов и часть Middle.
Типичная ошибка:
-- Неверно: это условие НИКОГДА не вернёт строки
WHERE some_column = NULL
-- Верно:
WHERE some_column IS NULL
Ещё одна ловушка:
-- NOT IN с NULL работает неожиданно
-- Если в подзапросе есть хотя бы один NULL — результат пуст
SELECT * FROM orders
WHERE customer_id NOT IN (SELECT id FROM blacklist);
-- Если blacklist содержит NULL → результат всегда пуст!
-- Безопасная альтернатива:
SELECT * FROM orders o
WHERE NOT EXISTS (
SELECT 1 FROM blacklist b WHERE b.id = o.customer_id
);
Как оценить: задайте прямой вопрос: «Что вернёт WHERE column != 5, если в колонке есть NULL-значения?» Правильный ответ: строки с NULL исключатся из результата, так как NULL != 5 возвращает NULL, а не TRUE.
Ошибка 3: Неэффективные запросы
Кандидат находит правильное решение, но пишет код, который плохо масштабируется.
Пример: коррелированный подзапрос вместо JOIN:
-- Медленно: для каждой строки выполняется отдельный подзапрос
SELECT
e.name,
(SELECT d.name FROM departments d WHERE d.id = e.department_id) AS dept
FROM employees e;
-- Быстро: один JOIN
SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id;
Ещё пример: функция в условии WHERE убивает индекс:
-- Плохо: индекс по created_at не используется
WHERE YEAR(created_at) = 2026
-- Хорошо: индекс работает
WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01'
Как оценить: для Middle и Senior добавьте вопрос «Как бы вы оптимизировали этот запрос?» после решения задачи.
Ошибка 4: Путаница с ORDER BY и оконными функциями
Кандидаты, знакомые с оконными функциями поверхностно, часто допускают семантические ошибки.
Типичная ошибка:
-- Кандидат хочет найти 3 последних заказа каждого клиента
-- Неверно: ORDER BY в оконной функции не влияет на итоговую сортировку
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
FROM orders
) t
WHERE rn <= 3;
-- Результат верный, но итоговый порядок строк не определён
-- Правильно добавить ORDER BY в конце:
... ORDER BY customer_id, order_date DESC;
Более серьёзная ошибка — не понимать, что оконные функции выполняются ПОСЛЕ WHERE и GROUP BY. Это приводит к неверным фильтрам:
-- Это НЕ работает — нельзя фильтровать по оконной функции в WHERE
SELECT * FROM orders
WHERE ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY date) = 1;
-- Нужен подзапрос или CTE!
Ошибка 5: Молчание при затруднении
Поведенческая ошибка, которая стоит дорого на live-кодинге.
Кандидат застрял, но вместо того чтобы рассуждать вслух, молчит несколько минут или говорит «подождите, я вспоминаю». Интервьюер не понимает, что происходит.
Что ожидается: «Хорошо, мне нужно найти N-й наибольший элемент. Могу сделать это через ORDER BY + LIMIT + OFFSET, или через DENSE_RANK. Давайте попробую второй вариант, потому что он лучше обрабатывает дубликаты...»
Как оценить: прямо скажите в начале интервью: «Нам важно понимать ваш ход мыслей, поэтому комментируйте вслух, что вы делаете». Если кандидат игнорирует это — минус балл.
Как использовать эту информацию в скрининге
Для каждой из пяти ошибок есть конкретная проверочная задача или вопрос:
| Ошибка | Проверочный метод |
|---|---|
| Не уточняет задачу | Дайте намеренно размытую формулировку |
| Проблемы с NULL | Задача с NOT IN и NULL в подзапросе |
| Неэффективные запросы | Попросите оптимизировать медленный запрос |
| Оконные функции | Задача на ROW_NUMBER с фильтрацией |
| Молчание | Явная инструкция думать вслух |
Хотите, чтобы кандидаты избегали этих ошибок? Порекомендуйте подготовку на SQLlab.ru — там разбираются именно такие типичные ловушки через практику.