![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
(SPX.П# = SX.П# AND
SPX.Д# = SX.Д#))
Описанное исчисление не обладает вычислительной полнотой, так как не позволяет выполнять вычисления, связанные с обработкой данных в базах. Добавление вычислительных функций в это исчисление можно реализовать путем расширения определения операндов сравнения и элементов целевого списка таким образом, чтобы они допускали использование скалярных выражений с литералами, ссылками на атрибуты и итоговыми функциями. В качестве итоговых могут выступать следующие функции: COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное). Для целевых элементов целесообразно использовать спецификацию вида " AS <имя атрибута> ", позволяющую явно задать имя результирующему атрибуту, если нет очевидного наследуемого имени.
Пример 4. Запись запроса.
Пусть требуется получить информацию о каждой поставке с полными данными о деталях и общем весе поставки. Запрос на дополненном функциями языке реляционного исчисления кортежей может выглядеть следующим образом:
(SPX.П#, SPX.Количество, PX, PX.Bec * SPX. Количество AS Общий_Вес) WHERE PX Д# = SPX.Д#
Вариант реляционного исчисления, основанного на доменах (исчисление доменов), предложен Лакроиксом и Пиротте (Lacroix and Pirotte), которые также разработали на его основе соответствующий язык ILL. Другими языками, основанными, на исчислении доменов, являются: FQL, DEDUCE, а также QBE с некоторыми оговорками.
По утверждению Дейта, язык QBE включает элементы исчисления кортежей и исчисления доменов, но более близок ко второму. Он не является реляционно полным, так как не поддерживает операцию отрицания квантора существования (NOTEXISTS). Несмотря на этот недостаток, язык QBE получил широкое распространение в современных СУБД. Тем более, что реализации этого языка как правило шире исходного языка.
Исчисление доменов имеет много сходства с исчислением кортежей. В отличие от исчисления кортежей, в исчислении доменов основой любого выражения запроса выступают переменные доменов. Переменная домена — это скалярная переменная, значения которой охватывают элементы некоторого домена.
Большая часть различий рассматриваемых исчислений заключается в том, что исчисление доменов поддерживает дополнительную форму условия, называемую условием принадлежности. В общем виде условие принадлежности записывается в виде:
R(A,: A,:,...),
где А^ — атрибут отношения R, а и — переменная домена или литерал. Проверяемое условие истинно, если и только если существует кортеж в отношении R, имеющий атрибуты А, равные заданным в выражении соответствующим значениям
Например, выражение SP(П#: 'S1', Д#: 'Р1') истинно, если в отношении SP существует хотя бы один кортеж со значением 'S1' атрибута П# и значением 'РГ' атрибута Д#. Аналогично, выражение SP (П#: SX, Д#: РХ) истинно, если в отношении SP существует кортеж, в котором значение атрибута П# эквивалентно текущему значению переменной домена SX, а значение атрибута Д# эквивалентно текущему значению переменной домена РХ.
В следующих примерах будем подразумевать существование (объявленное каким-либо образом, подобно оператору RANGE исчисления кортежей) следующих переменных доменов: SX (домен П#), РХ (домен Д#), NAMEX (домен Имя).
Пример 5. Выражения исчисления доменов.
(SX) WHERE S (П#: SX)
(SX) WHERE S (П#: SX, Город_П: 'Москва')
NAMEX WHERE EXISTS SX (S (П#: SX, Имя: NAMEX) AND FORALL РХ (IF P (Д#: РХ) THEN SP (П#:SX, Д#: РХ)))
Первое выражение означает множество всех номеров поставщиков отношения S, второе — множество номеров поставщиков из Москвы. Третье выражение соответствует запросу на получение имен поставщиков, производящих все детали.
Реляционная алгебра.
Примеры.
Посмотрим, как работают операции реляционной алгебры для другого примера. Возьмем набор отношений, которые моделируют сдачу сессии студентами некоторого учебного заведения.
R1 = <ФИО, Дисциплина, Оценка>; R2 = <ФИО, Группа>;
R3 = < Группа, Дисциплина>,
где R1 — информация о попытках (как успешных, так и неуспешных) сдачи экзаменов студентами; R2 — состав групп; R3 — список дисциплин, которые надо сдавать каждой группе. Домены для атрибутов формально задавать не будем, но, ориентируясь на здравый смысл, будем считать, что доменом для атрибута Дисциплина будет множество всех дисциплин, преподающихся в ВУЗе, доменом для атрибута Группа будет множество всех групп ВУЗа и т. д.
Покажем, каким образом можно получить из этих таблиц интересующие нас сведения с помощью реляционной алгебры. В каждом из приведенных примеров путем операций над исходными отношениями R1, R2, R3 формируются промежуточные отношения и результирующее отношение S, содержащее требуемую информацию.
· Список студентов, которые сдали экзамен по БД на «отлично». Результат может быть получен применением операции фильтрации по сложному условию к отношению R1 и последующей проектцией на атрибут «ФИО» (нам ведь требуется только список фамилий).
S:= (R1 WHERE Оценкa = «5» AND Дисциплина = «БД»)[ФИО];
· Список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал. Сначала найдем всех, кто должен был сдавать экзамен по БД. В отношении R3 находится список всех дисциплин, по которым каждая группа должна была сдавать экзамены, ограничим перечень дисциплин только «БД». Для того чтобы получить список студентов, нам надо соединить отношение R3 с отношением R2, в котором определен список студентов каждой группы.
R4:= ((R2 R3) WHERE R3.Группа = R2.Группа AND
R3.Дисциплина = «БД»)[ФИО];
Теперь получим список всех, кто сдавал экзамен по «БД» (нас пока не интересует результат сдачи, а интересует сам факт попытки сдачи, то есть присутствие в отношении R1):
R5:= (R1 WHERE Дисциплина = «БД»)[ФИО];
и, наконец, результат — все, кто есть в первом множестве, но не во втором:
S:= R4 \ R5;
· Список студентов, имеющих несколько двоек по различным дисциплинам:
S:= (R1 R1’) WHERE R1.ФИО = R1’.ФИО AND
R1.Дисциплина R1’.Дисциплина AND R1.Оценка < 2 AND R1’.Оценка < 2) [ФИО]
Этот пример весьма интересен: для поиска строк, удовлетворяющих в совокупности условию больше одного, применяется операция соединения отношения с самим собой. Поэтому мы как бы взяли копию отношения R1 и назвали ее R1’.
· Список круглых отличников. Строим список всех пар < студент — дисциплина >, которые в принципе должны быть сданы:
R6:= ((R2 R3) WHERE R2.Группа = R3.Группа)[ФИО, Дисциплина];
Строим список пар < студент — дисциплина >, где получена оценка «отлично»:
R7:= (R1 WHERE Оценка = «5»)[ФИО, Дисциплина];
Строим список студентов, что-либо не сдавших на «отлично»:
R8:= (R6 \ R7)[ФИО].
Наконец, исключив последнее отношение из общего списка студентов, получаем результат:
S:= R2[ФИО] \ R8
Обратите внимание, что для получения множества студентов, что-либо не сдавших на «отлично» (R8), мы осуществили «инверсию» множества всех отлично сданных пар <студент—дисциплина> (R5) путем вычитания его из предварительного построенного универсального множества (R4). Рекомендуем очень внимательно разобрать этот пример и вникнуть в смысл каждого действия — это очень пригодится для понимания реляционной алгебры.
Дата публикования: 2015-07-22; Прочитано: 879 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!