До сих пор мы рассматривали реляционную базу данных со структурной точки зрения: как набор взаимосвязанных таблиц (отношений), состоящих из строк (кортежей) и столбцов (атрибутов), ограниченных первичными и внешними ключами. Однако база данных создается не просто для хранения, а для быстрого, надежного и точного извлечения информации.
В 1970 году создатель реляционной модели Эдгар Франк Кодд (Edgar F. Codd) предложил строгий математический аппарат для манипулирования данными — реляционную алгебру (Relational Algebra). Это процедурный язык запросов, в котором операции применяются к отношениям и порождают новые отношения.
Свойство замкнутости — краеугольный камень теории реляционных баз данных. Оно гласит:
WITH ... AS (CTE).Две базовые операции реляционной алгебры — выборка (селекция) и проекция — являются унарными, то есть принимают на вход строго одно отношение $R$. Их исключительно легко запомнить через наглядную геометрическую аналогию:
Вырезает из таблицы строки (кортежи), удовлетворяющие логическому предикату. Заголовок таблицы (набор столбцов) остается неизменным.
Вырезает из таблицы столбцы (атрибуты). Ненужные столбцы отбрасываются, а возникающие дубликаты строк автоматически устраняются.
Математическое обозначение: греческая буква $\sigma$ (сигма) с индексом-предикатом $\varphi$:
$\sigma_{\varphi}(R) = \{ t \in R \mid \varphi(t) = \text{True} \}$
Здесь:
Математическое обозначение: греческая буква $\pi$ (пи) с перечнем оставляемых атрибутов в подстрочном индексе:
$\pi_{A_1, A_2, \dots, A_k}(R) = \{ t[A_1, A_2, \dots, A_k] \mid t \in R \}$
Постулат теории множеств гласит: множество не может содержать одинаковых элементов. В исходном отношении $R$ уникальность каждой строки гарантировалась первичным ключом (например, ID). Но если мы проецируем таблицу на атрибуты, не включающие первичный ключ (например, только на столбец Город), в столбце неизбежно возникнут повторы.
Город вернет строго одну строку со значением «Сургут».
В реальных задачах выборка и проекция почти всегда применяются совместно: сначала мы фильтруем строки по условию, а затем оставляем только требуемые столбцы.
| ID | ФИО | Кафедра | Стаж | Оклад |
|---|---|---|---|---|
| 1 | Иванов А.С. | Информатика | 8 | 65000 |
| 2 | Петров В.М. | Высшая математика | 3 | 48000 |
| 3 | Сидорова Е.Н. | Информатика | 12 | 82000 |
| 4 | Смирнов Д.К. | Информатика | 6 | 59000 |
| 5 | Козлова М.А. | Экономика | 10 | 71000 |
Шаг 1. Вычисляем внутреннюю операцию — селекцию $\sigma$:
Предикат: $\text{Стаж} \ge 6$ И $\text{Оклад} < 80000$. Проверяем каждый кортеж:
Промежуточное отношение $T' = \sigma(T)$:
| ID | ФИО | Кафедра | Стаж | Оклад |
|---|---|---|---|---|
| 1 | Иванов А.С. | Информатика | 8 | 65000 |
| 4 | Смирнов Д.К. | Информатика | 6 | 59000 |
| 5 | Козлова М.А. | Экономика | 10 | 71000 |
Шаг 2. Вычисляем внешнюю операцию — проекцию $\pi_{\text{Кафедра}}$:
Вырезаем только столбец «Кафедра». Из строк Иванова и Смирнова получаем два значения «Информатика». По правилу Кодда дубликаты схлопываются!
Финальный результат $\pi_{\text{Кафедра}}(T')$:
| Кафедра |
|---|
| Информатика |
| Экономика |
Итог: Отношение степени 1 и мощности 2.
В реляционных СУБД декларативным языком взаимодействия является SQL. Важно понимать, как формулы реляционной алгебры транслируются в реальные команды:
-- Реляционная селекция: sigma_{стаж >= 6}(T)
SELECT *
FROM Teachers
WHERE experience >= 6;
-- Реляционная проекция с устранением дубликатов: pi_{department}(T)
SELECT DISTINCT department
FROM Teachers;
-- SQL-проекция БЕЗ устранения дубликатов (мультимножество):
SELECT department
FROM Teachers;
-- Суперпозиция: pi_{department}(sigma_{experience >= 6 AND salary < 80000}(T))
SELECT DISTINCT department
FROM Teachers
WHERE experience >= 6 AND salary < 80000;
SELECT col FROM tbl экономит вычислительные ресурсы сервера. Для получения математической проекции программист явно указывает директиву DISTINCT.
Помимо унарных операций, реляционная алгебра включает четыре базовые бинарные операции над парами отношений $R$ и $S$:
| Операция и символ | Математическое определение | Требования и эквивалент в SQL |
|---|---|---|
| Объединение ($R \cup S$) | $\{ t \mid t \in R \lor t \in S \}$ | Требуется совместимость по объединению (одинаковые схемы и типы). SQL: UNION (удаляет дубли), UNION ALL (с дублями). |
| Пересечение ($R \cap S$) | $\{ t \mid t \in R \land t \in S \}$ | Требуется совместимость по объединению. SQL: INTERSECT. |
| Разность ($R \setminus S$) | $\{ t \mid t \in R \land t \notin S \}$ | Отношение кортежей, которые есть в $R$, но отсутствуют в $S$. SQL: EXCEPT (или MINUS в Oracle). |
| Декартово произведение ($R \times S$) | $\{ t_r \circ t_s \mid t_r \in R, t_s \in S \}$ | Сцепление каждой строки $R$ с каждой строкой $S$. Степень = $\text{deg}(R) + \text{deg}(S)$, мощность = $\text{card}(R) \times \text{card}(S)$. SQL: CROSS JOIN. |
SELECT column FROM table не является чистой проекцией Кодда, и какое ключевое слово делает ее таковой?