4.5 Реляционные базы данных
Табличные базы данных, SQL-запросы, связи между таблицами и подготовка к ЕГЭ
1 Введение в реляционные базы данных
Реляционные базы данных (РБД) — это базы данных, основанные на реляционной модели данных. Они представляют информацию в виде таблиц (отношений) и являются наиболее распространенным типом баз данных в современном мире.
Основные преимущества
- Структурированное хранение данных
- Целостность данных
- Гибкость запросов (SQL)
- Масштабируемость
- Стандартизация
Области применения
- Интернет-магазины
- Банковские системы
- Социальные сети
- Учебные заведения
- Государственные учреждения
2 Основные понятия реляционных баз данных
Структура таблицы базы данных
| ID | Фамилия | Имя | Группа | Средний балл |
|---|---|---|---|---|
| 1 | Иванов | Петр | ИВТ-101 | 4.5 |
| 2 | Сидорова | Анна | ИВТ-101 | 4.8 |
| 3 | Петров | Сергей | ИВТ-102 | 3.9 |
Терминология:
Таблица (отношение)
Структура для хранения данных об однотипных объектах
Поле (столбец, атрибут)
Отдельная характеристика объекта (ID, Фамилия, Имя)
Запись (строка, кортеж)
Набор данных об одном объекте (вся строка таблицы)
Ключ таблицы
Поле (или набор полей), уникально идентифицирующее запись
Типы ключей:
- Первичный ключ — уникальный идентификатор записи
- Внешний ключ — ссылка на первичный ключ другой таблицы
- Потенциальный ключ — поле, которое могло бы быть первичным
- Составной ключ — ключ из нескольких полей
Требования к первичному ключу:
- Уникальность (нет двух одинаковых значений)
- Непустота (значение не может быть NULL)
- Неизменяемость (значение не должно меняться)
- Минимальность (не содержит избыточных полей)
3 Работа с готовой базой данных
Для работы с реляционными базами данных используется язык SQL (Structured Query Language). Рассмотрим основные операции.
Пример базы данных «Библиотека»
| Код_книги | Название | Автор | Год | Цена |
|---|---|---|---|---|
| 1 | Война и мир | Толстой Л.Н. | 1869 | 500 |
| 2 | Преступление и наказание | Достоевский Ф.М. | 1866 | 450 |
| 3 | Мастер и Маргарита | Булгаков М.А. | 1967 | 600 |
| Код_читателя | Фамилия | Имя | Адрес |
|---|---|---|---|
| 101 | Иванов | Иван | ул. Ленина, 1 |
| 102 | Петрова | Мария | ул. Мира, 15 |
1. Поиск данных (SELECT)
SELECT Название, Автор, Цена FROM Книги WHERE Год > 1900 ORDER BY Цена DESC;
Выбирает книги, изданные после 1900 года, отсортированные по убыванию цены
2. Сортировка (ORDER BY)
SELECT * FROM Книги ORDER BY Автор ASC, Название ASC;
Сортирует книги по автору (по возрастанию), затем по названию
3. Фильтрация (WHERE)
SELECT Название, Цена FROM Книги WHERE Автор = 'Толстой Л.Н.' AND Цена BETWEEN 400 AND 600;
Выбирает книги Толстого стоимостью от 400 до 600 рублей
4 SQL-запросы: от простых к сложным
Запросы на выборку данных
Базовая структура SELECT
SELECT [столбцы] FROM [таблица] WHERE [условие] ORDER BY [столбец] [ASC|DESC] LIMIT [количество];
Агрегатные функции
SELECT
COUNT(*) AS всего_книг,
AVG(Цена) AS средняя_цена,
MAX(Цена) AS макс_цена,
MIN(Цена) AS мин_цена,
SUM(Цена) AS сумма
FROM Книги;
Запросы с параметрами
Пример 1: Поиск книг по автору (параметр передается в запрос)
SELECT Название, Год, Цена FROM Книги WHERE Автор = :author_name ORDER BY Год DESC;
:author_name — параметр, который будет заменен конкретным значением
Пример 2: Динамический диапазон цен
SELECT * FROM Книги WHERE Цена BETWEEN :min_price AND :max_price ORDER BY Цена;
Вычисляемые поля в запросах
Вычисляемые поля позволяют создавать новые столбцы на основе существующих данных.
Пример 1: Скидка на книги
SELECT
Название,
Цена,
Цена * 0.9 AS цена_со_скидкой,
Цена - Цена * 0.1 AS экономия
FROM Книги
WHERE Год < 2000;
Пример 2: Категоризация по цене
SELECT
Название,
Цена,
CASE
WHEN Цена < 300 THEN 'Дешевая'
WHEN Цена BETWEEN 300 AND 600 THEN 'Средняя'
ELSE 'Дорогая'
END AS категория_цены
FROM Книги;
5 Многотабличные базы данных
В реальных приложениях данные хранятся в нескольких связанных таблицах для устранения избыточности и обеспечения целостности.
Пример: База данных "Университет"
Таблица "Студенты"
| ID | Имя | Группа_ID |
|---|---|---|
| 1 | Иванов П. | 101 |
| 2 | Сидорова А. | 101 |
| 3 | Петров С. | 102 |
Первичный ключ: ID
Внешний ключ: Группа_ID → Группы.ID
Таблица "Группы"
| ID | Название | Факультет |
|---|---|---|
| 101 | ИВТ-101 | Информатики |
| 102 | ИВТ-102 | Информатики |
| 201 | ФИЗ-101 | Физики |
Первичный ключ: ID
Таблица "Оценки"
| ID | Студент_ID | Предмет | Оценка |
|---|---|---|---|
| 1 | 1 | Информатика | 5 |
| 2 | 1 | Математика | 4 |
| 3 | 2 | Информатика | 5 |
Первичный ключ: ID
Внешний ключ: Студент_ID → Студенты.ID
Типы связей между таблицами
Один к одному
Каждой записи в таблице A соответствует не более одной записи в таблице B
Один ко многим
Одной записи в таблице A соответствует несколько записей в таблице B
Многие ко многим
Одной записи в таблице A соответствует несколько записей в таблице B и наоборот
Целостность базы данных
Целостность по ссылкам
Внешний ключ должен ссылаться на существующее значение первичного ключа.
Пример: Студент_ID в таблице "Оценки" должен существовать в таблице "Студенты"
Каскадные действия
- CASCADE - удалить/обновить связанные записи
- SET NULL - установить NULL в связанных записях
- RESTRICT - запретить удаление/изменение
- NO ACTION - не выполнять никаких действий
6 Запросы к многотабличным базам данных
Операции соединения таблиц (JOIN)
INNER JOIN
Выбирает только совпадающие записи из обеих таблиц
SELECT Студенты.Имя, Группы.Название FROM Студенты INNER JOIN Группы ON Студенты.Группа_ID = Группы.ID;
LEFT JOIN
Все записи из левой таблицы и совпадающие из правой
SELECT Студенты.Имя, Оценки.Оценка FROM Студенты LEFT JOIN Оценки ON Студенты.ID = Оценки.Студент_ID;
Пример сложного запроса
SELECT
Студенты.Имя,
Группы.Название,
AVG(Оценки.Оценка) AS средний_балл
FROM Студенты
INNER JOIN Группы ON Студенты.Группа_ID = Группы.ID
LEFT JOIN Оценки ON Студенты.ID = Оценки.Студент_ID
WHERE Группы.Факультет = 'Информатики'
GROUP BY Студенты.Имя, Группы.Название
HAVING AVG(Оценки.Оценка) >= 4.0
ORDER BY средний_балл DESC;
Пример решения задачи ЕГЭ
Условие: Даны таблицы "Авторы" и "Книги". Найти авторов, у которых более 3 книг, изданных после 2010 года.
Структура таблиц:
Авторы (ID, Фамилия, Имя) Книги (ID, Название, Автор_ID, Год_издания)
Решение:
SELECT Авторы.Фамилия, Авторы.Имя, COUNT(*) AS количество_книг FROM Авторы INNER JOIN Книги ON Авторы.ID = Книги.Автор_ID WHERE Книги.Год_издания > 2010 GROUP BY Авторы.ID, Авторы.Фамилия, Авторы.Имя HAVING COUNT(*) > 3 ORDER BY количество_книг DESC;
Пояснение:
- Соединяем таблицы по полю Автор_ID
- Фильтруем книги, изданные после 2010 года
- Группируем по авторам
- Оставляем только авторов с более чем 3 книгами
- Сортируем по убыванию количества книг
Практические задания для ЕГЭ
Задание 1: Простой SELECT
В таблице "Сотрудники" есть поля: ID, Фамилия, Имя, Должность, Зарплата. Напишите запрос для вывода фамилий и зарплат менеджеров с зарплатой более 50000, отсортированных по убыванию зарплаты.
Задание 2: Многотабличный запрос
Даны таблицы: "Заказы" (ID, Клиент_ID, Сумма, Дата) и "Клиенты" (ID, Имя, Город). Напишите запрос, который выводит имена клиентов из Москвы и общую сумму их заказов за 2023 год.
Задание 3: Группировка и фильтрация
В таблице "Продукты" (ID, Название, Категория, Цена, Количество). Напишите запрос для вывода категорий, в которых средняя цена продукта превышает 1000, а общее количество продуктов больше 10.
Шпаргалка: Основные операторы SQL
DML (Data Manipulation)
SELECT- выборка данныхINSERT- добавление записейUPDATE- обновление записейDELETE- удаление записей
Условия WHERE
=, <>, <, >, <=, >=BETWEEN- диапазонLIKE- поиск по шаблонуIN- вхождение в списокIS NULL- проверка на NULL
Соединения JOIN
INNER JOIN- внутреннееLEFT JOIN- левое внешнееRIGHT JOIN- правое внешнееFULL JOIN- полное внешнееCROSS JOIN- декартово произведение
Агрегатные функции
COUNT()- количествоSUM()- суммаAVG()- среднееMAX()- максимумMIN()- минимум
Ключевые моменты для ЕГЭ
Знайте структуру РБД
Таблицы, поля, записи, ключи
Пишите корректные SQL-запросы
SELECT, WHERE, JOIN, GROUP BY
Понимайте связи между таблицами
1:1, 1:N, M:N, внешние ключи
Проверяйте целостность данных
Ограничения, каскадные действия
Совет для ЕГЭ: Внимательно читайте условие задачи, определите, какие таблицы нужны, какие связи между ними. Начинайте с простых запросов, постепенно добавляя условия и соединения. Проверяйте запрос на логику: что должно быть на входе, что на выходе.