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: оконные функции.

Продолжить на практике