Основы SQL
Для старта с WHERE, GROUP BY, сортировки и первых соединений перед задачами Junior.
Практическая линейка с автопроверкой на Stepik: стартуйте с Junior, доберите Middle или закройте всё Pro pack 3 in 1.
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; Слабый выбор курса легко ломает темп: Junior может быть скучным, Middle без базы быстро превращается в боль. Начните с честного состояния, в котором SQL проседает прямо сейчас.
Прямые ссылки на Stepik ниже, в карточках конкретных курсов. Здесь выбираем маршрут, а не покупаем наугад.
Четыре коротких вопроса: текущий уровень, понимание фрагмента запроса и ближайшая цель. В конце получите курс или бандл, который логично брать сейчас.
Если база проседает, не надо покупать Middle. Если уже пишете рабочий SQL, не надо топтаться в Junior.
Сначала выберите точку входа. Основы закрывают базу перед Junior. SQL-квест дает короткий игровой формат ближе к Middle. Бандлы подходят для полного маршрута.
Для старта с WHERE, GROUP BY, сортировки и первых соединений перед задачами Junior.
Короткий игровой курс с задачами ближе к Middle: решить руками, втянуться в формат и понять следующий шаг.
JOIN, GROUP BY, NULL, даты и первые задачи, где ломается логика результата.
CTE, окна, ранжирование, tricky-условия и объяснение хода решения.
50 задач без демо-блока: меньше разогрева, больше плотных кейсов на окна, подзапросы, агрегации и крайние случаи.
Проверка уровня перед покупкой: понять текущую точку и выбрать курс без промаха.
Маршрут с базой Junior и рабочими задачами Middle в одной программе.
Junior, Middle и Upper-Middle одним маршрутом: база, рабочие запросы и плотная подготовка к сложным вопросам.
Для тех, кто уже понимает синтаксис SQL, но всё ещё ошибается в JOIN, GROUP BY, NULL, датах, дубликатах после соединений и простых бизнес-условиях.
Основной трек идёт от безопасного демо к задачам на бизнес-логику, ловушки и разогрев перед собеседованием. Диалект курса: MySQL 8.0+.
Основной трек Junior: от задач 1-5 в демо до финального теста 91-100.
Можно проверить формат до покупки: условия, схема, автопроверка и разбор.
45 тестов с собеседовательным уклоном и 10 SQL-задач повышенной плотности.
Если SQL уже не пугает, но решение часто держится на ощущениях: “кажется, надо соединить таблицы”, “вроде COUNT”, “почему строк стало больше”. Это как раз Junior-уровень, который надо довести до автоматизма.
Короткие фрагменты реальных задач: условие, навык и SQL-решение. Так проще понять уровень без красивой болтовни.
Нужно соединить пользователей и сделки, оставить 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; Классика на 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; Нужно выбрать приглашённых пользователей, которые сделали хотя бы один заказ, и убрать повторы из-за нескольких покупок.
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; Основы нужны, если ещё путаются фильтрация, группировки и первые соединения. SQL-квест — короткий игровой курс для тех, кто уже может решать руками и хочет формат ближе к Middle.
Для тех, кто ещё путает порядок операторов, фильтрацию, группировку и первые соединения. Подготовка к Junior через спокойную базовую практику.
SELECT name, registration_date
FROM users
WHERE registration_date > '2023-01-01'
ORDER BY registration_date DESC; Короткий игровой курс с задачами ближе к Middle. Подходит, чтобы втянуться, увидеть формат и проверить ход мысли на компактной дистанции.
Смысл скидки лучше привязать к маршруту: студент выбирает нужный уровень и при необходимости берёт комплект. Позже это можно оформить через промокод, заявку или отдельную цену на бандл.
Для тех, кто уже пишет рабочий SQL, но теряет уверенность на CTE, оконных функциях, ранжировании, подзапросах и задачах, где важна не только выдача, но и ход мысли.
Здесь уже мало знать синтаксис. Нужно держать зерно результата, аккуратно собирать промежуточные CTE, использовать окна и спокойно объяснять, почему запрос устроен именно так.
Можно проверить формат и уровень до покупки курса.
Разбиваете решение на понятные шаги и спокойно проверяете каждый слой.
RANK, PARTITION BY, средние значения и сравнения внутри групп.
Если JOIN, GROUP BY и базовые агрегаты уже живут в руках, но задачи с окнами, несколькими шагами и tricky-условиями заставляют долго перебирать варианты, это Middle.
Три фрагмента показывают реальную плотность Middle: self join, ранжирование и сравнение со средним через окно.
Посчитать, сколько прямых приглашённых у каждого участника сделали хотя бы одну покупку.
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; Построить рейтинг магазинов внутри каждого региона по выручке за 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; Найти пользователей, чья активность по комментариям не меньше среднего по всем пользователям.
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 и хочет готовиться к сложным интервью: проверки данных, крайние случаи, EXISTS, окна, CTE и аккуратная логика результата.
Курс собран как плотный тренировочный блок: меньше вводных, больше задач, где легко ошибиться в зерне, фильтрах, дубликатах, NULL и граничных условиях.
Короткая дистанция без длинного разгона и повторения базы.
Сюда лучше идти после Junior и Middle-логики.
Сверки, разные заказы, отсутствующие строки, средние внутри групп.
Если Middle-задачи уже решаются без паники, но хочется нагрузить себя плотными кейсами перед интервью, Upper-Middle будет нормальной проверкой. Если база ещё плавает, сюда рано.
Здесь показываем задачи, где главная сложность в логике результата и edge cases.
Сверить сумму заказа с пересчитанной суммой позиций и поймать ошибки в данных.
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; Найти клиентов, которые купили два товара в разных заказах, без ложного совпадения в одном чеке.
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
); Сравнить сотрудника со средней зарплатой внутри отдела и сохранить название отдела в результате.
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; В DE-практикуме SQL нужен не для галочки. Он всплывает в зерне результата, связях между слоями, проверках данных и BI-витринах. Если здесь есть провалы, проект быстро начинает буксовать.
Понимать, где одна строка результата, а где уже случайное размножение после JOIN.
Читать RAW, STG, CORE и MARTS не как названия, а как разные уровни ответственности.
Ловить NULL, дубликаты, пропуски дат, лишние строки и расхождения между источниками.
Собрать запрос так, чтобы его можно было открыть, объяснить и показать в дашборде.
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; Коротко по выбору курса, демо-задачам, бандлам и переходу от SQL к Data Engineering.
Если путаются SELECT, WHERE, GROUP BY и порядок операторов, начните с основ. Если база уже есть, но ломается логика на JOIN, NULL и датах, берите Junior. Если пишете рабочий SQL, но проседают CTE, окна и объяснение решения, смотрите Middle.
Junior стабилизирует базу: соединения, группировки, NULL, даты, дубликаты и простые бизнес-условия. Middle уже про рабочие аналитические запросы: CTE, окна, ранжирование, подзапросы и задачи, где важно объяснить ход мысли.
Когда базовый SQL не мешает и хочется готовиться к сложным интервью. Там меньше разогрева и больше плотных задач: проверки данных, edge cases, EXISTS, окна и аккуратная логика результата.
Если до интервью мало времени, сначала пройдите диагностику. Если уровень уже понятен, Middle обычно закрывает основную массу собеседовательных SQL-задач. Upper-Middle нужен тем, кто хочет отработать сложные кейсы.
Бандл нужен, если цель не один узкий пробел, а маршрут. Junior + Middle подходит, когда база плавает и нужно выйти на рабочий уровень. Pro pack 3 in 1 нужен, если хотите закрыть всю SQL-линейку без пересборки покупки.
В Junior и Middle есть демо-задачи, которые можно попробовать на Stepik до покупки. В Upper-Middle формат плотнее: 50 задач без демо-блока, поэтому перед ним лучше честно проверить уровень.
Если цель Data Engineering, после уверенного SQL логично переходить к Python и DE-практикуму: файлы, DWH-слои, Spark, Airflow, Postgres и BI-витрина. SQL там нужен не для галочки, а для проверки зерна результата.
Если уровень понятен, открывайте программу на Stepik. Если есть сомнения или нужен комплект, диагностика покажет маршрут, точную цену и экономию.
Основы, Junior, Middle или Upper-Middle.
Junior + Middle или полная SQL-линейка.
Точная стоимость курса и реальная экономия комплекта.