|
Программирование >> Хронологические базы данных
7.3.1. Определить номера поставщиков из Парижа со статусом, большим 20 { SX.SI, SX.STATUS ) WHERE SX.CITY = Paris AND SX.STATUS > 20 7.3.2. Найти все такие пары номеров поставщиков, в которых два поставщика находятся в одном городе ( SX.SI AS SA, SY.Sf 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 WHERE EXISTS SPX ( SPX.Sl = SX.SI AND SPX.PI = PI { P2 ) ) Обратите внимание на использование имени переменной кортежа в прототипе кортежа. Этот пример является сокращенной записью следующего выражения. (SX.SI, SX.NAME, SX.STATUS, SX.CITY ) WHERE EXISTS SPX ( SPX.Sl = SX.SI AND SPX.PI = PI { P2 ) ) 7.3.4. Определить имена поставщиков по крайней мере одной красной детали SX.SNAME WHERE EXISTS SPX ( SX.SI = SPX.Sl AND EXISTS PX { PX.PI = SPX.PI AND PX.COLOR = COLOR { Red ) ) ) Эквивалентная формула (но записанная в предваренной нормальной форме, в которой все кванторы помещаются в начало формулы WFF) имеет следующий вид. SX.SNAME WHERE EXISTS SPX ( EXISTS PX ( SX.SI = SPX.Sl 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.Si = SPX.Si AND SPX.Pi = PX.Pi AND PX.COLOR = COLOR { Red ) ) Однако для ясности будем продолжать показывать все скобки во всех остальных примерах. 7.3.5. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером S2 SX.SNAME WHERE EXISTS SPX ( EXISTS SPY { SX.Si = SPX.Si AND SPX.Pi = SPX.Pi AND SPY.Si = Si { S2 ) ) ) 7.3.6. Выбрать имена поставщиков всех типов деталей SX.SNAME WHERE FORALL PX { EXISTS SPX { SPX.Si = SX.Si AND SPX.Pi = PX.Pi ) ) Равносильное выражение можно записать без использования квантора FORALL. SX.SNAME WHERE NOT EXISTS PX { NOT EXISTS SPX ( SPX.Si = SX.Si AND SPX.Pi = PX.Pi ) ) 7.3.7. Определить имена поставщиков, которые не поставляют деталь с номером Т2 SX.SNAME WHERE NOT EXISTS SPX { SPX.Si = SX.Si AND SPX.Pi = Pi { P2 ) ) Обратите внимание, как просто это решение можно получить из решения примера 7.3.3. 7.3.8. Определить номера поставщиков по крайней мере всех типов деталей, поставляемых поставщиком с номером S2 SX.SI WHERE FORALL SPX ( SPX.Sl s { S2 ) OR EXISTS SPY { SPY.SI = SX.SI AND SPY.Pi = SPX.PI ) ) Переформулируем запрос в соответствии со следующим выражением: Получить номера поставщиков (скажем, SX), таких, что для всех поставок SPY поставка осуществляется либо не от поставщика с номером S2, либо существует поставка SPY всех типов деталей, входящих в поставку SPX от поставщика SX . Чтобы упростить формулировку таких сложных запросов, как этот, введем другое синтаксическое соглашение, называемое явной синтаксической формой для оператора логической импликации. Если р и q - формулы WFF, то выражение логической импликации вида IF р THEN q END IF также будет формулой WFF с семантикой, идентичной семантике следующей формулы. { NOT р ) OR q Таким образом, приведенное выше выражение может быть переписано так. SX.SI WHERE FORALL SPX ( IF SPX.Sl = SI { S2 ) THEN EXISTS SPY { SPY.SI = SX.SI AND SPY.PI = SPX.PI ) END IF ) Дадим словесную формулировку этого запроса: Получить номера поставщиков (скажем, SX), таких, что для всех поставок SPX в случае поставки от поставщика с номером S2 существует поставка SPY всех типов деталей, входящих в поставку SPXot поставщика SX . 7.3.9. Получить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером S2, либо и то, и другое RANGEVAR PU RANGES OVER ( PX.PI WHERE PX.WEIGHT > WEIGHT ( 16.0) ), { SPX.PI WHERE SPX.Sl = SI ( S2 ) ) ; PU.PI В эквивалентном выражении реляционной алгебры здесь могло бы использоваться явное объединение. Ради интереса покажем альтернативную формулировку этого запроса. Однако тот факт, что каждый номер детали в переменной-отношении SP присутствует и в переменной-отношении Р, делает вторую формулировку не соответствующей стилю объединения .
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |