Чему вы научитесь
- Запускать локальную учебную базу SQLite и выполнять SQL-запросы к данным интернет-магазина
- Определять ключи, связи и уровень детализации строк в таблицах пользователей, заказов, товарных позиций, платежей и доставок
- Рассчитывать стоимость товаров в заказе по количеству и цене каждой позиции
- Сравнивать INNER JOIN и LEFT JOIN и сохранять в выборке заказы без платежей или других связанных записей
- Находить размножение строк при соединении заказов с несколькими позициями и доставками
- Различать COUNT(*) и COUNT(DISTINCT order_id) при подсчёте строк и уникальных заказов
- Объяснять, почему SUM(DISTINCT ...) теряет корректные суммы одинаковых по стоимости позиций
- Использовать GROUP BY для расчёта агрегатов и получать ровно одну строку на заказ
- Различать отсутствие платежа и нулевую сумму, корректно применять NULL и COALESCE в отчётах
- Считать только успешные платежи, исключая ожидающие и неуспешные попытки оплаты
- Находить неоплаченные и частично оплаченные заказы и рассчитывать разницу между стоимостью товаров и суммой платежей
- Использовать CTE и подзапросы для независимой агрегации товарных позиций и платежей до соединения результатов
- Применять EXISTS для проверки наличия связанных записей без увеличения числа строк
- Обнаруживать повторный импорт одного платежа по идентификатору транзакции в пределах заказа
- Учитывать разные успешные транзакции с одинаковой суммой, не удаляя их как дубликаты
- Проверять, что дополнительные доставки и неуспешные платежи не изменяют итоговые денежные показатели
- Сверять значения по каждому заказу и общие суммы отчёта с независимыми запросами к исходным таблицам
- Проверять SQL-расчёты на изменённых данных, включая новые позиции, другую стоимость заказа и повторные записи
- Самостоятельно находить несколько причин неверных расчётов в готовом SQL-отчёте и исправлять их
- Создавать итоговый отчёт с одной строкой на заказ, корректными суммами и проверкой на семи наборах данных
О курсе

🧭 Отправная точка
У заказа 104 две товарные позиции стоимостью 6000 и 1500 копеек. Вместе они стоят 7500 копеек. После соединения с таблицей доставок запрос может вернуть четыре строки: у заказа две доставки, и каждая позиция повторяется дважды. Обычный SUM в таком результате покажет 15 000 копеек.
SUM(DISTINCT ...) тоже не исправит расчёт. У заказа 107 две разные позиции по 750 копеек. Этот агрегат сложит только одно из одинаковых значений и покажет 750 вместо 1500. Чтобы правильно считать суммы, нужно понимать, какие записи представляют отдельные товары, платежи и заказы.
На курсе вы будете находить подобные ошибки в учебной базе интернет-магазина на SQLite. В ней есть пользователи, заказы, товарные позиции, платежи и доставки. Вы разберётесь, как соединения увеличивают число строк, почему из отчёта исчезают неоплаченные заказы и как отличать повторную запись платежа от новой транзакции.
🎯 Цель курса — научиться находить ошибки в SQL-отчётах, исправлять расчёты и независимо проверять суммы товаров и успешных платежей.
⚙️ Что вы будете делать
Начнёте с пяти таблиц магазина: изучите ключи и связи, рассчитаете стоимость товаров, сравните INNER JOIN и LEFT JOIN. Проследите, откуда берутся дополнительные строки после соединений, и проверите разницу между COUNT(*) и COUNT(DISTINCT order_id). Научитесь получать по одной строке для каждого заказа, сохраняя в отчёте и неоплаченные заказы.
Затем разберёте учёт платежей. Будете суммировать успешные транзакции, отделять их от ожидающих и неуспешных, работать с NULL и COALESCE. Проверите, как распознать повторный импорт по паре (order_id, transaction_ref), почему разные платежи равной суммы нужно учитывать отдельно и как находить противоречивые суммы у записей одной транзакции.
С помощью GROUP BY, CTE и подзапросов соберёте отчёт, где стоимость товаров и оплата рассчитываются отдельно, а готовые суммы присоединяются к заказам. Проверите, что дополнительная доставка не меняет денежные показатели, неуспешный платёж не увеличивает оплаченную сумму, а изменение количества товара отражается в стоимости заказа.
В финале исследуете готовый отчёт с ошибками и самостоятельно напишете исправленный запрос в queries/final_report.sql. Сверите значения с исходными таблицами и запустите проверку на изменённых данных, чтобы обнаружить ошибки, незаметные на первоначальном наборе.
🔥 Чем отличается курс
Все примеры выполняются на небольшой локальной базе SQLite. Вы будете смотреть на исходные строки и результаты соединений, проверять количество позиций, доставок и платежей. Для каждой неверной суммы можно проследить, какие именно записи попали в расчёт.
У платежей есть отдельные правила учёта. Повторные успешные записи одной транзакции считаются один раз по её идентификатору в пределах заказа. Две разные транзакции с одинаковой суммой учитываются обе. Если записи одной транзакции противоречат друг другу по сумме, сначала потребуется обнаружить ошибку в данных.
Итоговый SQL-отчёт содержит идентификатор и статус заказа, стоимость его товаров, сумму успешных платежей и разницу. Заказы без оплаты остаются в отчёте, а заказ без позиций показывает нулевую стоимость товаров. Если оплата превышает стоимость, разница будет отрицательной. Вы проверите как отдельные заказы, так и общие итоги: совпавшая общая сумма ещё не гарантирует правильность каждой строки.
Локальный скрипт проверит ваш SQL на семи независимых наборах данных: исходном и шести изменённых. Среди изменений — новая доставка, повторный импорт платежа, неуспешная попытка оплаты, другое количество товара, дополнительная позиция той же стоимости и заказ без позиций. Проверяются состав и уникальность заказов, пять полей отчёта и суммы по каждому заказу.
📚 Дополнительные бесплатные материалы
- 📄 SQL JOIN удвоил сумму заказа: разбираем ошибку агрегации
- 📄 SQL JOIN: INNER, LEFT, RIGHT и FULL JOIN с примерами
- 📄 Retry, Rerun и Backfill: почему повторная загрузка может испортить данные
- 📄 ETL и ELT: что это, в чём разница и что выбрать
📦 Учебные файлы и время
Курс бесплатный: 5 модулей, 24 урока, ориентировочно 7–10 часов с практикой. Вы получите учебную базу SQLite и файлы для самостоятельных SQL-заданий. Для работы достаточно Python 3.12 или новее, редактора и терминала; Docker и серверная база данных не понадобятся.
Готовые запросы проверяются локально. Аккаунт GitHub, форк, публикация решений и ручная рецензия для прохождения не требуются.
🧪 Поддержка
🧪 Самопроверка вместо ожидания ручной рецензии. Вы сверяете результат по критериям задания, ответам и предусмотренным в курсе локальным проверкам. Разборы самостоятельных упражнений доступны там, где они предусмотрены программой.
Индивидуальная проверка работ преподавателем и персональные консультации в этом курсе не предусмотрены. Формат рассчитан на самостоятельное прохождение.
🚀 О XNova
XNova — практические курсы и учебные проекты для разработчиков, тестировщиков и инженеров. Мы разбираем технологии на работающих примерах: с кодом, наблюдаемым результатом и объяснением инженерных решений.
🔗 xnova.dev — другие курсы и материалы XNova.
📬 Контакты и сообщество
Продолжить знакомство с XNova, следить за новыми материалами или задать организационный вопрос можно здесь:
- 📣 Telegram-канал: @xnova_dev — анонсы курсов, статьи и новости проекта.
- 💬 Написать XNova: @xnova_contact — контакт для вопросов о курсах и проекте.
- ✉️ Почта: contact@xnova.dev — если удобнее написать письмом.
- 💻 GitHub: xnova-tech — открытые учебные проекты и примеры.
Для кого этот курс
Начальные требования
📚 Начальные знания
- Уметь выполнять базовый SELECT, выбирать столбцы, использовать WHERE и читать таблицу результата.
- Понимать, что такое строка, столбец и идентификатор записи.
- Уметь открыть терминал и запустить команду. JOIN, CTE и агрегаты разбираются в курсе.
🧰 Окружение
- Python 3.12 или новее со встроенным модулем sqlite3. Установка серверной базы не требуется.
- Редактор для SQL-файлов и терминал на Windows, macOS или Linux.
- Git полезен, но необязателен: учебный архив можно скачать без аккаунта GitHub.
- После подготовки стенда все проверки должны работать локально и без интернета.
⏱️ Время и формат
Курс бесплатный. Ориентир — 7–10 часов с самостоятельными заданиями. Ответы на вопросы проверяются автоматически; собственные SQL-файлы проверяет локальный скрипт, без ручной рецензии.
✅ Что не потребуется
Docker, облачная база, платные сервисы, API-ключи, доступ к реальным заказам или обязательный форк GitHub.
Как проходит обучение
🧮 От исходных строк к проверенному отчёту. На одной локальной базе SQLite вы постепенно разбираете JOIN, агрегаты и причины неверных сумм.
- 🔎 Исследуете данные: проверяете, где появляются лишние строки и почему пропадают неоплаченные заказы.
- 🛠️ Пишете свои запросы: исправляете расчёты и небольшой аналитический отчёт.
- ✅ Сверяете итог: сравниваете суммы с исходными таблицами и запускаете локальную автоматическую проверку.
Программа курса
В курс входят
- 25 уроков
- 40минут видео
- 24 теста
Наши преподаватели
Что вы получаете
- Локальная учебная база SQLite с синтетическими пользователями, заказами, товарными позициями, платежами и доставками
- Собственные SQL-запросы для расчёта стоимости заказов, сравнения INNER JOIN и LEFT JOIN и обнаружения размножения строк
- Запросы с GROUP BY, CTE, подзапросами и EXISTS для расчётов без повторного учёта записей
- Проверки успешных, неуспешных и отсутствующих платежей, повторных импортов и частично оплаченных заказов
- Независимые SQL-сверки сумм товаров и платежей по каждому заказу и по всей выборке
- Исправленный итоговый запрос queries/final_report.sql с идентификатором и статусом заказа, стоимостью товаров, суммой успешных платежей и разницей
- Результаты локальной автоматической проверки отчёта на семи наборах данных, включая случаи с повторными платежами, новыми доставками и изменёнными позициями