6 мин чтения

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

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

О чём задание

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

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

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

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

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

Пример — онлайн-школа. Есть три таблицы:

Ученики (students.csv):

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

Курсы (courses.csv):

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

Записи на курсы (enrollments.csv):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. Открыть все три CSV.
  2. В enrollments.csv добавить колонку «price», заполнить через ВПР по course_id.
  3. Добавить колонку «class» через ВПР по student_id.
  4. Применить автофильтр: class = «11А».
  5. Применить сводную таблицу (Данные → Сводная таблица): строки — student_id, значения — сумма price.
  6. В полученной сводной выбрать максимум.

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

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

Сколько времени тратить на задание 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 (новая функция, аналог ВПР, но гибче) и СРЗНАЧЕСЛИ. Всё остальное — вспомогательное. Эти пять функций покрывают 95% задач.

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

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

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

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

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

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

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