7 мин чтения

Как решать задание 3 ЕГЭ по информатике 2026 — реляционные базы данных

Разбор задания 3 ЕГЭ по информатике: связанные таблицы, CSV, фильтры, два подхода — LibreOffice Calc и Python. Пошаговый алгоритм и типичные ошибки.

О чём задание

В задании 3 тебе дают один файл электронной таблицы (в 2026 году — .ods), внутри которого три связанные таблицы — чаще всего на отдельных листах. Вопрос звучит вроде «Сколько товаров продано в апреле у поставщика из Москвы» или «На какую сумму Иванов купил продукцию категории Б». Нужно отфильтровать данные по условиям, объединить таблицы по общему ключу и посчитать — количество, сумму или среднее.

Это прямое отражение того, как работают реальные информационные системы. Школьный электронный журнал хранит оценки, расписание и списки учеников в разных таблицах, связанных по ID. Интернет-магазин так же разбивает товары, заказы и покупателей. Умение работать со связанными таблицами — реально полезный навык, который пригодится не только на ЕГЭ.

Задание 3 стоит 1 первичный балл (всего 29 первичных на экзамене), но пропускать его нельзя — оно решается за 5-7 минут при минимальной подготовке. Если ты только начинаешь готовиться — начни с плана подготовки с нуля.

Что такое реляционная БД

Реляционная модель — это способ хранения данных в виде таблиц со строками и столбцами, связанных между собой общими полями.

Пример — онлайн-школа. В одном файле три таблицы, каждая на своём листе:

Ученики (лист students):

idnameclass
1Иванов11А
2Петров11Б
3Сидорова11А

Курсы (лист courses):

idtitleprice
10Информатика15000
11Математика12000

Записи на курсы (лист enrollments):

student_idcourse_iddate
1102026-01-15
1112026-01-20
2102026-02-01
3112026-02-10

Третья таблица — связующая: student_id ссылается на id в таблице учеников (это внешний ключ), course_id — на id в таблице курсов. Чтобы узнать, кто записан на курс «Информатика», нужно:

  1. Найти на листе courses ID курса «Информатика» — это 10.
  2. На листе enrollments отфильтровать строки, где course_id = 10 — получаем student_id = 1, 2.
  3. На листе students найти имена учеников с этими ID — Иванов и Петров.

Это классическая схема задания 3.

Четыре типа задач

1. Фильтрация по простому условию

«Сколько учеников 11А класса записано на курс Математика». Простая фильтрация в одной или двух таблицах с логическим И.

2. Подсчёт по группам

«В каком классе больше всего учеников, записанных на курс Информатика». Нужно сгруппировать результаты по полю и сравнить.

3. Сумма по условию

«На какую сумму ученик Иванов записался на курсы». Складываются цены всех курсов Иванова. Здесь связь идёт через две таблицы.

4. Связь через две и более таблицы

«Средняя цена курса, на который записаны ученики 11А класса». Надо пройти через все три таблицы: с листа students взять ID учеников 11А, с листа enrollments — их курсы, с листа courses — цены и усреднить.

Пошаговый алгоритм

  1. Прочитай условие целиком. Выпиши, что нужно посчитать и по каким таблицам.
  2. Нарисуй схему связей. На черновике: какая таблица с какой связана и через какое поле. Это 30 секунд, но спасает от путаницы.
  3. Выбери инструмент. Если условие простое и на одну-две таблицы — Calc. Если три таблицы или хитрая логика — Python.
  4. Отфильтруй исходные данные. В Calc — автофильтр, в Python — цикл с условием.
  5. Соедини таблицы. В Calc — через ВПР, в Python — через словари.
  6. Посчитай итог. Сумма, количество, среднее.
  7. Проверь. Посмотри на крайние значения: не получилось ли 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()))

Разберём логику:

  1. Собираем ID учеников класса 11А в множество — это даёт быструю проверку in.
  2. Строим словарь course_id → price: по ID курса мгновенно получаем цену.
  3. Идём по всем записям. Если ученик из 11А — прибавляем цену курса к его сумме.
  4. Берём максимум.

Проверка вручную. У Иванова: 15000 + 12000 + 13000 = 40000. У Сидоровой: 12000. У Козлова: 15000 + 13000 = 28000. Максимум — 40000. Python вернёт то же.

Решение через LibreOffice Calc.

  1. Открыть файл — все три таблицы уже на своих листах.
  2. На листе enrollments добавить колонку «price», заполнить через ВПР по course_id.
  3. Добавить колонку «class» через ВПР по student_id.
  4. Применить автофильтр: class = «11А».
  5. Применить сводную таблицу (Данные → Сводная таблица): строки — student_id, значения — сумма price.
  6. В полученной сводной выбрать максимум.

