Программирование >>  Реляционные базы данных 

1 ... 81 82 83 [ 84 ] 85 86 87 ... 125


Само по себе произведение редко бывает папезным. Более стандартное тэта-соединение получается с помощью ключевого слова ON и какого-то условия. Между отношениями R и .Уставится JOiN, а далее следует ON и заданное условие. Тогда за операцией произведения следует выбор для любого условия, указанного после ON.

Пример 5.47. Предположим, нужно объединить отношения

Movie(tille. year, length, inColor, studioName. producerC#) Starsln(movieTitie. movieYear, starName)

при условии, что будут объединяться только кортежи, относящиеся к одному и тому же фильму, т.е. названия фильмов и i-оды их выпуска в обоих отношениях должны совпадать. Тогда в результате запроса

Movie JOIN Starsin ON

title = movieTitle AND year = movieYear;

ciTOua получится отношен1ге с девятью столбцами и очевидными именами атрибутов. Но теперь ко)тежи из отношений Movie и Starsln составляют кортеж ответа, если только онн совпат1ют по голу выпуска и названию фильма. Б итоге два столбца оказываются излишними, так как каждый кортеж резу.пьтата имеет одно и то же значение в компс нентах title и movieTitle и одно и то же значение в year и movieYear. □

Соединения могуг аходнть в предложения FROM запросов типа select-from-where. При этом отношение, обозначенное таким выражением, интерпретируется точно гак же, как таблицы базы или представления в предложении FROM.

Пример 5.48. Еслн имеет значение то. что в отношении из примера 5.47 есть избыточные кортежи, все выражение из этого примера можно поместить в предложение FROM и применить SELECT для удаления ненужных атрибутов. Итак, мы можем записать запрос:

SELECT title, year, length, inColor. studioName,

producerC#, StarName FROM Movie JOIN Starsin ON

title = movieTitle AND year = movieYear;

чтобы получить отношение с семью столбцами, состоящее из кортежей отношения Movie, расширенных всеми возможными способами за счет имен кинозвезд, снявшихся в конкретном фильме. □

5-9.4 Натуральные соединения

Натуральные объединения отличаются от тэта-соединений двумя параметрами.

1. Единственное условие натурального соединения заключается в том, что все пары атриб1Тов нз двух отношений, имеющих обшее имя, приравниваюгся.

2. Одна из пар равных атрибутов удаляется п\тем проекции. *

Натуральное объединение SQL2 действует точно так же, только оператор соединения м заменяется ключевыми словами NATURAL JOIN.

Пример 5.49. Вычислим натуральное соединение отношений

MovieStar(name, address, gender, birthdate) MovieExec(name, address, cert#, netWorth)



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

Кратко описывается выражением

MovieStar NATURAL JOIN MovieExec; □

5.9.5 Внешние соединения

Внешнее соединение - это один из вариантов соединения, предусмотренный стандартом SQL2 лля решения проблемы, связанной с определенными соединениями. Допустим, нужно вычислить соединение RxS. Если кортеж f из Л не соответствует ни одному кортежу из 5, он полностью исчезает из отношения Rix S. Такая ситуация вызывает немало проблем. Например, если данное соединение является представлением и запрос относится к представлению об атрибутах, принадлежащих только схеме отношения R, мы интуитивно предполагаем, что / войдет в результат этого запроса. Но фактически / невозможно увидеть в представлении Rx S, поэтому запрос к Л может дать результат, отличающийся от результата такого же самого запроса к RxS.

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

Пример 5.SO. Допустим, нужно выполнить соединение двух отношений:

MovieStar(name, address, gender, birthdate) Movieexec(name, address, cert#. netWorth)

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

MovieStar NATURAL FULL OUTER JOIN MovieExec;

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

Второй вид кортежей представляет людей; являющихся кинозвездами, но не администраторами. Значения атрибутов name, address, gender и birthdate этих кортежей взяты из кортежа отношения MovieStar. а их атрибуты cert# и netWorth. принадлежащие только отношению MovieExec, имеют значения NULL.

Третий вид кортежей представляет людей, являющихся администраторами, но не кинозвездами. Для этих кортежей значения атрибутов MovieExec берутся из кортежа отношения MovieExec, а их атрибуты gender и birthdate, принадлежащие только отнощению MovieStar, имеют значения NULL.

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



name

address

gender

birthdate

cert#

netWorth

Mary Tyler Moore

Maple St.

9/9/99

12345

$100.

Tom Hanks

Cherry Ln.

8/8/88

NULL

NULL

George Lucas

Oak Rd.

NULL

NULL

23456

S200...

Рис, 5.20. Три нортежо внешнего соединения отношений MovieStar и MovieExec

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

MovieStar NATURAL LEFT OUTER JOIN MovieExec

дает только два первых кортежа отношения, изображенного на рис. 5.20.

Аналогично правое внешнее соединение пополняет значениями NULL и включает в результат только кортежи правого (второго) отношения. Выражение

MovieStar NATURAL R GHT OUTER JOIN MovieExec

дает только первый и третий кортежи отношения, изображенного на рис. 5.20.

Внешнее соединение варьируется и в зависимости от определения условия, которому должны удовлетворять соответствуюшие друг другу кортежи. Вместо ключевого слова NATURAL за соединением могут следовать слово ON и условие для кортежей. Если задано также FULL OUTER JOIN, то после установления соответствия между кортежами соединяемых отношений висящие кортежи обоих отношений пополняются значениями NULL и включаются в результат.

Пример 5.51. Рассмотрим снова пример 5.47, в котором отношения Move и StarslN соединялись при условии, что атрибуты этих отношений title и movieTitle, а также year и movieYear совпадают. Если изменить этот пример, введя в него полное внешнее соединение

Movie FULL OUTER JOIN Starsln ON title = movieTitle AND yaer - movieYear;

получатся кортежи только для фильмов, в которых снялась по крайней мере одна 113 кинозвезд, упомянутых в Starsln, а кортежи для фильмов, для которых кинозвезды не указаны, будут иметь значения NULL в атрибутах movieTitle, movieYear и starName. Аналогачно для кинозвезд, не участвующих hii в одном из фильмов, перечисленных в отношении Movie, получится кортеж со значениями NULL в шести атрибутах из Movie. □

В объединении из примера 5.51 ключевое слово FULL можно заменить иа LEFT или RIGHT. Например:

Movie LEFT OUTER JOIN Starsln ON title = movieTitle AND year = movieYear;

позволяет получить кортежи отношения Movie, в которых указана хотя бы одна кинозвезда, и кортежи Movie без кинозвезд, пополненные значениями NULL, но не кортежи, в которых для кинозвезд не указаны фильмы. Напротив, соединение

Movie RIGHT OUTER JOIN Starsln ON title = movieTitle AND year = movieYear;



1 ... 81 82 83 [ 84 ] 85 86 87 ... 125

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