Пример 1 Получить имена поставщиков, поставляющих деталь номер 2.
Решение: ((DP JOIN P) WHERE DNUM =2)[ PNAME ]
Пример 2 Получить имена поставщиков, поставляющих по крайней мере одну гайку.
Решение: (((D WHERE DNAME = Гайка) JOIN DP) JOIN P)[ PNAME ]
Ответ на этот запрос можно получить и иначе:
(((D JOIN DP) JOIN P) WHERE DNAME=Гайка)[ PNAME ]
Пример 3 Получить имена поставщиков, поставляющих все детали.
Решение: ((DP [ PNUM, DNUM ] DIVIDEBY D [ DNUM ]) JOIN P)[ PNAME ]
Пример 15. Получить имена поставщиков, не поставляющих деталь номер 2.
Решение: ((P [ PNUM ] MINUS ((P JOIN DP) WHERE DNUM =2)[ PNUM ]) JOIN P)[ PNAME ]
Ответ на этот запрос можно получить и пошагово:
T1 = P [ PNUM ] – получить список номеров всех поставщиков,
T2 = P JOIN DP – соединить данные о поставщиках и поставках,
T3 = T2 WHERE DNUM =2 – в данных о поставщиках и поставках оставить только данные о поставках детали номер 2,
T4 = T3 [ PNUM ] – получить список номеров поставщиков, поставляющих деталь номер 2,
T5 = T1 MINUS T4 – получить список номеров поставщиков, не поставляющих деталь номер 2,
T6 = T5 JOIN P – соединить список номеров поставщиков, не поставляющих деталь номер 2 с данными о поставщиках (получатся полные данные о поставщиках, не поставляющих деталь номер 2),
|
|
T7 = T6 [ PNAME ] – искомый ответ (имена поставщиков, не поставляющих деталь номер 2).
Зависимые реляционные операторы
Как было сказано в начале лекции, не все операторы реляционной алгебры являются независимыми - некоторые из них выражаются через другие реляционные операторы.
Оператор соединения определяется через операторы декартового произведения и выборки. Для оператора естественного соединения добавляется оператор проекции.
Оператор пересечения выражается через вычитание следующим образом:
A INTERSECT B = A MINUS (A MINUS B)
Оператор деления выражается через операторы вычитания, декартового произведения и проекции следующим образом: A DIVIDEBY B = A [ X ] MINUS ((A [ X ] TIMES B) MINUS A)[ X ]
Таким образом, показано, что операторы соединения, пересечения и деления можно выразить через другие реляционные операторы, т.е. эти операторы не являются примитивными.