В реляционных базах данных соблюдение принципов нормализации требует декомпозиции предметной области на множество независимых таблиц-сущностей. Клиенты, заказы, товары, платежи и филиалы хранятся раздельно, чтобы исключить избыточность и аномалии данных.
Однако для пользователя базы данных ценность представляют не изолированные идентификаторы, а целостные информационные сводки: «Какой клиент, когда, какой товар приобрел и через какой филиал банка оплатил покупку?».
Операция соединения (JOIN) — это математический инструмент реляционной алгебры, который восстанавливает смысловую взаимосвязь между кортежами раздельных отношений на основе логического предиката связывания.
Теоретический фундамент любого соединения — это композиция двух базовых операций: Декартова произведения (Cartesian Product, $\times$) и Селекции (Selection, $\sigma$).
Для наглядности разберем все операции на едином модельном примере двух отношений:
| Студент_ID | ФИО | Группа |
|---|---|---|
| 101 | Иванов А. | ИС-21 |
| 102 | Петров Б. | ИС-21 |
| 103 | Сидоров В. | ИС-22 |
| Студент_ID | Сумма_руб | Категория |
|---|---|---|
| 101 | 4500 | Академическая |
| 103 | 7000 | Повышенная |
| 104 | 5000 | Социальная |
Обратите внимание: студент 102 (Петров) не получает стипендию. А стипендия для студента 104 назначена, но сам студент еще не внесен в таблицу студентов.
Возвращает только те кортежи, для которых найдено строгое соответствие в обоих отношениях по ключу Студент_ID. Кортежи 102 и 104 отбрасываются.
| Студент_ID | ФИО | Группа | Сумма_руб | Категория |
|---|---|---|---|---|
| 101 | Иванов А. | ИС-21 | 4500 | Академическая |
| 103 | Сидоров В. | ИС-22 | 7000 | Повышенная |
Сохраняет абсолютно все строки левого отношения $R$ (Студенты). Если у студента нет стипендии (Петров, 102), поля таблицы стипендий заполняются маркером NULL.
| Студент_ID | ФИО | Группа | Сумма_руб | Категория |
|---|---|---|---|---|
| 101 | Иванов А. | ИС-21 | 4500 | Академическая |
| 102 | Петров Б. | ИС-21 | NULL | NULL |
| 103 | Сидоров В. | ИС-22 | 7000 | Повышенная |
Сохраняет все строки правого отношения $S$ (Стипендии). Для не привязанной стипендии 104 поля студента заполняются маркером NULL.
| Студент_ID | ФИО | Группа | Сумма_руб | Категория |
|---|---|---|---|---|
| 101 | Иванов А. | ИС-21 | 4500 | Академическая |
| 103 | Сидоров В. | ИС-22 | 7000 | Повышенная |
| 104 | NULL | NULL | 5000 | Социальная |
Объединение результатов левого и правого внешних соединений. Сохраняет кортежи из обоих отношений без потерь.
| Студент_ID | ФИО | Группа | Сумма_руб | Категория |
|---|---|---|---|---|
| 101 | Иванов А. | ИС-21 | 4500 | Академическая |
| 102 | Петров Б. | ИС-21 | NULL | NULL |
| 103 | Сидоров В. | ИС-22 | 7000 | Повышенная |
| 104 | NULL | NULL | 5000 | Социальная |
Полусоединение ($R \ltimes S$): извлекает кортежи $R$, у которых есть стипендия. Схема содержит только атрибуты отношения R:
| Студент_ID | ФИО | Группа |
|---|---|---|
| 101 | Иванов А. | ИС-21 |
| 103 | Сидоров В. | ИС-22 |
Антисоединение ($R \rhd S$): извлекает кортежи $R$, у которых нет соответствия в $S$ (студенты без стипендии). Это реляционный аналог конструкции WHERE NOT EXISTS:
| Студент_ID | ФИО | Группа |
|---|---|---|
| 102 | Петров Б. | ИС-21 |
NULL = NULL дает результат UNKNOWN, а не TRUE!NULL <> 5 дает результат UNKNOWN!IS NULL.
Когда СУБД получает декларативный запрос, оптимизатор выбирает один из трех физических алгоритмов:
NULL = NULL в трехзначной логике вычисляется в UNKNOWN, а операторы реляционной селекции отбирают только строки со значением TRUE.