Набор реляционных операторов принято считать реляционно полным в том смысле, что его выразительная мощность эквивалентна выразительной мощности реляционного исчисления. Теоретико-множественными операциями в реляционной алгебре частично определена алгебра множеств на множестве отношений (отсутствует операция дополнения). В реляционной алгебре частично выразимы формулы исчисления высказываний (идея квантификации неявно выражена в содержательных определениях).
Однако ни в каком математическом смысле реляционную алгебру нельзя считать полной. Набор реляционных операций не является независимым. Например, можно выделить независимый поднабор: селекция, проекция, произведение, объединение, разность.
Пример. База данных содержит три таблицы:
ПОСТАВЩИКИ (КОД_ПОСТАВЩИКА, ФАМИЛИЯ, РЕЙТИНГ, ГОРОД)
ДЕТАЛИ (КОД_ДЕТАЛИ, НАИМЕНОВАНИЕ, ЦВЕТ, ВЕС, ГОРОД)
ПОСТАВКИ (КОД_ПОСТАВЩИКА, КОД_ДЕТАЛИ, КОЛИЧЕСТВО)
Транзакция1. Получить имена поставщиков детали Part-1 (Код).
1. Естественное соединение таблиц ПОСТАВЩИКИ и ПОСТАВКИ.
2. Выборка из полученного результата кортежей с атрибутом КОД_ДЕТАЛИ, равным Part-1.
3. Проекция выбранных кортежей по атрибуту ФАМИЛИЯ.
Транзакция2. Получить имена поставщиков хотя бы одной красной детали.
В транзакции изменено условие выборки ЦВЕТ = “красный”
Транзакцию можно выполнить иным образом:
1. Выборка в таблице ДЕТАЛИ кортежей, удовлетворяющих условию на цвет.
2. Проекция результата по атрибуту КОД_ДЕТАЛИ.
3. Естественное соединение полученных кортежей с таблицей ПОСТАВКИ.
4. Естественное соединение результата с таблицей ПОСТАВЩИКИ.
5. Проекция полученных кортежей по атрибуту ФАМИЛИЯ.
Таким образом, один и тот же запрос можно реализовать различными комбинациями реляционных операций.
Транзакция3. Получить имена поставщиков, которые поставляют все детали.
1. Проекция1 таблицы ПОСТАВКИ по атрибутам КОД_ПОСТАВЩИКА, КОД_ДЕТАЛИ. (список поставщики-товары)
2. Проекция2 таблицы ДЕТАЛИ по атрибуту КОД_ДЕТАЛИ. (список кодов товаров)
3. Деление проекции1 на проекцию2. (Коды поставщиков, в поставках которых имеются все коды товаров).
4. Естественное соединение результата с таблицей ПОСТАВЩИКИ.
5. Проекция полученных кортежей атрибуту ФАМИЛИЯ.
Д.з. Получить номера поставщиков, которые поставляли те же детали, что и поставщик Supplier-1.
Транзакция4. Получить имена поставщиков, которые не поставляют деталь Part-2.
1. Проекция1 таблицы ПОСТАВЩИКИ по атрибуту КОД_ПОСТАВЩИКА. (список поставщиков)
2. Выборка из таблицы ПОСТАВКИ кортежей с атрибутом КОД_ДЕТАЛИ, равным Part-2.
3. Проекция2 выборки по атрибуту КОД_ПОСТАВЩИКА. (список поставщиков детали)
4. Разность проекций 1 и 2 (список тех, кто не поставляет).
5. Естественное соединение результата с таблицей ПОСТАВЩИКИ.
6. Проекция полученных кортежей атрибуту ФАМИЛИЯ.
Реляционные операторы включены в DML для обновления БД.
Операторы INSERT и DELETE позволяют обрабатывать ситуации, которые операции объединение и разность не считают ошибочными. Например, добавление дубликата, удаление несуществующего кортежа.
INSERT критерий INTO отношение вставляет кортежи, удовлетворяющие критерию в указанное отношение.
DELETE критерий удаляет кортежи, удовлетворяющие условию.
UPDATE критерий выражение обновляет атрибуты кортежей, соответствующих критерию, в соответствии с выражением.
Например. UPDATE ПОСТАВЩИКИ WHERE ГОРОД = City-3 СТАТУС := СТАТУС + 5.
Выражение реляционной алгебры всегда задает некий порядок вычислений. В запросе реляционного исчисления указывается, что извлечь, а не как. Задача состоит в нахождении кортежей, для которых предикат является истинным.
Транзакция. Получить коды поставщиков со статусом больше Status-1 и расположенных в городе Sity-2.
ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА WHERE ПОСТАВЩИКИ_X.ГОРОД = Sity-2 AND ПОСТАВЩИКИ_X.СТАТУС > Status-1
Транзакция1. Получить имена поставщиков детали Part-1 (Код).
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE EXIST ПОСТАВКИ_X (ПОСТАВКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВЩИКИ_X. КОД_ПОСТАВЩИКА AND EXIST ПОСТАВКИ_X.КОД_ДЕТАЛИ = Part-1).
Транзакция2. Получить имена поставщиков хотя бы одной красной детали.
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE EXIST ПОСТАВКИ_X (ПОСТАВКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА AND EXIST ДЕТАЛИ_X (ДЕТАЛИ_X.КОД_ДЕТАЛИ = ПОСТАВКИ_X.КОД_ДЕТАЛИ AND ДЕТАЛИ_X.ЦВЕТ = “красный”) ).
Эквивалентная предваренная нормальная форма:
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE EXIST ПОСТАВКИ_X (AND EXIST ДЕТАЛИ_X (ПОСТАВКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА AND ДЕТАЛИ_X.КОД_ДЕТАЛИ = ПОСТАВКИ_X.КОД_ДЕТАЛИ AND ДЕТАЛИ_X.ЦВЕТ = “красный”) ).
Транзакция3. Получить имена поставщиков, которые поставляют все детали.
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE FORALL ПОСТАВКИ_X (AND EXIST ДЕТАЛИ_X (ПОСТАВКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА AND ДЕТАЛИ_X.КОД_ДЕТАЛИ = ПОСТАВКИ_X.КОД_ДЕТАЛИ) ).
Транзакция4. Получить имена поставщиков, которые не поставляют деталь Part-2.
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE NOT EXIST ПОСТАВКИ_X (ПОСТАВКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА AND ДЕТАЛИ_X.КОД_ДЕТАЛИ = Part-2).
Д.з. Получить имена поставщиков, которые поставляли хотя бы одну деталь, поставляемую поставщиком Supplier-1.
Транзакция5. Получить имена поставщиков, которые поставляли те же детали, что и поставщик Supplier-1 (код).
ПОСТАВЩИКИ_X.ФАМИЛИЯ WHERE FORALL ПОСТАВКИ_Y (ПОСТАВКИ_Y.КОД_ПОСТАВЩИКА = Supplier-1 OR EXIST ПОСТАВКИ_Z (ПОСТАВЩИКИ_X.КОД_ПОСТАВЩИКА = ПОСТАВКИ_Z.КОД_ПОСТАВЩИКА AND ПОСТАВКИ_Y.КОД_ДЕТАЛИ = ПОСТАВКИ_Z.КОД_ДЕТАЛИ) ).
Пример демонстрирует, относительную корректность аналогичной транзакции в примерах реляционной алгебры.
Смысл выражения: получить номера поставщиков (ПОСТАВЩИКИ_X) таких, что для всех поставок ПОСТАВКИ_Y поставка либо не от Supplier-1 либо если от Supplier-1, то существует поставка ПОСТАВКИ_Z от ПОСТАВЩИКИ_X деталей, входящих в поставку ПОСТАВКИ_Y.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.