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

1 ... 66 67 68 [ 69 ] 70 71 72 ... 125


5.2 Запросы, содержащие

более одного отношения

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

5.2.1 Произведения и объединения в SQL

В SQL есть простой способ соединения отношений в одном запросе - их нужно перечислить в пункте FROM. Тогда пункты SELECT и WHERE смогут ссылаться на любой атрибут этих отношений.

Пример 5.10. Допустим, нужно узнать имя продюсера фильма Star Wars . Для этого нужны два отношения:

Movie(title. year, length. inColor, studioName. producerC#) MovieExec(name. address, cert#. netWorth)

Номер сертификата продюсера содержится в отношении Movie, значит, его можно узнать с помощью простого запроса на этом отношении. Затем можно выполнить запрос на отношении MovieExec и получить имя человека, имеющего данный номер сертификата.

Однако оба этих шага можно объединить в одном запросе на отношениях Movie и MovieExec:

SELECT name

FROM Movie, MovieExec

WHERE title =Star Wars AND producerC* = cert#

Этот запрос требует рассмотреть все пары кортежей, один из которых принадлежит Movie, а другой - MovieExec. Условие, которому они должны удовлетворять, формулируется в пункте WHERE:

1. Атрибут title кортежа из Movie должен иметь значение Star Wars.

2. Атрибут producerC# кортежа из Movie должен быть тем же номером сертификата, что и атрибуг сег1# кортежа из MovieExec; т.е. два кортежа должны ссылаться на одного и того же продюсера.

Когда найдена пара кортежей, удовлетворяющих обоим условиям, в качестве части ответа создается атрибут name кортежа из MovieExec. При подходящих данных оба условия выполняются только однажды - для кортежа Star Wars из Movie и кортежа George Lucas из MovieExec. Только в этом случае название фильма будет правильным и номера сертификатов совпадут. В результате получается единственное значение - George Lucas. D

5.5.2 Уточнение атрибутов

Иногда в запрос включается несколько отнонгений, и некоторые из них имеют атрибуты с одинаковыми именами. В этом случае приходится уточнять, какой именно атрибут используется. В SQL эта проблема решается указанием перед атрибутом имени отношения, за которым следует точка. Таким образом, R.A обозначает-атрибут А отношения R.



MovieSler.name

Jane Fonda

MovieExec.name Ted Turner

Отношение со следующей за ним точкой допустимо даже тогда, когда нет никакой двусмысленности. Так, запрос из примера 5.10 можно записать в следую-uie.M виде:

SELECT MovieExec.name FROM Movie, MovieExec WHERE Movie.titJe = Star Wars

AND Movie.producerC# = MovieExec.cert#

В этом запросе имена отношений с точками можно указывать перед каждым подмножеством атрибутов.

Переменные кортежей и имена отношений

Технически ссылки на атрибуты в предложениях SELECT и WHERE всегда являются ссылкагн! на переменную кортежа. Опнако, еспи отношение входит в предложение FROM всего один раз, его имя можно использовать в качестве переменной его собственного кортежа. Поэтому имя отношения fi в пункте FROM может быть сокраигением записи Л AS Д.

5-2.3 Переменные кортежей

\точненне агрнб>тов путем префнксироюння отношения эффективно, когда запрос содержит комбинацию различных отно1иеиий. Однако иногда требуется запрос, содержащий несколько кортежей нз одного и того же отношения. Можно повторить orHouicHHe Я необ.\одн.\1ое число раз в пункте FROM, но нри этом нужно обеспечить ссылки на каяаое его вхождение. В SQL для каждого вхождения Я а пункт запроса FROM можно опреяелнть пссвлоним , который мы будем называть перс.чепнач картечи. За кажды.м применением Л в пуикге FROM следует (по выбору) ключевое слово AS и нмч или переменная кортежа.

Пример 5Л1. Два отношения

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

имеют атрибуты nama и address. Предположим, нужно найти пары, состоящие ИЗ кинозвезды н продюсера, имеющих один и тот же адрес. -Это можно сделать с помощью сле.ауюшего запроса:

SELECT MovieStar.name, MovieExec.name

FROM Movie.Star, MovieExec

WHERE Movie Star, address = MovieExec.address

В этом запросе мы ищем пары кортежей, один из которых на.ходется в MovieStar, а другой в MovieExec и при этом их компоненты, содержащие адреса, совпадают. По условию пункта WHERE атрибуты address каждой пары кортежей должны совпадать. Запем из каждой нары кортежей выбирается два атрибута neme - сначала из кортежа, принадлежанего отношению MovieStar, а потом из другого кортежа. В результате получается множество пар типа



Starl.name

Star2.nBme

Alec Baldwin Kim Bssinger

K!m Basinger Alec Baldwin

5.2.4 Интерпретация запросов

с несколькими отношениями 1

Существует множество способов интерпретации запросов типа select-from-where. Все они эквивалентны в том смысле, что при любой интерпретации запрос к одному и тому же экземпляру от>10шения дает один и тот же ответ.

Вложенные циклы i

В предыдущих примерах неявно использовалась семантика переменных корте жей. Напомним, что псевдоним имени отношения - это переменная кортежа, пробегающая по всем кортежам определенргого опюшения. Имя отношения без псевдонима - это тоже переменная кортежа, пробегающая по самому этому отно шению. При наличии нескольких переменных кортежей для каждой из них можно представить вложенный цикл, в котором каждая переменная пробегает по кортежам соответствующего ей отношения. Для каждого приписывания кортежей nepe.vien-ным кортежей определяется, истинен ли пункт WHERE. Если истинен, порождается

3 Такая же проблема возникает в при.\1сре 5.11, когда один > тот же человек является и кннозвезлой, и администратором. Она решается с гомошью требов.1ния. cotnacHo которому два имени не лолжны совпадать. ,

Атрибуты R в пунктах SELECT и WHERE можно уточнить, указывая передни.ми подходяшую переменную кортежа и точку. Таким образом, переменная кортежа выполняет функцию другого имени отношения R и при желании .может быть использована вместо него.

Пример 5.12. Запрос из примера 5.11 касается кинозвезды и администратора, имеющих один и тот же адрес. .Аналогично можно искать двух кинозвезд с одним и тем же адресом. Запрос, по существу, остается прежним, но теперь нужно выбирать кортежи только из отношения MovieStar. Используя переменные кортежей и псевдонимы для двух применений отношения MovieStar, можно сформулировать следующий запрос;

SELECT Star1 name, Star2.name

FROM MovieStar AS Star1, MovieStar AS Star2

WHERE Star1.address = Star2.address AND Start.name < Star2.name

В предложении FROM переменные кортежей Starl и Star2 являются псевдонимами отношения MovieStar В предложении SELECT они применяются для ссылки на компоненты пате двух кортежей, а в предложении WHERE означают, что представленные ими кортежи из MovieStar имеют одно и то же значение в своих компонентах address.

Согласно второму условию прсдложе1П1я WHERE, т.е. Star1.name<Star2.name, имя первой кинозвезды предшествует имени второй по алфавиту. В отсутствие этого условия переменные Starl и Star2 относились бы к одному и тому же кортежу. Адреса при этом тоже совпали бы, и в результате получились бы пары идентичных имен кинозвезд. Второе условие требует также формировать каждую пару кинозвезд только один раз в алфавитном порядке. При использовании оператора <> <не равно) можно получить пары кинозвезд, состоящих в браке, например:



1 ... 66 67 68 [ 69 ] 70 71 72 ... 125

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