SQLшпаргалкаобучение

Шпаргалка по SQL для аналитика — все конструкции

2026-07-04 8 мин

Шпаргалка по SQL для аналитика данных: все конструкции, которые реально нужны в работе и на собеседовании — на одной странице. Порядок выполнения запроса, JOIN на диаграммах, GROUP BY и HAVING, оконные функции, работа с NULL и датами — с визуальными схемами и мини-примерами. Сохраняй в закладки и повторяй перед собеседованием.

Эта шпаргалка построена по принципу «минимум текста — максимум структуры»: таблицы, визуальные схемы и короткие примеры. Каждый блок заканчивается ссылкой, где тему можно потренировать на реальных задачах. Если SQL для тебя совсем новый — начни с бесплатного курса «SQL с нуля», а сюда возвращайся как к справочнику.

Порядок выполнения SQL-запроса

Самый частый источник ошибок у новичков: запрос читается сверху вниз, а выполняется — нет. Отсюда классика «почему я не могу использовать алиас из SELECT в WHERE».

Порядок выполнения SQL-запроса: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT

ШагКонструкцияЧто происходит
1FROM + JOINСобираем исходные таблицы
2WHEREФильтруем строки (агрегатов ещё нет!)
3GROUP BYСхлопываем строки в группы
4HAVINGФильтруем уже группы
5SELECTВычисляем выражения и алиасы
6ORDER BYСортируем результат
7LIMITОтрезаем нужное число строк

Запомни два следствия: алиасы из SELECT нельзя использовать в WHERE (шаг 5 позже шага 2), а фильтровать по агрегату можно только в HAVING.

JOIN: соединение таблиц

LEFT JOIN: все строки левой таблицы плюс совпадения из правой, без пары — NULL

JOINЧто вернётТиповой случай
INNER JOINТолько совпавшие строкиЗаказы с существующими клиентами
LEFT JOINВсю левую + совпадения из правойВсе клиенты, даже без заказов
LEFT JOIN … IS NULLСтроки левой БЕЗ пары в правойКлиенты, которые ни разу не купили
FULL JOINВсё из обеих таблицСверка двух источников
CROSS JOINКаждая с каждойКалендарь × товары для решётки
-- Клиенты без заказов (anti-join)
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Подводный камень собеседований — fan-out: если в правой таблице несколько строк на ключ, строки левой задублируются, и SUM посчитает лишнее. Проверяй кардинальность до JOIN. Больше примеров — в гайде по JOIN и задачах тренажёра.

Цепочка JOIN нескольких таблиц: orders, customers, products

GROUP BY и HAVING

WHERE фильтрует строки до группировки, HAVING — группы после

-- Города, где средний чек выше 2000
SELECT city, COUNT(*) AS orders_cnt, AVG(amount) AS avg_check
FROM orders
WHERE status = 'paid'          -- строки: до группировки
GROUP BY city
HAVING AVG(amount) > 2000;     -- группы: после
АгрегатНюанс
COUNT(*)Считает строки, включая NULL
COUNT(col)Пропускает NULL в col
COUNT(DISTINCT col)Уникальные значения
SUM / AVGИгнорируют NULL (AVG делит на не-NULL!)
MIN / MAXРаботают и с датами, и со строками

Оконные функции

Главная тема SQL-секции на собеседовании аналитика. Окно = агрегат без схлопывания строк.

Оконные функции против GROUP BY: строки сохраняются, агрегат приписывается каждой

ФункцияЧто делаетТиповая задача
ROW_NUMBER()Уникальный номер в группеДедупликация, «первый заказ клиента»
RANK() / DENSE_RANK()Ранг с пропусками / безТоп-N с учётом ничьих
LAG() / LEAD()Значение предыдущей/следующей строкиРост к прошлому месяцу
SUM() OVER (ORDER BY …)Нарастающий итогКумулятивная выручка
AVG() OVER (… ROWS 6 PRECEDING)Скользящее среднееСглаживание метрики за 7 дней

LAG и LEAD: сдвиг значения по временной оси

-- Последний заказ каждого клиента
SELECT * FROM (
  SELECT o.*,
         ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
  FROM orders o
) t
WHERE rn = 1;

Разница ROWS и RANGE, дефолтная рамка окна и почему она коварна — в разборе оконных функций.

NULL: три правила

Правила NULL: сравнение через IS NULL, NULL в агрегатах, COALESCE

Даты

DATE_TRUNC: округление даты до месяца, недели, дня

ЗадачаPostgreSQL
Начало месяцаDATE_TRUNC('month', dt)
Вытащить год/день неделиEXTRACT(YEAR FROM dt), EXTRACT(DOW FROM dt)
Вчера / неделю назадCURRENT_DATE - INTERVAL '1 day' / '7 day'
Разница дат в дняхdt2::date - dt1::date
-- Выручка по месяцам
SELECT DATE_TRUNC('month', paid_at) AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;

CTE и подзапросы

WITH monthly AS (
  SELECT DATE_TRUNC('month', paid_at) AS month, SUM(amount) AS revenue
  FROM orders GROUP BY 1
)
SELECT month, revenue,
       LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM monthly;

CTE (WITH) делает запрос читаемым: каждый шаг — именованный блок. Цепочка из двух-трёх CTE — стандарт продуктовых задач (когорты, воронки). Рекурсивные CTE для иерархий — отдельная тема, разбор с примерами тут.

Мини-справка: строки и агрегация по условию

ЗадачаКонструкция
Условный агрегат (pivot)SUM(CASE WHEN type = 'a' THEN 1 ELSE 0 END)
КонкатенацияCONCAT(first_name, ' ', last_name)
Подстрока по позицииSUBSTRING(s FROM 1 FOR 3)
Поиск по шаблонуLIKE 'abc%' (регистрозависим), ILIKE — нет
Убрать пробелыTRIM(s)

Как учить это всё

Шпаргалка помогает вспомнить, но не заменяет практику: конструкции запоминаются руками. Рабочая связка — курс «SQL с нуля» для базы, затем 545 задач в тренажёре с автопроверкой, и перед собеседованием — топ-50 реальных вопросов по SQL.

Частые вопросы

Что учить в SQL для собеседования аналитика в первую очередь?

Порядок по частоте на реальных собеседованиях: JOIN и их подводные камни (fan-out, anti-join), GROUP BY + HAVING, оконные функции (ROW_NUMBER, LAG, нарастающий итог), работа с датами (DATE_TRUNC), CTE. Этого хватает для 80% SQL-секций на позиции джуна и мидла.

Чем отличается WHERE от HAVING?

WHERE фильтрует строки до группировки — агрегатные функции в нём недоступны. HAVING фильтрует уже готовые группы после GROUP BY — именно туда идут условия на COUNT, SUM, AVG. Если условие не использует агрегат, ставь его в WHERE: это дешевле, фильтрация происходит раньше.

Нужно ли учить отличия диалектов SQL — PostgreSQL, MySQL, ClickHouse?

Для собеседования достаточно одного диалекта, в РФ стандарт де-факто — PostgreSQL. Отличия (strftime в SQLite, toStartOfMonth в ClickHouse) уточняются за минуты, когда понимаешь общую логику. Исключение — если в вакансии явно указан ClickHouse: тогда посмотри его особенности агрегации и массивов.

Где практиковать SQL бесплатно?

В SQL-тренажёре первые задачи открыты без регистрации, движок PostgreSQL работает прямо в браузере. Плюс бесплатный курс из 10 частей с практикой в каждой части.

Закрепи на практике
Шпаргалка запоминается руками: 545 SQL-задач с автопроверкой в браузере. Первые — без регистрации.
Открыть SQL-тренажёр →