Главная » SQL, Базы данных » ПРИМЕРЫ использования реляционного исчисления кортежей для формулирования запросов

0

Представляем несколько примеров использования реляционного исчисления кортежей для формулирования запросов. В качестве упражнения рекомендуется  решить эти задачи средствами реляционной алгебры (для сравнения и сопоставления). В некоторых случаях примеры являются повторением примеров  из  главы 7 (эти случаи обозначены специально).

8.3.1.     Определить номера поставщиков из Парижа со статусом, большим 20

{ SX.S#, SX.STATUS }

WHERE SX.CITY = ‘Paris’ AND SX.STATUS > 20

8.3.2.     Найти все пары номеров таких поставщиков, которые находятся в одном городе (повторение примера 7.5.5)

{ SX.S# AS SA, SY.S# AS SB }

WHERE SX.CITY = SY.CITY AND SX.S# < SY.S#

Обратите внимание, что конструкции AS в кортеже-прототипе используются для присваивания имен атрибутам результата. Следовательно, эти имена  недоступны для использования в конструкции WHERE, и потому вторая операция сравнения в конструкции WHERE записана как sx.s# <  SY.S#, а не в виде SA <  SB.

Глава 8. Реляционное исчисление     301

8.3.3.Получить полную информацию о поставщиках детали с номером Р2 (модифицированная версия примера 7.5.1)

SX WHERE EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = P# (‘P2′) )

Обратите внимание на использование имени переменной области значений в кортеже-прототипе. Этот пример является сокращенной записью следующего выражения.

{ SX.S#, SX.SNAME, SX.STATUS, SX.CITY }

WHERE EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = P# (‘P2′) )

8.3.4. Определить имена поставщиков по крайней мере одной детали красного цвета

(повторение примера 7.5.2)

SX.SNAME

WHERE EXISTS SPX ( SX.S# = SPX.S# AND .

EXISTS PX ( PX.P# = SPX.P# AND

PX.COLOR = COLOR (‘Red’) ) )

Эквивалентная формула (но записанная в предваренной нормальной форме, в которой все кванторы помещаются в начало правильно построенной формулы) имеет следующий вид.

SX.SNAME

WHERE EXISTS SPX ( EXISTS PX ( SX.S# = SPX.S# AND SPX.P#   =   PX.P#   AND PX.COLOR = COLOR (‘Red’)

) )

Предваренная (или пренексная) нормальная форма по своей сути не является более (или менее) правильной по сравнению с другими формами, но после ее усвоения можно убедиться, что в большинстве случаев она представляет собой  наиболее естественный метод формирования запросов. Кроме того, она  позволяет  уменьшить количество используемых скобок, как показано ниже. Например, рассмотрим следующую правильно построенную формулу.

Q1   V1    (   Q2   V2    (   wff   )    )

Здесь каждый из кванторов Q1 и Q2 представляет собой или квантор  EXISTS,  или квантор FORALL. При необходимости эту формулу всегда можно однозначно привести к следующему виду.

Q1   V1   Q2   V2    (   wff   )

Таким образом, приведенное выражение реляционного исчисления можно  переписать следующим образом.

SX.SNAME

WHERE EXISTS SPX EXISTS PX ( SX.S# = SPX.S# AND SPX.P#  =  PX.P#  AND PX.COLOR    =    COLOR (‘Red’) )

Однако для ясности во всех остальных примерах будем по-прежнему показывать все скобки.

8.3.5.   Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером S2

SX.SNAME

WHERE EXISTS SPX ( EXISTS SPY ( SX.S# = SPX.S# AND SPX.P# = SPY.P# AND SPY.S# = S# (‘S2′) )

)

8.3.6.   Получить имена поставщиков всех типов деталей

(повторение примера 7.5.3)

SX.SNAME WHERE FORALL РХ ( EXISTS SPX ( SPX.S# = SX.S# AND SPX.P# = PX.P# ) )

Эквивалентное выражение можно записать без использования KBaHTopaFORALL.

SX.SNAME WHERE NOT EXISTS PX ( NOT EXISTS SPX

( SPX.S# = SX.S# AND SPX.P# = PX.P# ) )

8.3.7.   Определить имена поставщиков, которые не поставляют деталь с номером Р2 (повторение примера 7.5.6)

SX.SNAME WHERE NOT EXISTS SPX

( SPX.S# = SX.S# AND SPX.P# = P# (‘P2′) )

Обратите внимание, как просто это решение можно получить из решения примера 8.3.3.

8.3.8.   Определить номера поставщиков, по крайней мере, тех деталей, которые поставляет поставщик с номером S2 (повторение примера 7.5.4)

SX.S# WHERE FORALL SPX ( SPX.S# S# (‘S2′) OR EXISTS SPY ( SPY.S# = SX.S#

AND SPY.P# = SPX.P# ) )

Переформулируем этот запрос в соответствии со следующим выражением: "Получить номера таких поставщиков sx, что для всех поставок детали SPX, независимо то того, выполнена ли эта поставка поставщиком S2 или нет, существует поставка SPY детали SPX поставщиком sx". Чтобы упростить  формулировку таких сложных запросов, как этот,  введем  другое  синтаксическое  соглашение, называемое  явной  синтаксической формой для  оператора логической импликации. Если р и q— правильно построенные формулы, то выражение логической импликации вида

IF  p  THEN  q  END  IF

также будет правильно построенной формулой с семантикой, идентичной семантике следующей формулы.

(   NOT p   )   OR  q

Таким образом, приведенное выше выражение может быть переписано следующим образом.

SX.S# WHERE FORALL SPX ( IF SPX.S# = S# (‘S2′) THEN EXISTS SPY ( SPY.S# = SX.S# AND

SPY.P# = SPX.P#

) END IF )

Дадим словесную формулировку этого запроса: "Получить номера таких поставщиков SX, что для всех поставок SPX, если существует поставка SPX поставщиком с номером S2, то существует поставка SPY всех типов деталей, входящих в поставку SPX, поставщиком sx".

8.3.9.Получить номера деталей, которые весят более 16 фунтов, поставляются поставщиком с номером S2 или соответствуют обоим условиям

RANGEVAR PU RANGES OVER

( РХ.Р# WHERE PX.WEIGHT > WEIGHT ( 16.0 ) ), ( SPX.P# WHERE SPX.S# = S# (‘S2′) )

; PU.P#

В эквивалентном выражении реляционной алгебры здесь могло бы  использоваться явное объединение.

Ради интереса покажем альтернативную формулировку этого запроса.  Однако  эта вторая формулировка (в отличие от первой) опирается на тот факт, что каждый номер детали из переменной отношения SP появляется также в переменной отношения Р.

РХ.Р# WHERE PX.WEIGHT > WEIGHT ( 16.0 ) OR EXISTS SPX ( SPX.P# = PX.P# AND SPX.S# = S# (‘S2′) )

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии