Как решать задание 3 ЕГЭ по информатике 2026 — реляционные базы данных
Разбор задания 3 ЕГЭ по информатике: связанные таблицы, CSV, фильтры, два подхода — LibreOffice Calc и Python. Пошаговый алгоритм и типичные ошибки.
О чём задание
В задании 3 тебе дают один файл электронной таблицы (в 2026 году — .ods), внутри которого три связанные таблицы — чаще всего на отдельных листах. Вопрос звучит вроде «Сколько товаров продано в апреле у поставщика из Москвы» или «На какую сумму Иванов купил продукцию категории Б». Нужно отфильтровать данные по условиям, объединить таблицы по общему ключу и посчитать — количество, сумму или среднее.
Это прямое отражение того, как работают реальные информационные системы. Школьный электронный журнал хранит оценки, расписание и списки учеников в разных таблицах, связанных по ID. Интернет-магазин так же разбивает товары, заказы и покупателей. Умение работать со связанными таблицами — реально полезный навык, который пригодится не только на ЕГЭ.
Задание 3 стоит 1 первичный балл (всего 29 первичных на экзамене), но пропускать его нельзя — оно решается за 5-7 минут при минимальной подготовке. Если ты только начинаешь готовиться — начни с плана подготовки с нуля.
Что такое реляционная БД
Реляционная модель — это способ хранения данных в виде таблиц со строками и столбцами, связанных между собой общими полями.
Пример — онлайн-школа. В одном файле три таблицы, каждая на своём листе:
Ученики (лист students):
| id | name | class |
|---|---|---|
| 1 | Иванов | 11А |
| 2 | Петров | 11Б |
| 3 | Сидорова | 11А |
Курсы (лист courses):
| id | title | price |
|---|---|---|
| 10 | Информатика | 15000 |
| 11 | Математика | 12000 |
Записи на курсы (лист enrollments):
| 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 в таблице курсов. Чтобы узнать, кто записан на курс «Информатика», нужно:
- Найти на листе
coursesID курса «Информатика» — это 10. - На листе
enrollmentsотфильтровать строки, гдеcourse_id = 10— получаем student_id = 1, 2. - На листе
studentsнайти имена учеников с этими ID — Иванов и Петров.
Это классическая схема задания 3.
Четыре типа задач
1. Фильтрация по простому условию
«Сколько учеников 11А класса записано на курс Математика». Простая фильтрация в одной или двух таблицах с логическим И.
2. Подсчёт по группам
«В каком классе больше всего учеников, записанных на курс Информатика». Нужно сгруппировать результаты по полю и сравнить.
3. Сумма по условию
«На какую сумму ученик Иванов записался на курсы». Складываются цены всех курсов Иванова. Здесь связь идёт через две таблицы.
4. Связь через две и более таблицы
«Средняя цена курса, на который записаны ученики 11А класса». Надо пройти через все три таблицы: с листа students взять ID учеников 11А, с листа enrollments — их курсы, с листа courses — цены и усреднить.
Пошаговый алгоритм
- Прочитай условие целиком. Выпиши, что нужно посчитать и по каким таблицам.
- Нарисуй схему связей. На черновике: какая таблица с какой связана и через какое поле. Это 30 секунд, но спасает от путаницы.
- Выбери инструмент. Если условие простое и на одну-две таблицы — Calc. Если три таблицы или хитрая логика — Python.
- Отфильтруй исходные данные. В Calc — автофильтр, в Python — цикл с условием.
- Соедини таблицы. В Calc — через ВПР, в Python — через словари.
- Посчитай итог. Сумма, количество, среднее.
- Проверь. Посмотри на крайние значения: не получилось ли 0, не стало ли результатом отрицательное число, правдоподобен ли ответ.
Подход 1: LibreOffice Calc
Загрузка файла
Открой файл через Файл → Открыть. Экзаменационный файл — обычная электронная таблица, поэтому никаких диалогов импорта не будет: все три таблицы уже внутри, каждая на своём листе. Переключайся между ними по вкладкам в нижней части окна.
Фильтрация
Выдели шапку первой таблицы, меню Данные → Автофильтр. В колонке появятся стрелочки. Нажми стрелку — выбери нужное значение или задай условие.
Для сложной фильтрации: Данные → Ещё фильтры → Стандартный фильтр, там можно задать до 8 условий с И/ИЛИ.
Связь через ВПР
Функция ВПР(искомое_значение; диапазон; номер_столбца; 0) ищет значение в первом столбце диапазона и возвращает значение из указанного столбца той же строки. Пример:
=ВПР(A2; students.A:C; 2; 0)
Берёт из ячейки A2 значение (ID ученика), ищет его в первом столбце листа students и возвращает значение из второго столбца — имя. Запись students.A:C — это ссылка на другой лист того же файла: сначала имя листа, потом точка и диапазон.
Подсчёт и суммирование
=СЧЁТЕСЛИ(диапазон; условие)— сколько ячеек удовлетворяет условию.=СУММЕСЛИ(диапазон; условие; диапазон_суммы)— сумма по условию.=СЧЁТЕСЛИМН(диапазон1; условие1; диапазон2; условие2; ...)— несколько условий И.=СУММЕСЛИМН(диапазон_суммы; диапазон1; условие1; ...)— сумма по нескольким условиям.
Пример: сколько записей на курс с ID 10:
=СЧЁТЕСЛИ(enrollments.B:B; 10)
Подход 2: Python
Универсальный инструмент, который справится с любой задачей. Модули csv и sqlite3 входят в стандартную поставку Python, поэтому будут на любой станции КЕГЭ. А вот на внешние библиотеки вроде pandas рассчитывать нельзя — гарантирован только стандартный Python.
Чтение CSV
Python сам по себе .ods не открывает, поэтому данные сначала нужно подготовить: открой экзаменационный файл в Calc и сохрани каждый лист отдельным CSV-файлом (Файл → Сохранить как → Текст CSV; Calc сохраняет только активный лист, так что повтори для каждого). Это минута работы, зато дальше всё читается стандартным модулем 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
Этот подход мощный, но на экзамене его стоит использовать, только если часто тренировался заранее — иначе время уйдёт на набор служебного кода: создание таблиц и вставку строк.
Полноценный разобранный пример
Условие. В файле три таблицы: на листе students — данные учеников, на листе courses — курсы, на листе enrollments — записи учеников на курсы. Требуется определить максимальную сумму, на которую записался один ученик из класса 11А.
Данные (упрощённые; листы уже сохранены в CSV для Python):
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.
- Открыть файл — все три таблицы уже на своих листах.
- На листе enrollments добавить колонку «price», заполнить через ВПР по course_id.
- Добавить колонку «class» через ВПР по student_id.
- Применить автофильтр: class = «11А».
- Применить сводную таблицу (Данные → Сводная таблица): строки — student_id, значения — сумма price.
- В полученной сводной выбрать максимум.
Способ через Calc быстрее, если ты много тренировался со сводными таблицами. Python универсальнее, если условие хитрее стандартного.
Типичные ошибки
Не учёл связь между таблицами. Считают что-то только по одной таблице, забывая, что вопрос требует данных из другой. Всегда рисуй схему связей перед решением.
Путаница с разделителем CSV. Когда сохраняешь лист в CSV, разделителем может оказаться , или ; — что выбрал в диалоге сохранения, то и будет. Если Python не читает данные или всё склеилось в одну колонку, проверь разделитель и передай его явно: 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 задач с одной таблицей. Параллельно научись открывать файлы в LibreOffice Calc, сохранять лист в CSV и применять автофильтр.
Неделя 2. Переходи к задачам с двумя таблицами. Цель — 15 задач, половину реши через Calc (ВПР + СЧЁТЕСЛИ), половину через Python (словари). Сравни, где ты быстрее.
Неделя 3. Задачи с тремя таблицами. 10 штук, обязательно с проверкой ответа вручную на маленьком подмножестве строк.
Неделя 4. Смешанная тренировка: 20 вариантов задания 3 в формате КЕГЭ. Таймер на 7 минут. Главная цель — не ошибаться в связях.
Совет: доведи набор шаблона чтения CSV до автоматизма — пять строк с csv.DictReader ты должен печатать не задумываясь. Свои файлы и заготовки на экзамен пронести нельзя, поэтому шаблон должен жить в пальцах, а не на флешке.
Потренироваться на живых задачах можно в TuteMe: там все типы задания 3 с автопроверкой, а при ошибке показывается подробный разбор. Для общего понимания структуры экзамена — посмотри что изменилось в ЕГЭ 2026.