Способ через 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.

Попробовать бесплатно →

Частые вопросы

Сколько времени тратить на задание 3 ЕГЭ по информатике?

На типовую задачу — 5-7 минут, если работаешь в табличном редакторе, или 4-5 минут через Python. Если таблиц три и связь двойная — до 10 минут. За задание 1 первичный балл. Если за 10 минут не справился — помечай и иди дальше, возвращайся в конце экзамена.

В чём смысл реляционной базы данных?

Реляционная БД — это несколько связанных между собой таблиц. Вместо того чтобы хранить всё в одной огромной таблице с повторяющимися данными, информацию разбивают по темам: одна таблица про товары, другая про поставщиков, третья про продажи. Связь между ними — через внешние ключи: в таблице продаж есть столбец id_товара, который ссылается на строку в таблице товаров. Так устроены почти все информационные системы — от школьного журнала до интернет-магазина.

Какой инструмент выбрать для задания 3 — Python или табличный редактор?

Если ты уверенно владеешь фильтрами и функциями СЧЁТЕСЛИ/СУММЕСЛИ/ВПР — бери LibreOffice Calc, это быстрее для простых задач. Если задача со сложной связью между тремя таблицами или с хитрой фильтрацией — бери Python: там ты контролируешь каждый шаг, меньше шансов ошибиться в ВПР. На практике хорошие стобалльники владеют обоими подходами и выбирают под задачу.

Что такое внешний ключ (foreign key)?

Это столбец в одной таблице, который содержит значения первичного ключа из другой таблицы — и таким образом связывает их. Например, в таблице «Продажи» есть столбец ID_товара, значения в котором соответствуют столбцу ID в таблице «Товары». По этому столбцу ты можешь для каждой продажи подтянуть название и цену товара. Без внешних ключей таблицы — это просто независимые списки без связи.

Как отфильтровать строки по условию в LibreOffice Calc?

Выдели шапку таблицы → меню Данные → Автофильтр. В каждой колонке появятся стрелки, через которые можно выбрать значения или задать условие «больше», «меньше», «содержит». Для сложной фильтрации по нескольким условиям используй Данные → Ещё фильтры → Стандартный фильтр — там можно задать комбинации И/ИЛИ. Результат можно выгрузить в отдельную область листа и дальше считать.

Какие функции LibreOffice чаще всего нужны на задании 3?

Топ-5: СЧЁТЕСЛИ (считает строки по условию), СУММЕСЛИ (сумма по условию), СЧЁТЕСЛИМН и СУММЕСЛИМН (несколько условий), ВПР (подтянуть данные из другой таблицы по ключу). Реже — ПРОСМОТРX (аналог ВПР, но гибче; появилась только в LibreOffice 24.8, на экзаменационной станции её может не быть, так что основной инструмент — ВПР) и СРЗНАЧЕСЛИ. Всё остальное — вспомогательное. Этих пяти функций хватает почти на любую задачу третьего номера.

Как читать CSV в Python без импорта pandas?

Через стандартный модуль csv. Экзаменационный файл приходит в табличном формате, поэтому сначала открой его в Calc и сохрани нужный лист как CSV (Файл → Сохранить как → Текст CSV). Потом открываешь этот файл через open('file.csv', encoding='utf-8'), передаёшь в csv.DictReader — получаешь итератор словарей, где ключи — имена колонок. Дальше обычный цикл по строкам с условиями. Это занимает 5 строк кода и работает на любом Python без дополнительных установок. На pandas не рассчитывай: на КЕГЭ гарантирована только стандартная поставка Python, а csv.DictReader достаточно для любой задачи.

Что делать, если после объединения таблиц получаются дубликаты?

Скорее всего, ты неправильно построил связь: например, соединил таблицы по полю, которое в одной из них не уникально. Проверь: в таблице-источнике (той, на которую ссылается внешний ключ) поле связи должно быть уникальным. Если у одного ID несколько строк — получишь дубли. Фиксится либо добавлением ещё одного условия, либо использованием set() в Python для уникальных значений.

Готов применять на практике?

В тренажёре TuteMe — 1250 заданий ЕГЭ по информатике с автоматической проверкой и подробным разбором. AI-помощник подсказывает, где ты ошибаешься, и подбирает задания под твой уровень.

Начать бесплатно →

Не пишешь код? Курс «Python для ЕГЭ» — с нуля, первые два модуля бесплатно.