Реляционная алгебра: выборка и проекция
Откуда берется реляционная алгебра?
В 1970 году Эдгар Франк Кодд создал математический аппарат для манипулирования отношениями.
До реляционной модели (1960-е)
Программист писал процедурный код с указателями и адресами диска, обходя физические записи по цепочкам связей (навигационная модель). Изменение структуры файла ломало все программы.
Декларативность и математика
Кодд предложил абстрагироваться от дисков: данные представляются в виде математических отношений (множеств), а манипулирование ими описывается замкнутой алгеброй операций.
Свойство реляционной замкнутости (Relational Closure)
Ключевой математический закон: результат ЛЮБОЙ операции есть снова ОТНОШЕНИЕ.
Вложенность и композиция
Выход одной операции можно мгновенно подать на вход другой: π(σ(R)). В SQL это легло в основу подзапросов (Subqueries) и общих табличных выражений (CTE).
Чистые функции
Операции не разрушают и не перезаписывают исходные таблицы в памяти или на диске. Они вычисляют совершенно новое порожденное отношение.
Оптимизация запросов
Благодаря законам алгебры оптимизатор СУБД переставляет операторы местами, ускоряя запрос в тысячи раз без изменения смысла данных.
Геометрическая модель: два среза таблицы
Унарные операции выборки и проекции работают в перпендикулярных плоскостях.
Селекция / Выборка (σ)
Фильтрует строки (кортежи) по предикату условия. Заголовок таблицы (набор атрибутов) остается неизменным.
Проекция (π)
Вырезает столбцы (атрибуты). Ненужные поля удаляются, а образовавшиеся одинаковые строки схлопываются.
Операция Селекции (σ)
Фильтрация кортежей, удовлетворяющих истинности логического предиката φ.
Характеристики селекции
- Степень (число колонок): строго сохраняется (°(σ(R)) = °(R)).
- Мощность (число строк): от 0 до card(R).
- Смысл: отбор записей, удовлетворяющих критерию.
Предикат φ (булево условие)
Строится из имен атрибутов, констант и операторов:
- Сравнение:
=,≠,<,≤,>,≥ - Конъюнкция (И):
∧(AND) - Дизъюнкция (ИЛИ):
∨(OR) - Отрицание (НЕ):
¬(NOT)
Операция Проекции (π)
Выделение заданного набора атрибутов с ликвидацией нерелевантных столбцов.
Характеристики проекции
- Степень: строго равна количеству выбранных атрибутов k (k ≤ °(R)).
- Мощность: от 1 до card(R) (при непустом отношении).
- Смысл: скрытие лишних колонок и декомпозиция.
Практическое назначение
- Сокрытие конфиденциальных атрибутов (пароли, зарплаты).
- Подготовка данных к передаче по сети (уменьшение трафика).
- Формирование промежуточных таблиц для соединений и отчетов.
Автоматическое устранение дубликатов в проекции
Фундаментальный математический закон: отношение — это МНОЖЕСТВО по Кантору.
Потеря первичного ключа
В исходной таблице уникальность строк гарантировалась первичным ключом ID. Если проекция отбрасывает ID и оставляет только столбец Город, в таблице неизбежно возникнут повторы одинаковых значений.
Закон устранения повторов
Множество не может содержать одинаковых элементов: {'Сургут', 'Сургут'} = {'Сургут'}. Реляционная проекция обязана автоматически схлопнуть дубликаты в одну строку!
Пример: проекция π[Город, Должность]
Наглядная трансформация таблицы с устранением дубликатов.
Исходное отношение R (4 строки)
| ID | ФИО | Город | Должность |
|---|---|---|---|
| 1 | Иванов | Сургут | Инженер |
| 2 | Петров | Москва | Менеджер |
| 3 | Сидоров | Сургут | Инженер |
| 4 | Козлов | Сургут | Бухгалтер |
Результат π[Город, Должность] (3 строки!)
| Город | Должность |
|---|---|
| Сургут | Инженер |
| Москва | Менеджер |
| Сургут | Бухгалтер |
✓ Строки Иванова и Сидорова дали одинаковую пару (Сургут, Инженер) — дубликат автоматически устранен!
Суперпозиция операций: π(σ(R))
Композиция селекции и проекции — классический алгоритм извлечения данных.
Внутренняя селекция
Вычисляется R' = σφ(R): фильтруются строки, не удовлетворяющие предикату φ. Набор атрибутов полный.
Внешняя проекция
Вычисляется R'' = πA(R'): из отфильтрованных строк вырезаются нужные атрибуты, дубликаты схлопываются.
Pushdown-предикат
Селекцию ВСЕГДА выполняют раньше проекции, чтобы уменьшить объем промежуточных данных и не потерять атрибуты из предиката.
Соответствие реляционной алгебры и SQL
Как теоретические операторы транслируются в реальный синтаксис SQL.
Реляционная алгебра Кодда
Эквивалент в стандарте SQL
FROM R
WHERE salary < 70000;
Почему в SQL нужен DISTINCT?
Различие между чистым математическим множеством и мультимножеством (мешком).
Инженерный компромисс SQL
В реальных базах хранятся миллионы строк. Устранение дубликатов требует либо тяжелой сортировки на диске O(N log N), либо выделения сотен мегабайт ОЗУ под хэш-таблицу.
Поэтому создатели SQL сделали проекцию по умолчанию сохраняющей дубликаты (SELECT col FROM tbl).
Когда обязателен DISTINCT?
- Получение справочника уникальных значений (список городов доставки).
- Устранение избыточных строк при объединениях таблиц (JOIN).
- Точное соответствие требованиям математической реляционной алгебры Кодда.
Теоретико-множественные операции: ∪ и ∩
Бинарные операции над отношениями с обязательной совместимостью схем.
Реляционное объединение
Множество всех кортежей, входящих либо в R, либо в S, либо в оба. Одинаковые строки схлопываются в одну.
SQL: UNION (без дублей) / UNION ALL (с дублями).
Требование: одинаковое число атрибутов и совместимые типы данных.
Реляционное пересечение
Множество кортежей, одновременно присутствующих и в отношении R, и в отношении S.
SQL: INTERSECT.
Свойство: выражается через двойную разность: R ∩ S = R \ (R \ S).
Теоретико-множественные операции: ∖ и ×
Разность отношений и прямое произведение как основа соединений.
Относительное дополнение
Кортежи, которые принадлежат отношению R, но отсутствуют в отношении S.
SQL: EXCEPT (PostgreSQL) / MINUS (Oracle).
Внимание: некоммутативна (R ∖ S ≠ S ∖ R).
Конкатенация строк
Каждая строка отношения R сцепляется со всеми строками отношения S.
Степень: deg(R) + deg(S).
Мощность: card(R) × card(S).
SQL: CROSS JOIN.
Типовые ошибки и чек-лист самопроверки
На что обратить внимание при решении задач в рабочем листе.
✗ Забыли удалить дубликаты
Если проекция отбрасывает первичный ключ, проверьте одинаковые строки. В итоговом отношении повторяющихся кортежей быть НЕ ДОЛЖНО!
✗ Перепутали порядок срезов
Селекция фильтрует строки (высоту таблицы), проекция оставляет столбцы (ширину таблицы). Не пытайтесь удалять столбцы через σ.
✓ Проверка булевых связок
Предикат с ∧ (И) требует одновременного выполнения условий. Предикат с ∨ (ИЛИ) требует хотя бы одного.
✓ Проверка реляционной замкнутости
Убедитесь, что результат вычисления оформлен в виде полноценной таблицы со столбцами и строками, а не отдельного числа.
Классический мем реляционных баз данных: «Bobby Tables»
Комикс xkcd №327: «Exploits of a Mom» (автор Рэндалл Манро) — самый знаменитый в мире мем о реляционных СУБД, структуре запросов и безопасности данных.
Мама называет сына именем:
Robert'); DROP TABLE Students;--
Когда наивная школьная программа попыталась выполнить конкатенацию строк без реляционной типизации параметров, СУБД выполнила удаление таблицы учащихся за целый год!
Комикс: xkcd #327 "Exploits of a Mom" (автор Randall Munroe).
Лицензия: Creative Commons Attribution-NonCommercial 2.5 License (CC BY-NC 2.5).
Методический вывод: алгебраическая строгость предикатов, четкое разделение данных и команд — основа надежности реляционных СУБД.