Скачиваний:
147
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

7.3. Примеры

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

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

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

( SX.S#, SX,STATUS ) WHERE SX.CITY = 'Paris' AND SX.STATUS > 20

7.3.2. Найти все такие пары номеров поставщиков,

в которых два поставщика находятся в одном городе

( SX.SI AS SA, SY.Si AS SB )

WHERE SX.CITY = SY.CITY AND SX.Si < SY.Si

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

7.3.3. Определить имена поставщиков детали с номером 'Р2'

SX

WHERE EXISTS SPX ( SPX.Si = SX.SI AND

SPX.Pi = Pi { 'P2' ) )

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

(SX.Si, SX.NAME, SX.STATUS, SX.CITY ) WHERE EXISTS SPX ( SPX.Si = SX.Si AND

SPX.Pi = Pi ( 'P2' ) )

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

SX.SNAME

WHERE EXISTS SPX ( SX.Si = SPX.Si AND

EXISTS PX ( PX.Pi = SPX.Pi AND

PX.COLOR = COLOR ( 'Red' ) ) )

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

SX.SNAME

WHERE EXISTS SPX ( EXISTS PX ( SX.Si = SPX.Si AND

SPX.Pi = PX.Pi AND PX.COLOR = COLOR ( 'Red' ) ) )

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

quantl vblel ( quant2 vble2 ( wff ) )

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

quantl vblel quant2 vble2 ( wff )

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

SX.SNAME

WHERE EXISTS SPX EXISTS PX ( SX.St = SPX.St AND

SPX.Pt = PX.Pi AND

PX.COLOR = COLOR ( 'Red' ) )

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

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

SX.SNAME

WHERE EXISTS SPX ( EXISTS SPY ( SX.St = SPX.Si AND

SPX.Pt = SPX.Pt AND SPY.St = St ( 'S2' ) ) )

7.3.6. Выбрать имена поставщиков всех типов деталей

SX.SNAME WHERE FORALL PX ( EXISTS SPX ( SPX.Si = SX.St AND

SPX.Pt = PX.Pi ) )

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

SX.SNAME WHERE NOT EXISTS PX ( NOT EXISTS SPX

( SPX.Si = SX.St AND SPX.Pt = PX.Pt ) )

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]