SQL-направление

SQL для собесов и работы: JOIN, CTE и окна

Практическая линейка с автопроверкой на Stepik: стартуйте с Junior, доберите Middle или закройте всё Pro pack 3 in 1.

350+ задач
Junior / Middle / Upper-Middle
4.9 / 5 на Stepik
interview_sql.sql accepted
with user_revenue as (
  select
    u.user_id,
    u.segment,
    sum(p.amount) as revenue,
    row_number() over (
      partition by u.segment
      order by sum(p.amount) desc
    ) as rn
  from users u
  join payments p
    on p.user_id = u.user_id
  where p.status = 'paid'
  group by u.user_id, u.segment
)
select segment, user_id, revenue
from user_revenue
where rn = 1;
query.result checks passed
JOIN GROUP BY CTE window interview
Выбор уровня

Сначала уровень, потом SQL-маршрут

Слабый выбор курса легко ломает темп: Junior может быть скучным, Middle без базы быстро превращается в боль. Начните с честного состояния, в котором SQL проседает прямо сейчас.

Важно

Прямые ссылки на Stepik ниже, в карточках конкретных курсов. Здесь выбираем маршрут, а не покупаем наугад.

Карта линейки

Один SQL, разные точки входа

Сначала выберите точку входа. Основы закрывают базу перед Junior. SQL-квест дает короткий игровой формат ближе к Middle. Бандлы подходят для полного маршрута.

Обложка курса Основы SQL

Основы SQL

Для старта с WHERE, GROUP BY, сортировки и первых соединений перед задачами Junior.

база перед Junior основы
Открыть на Stepik
Обложка SQL-квеста

SQL-квест

Короткий игровой курс с задачами ближе к Middle: решить руками, втянуться в формат и понять следующий шаг.

короткий курс игровой формат Middle
Открыть на Stepik
Обложка SQL Junior
01 Junior

Если база плавает

JOIN, GROUP BY, NULL, даты и первые задачи, где ломается логика результата.

5 демо задач старт собесы junior
Разобрать Junior
Обложка SQL Middle
02 Middle

Если рабочий SQL уже есть

CTE, окна, ранжирование, tricky-условия и объяснение хода решения.

5 демо задач CTE и окна собесы middle
Разобрать Middle
Обложка SQL Upper-Middle
03 Upper-Middle

Если нужны сложные интервью

50 задач без демо-блока: меньше разогрева, больше плотных кейсов на окна, подзапросы, агрегации и крайние случаи.

50 задач без демо интервью
Разобрать Upper-Middle
Обложка SQL Skill Test 1
04 Skill Test

Если неясно, куда заходить

Проверка уровня перед покупкой: понять текущую точку и выбрать курс без промаха.

диагностика перед курсом маршрут
Понять уровень
Обложка SQL Junior plus Middle
05 Junior + Middle

Если хотите базу и рабочий уровень

Маршрут с базой Junior и рабочими задачами Middle в одной программе.

2 курса jun + mid программа
Купить выгодно
Обложка SQL Pro pack 3 in 1
06 Pro pack 3 in 1

Если нужно закрыть всю линейку

Junior, Middle и Upper-Middle одним маршрутом: база, рабочие запросы и плотная подготовка к сложным вопросам.

3 курса полная линия pro pack
Купить выгодно
SQL Junior

Junior: база, которая не разваливается на первых задачах

Для тех, кто уже понимает синтаксис SQL, но всё ещё ошибается в JOIN, GROUP BY, NULL, датах, дубликатах после соединений и простых бизнес-условиях.

Обложка курса SQL Junior
Stepik course · 2690 ₽

SQL-собеседование: 100 задач уровня Junior

Основной трек идёт от безопасного демо к задачам на бизнес-логику, ловушки и разогрев перед собеседованием. Диалект курса: MySQL 8.0+.

100 SQL-задач

Основной трек Junior: от задач 1-5 в демо до финального теста 91-100.

5 бесплатных демо

Можно проверить формат до покупки: условия, схема, автопроверка и разбор.

45 + 10 экзаменационный модуль

45 тестов с собеседовательным уклоном и 10 SQL-задач повышенной плотности.

Что закрывает

  • JOIN, LEFT JOIN, фильтры в ON и WHERE.
  • GROUP BY, HAVING, COUNT, SUM, AVG, подзапросы.
  • NULL, даты, статусы, отмены, возвраты и edge cases.
  • Ложные дубликаты после JOIN и ошибки в зерне результата.

Кому подходит

Если SQL уже не пугает, но решение часто держится на ощущениях: “кажется, надо соединить таблицы”, “вроде COUNT”, “почему строк стало больше”. Это как раз Junior-уровень, который надо довести до автоматизма.

Примеры задач из курса

Короткие фрагменты реальных задач: условие, навык и SQL-решение. Так проще понять уровень без красивой болтовни.

Демо 1

Топ-2 города по количеству завершённых сделок

Нужно соединить пользователей и сделки, оставить Completed, посчитать сделки по городам и взять два лидера.

SELECT
  u.city,
  COUNT(*) AS total_orders
FROM trades t
JOIN users u ON t.user_id = u.user_id
WHERE t.status = 'Completed'
GROUP BY u.city
ORDER BY total_orders DESC, u.city
LIMIT 2;
Демо 3

Клиенты без заказов

Классика на LEFT JOIN: найти клиентов, у которых нет ни одного заказа, и не сломать смысл фильтром.

SELECT c.name
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL
  AND c.name IS NOT NULL
ORDER BY c.name;
Задача 56

Рефералы, которые дошли до покупки

Нужно выбрать приглашённых пользователей, которые сделали хотя бы один заказ, и убрать повторы из-за нескольких покупок.

SELECT DISTINCT
  u.name AS referred_user
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE u.referrer_id IS NOT NULL
ORDER BY referred_user;
Основы и квест

Основы перед Junior, SQL-квест ближе к Middle

Основы нужны, если ещё путаются фильтрация, группировки и первые соединения. SQL-квест — короткий игровой курс для тех, кто уже может решать руками и хочет формат ближе к Middle.

01 Основы

Основы SQL

Для тех, кто ещё путает порядок операторов, фильтрацию, группировку и первые соединения. Подготовка к Junior через спокойную базовую практику.

пример недавние пользователи
SELECT name, registration_date
FROM users
WHERE registration_date > '2023-01-01'
ORDER BY registration_date DESC;
Открыть основы Сравнить с Junior
02 Квест

SQL-квест

Короткий игровой курс с задачами ближе к Middle. Подходит, чтобы втянуться, увидеть формат и проверить ход мысли на компактной дистанции.

start понять формат
solve решить руками
next понять уровень
Открыть квест К карте курсов
Как выгоднее На сайте проще собрать маршрут по уровню

Квиз ниже на странице.

SQL Middle

Middle: запросы, которые надо уметь объяснить

Для тех, кто уже пишет рабочий SQL, но теряет уверенность на CTE, оконных функциях, ранжировании, подзапросах и задачах, где важна не только выдача, но и ход мысли.

Обложка курса SQL Middle
Stepik course · 3490 ₽

SQL-собеседование: задачи уровня Middle

Здесь уже мало знать синтаксис. Нужно держать зерно результата, аккуратно собирать промежуточные CTE, использовать окна и спокойно объяснять, почему запрос устроен именно так.

5 демо-задач

Можно проверить формат и уровень до покупки курса.

CTE промежуточная логика

Разбиваете решение на понятные шаги и спокойно проверяете каждый слой.

OVER окна и ранжирование

RANK, PARTITION BY, средние значения и сравнения внутри групп.

Что закрывает

  • CTE как способ собрать решение по шагам.
  • Оконные функции: RANK, AVG OVER, PARTITION BY.
  • Подзапросы, EXISTS, анти-дубли и аккуратные фильтры.
  • Интервью-задачи, где надо проговорить ход решения.

Кому подходит

Если JOIN, GROUP BY и базовые агрегаты уже живут в руках, но задачи с окнами, несколькими шагами и tricky-условиями заставляют долго перебирать варианты, это Middle.

Примеры задач из курса

Три фрагмента показывают реальную плотность Middle: self join, ранжирование и сравнение со средним через окно.

Задача 56

Эффективность рефералов

Посчитать, сколько прямых приглашённых у каждого участника сделали хотя бы одну покупку.

SELECT
  r.name AS referrer_name,
  COUNT(DISTINCT u.user_id) AS referral_purchasers
FROM users u
JOIN users r ON u.referrer_id = r.user_id
JOIN orders o ON u.user_id = o.user_id
GROUP BY r.name
ORDER BY referral_purchasers DESC, referrer_name;
Задача 58

Рейтинг продаж по регионам

Построить рейтинг магазинов внутри каждого региона по выручке за 2024 год.

SELECT
  s.region,
  s.store_name,
  SUM(sa.amount) AS total_sales,
  RANK() OVER (
    PARTITION BY s.region
    ORDER BY SUM(sa.amount) DESC
  ) AS region_rank
FROM stores s
JOIN sales sa ON s.store_id = sa.store_id
WHERE YEAR(sa.sale_date) = 2024
GROUP BY s.region, s.store_name, s.store_id;
Задача 60

Активность выше средней

Найти пользователей, чья активность по комментариям не меньше среднего по всем пользователям.

WITH user_activity AS (
  SELECT
    u.name,
    COUNT(c.comment_id) AS comment_count,
    AVG(COUNT(c.comment_id)) OVER () AS avg_comments
  FROM users u
  LEFT JOIN comments c ON u.user_id = c.user_id
  GROUP BY u.user_id, u.name
)
SELECT name, comment_count
FROM user_activity
WHERE comment_count >= avg_comments;
SQL Upper-Middle

Upper-Middle: плотные задачи без разогрева

Для тех, кто уже не спотыкается о базовый SQL и хочет готовиться к сложным интервью: проверки данных, крайние случаи, EXISTS, окна, CTE и аккуратная логика результата.

Обложка курса SQL Upper-Middle
Stepik course · 4290 ₽

SQL-собеседование: 50 задач Upper-Middle

Курс собран как плотный тренировочный блок: меньше вводных, больше задач, где легко ошибиться в зерне, фильтрах, дубликатах, NULL и граничных условиях.

50 плотных задач

Короткая дистанция без длинного разгона и повторения базы.

0 демо-блоков

Сюда лучше идти после Junior и Middle-логики.

EDGE на edge cases

Сверки, разные заказы, отсутствующие строки, средние внутри групп.

Что закрывает

  • Проверка данных и расхождения между фактами и итогами.
  • EXISTS, DISTINCT, разные заказы и ложные совпадения.
  • Оконные функции внутри CTE и сравнение с групповыми метриками.
  • Задачи, где важны крайние случаи и защита логики на интервью.

Кому подходит

Если Middle-задачи уже решаются без паники, но хочется нагрузить себя плотными кейсами перед интервью, Upper-Middle будет нормальной проверкой. Если база ещё плавает, сюда рано.

Примеры задач из курса

Здесь показываем задачи, где главная сложность в логике результата и edge cases.

Задача 76

Расхождение сумм в заказах

Сверить сумму заказа с пересчитанной суммой позиций и поймать ошибки в данных.

SELECT
  o.order_id,
  o.total_amount,
  ROUND(SUM(i.price * i.quantity), 2) AS calc_amount,
  ROUND(ABS(SUM(i.price * i.quantity) - o.total_amount), 2) AS delta
FROM orders o
LEFT JOIN order_items i ON o.order_id = i.order_id
WHERE o.status = 'completed'
GROUP BY o.order_id, o.total_amount
HAVING ABS(SUM(i.price * i.quantity) - o.total_amount) > 0.01
   OR SUM(i.price * i.quantity) IS NULL;
Задача 78

Товары A и B в разных заказах

Найти клиентов, которые купили два товара в разных заказах, без ложного совпадения в одном чеке.

SELECT DISTINCT o1.customer_id
FROM orders o1
JOIN order_items i1 ON o1.order_id = i1.order_id
WHERE i1.product_id = 'A'
  AND EXISTS (
    SELECT 1
    FROM orders o2
    JOIN order_items i2 ON o2.order_id = i2.order_id
    WHERE o2.customer_id = o1.customer_id
      AND i2.product_id = 'B'
      AND o2.order_id <> o1.order_id
  );
Задача 80

Зарплата выше средней по отделу

Сравнить сотрудника со средней зарплатой внутри отдела и сохранить название отдела в результате.

