Чтение учебника даёт 10% усвоения. Решение задач — 70%. На собесе спросят: «напиши SQL чтобы посчитать MoM revenue growth» — без 50-100 решённых задач не справишься. Практика тренирует pattern recognition.
Реалистичный график для подготовки Junior с нуля. Решай регулярно, не в last-minute.
| Дни | Тема | Задач |
|---|---|---|
| 1-5 | SELECT/WHERE/ORDER BY/LIMIT | 25-50 |
| 6-10 | GROUP BY + HAVING + агрегаты | 30-50 |
| 11-15 | INNER/LEFT/SELF JOIN | 40-60 |
| 16-20 | Подзапросы и CTE | 30-50 |
| 21-26 | Окна (ROW_NUMBER, LAG, frames) | 40-60 |
| 27-30 | Рекурсивный CTE, gaps-and-islands, pivot | 25-40 |
Эти типы задач топовые компании РФ регулярно спрашивают на технической секции:
Эти ошибки видны в первых же задачах. Зная их — сэкономишь недели.
У нас доступны 2 движка: PostgreSQL 16 (через PGlite WASM) и SQLite (через sql.js). Они почти совместимы, но есть отличия.
| Что | PostgreSQL | SQLite |
|---|---|---|
| Окна с RANGE | Полноценно | Только базовая |
| Recursive CTE | Да | Да |
| ARRAY типы | Да | Нет |
| JSON функции | JSONB полноценный | JSON1 extension |
| STRICT mode | По умолчанию | Опциональный |
| Регэкспы | ~ оператор | REGEXP, опционально |
Регулярность важнее объёма. 5 задач каждый день эффективнее 50 задач раз в неделю — нейропластичность накапливает паттерны.
Если на каждый пункт можешь сказать «да, могу написать за 5 минут» — Middle-собес SQL пройдёшь.
Классическая задача каждого собеса. Найти топ-3 товара по выручке в каждой категории. Решается через ROW_NUMBER + filter.
-- Топ-3 товара по выручке в каждой категории
SELECT category_id, product_id, revenue
FROM (
SELECT
category_id, product_id, revenue,
ROW_NUMBER() OVER (
PARTITION BY category_id
ORDER BY revenue DESC
) AS rn
FROM products_revenue
) ranked
WHERE rn <= 3
ORDER BY category_id, rn;
У нас на zasqlpython.ru — 5 задач бесплатно без регистрации, автопроверка в браузере (PostgreSQL/SQLite). Кроме того есть открытые англоязычные площадки и бесплатные интерактивные курсы. Удобнее начать с локальных русскоязычных площадок, далее переходить на конкретные пробелы.
Junior: 80-100 задач (SELECT/JOIN/GROUP BY/базовые окна). Middle: 150-200 задач (+CTE, window frames, subqueries). Senior: 300+ задач (+рекурсивные CTE, gaps-and-islands, sessionization, dialect-специфика). Решай 5-10 в день за 2-4 недели.
Топ-5 must-do: 1) Top-N per group через ROW_NUMBER. 2) Cohort retention. 3) Воронка conversion (4-стадии). 4) MoM/WoW growth через LAG. 5) Self-join иерархия (manager → employee). Эти задачи спрашивают на 80% собесов.
Да, в браузере через PGlite (WASM PostgreSQL 16) и sql.js (SQLite). У нас всё работает без установки — нажал «Проверить», получил результат за 100мс. Не нужны Docker, PostgreSQL, DBeaver — только браузер.
Junior с нуля: 1-2 месяца по 1-2 часа в день (10 задач). Middle: 2-3 месяца. Senior: 3-6 месяцев включая deep dive в EXPLAIN/индексы. Главное — регулярность: 5 задач в день лучше чем 50 раз в месяц.
PostgreSQL — стандарт для аналитика (90% top-компаний РФ). MySQL встречается реже (legacy). Если работаешь с маркетплейсом или fintech — PG. Если b2c-стартап на LAMP — может быть MySQL. В тренажёре доступен PG 16.
Топ-3: 1) Sessionization через LAG + cumulative SUM (по таймаут-gap). 2) Gaps-and-islands (серии подряд). 3) Median через NTILE или percentile_cont. Эти задачи отличают Senior от Middle.
Команда PostgreSQL: показывает реальный план выполнения с временами. Видишь Seq Scan vs Index Scan, JOIN strategy (Hash vs Nested Loop vs Merge), стоимость каждого шага. На Senior-собесе обязательны — спросят как читать план.
У нас в тренажёре каждая задача имеет seedData (готовая таблица с данными). Можно также брать публичные датасеты: Kaggle (бизнес-данные), UCI ML Repository, datasets.google.com. Для своих pet-проектов — Github открытые датасеты компаний.
1) Прочитай условие 3 раза, нарисуй expected output на бумаге. 2) Посмотри schema и seedData — отметь связи. 3) Декомпозируй: «сначала фильтр → потом группировка → потом окно». 4) Если за 20 мин не понял — открой подсказку. 5) После решения сравни с эталоном.