
Информатика: создаём своего цифрового помощника Урок 53 из 72
Соединение таблиц и честный отчёт
Соединим две таблицы и сохраним в отчёте задачу, для которой занятий пока нет.
Где мы на карте
Урок 53 из 72, блок «Данные, таблицы и базы» (47–54). Мы продолжаем помощника 1.1 с тремя вымышленными задачами. В конце блока его записи будут храниться в локальном SQLite, а проверенные правила напоминаний останутся прежними.
Ситуация и вопрос
Обычное соединение показывает только t-01 и t-03. Если забыть t-02, читатель решит, что такой задачи никогда не было. Тип соединения меняет вопрос отчёта.
Новые слова без пропусков
JOIN соединяет строки по условию. INNER JOIN оставляет только совпадения в обеих таблицах. LEFT JOIN оставляет все строки левой таблицы и подставляет NULL, если справа совпадения нет. COALESCE(SUM(...), 0) показывает в отчёте ноль вместо пустого итога; подпись должна уточнить «нет записанных занятий». Группировка GROUP BY объединяет занятия по ID задачи. Зернистость отчёта — одна строка на задачу, не на занятие.
Опорный сигнал
Прочитайте схему слева направо. Для каждой стрелки назовите вход, преобразование и проверку. Закройте третий шаг и предскажите его. Затем найдите соответствующую строку в CSV, SQL или отчёте: нарисованная стрелка не должна подменять реальные значения и связи.
Разбираем шаг за шагом
Поставьте tasks слева, study_sessions справа. Обычный INNER JOIN даёт четыре строки занятий и теряет t-02. LEFT JOIN даёт пять строк: четыре занятия и одну строку с задачей t-02, где поля занятия NULL. После GROUP BY t.task_id получаем три строки. Суммы: t-01 — 45, t-02 — 0, t-03 — 25. Проверьте, что 45+0+25=70, но не делайте вывод, будто 0 означает измеренную нулевую сессию.
Предскажите и проверьте
Сначала запишите ожидаемый вывод точно, включая порядок строк. Затем выполните код из папки step-05 и сравните посимвольно. Измените один вход и повторите цикл «предсказать — запустить — объяснить». Пример доказывает только заявленное правило: он не превращает учебные вымышленные данные в измерение реальных людей.
from pathlib import Path
from tempfile import TemporaryDirectory
from data_store import create_database, minutes_report
with TemporaryDirectory() as folder:
db = Path(folder) / "test.db"
create_database(db, "tasks.json", "study_sessions.csv")
for task_id, minutes in minutes_report(db):
print(task_id, minutes)
Ожидаемый вывод
t-01 45
t-02 0
t-03 25
Поймайте ошибку
Если фильтровать s.source = 'app' в WHERE после LEFT JOIN, строка без занятия исчезнет: условие по NULL не истинно. Для отчёта «все задачи, занятия из app» фильтр по правой таблице помещают в ON, затем явно проверяют ожидания.
Изменение проекта
minutes_report строит результат для всех трёх задач. Сохраните рядом число исходных сессий (4), число строк отчёта (3) и контрольную сумму (70). Это защита от тихой потери категории.
Задание и доказательство
Нарисуйте результат INNER и LEFT JOIN до группировки. Объясните, почему в одном четыре строки, в другом пять. Проверьте отчёт по трём ID и назовите отсутствие данных у t-02.
Перенос в новую ситуацию
Есть список всех классов и таблица результатов олимпиады. Как показать в отчёте класс без участников, не превращая отсутствие результата в плохую оценку?
Возврат через 1, 7 и 30 дней
Через 1 день восстановите схему по памяти и назовите случай, где простая аналогия не работает. Через 7 дней объясните новую таблицу товарищу без текста и ответьте минимум на 7 из 10 вопросов итогового урока. Через 30 дней повторите импорт во временную папку и проверьте три задачи, четыре занятия, сумму 70 и неизменные напоминания. Запишите оставшийся непонятным термин и вернитесь к его первому определению.
Первоисточник для проверки
Следующий урок
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.