SQL-собеседование: как проверить готовность после основ
Готовность к SQL-собеседованию лучше проверять самостоятельным решением и объяснением результата. Знание названий JOIN и оконных функций помогает, но не показывает, сможете ли вы выбрать зерно данных, сохранить нужные строки и заметить неверный итог.
Ниже три авторских диагностических задания. Это учебные ситуации, а не вопросы конкретных работодателей. Сначала сформулируйте решение словами, затем пишите запрос и проверяйте его на маленьких данных.
Задание 1. Почему выручка выросла после JOIN
В таблице заказов две строки: заказ 10 на 100 рублей и заказ 20 на 200 рублей. У заказа 10 три позиции, у заказа 20 одна. После соединения с позициями запрос складывает поле суммы заказа и получает 500 вместо 300.
До написания исправления ответьте: что означает строка исходной таблицы и строка после соединения? Если нужна только выручка, таблица позиций может вообще не требоваться. Если нужен фильтр по наличию определённого товара, сравните EXISTS с предварительной агрегацией. SUM(DISTINCT amount) не универсальное исправление: два разных заказа могут иметь одинаковую сумму.
Задание 2. Лидеры с одинаковой суммой
Даны четыре покупки: пользователь 1 потратил 100 и 200, пользователь 2 — 300, пользователь 3 — 50. Нужно вывести всех пользователей с максимальной суммой покупок. Ожидаемый результат — пользователи 1 и 2, у каждого 300.
Один из вариантов для SQLite:
WITH orders(user_id, amount) AS (
VALUES (1, 100), (1, 200), (2, 300), (3, 50)
), totals AS (
SELECT user_id, SUM(amount) AS total
FROM orders GROUP BY user_id
), ranked AS (
SELECT user_id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS place
FROM totals
)
SELECT user_id, total FROM ranked
WHERE place = 1 ORDER BY user_id;
Запрос возвращает (1, 300) и (2, 300). Агрегация происходит до ранжирования. DENSE_RANK сохраняет одинаковое место при равных суммах. Для этого конкретного условия можно обойтись и сравнением с максимальной суммой; на собеседовании полезно объяснить оба подхода.
Поменяйте условие на «ровно один лидер». Теперь нужно правило разрешения равенства: например, минимальный ID. Без такого условия единственного правильного пользователя нет. SQL не должен молча придумывать бизнес-правило.
Задание 3. День без заказов и неизвестная сумма
В понедельник было два заказа на 100 и 200 рублей, во вторник — ни одного, в среду — один заказ с NULL в сумме. Постройте отчёт за все три дня. Прежде чем писать запрос, решите, означает ли NULL неизвестную сумму или отсутствие оплаты.
Для дня без заказов обычно нужен календарь и LEFT JOIN. Но нулевой оборот вторника и неизвестный оборот среды нельзя автоматически считать одинаковыми. Проверьте отдельно количество заказов, количество известных сумм и результат SUM. Итоговая политика зависит от правил данных.
Как разбирать собственные ошибки
| Симптом | Что повторить |
|---|---|
| После JOIN выросло число строк | Кардинальность связей и зерно агрегации |
| Потерялся второй лидер | Равенства, ранжирование, детерминированность |
| Исчез день без событий | Календарь, внешнее соединение и условия WHERE |
| NULL незаметно стал нулём | Смысл пропусков и правила агрегации |
Для каждой решённой задачи сохраняйте входные данные, ожидаемую таблицу и объяснение запроса. Добавляйте граничный случай: одинаковые суммы, пустую группу, повтор события или пропущенную дату. Если решение работает только на красивом примере, подготовка ещё не закончена.
Куда двигаться после диагностики
Если базовые SELECT и GROUP BY пока требуют постоянной подсказки, вернитесь к ним. Если синтаксис уже знаком, а сложность в составлении запроса и проверке смысла, нужен следующий уровень: несколько этапов расчёта, окна, интервалы и самостоятельные задачи. Смотрите на наличие проверяемой практики, а не на обещание «пройти собеседование за вечер».
Как перейти от разбора к практике
Продвинутый SQL на Latorn продолжает основы: сложные запросы, аналитические расчёты и задачи для подготовки к собеседованиям. Для начала уже нужны JOIN, группировки и знакомство с CTE и окнами. Материал подготовлен Latorn; ссылка ведёт на наш платный курс. Перед покупкой сравните программу и требования со своей задачей.
Посмотреть программу курса. Для самостоятельной диагностики доступна подборка упражнений.
Если пока выбираете направление обучения, прочитайте разбор выбора курса и необходимой подготовки.
Источники и проверка
Примеры в статье авторские и учебные. Технические справочники: SQLite: оконные функции.
Продолжить на практике
- Продвинутый SQL: сложные запросы и задачи для собеседований ↗
Продолжение базового SQL: сложные JOIN, оконные рамки, временные ряды, retention, воронки и рекурсивные CTE. Разбирайте примеры и пишите запросы с автоматической проверкой — от отдельных расчётов до витрины интернет-магазина.
