Собеседование по SQL: 15 вопросов, которые задают почти всегда
Разбор типовых вопросов на собеседовании по SQL для аналитиков и тестировщиков: JOIN, GROUP BY, NULL, подзапросы, оконные функции — с короткими ответами.
Вопросы по SQL на собеседовании повторяются из компании в компанию, и это хорошая новость: к ним можно подготовиться за несколько вечеров. Ниже — те, что спрашивают чаще всего у аналитиков, тестировщиков и начинающих разработчиков, с ответами, которые ждёт интервьюер. Не заучивайте формулировки: гораздо важнее написать запрос руками хотя бы раз.
Основы: здесь отсеивают
1. Чем WHERE отличается от HAVING? WHERE фильтрует строки до группировки, HAVING — группы после неё. «Клиенты с суммой заказов больше ста тысяч» — это HAVING, потому что сумма появляется только после GROUP BY.
2. Что вернёт WHERE price = NULL? Ничего. NULL не равен ничему, даже самому себе; проверять надо через IS NULL. Этот вопрос ловит тех, кто учил SQL по картинкам.
3. Как COUNT(*) отличается от COUNT(столбец)? Первый считает строки, второй — строки, где столбец не NULL. На таблице с пропусками результаты разные.
4. В каком порядке выполняются части запроса? FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. Отсюда следует, что псевдоним из SELECT нельзя использовать в WHERE — его ещё не существует.
5. Зачем DISTINCT и чем он опасен? Убирает повторы. Опасен тем, что прячет ошибку соединения: если после JOIN строки задвоились, DISTINCT сделает результат «красивым», а причина останется.
Соединения: главная тема
6. Чем INNER JOIN отличается от LEFT JOIN? Внутреннее оставляет только пары, у которых нашлось совпадение с обеих сторон. Левое сохраняет все строки левой таблицы, а справа подставляет NULL там, где пары нет. «Клиенты без заказов» — это LEFT JOIN плюс WHERE orders.id IS NULL.
7. Что произойдёт, если соединить таблицы без условия? Декартово произведение: каждая строка с каждой. Сто клиентов и тысяча заказов дадут сто тысяч строк. Так проверяют, понимаете ли вы, что JOIN — это не магия.
8. Почему после JOIN сумма выросла вдвое? Потому что у одной строки слева нашлось несколько справа, и она размножилась. Считать надо до соединения — в подзапросе, — либо группировать по ключу левой таблицы.
9. Как соединить таблицу саму с собой? Через псевдонимы: сотрудники и их руководители лежат в одной таблице, и запрос пишется как FROM employees e JOIN employees m ON e.manager_id = m.id.
Подзапросы и оконные функции
10. Товары дороже среднего — как? Подзапрос в WHERE: WHERE price > (SELECT AVG(price) FROM products). Уточняющий вопрос: а дороже среднего по своей категории? Это уже коррелированный подзапрос или оконная функция.
11. Что такое оконная функция и чем она отличается от GROUP BY? GROUP BY схлопывает строки в группы, оконная функция считает по группе, но строки оставляет. «Доля заказа в сумме клиента» — окно; «сумма по клиенту» — группировка.
12. Как взять последний заказ каждого клиента? ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY created_at DESC), потом фильтр по номеру 1. Ответ через MAX и повторное соединение тоже примут, но окно короче.
13. В чём разница между RANK и DENSE_RANK? При одинаковых значениях RANK пропускает номера (1, 1, 3), DENSE_RANK — нет (1, 1, 2).
Про базу в целом
14. Зачем нужен индекс и когда он вредит? Ускоряет поиск по столбцу, но замедляет вставку и занимает место. Индекс на столбце с тремя значениями почти бесполезен.
15. Что такое транзакция? Группа операций, которая либо выполняется целиком, либо не выполняется вовсе. Перевод денег: списать с одного счёта и зачислить на другой — либо оба действия, либо ни одного.
Как готовиться, чтобы не забыть на месте
Список выше — это карта, а не подготовка. Подготовка — это когда пальцы сами пишут LEFT JOIN, пока голова думает о задаче. Для этого нужна практика на разных данных, а не на одной учебной таблице из книжки.
- Пройдите разделы про соединения и группировку в курсе SQL: там ответ сверяется с эталонной таблицей, и «почти правильно» не засчитывается — как и на собеседовании.
- За неделю до встречи решайте по десять задач в день в тренажёре: он даёт случайные задания и показывает, где вы стабильно ошибаетесь.
- Прочитайте одно расследование до конца: там задачи без подсказок, как на живом собеседовании, где интервьюер молчит и ждёт.
И последнее. Если вопрос непонятен, переспросите: «вы про порядок выполнения или про синтаксис?». Уточняющий вопрос оценивают выше, чем уверенный ответ мимо.