Как решать задание 3 ЕГЭ по информатике 2026 — реляционные базы данных
Разбор задания 3 ЕГЭ по информатике: связанные таблицы, CSV, фильтры, два подхода — LibreOffice Calc и Python. Пошаговый алгоритм и типичные ошибки.
О чём задание
В задании 3 тебе дают несколько связанных таблиц в формате CSV или ODS (обычно 2-3 файла) и задают вопрос вроде «Сколько товаров продано в апреле у поставщика из Москвы» или «На какую сумму Иванов купил продукцию категории Б». Нужно отфильтровать данные по условиям, объединить таблицы по общему ключу и посчитать — количество, сумму или среднее.
Это прямое отражение того, как работают реальные информационные системы. Школьный электронный журнал хранит оценки, расписание и списки учеников в разных таблицах, связанных по ID. Интернет-магазин так же разбивает товары, заказы и покупателей. Умение работать со связанными таблицами — реально полезный навык, который пригодится не только на ЕГЭ.
Задание 3 стоит 1 первичный балл (всего 29 первичных на экзамене), но пропускать его нельзя — оно решается за 5-7 минут при минимальной подготовке. Если ты только начинаешь готовиться — начни с плана подготовки с нуля.
Что такое реляционная БД
Реляционная модель — это способ хранения данных в виде таблиц со строками и столбцами, связанных между собой общими полями.
Пример — онлайн-школа. Есть три таблицы:
Ученики (students.csv):
| id | name | class |
|---|---|---|
| 1 | Иванов | 11А |
| 2 | Петров | 11Б |
| 3 | Сидорова | 11А |
Курсы (courses.csv):
| id | title | price |
|---|---|---|
| 10 | Информатика | 15000 |
| 11 | Математика | 12000 |
Записи на курсы (enrollments.csv):
| student_id | course_id | date |
|---|---|---|
| 1 | 10 | 2026-01-15 |
| 1 | 11 | 2026-01-20 |
| 2 | 10 | 2026-02-01 |
| 3 | 11 | 2026-02-10 |
Третья таблица — связующая: student_id ссылается на id в таблице учеников (это внешний ключ), course_id — на id в таблице курсов. Чтобы узнать, кто записан на курс «Информатика», нужно:
- Найти в
courses.csvID курса «Информатика» — это 10. - В
enrollments.csvотфильтровать строки, гдеcourse_id = 10— получаем student_id = 1, 2. - В
students.csvнайти имена учеников с этими ID — Иванов и Петров.
Это классическая схема задания 3.
Четыре типа задач
1. Фильтрация по простому условию
«Сколько учеников 11А класса записано на курс Математика». Простая фильтрация в одной или двух таблицах с логическим И.
2. Подсчёт по группам
«В каком классе больше всего учеников, записанных на курс Информатика». Нужно сгруппировать результаты по полю и сравнить.
3. Сумма по условию
«На какую сумму ученик Иванов записался на курсы». Складываются цены всех курсов Иванова. Здесь связь идёт через две таблицы.
4. Связь через две и более таблицы
«Средняя цена курса, на который записаны ученики 11А класса». Надо пройти через все три таблицы: из students.csv взять ID учеников 11А, из enrollments.csv взять их курсы, из courses.csv взять цены и усреднить.
Пошаговый алгоритм
- Прочитай условие целиком. Выпиши, что нужно посчитать и по каким таблицам.
- Нарисуй схему связей. На черновике: какая таблица с какой связана и через какое поле. Это 30 секунд, но спасает от путаницы.
- Выбери инструмент. Если условие простое и на одну-две таблицы — Calc. Если три таблицы или хитрая логика — Python.
- Отфильтруй исходные данные. В Calc — автофильтр, в Python — цикл с условием.
- Соедини таблицы. В Calc — через ВПР, в Python — через словари.
- Посчитай итог. Сумма, количество, среднее.
- Проверь. Посмотри на крайние значения: не получилось ли 0, не стало ли результатом отрицательное число, правдоподобен ли ответ.
Подход 1: LibreOffice Calc
Загрузка CSV
Открой файл через Файл → Открыть. Появится диалог: выбери кодировку UTF-8, разделитель (обычно запятая или точка с запятой), пометь «Разделители — запятая». Нажми OK. Данные загрузятся в таблицу.
Повтори для каждого файла — у тебя откроется несколько окон.
Фильтрация
Выдели шапку первой таблицы, меню Данные → Автофильтр. В колонке появятся стрелочки. Нажми стрелку — выбери нужное значение или задай условие.
Для сложной фильтрации: Данные → Ещё фильтры → Стандартный фильтр, там можно задать до 8 условий с И/ИЛИ.
Связь через ВПР
Функция ВПР(искомое_значение; диапазон; номер_столбца; 0) ищет значение в первом столбце диапазона и возвращает значение из указанного столбца той же строки. Пример:
=ВПР(A2; students.csv.A:C; 2; 0)
Берёт из ячейки A2 значение (ID ученика), ищет его в первом столбце таблицы students.csv, и возвращает значение из второго столбца — имя.
Подсчёт и суммирование
=СЧЁТЕСЛИ(диапазон; условие)— сколько ячеек удовлетворяет условию.=СУММЕСЛИ(диапазон; условие; диапазон_суммы)— сумма по условию.=СЧЁТЕСЛИМН(диапазон1; условие1; диапазон2; условие2; ...)— несколько условий И.=СУММЕСЛИМН(диапазон_суммы; диапазон1; условие1; ...)— сумма по нескольким условиям.
Пример: сколько записей на курс с ID 10:
=СЧЁТЕСЛИ(enrollments.csv.B:B; 10)
Подход 2: Python
Универсальный инструмент, который справится с любой задачей. На КЕГЭ у тебя установлен Python 3.10+ с модулями csv, sqlite3, а часто и pandas.
Чтение CSV
import csv
def load(path):
with open(path, encoding='utf-8') as f:
return list(csv.DictReader(f, delimiter=';'))
students = load('students.csv')
courses = load('courses.csv')
enrollments = load('enrollments.csv')
Каждая таблица становится списком словарей: students[0] = {'id': '1', 'name': 'Иванов', 'class': '11А'}. Все значения — строки, поэтому числа надо явно конвертить через int().
Фильтрация
# Ученики 11А
class_a = [s for s in students if s['class'] == '11А']
# Курсы дороже 13000
expensive = [c for c in courses if int(c['price']) > 13000]
Связь через словарь
Самый удобный приём: построить словарь по ID, чтобы быстро получать данные по ключу.
students_by_id = {s['id']: s for s in students}
courses_by_id = {c['id']: c for c in courses}
# Теперь по каждой записи в enrollments можно подтянуть данные
for e in enrollments:
student = students_by_id[e['student_id']]
course = courses_by_id[e['course_id']]
print(student['name'], 'записался на', course['title'])
SQL через sqlite3
Для сложных задач можно подключить sqlite3, загрузить CSV в таблицы и писать настоящий SQL.
import sqlite3, csv
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE students (id INT, name TEXT, class TEXT)')
cur.execute('CREATE TABLE courses (id INT, title TEXT, price INT)')
cur.execute('CREATE TABLE enrollments (student_id INT, course_id INT, date TEXT)')
with open('students.csv', encoding='utf-8') as f:
for row in csv.DictReader(f, delimiter=';'):
cur.execute('INSERT INTO students VALUES (?,?,?)',
(int(row['id']), row['name'], row['class']))
# Аналогично для courses и enrollments
conn.commit()
Теперь можно писать SQL-запрос:
SELECT s.name, SUM(c.price)
FROM enrollments e
JOIN students s ON s.id = e.student_id
JOIN courses c ON c.id = e.course_id
WHERE s.class = '11А'
GROUP BY s.name
ORDER BY SUM(c.price) DESC
Этот подход мощный, но на экзамене его стоит использовать, только если часто тренировался заранее — иначе время уйдёт на набор boilerplate-кода.
Полноценный разобранный пример
Условие. В файле students.csv хранятся данные учеников, в courses.csv — курсы, в enrollments.csv — записи учеников на курсы. Требуется определить максимальную сумму, на которую записался один ученик из класса 11А.
Данные (упрощённые):
students.csv:
id;name;class
1;Иванов;11А
2;Петров;11Б
3;Сидорова;11А
4;Козлов;11А
courses.csv:
id;title;price
10;Информатика;15000
11;Математика;12000
12;Физика;13000
enrollments.csv:
student_id;course_id;date
1;10;2026-01-15
1;11;2026-01-20
1;12;2026-01-25
3;11;2026-02-10
4;10;2026-02-15
4;12;2026-02-20
Решение через Python.
import csv
def load(path):
with open(path, encoding='utf-8') as f:
return list(csv.DictReader(f, delimiter=';'))
students = load('students.csv')
courses = load('courses.csv')
enrollments = load('enrollments.csv')
# Ученики 11А
class_a_ids = {s['id'] for s in students if s['class'] == '11А'}
# Цена по ID курса
price_by_course = {c['id']: int(c['price']) for c in courses}
# Сумма по каждому ученику
totals = {}
for e in enrollments:
sid = e['student_id']
if sid in class_a_ids:
totals[sid] = totals.get(sid, 0) + price_by_course[e['course_id']]
# Максимум
print(max(totals.values()))
Разберём логику:
- Собираем ID учеников класса 11А в множество — это даёт быструю проверку
in. - Строим словарь
course_id → price: по ID курса мгновенно получаем цену. - Идём по всем записям. Если ученик из 11А — прибавляем цену курса к его сумме.
- Берём максимум.
Проверка вручную. У Иванова: 15000 + 12000 + 13000 = 40000. У Сидоровой: 12000. У Козлова: 15000 + 13000 = 28000. Максимум — 40000. Python вернёт то же.
Решение через LibreOffice Calc.
- Открыть все три CSV.
- В enrollments.csv добавить колонку «price», заполнить через ВПР по course_id.
- Добавить колонку «class» через ВПР по student_id.
- Применить автофильтр: class = «11А».
- Применить сводную таблицу (Данные → Сводная таблица): строки — student_id, значения — сумма price.
- В полученной сводной выбрать максимум.
Способ через Calc быстрее, если ты много тренировался со сводными таблицами. Python универсальнее, если условие хитрее стандартного.
Типичные ошибки
Не учёл связь между таблицами. Считают что-то только по одной таблице, забывая, что вопрос требует данных из другой. Всегда рисуй схему связей перед решением.
Путаница с разделителем CSV. В одних файлах разделитель — ,, в других — ;. Если Python не читает данные или Calc грузит всё в одну колонку, проверь разделитель и передай его явно: csv.DictReader(f, delimiter=';').
Строки вместо чисел. csv.DictReader возвращает все значения как строки. Если сравнить row['price'] > 1000 без int(), получится сравнение строк — и результат будет непредсказуемым. Всегда конвертируй: int(row['price']).
Неправильная фильтрация с И/ИЛИ. Условие «ученики 11А и записанные на Математику» — это два отдельных фильтра, применённых через И. Ошибка — применить один фильтр, потом другой, но без пересечения множеств.
ВПР с неправильной сортировкой. У функции ВПР есть последний параметр — 0 (точное совпадение) или 1 (приблизительное). Если забыл 0, функция может вернуть неверное значение, особенно на неотсортированных данных.
Дубликаты при объединении. Если поле связи не уникально, одна строка из первой таблицы может соединиться с несколькими из второй — и сумма исказится. Всегда проверяй уникальность ключа.
Полный список типичных ошибок по всем заданиям — в разборе ошибок ЕГЭ.
Тайминг
Задание 3 идёт после задания 2. В среднем:
- Прочитать условие, посмотреть файлы: 1 минута
- Нарисовать схему связей: 30 секунд
- Написать Python или настроить Calc: 2-3 минуты
- Получить и проверить ответ: 1-2 минуты
Итого — 5-7 минут. Если уходишь за 10 минут — что-то идёт не так, помечай и двигайся дальше. Время лучше потратить на задание 6 или задание 12, которые тоже по 1 баллу, но требуют концентрации.
Как тренироваться
Неделя 1. Освой базовую работу с CSV: чтение, фильтрация, подсчёт. Реши 10 задач с одной таблицей. Параллельно научись открывать CSV в LibreOffice Calc и применять автофильтр.
Неделя 2. Переходи к задачам с двумя таблицами. Цель — 15 задач, половину реши через Calc (ВПР + СЧЁТЕСЛИ), половину через Python (словари). Сравни, где ты быстрее.
Неделя 3. Задачи с тремя таблицами. 10 штук, обязательно с проверкой ответа вручную на маленьком подмножестве строк.
Неделя 4. Смешанная тренировка: 20 вариантов задания 3 в формате КЕГЭ. Таймер на 7 минут. Главная цель — не ошибаться в связях.
Совет от стобалльников: заведи отдельный файл template.py с готовым кодом чтения CSV и базовыми функциями. На экзамене просто скопируешь шаблон и адаптируешь под задачу — сэкономит 1-2 минуты.
Если хочешь увидеть разбор в формате видео и потренироваться на живых задачах — заходи на тренажёр TuteMe: там все типы задания 3 с автопроверкой, а при ошибке показывается подробный разбор. Для общего понимания структуры экзамена — посмотри что изменилось в ЕГЭ 2026.