WITH ranked_employees AS (
  SELECT
    e.name,
    e.salary,
    d.dept_name,
    AVG(e.salary) OVER (PARTITION BY e.dept_id) AS avg_salary
  FROM employees e
  JOIN departments d ON e.dept_id = d.dept_id
)
SELECT name, salary, dept_name
FROM ranked_employees
WHERE salary > avg_salary;
SQL before DE
SQL -> DE

Перед DE нужен SQL, который держится

В DE-практикуме SQL нужен не для галочки. Он всплывает в зерне результата, связях между слоями, проверках данных и BI-витринах. Если здесь есть провалы, проект быстро начинает буксовать.

01

Гранулярность

Понимать, где одна строка результата, а где уже случайное размножение после JOIN.

02

Слои данных

Читать RAW, STG, CORE и MARTS не как названия, а как разные уровни ответственности.

03

Проверки

Ловить NULL, дубликаты, пропуски дат, лишние строки и расхождения между источниками.

04

BI-витрина

Собрать запрос так, чтобы его можно было открыть, объяснить и показать в дашборде.

foundation_check.sql ready for pipeline
with paid_orders as (
  select
    user_id,
    date_trunc('month', paid_at) as pay_month,
    amount
  from core.orders
  where status = 'paid'
),
monthly_revenue as (
  select
    user_id,
    pay_month,
    sum(amount) as revenue
  from paid_orders
  group by user_id, pay_month
)
select *
from monthly_revenue
where revenue > 0;
JOIN без дублей
grain определён
DAG следующий шаг
SQL диагностика

Подберите SQL-маршрут

Четыре коротких вопроса: текущий уровень, понимание фрагмента запроса и ближайшая цель. В конце получите курс или бандл, который логично брать сейчас.

Найдем точку входа

Если база проседает, не надо покупать Middle. Если уже пишете рабочий SQL, не надо топтаться в Junior.

Вопрос 1 из 4

Маршрут

Открыть маршрут
FAQ

Вопросы, которые лучше закрыть до покупки

Коротко по выбору курса, демо-задачам, бандлам и переходу от SQL к Data Engineering.

С какого курса начать?

Если путаются SELECT, WHERE, GROUP BY и порядок операторов, начните с основ. Если база уже есть, но ломается логика на JOIN, NULL и датах, берите Junior. Если пишете рабочий SQL, но проседают CTE, окна и объяснение решения, смотрите Middle.

Чем Junior отличается от Middle?

Junior стабилизирует базу: соединения, группировки, NULL, даты, дубликаты и простые бизнес-условия. Middle уже про рабочие аналитические запросы: CTE, окна, ранжирование, подзапросы и задачи, где важно объяснить ход мысли.

Когда нужен Upper-Middle?

Когда базовый SQL не мешает и хочется готовиться к сложным интервью. Там меньше разогрева и больше плотных задач: проверки данных, edge cases, EXISTS, окна и аккуратная логика результата.

Что выбрать перед собеседованием?

Если до интервью мало времени, сначала пройдите диагностику. Если уровень уже понятен, Middle обычно закрывает основную массу собеседовательных SQL-задач. Upper-Middle нужен тем, кто хочет отработать сложные кейсы.

Когда брать бандл?

Бандл нужен, если цель не один узкий пробел, а маршрут. Junior + Middle подходит, когда база плавает и нужно выйти на рабочий уровень. Pro pack 3 in 1 нужен, если хотите закрыть всю SQL-линейку без пересборки покупки.

Есть ли демо-задачи?

В Junior и Middle есть демо-задачи, которые можно попробовать на Stepik до покупки. В Upper-Middle формат плотнее: 50 задач без демо-блока, поэтому перед ним лучше честно проверить уровень.

Что делать после SQL?

Если цель Data Engineering, после уверенного SQL логично переходить к Python и DE-практикуму: файлы, DWH-слои, Spark, Airflow, Postgres и BI-витрина. SQL там нужен не для галочки, а для проверки зерна результата.

Финальный выбор

Не угадывайте курс. Сначала проверьте маршрут

Если уровень понятен, открывайте программу на Stepik. Если есть сомнения или нужен комплект, диагностика покажет маршрут, точную цену и экономию.

01 Один курс

Основы, Junior, Middle или Upper-Middle.

02 Бандл

Junior + Middle или полная SQL-линейка.

03 Цена

Точная стоимость курса и реальная экономия комплекта.