|
Программирование >> Реляционные базы данных
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, а потом из другого кортежа. В результате получается множество пар типа
□ 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 относились бы к одному и тому же кортежу. Адреса при этом тоже совпали бы, и в результате получились бы пары идентичных имен кинозвезд. Второе условие требует также формировать каждую пару кинозвезд только один раз в алфавитном порядке. При использовании оператора <> <не равно) можно получить пары кинозвезд, состоящих в браке, например:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |