Этот модуль не учит SQL с нуля. Он про те места, где инженер данных ошибается, даже если давно пишет запросы: задвоенные суммы после JOIN, NULL в условиях, потерянные строки, повторная загрузка с дублями, запрос, который на проде работает час. Синтаксис SELECT, WHERE и GROUP BY здесь считается известным.
Если базовый синтаксис пока не знаком, сначала пройдите вводный курс, например симулятор SQL от karpov.courses или SQL Academy, и возвращайтесь. Понять, нужно ли это вам, поможет самопроверка в конце урока.
Что внутри
- Как запрос выполняется на самом деле: логический порядок обработки, NULL и трёхзначная логика, типы и неявные приведения.
- JOIN: потерянные строки, semi и anti join, JOIN по диапазону, физические алгоритмы соединения.
- Оконные функции: ранжирование, рамки окна, дедупликация и последняя версия записи.
- Изменение данных: виды команд SQL, DDL и права доступа, upsert и MERGE, повторный запуск загрузки без дублей, транзакции.
- Качество данных и сверки: проверки уникальности и полноты, сверка источника с витриной.
- Производительность: чтение EXPLAIN, индексы, партиции, типичные антипаттерны.
Учебная база
Все примеры и задачи модуля используют одну базу данных интернет-магазина. В ней хранятся клиенты, товары, заказы, платежи и события сайта, а также служебные таблицы, через которые данные загружаются в хранилище. СУБД — PostgreSQL. Время в базе хранится в UTC, текущая дата в ней — 1 июля 2026 года.
| Таблица | Что в ней |
|---|---|
customers | клиенты: email, город, сегмент, дата регистрации |
customers_history | история города и сегмента клиента с периодами действия |
cities | города, регионы и часовые пояса |
products | товары и категории |
orders | заказы: статус, даты, город доставки, промокод, сумма |
order_items | позиции заказов: количество, цена на момент заказа, скидка |
payments | платежи, частичные оплаты, неудачные попытки и возвраты |
stg_orders | промежуточная таблица загрузки: все версии заказов в том виде, в каком они приходят из источника |
events | события сайта: просмотры, поиск, корзина, покупки |
load_log | журнал загрузок: даты, попытки, статусы, число строк |
В данных встречаются пропуски, дубли, заказы без клиента, события, пришедшие с опозданием, и одинаковые статусы в разном регистре. Так выглядят данные в рабочих хранилищах, и задачи модуля построены на этих особенностях.
Внешних ключей в базе нет: в аналитических хранилищах их обычно не создают. Поэтому заказ может ссылаться на клиента, которого нет в таблице клиентов, и целостность данных проверяется запросами.
Самопроверка
Ниже три запроса на то, что модуль считает известным. Ориентир такой: если все три решаются без подсказок, идите дальше. Если буксуют JOIN, GROUP BY или оконные функции, сначала закройте базу вводным курсом, иначе следующие уроки будут читаться тяжело.
Сколько заказов создано в июне 2026 года? Верните одну строку с колонкой orders.
Время в базе хранится в UTC, границы месяца считайте по нему.