Программирование >>  Хронологические базы данных 

1 ... 79 80 81 [ 82 ] 83 84 85 ... 348


Замечание. В этом SQL-примере ссылка на подзапрос представлена как ссылка на относительный подзапрос, поскольку в данном подзапросе содержится ссылка на переменную кортежа, а именно - на неявную переменную кортежа S, которая определена во внешнем запросе. Другим примером относительного подзапроса служит пример 7.7.8.

7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером Р2

SELECT DISTINCT S.SNAME FROM S

WHERE NOT EXISTS ( SELECT * FROM SP

WHERE SP.S# = S.S# AND SP.PI = P2 ) ;

Этот же запрос можно представить в альтернативной формулировке.

SELECT DISTINCT S.SNAME FROM S

WHERE S.SI NOT IN ( SELECT SP.Sl FROM SP

WHERE SP.PI = P2 ) ;

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

SELECT DISTINCT S.SNAME FROM S

WHERE NOT EXISTS ( SELECT * FROM P

WHERE NOT EXISTS ( SELECT * FROM SP

WHERE SP.Sl = S.SI

AND SP.PI = P.PI ) ) ;

Язык SQL не включает какой-либо непосредственной поддержки универсального квантора FORALL; следовательно, запросы типа ДЛЯ ВСЕХ обычно выражаются через отрицание кванторов сушествования, как в этом примере.

Стоит отметить, что выражения, подобные показанному выше, хотя, на первый взгляд, и выглядят несколько устрашаюше, легко составляются пользователями, знакомыми с реляционным исчислением, как отмечается в [7.4]. В альтернативном случае, если подобные примеры все еше кажутся вам слишком сложными, сушествует несколько обходных путей, позволяюших избежать использования негативных кванторов. В нашем случае, например, можно записать запрос следующим образом.

SELECT DISTINCT S.SNAME FROM S



WHERE ( SELECT COUNT ( SP.Pf ) FROM SP

WHERE SP.SI = S.S# ) = { SELECT COUNT { P.Pt ) FROM P ) ;

(Расшифровка: Получить имена поставщиков, для которых количество поставляемых деталей равно количеству всех деталей .) Однако обратите внимание на следующие обстоятельства.

Во-первых, в отличие от формулировки с выражением NOT EXISTS, в последней формулировке предполагается, что в отношении SP нет номеров деталей, которые не содержатся в отношении Р. Другими словами, эти две формулировки эквивалентны (а вторая будет верной) только в случае соблюдения определенного ограничения целостности (подробности приводятся в следующей главе).

Во-вторых, метод, примененный во второй формулировке для сравнения двух количеств (подзапросы, расположенные по обе стороны знака равенства), изначально не поддерживался в языке SQL и был добавлен только в стандарте SQL/92. Он все еще не поддерживается во многих продуктах.

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

SELECT DISTINCT S.SNAME FROM S

WHERE ( SELECT SP.Pl ) FROM SP

WHERE SP.S# = S.S# ) = ( SELECT P.P# FROM P ) ;

Поскольку язык SQL непосредственно не поддерживает операции сравнения таблиц, необходимо прибегнуть к приему, используюшему сравнение кардинальности таблиц (опираясь на практический опыт, мы можем гарантировать, что если кардинальности таблиц равны, то и таблицы одинаковы, по крайней мере в обсуждаемом случае). Дополнительный материал по данной теме приведен в упр. 7.1 L

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

SELECT Р.Р#

FROM Р

WHERE Р.WEIGHT > 16.0 UNION

SELECT SP.PI

FROM SP

WHERE SP.SI = S2 ;



Лишние повторяюшиеся строки всегда исключаются из результата выполнения не-уточненных операторов UNION, INTERSECT и EXCEPT (в языке SQL оператор EXCEPT служит аналогом операции MINUS реляционной алгебры). Однако язык SQL также поддерживает уточненные варианты этих операторов (UNION ALL, INTERSECT ALL и EXCEPT ALL), при которых повторяющиеся строки (если они есть) сохраняются. Примеры с этими вариантами операторов умышленно опускаются.

В заключение отметим, что, хотя список примеров операций выборки был достаточно большим, о многих возможностях языка SQL здесь даже не упоминалось. Язык SQL в действительности является чрезвычайно избыточным [4.18] в том смысле, что почти всегда существует множество способов формулирования одного и того же запроса и нам не хватит места, чтобы описать все возможные формулировки и все возможные опции даже для сравнительно небольшого числа примеров, которые приводились в этой главе.

7.8. Резюме

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

Реляционное исчисление существует в двух версиях: исчисление кортежей и исчисление доменов. Основное различие между ними состоит в том, что переменные исчисления кортежей изменяются на отношениях, а переменные исчисления доменов изменяются на доменах.

Выражение исчисления кортежей состоит из прототипа кортежа и необязательного предложения WHERE, содержащего логическое выражение или формулу WFF ( правильно построенную формулу ). Подобная формула WFF может включать кванторы (EXISTS и FORALL), свободные и связанные ссылки на переменные, логические (булевы) операторы (AND, OR, NOT и др.) и т.д. Каждая свободная переменная, которая встречается в формуле WFF, также должна быть упомянута в прототипе кортежа.

Замечание. В настоящей главе явно этот вопрос не затрагивался, но выражения реляционного исчисления предназначены, по существу, для тех же целей, что и выражения реляционной алгебры (см. раздел 6.6 главы 6).

На примере было показано, как алгоритм редукции Кодда может использоваться для преобразования произвольного выражения реляционного исчисления в эквивалентное выражение реляционной алгебры, таким образом подготавливая почву для выбора возможной стратегии реализации исчисления. Вновь обратившись к вопросу реляционной полноты, мы кратко обсудили, каким образом можно доказать, что некоторый язык L является полным в этом смысле.

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



1 ... 79 80 81 [ 82 ] 83 84 85 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика