|
Программирование >> Реляционные базы данных
1) SELECT name 2) FROM MovieExec 3) WHERE certC#- 4) (SELECT producerC* 5) FROM Movie 6) WHERE title =Star Wars 7) ): Рис. 5.4. Поиск продюсера фильмо Star iVnrs с поллощью вложенного подзопросо Подзапрос выражен строками (4) - (6). Уже один он показь вает, что результатом будет унарное отношение с атрибутом producerC# и единственным кортежем. Кортеж будет выглядеть примерно как (12345), т.е. как единственный компонент с целым числом, совпадаюшим с номером сертификата продюсера Geoie Lucas. Если этот подзапрос не порождает ни одного кортежа или порождает более оаного кортежа, это ошибка этапа выполнения запроса. Выполнив подзапрос, можно выполнять строки (I) - (3) так, словно 12345 заменяет целый подзапрос, т.е. главный запрос выполняется так, как запрос вида 1) SELECT name 2) FROM MovieExec 3) WHERE certC# = 12345 Его результат - George Lucas. □ 5.3.2 Условия, содержащие отношения Есть ряд операторов SQL, которые можно применять к отношению R и получать булевы значения. Обычно R - результат запроса seleci-from where Некоторые 42 этих операторов, например IN, ALL и ANY, содержат скалярное значение s, и в этом случае R должно быть отношением с одним столбцом. 1. EXISTS Л - это условие, которое истинно, если и только если R не пусто. 2. Условие J IN Л истинно, если и только еспи j эквивалентно одному из значений Я. Выражение s ЫО IN Л истинно, если и только если j не эквивалентно ни одному из значений R. При этом предполагается, что Л -унарное отношение. Расширение операторов IN и NOT IN, при котором схема R имеет более одного атрибута, as- кортеж, будет рассмотрено в разделе 5.3.3. 3. Условие S > ALL R истинно, если и только если j больше любого значения унарного отношения Л. Здесь оператор > можно заменить любым оператором сравнения с ашиюгнчным значением. Например, выражение .\- о ALL Л эквивалентно выражению f NOT IN Л. 4. Условие .\- > ANY R истинно, если и только если j больше по крайней .мере одного из значений унарного отношения R. Здесь оператор > .можно 5а,мен11ть любым из пяти других операторов сравнения. Например. у = ANY R эквивалентно .< IN Я. Можно строить отрицания операторов EXIST, ALL н ANY точно так же. как любых булевозиачиых выражений - ставить перед всем выражением слово NOT. Значит. NOT EXIST R истнпио. если и только если R пусто. NOT s > ALL Л ис инно, если и только если s не является максимальным значением Л. а NOT s > ANY R истинно, еслч II только если i - минимальное значение R. 5-3.3 Условия, содержащие кортежи в SQL кортеж представляется заключенным в скобки списком скалярных значений, например (123, foo) и (name, address, networth). Первый из них в качестве своих компонентов содержит константы, а второй - атрибуты. Допустимо также смешение констант и атрибутов в одном кортеже. Если в кортеже / столько же компонентов, как и в отношении R, имеет смысл сраанивать / и Л в выражениях типа / IN Л или / <> ANY Л. Последнее означает, что в R есть кортеж, отличающийся ст /. При сравнении кортежа с членами отношения Л необходимо использовать установленный стандартный порядок атрибугов R. Пример 5.18. На рис. 5.5 сформулирован запрос SQL на трех отношениях: Movie(tiHe. yeer, length. InColor, studioName. producerC#) Starsln(movieTitle, movieYear. starNeme) MovleExec(name. address. cert#. netWorth) касающийся продюсеров фильмов, в которых играет Harrison Ford. Он состоит из главного запроса, вложенного в него запроса и третьего запроса, вложенного во второй. 1) SELECT name 2) FROM MovieExec 3) WHERE cert#IN 4) (SELECT producerC# 5) FROM Movie 6) WHERE (title, year) IN 7) (SELECT movieTitle. movieYear 8) FROM Starsin 9) WHERE SlarName =HarrisonFord 10) ) 11) ): Рис. 5.5, Поиск продюсеров фильмов с Хоррисоном Фордом (Horrteon ford) Нужно проанализировать каждый вложенный подзапрос, начиная изнутри. Поэтому мы начнем со строк (7) - (9). Этот подзапрос проверяет кортежи отношения Starsin, находит в них кортежи, компонентом starName которых является Henison Ford , и возвращает названия и годы выпуска фильмов. Напоминаем, что ключом фильмов является не один атрибут year, а оба атрибута title и year, поэтому для идеитификвиии фильма нужно строить кортежи, содержащие оба эти атрибута. Значит можно ожидать, что строки (7) - (9) порождают значение, похожее на то, которое изображено на рис. 5.6. tiUe Star Wars 1977 Raiders of the Lost Ark 1981 The Fugitive 1993 Рис. 5.6 Поры назвонив - год , возврощоемые внутренним вопросом Теперь paccMoipnM средний подзапрос, г.е. спюки (4) ~ (6). Здесь ведется поиск кортежей отношения Movie, в которых есть годы и названия фильмов, указанные в отношении на рис. .\6 Дпя кашого такого кортежа возвращается номер сертификата продюсера, поэтому результат данного подзапроса - множество номеров сертификатов продюсеров фильмов, в которых iH-рает Харрнсон Форд. И наконец рассмотрим главный .запрос на строках (I.) - (3). Здесь проверяется отношение MovieExec и вслегся поиск кортежей, компонент cert# которых являе1ся одним из сертификатов множества, возвращенного средним подзапросом. Дзя каждого такого кортежа возвращается имя продюсера в порождается требуемое личожество про.1юссро15 фильмов, в которых играл Харрисон Форд. □ Вложенный запрос, сформулированный на рнс. 5.5, как и множество других вложенных запросов, можно записать в виде выражения типа se ect-from-wliere с указанием п пункте FROM всех отношений, упомякртых в главном запросе или в ползап]30се. Связки IN заменяются равенствами в пункте WHERE. Например, на рнс. 5.7 выражен, в сущности, тот же запрос, что и на рис. 5.5. SELECT name FROM MovieExec. Movie, Starsln WHERE cert# = producerC*; AND tffle = movieT tie AND year = movieYear AND StarName = Harrison Ford; Рис. 5.7. Поиск продюсеров фип11мое без помощи елотенньс подзапросов Разница между нн.ми связана со способом дублирования имен продюсеров и будет рассмотрена в разделе 5.4. 5.3-4 Коррелирующие подзапросы Простейшие Подзапросы можно оцен1пъ раз и навсегда, а затем использовать результаты в запросе более высокого уровня. При более сложном применении подзапросов проводится мноюкратиое вычисление подзапроса, по одному разу для ;aлiдoгo приписывания значения терму этого подзапроса, происхсиящему от переменной, находящейся вне его. Подзапрос такого типа называется коррелирующим. Рассмотрим примеэ. Пример 5.19. Найдем названия, использованные для двух и.пн более фильмов. Внегвний запрос касается поиска кортежей в отношении Movie(t tie. year, lengtti, inColor, studioName. producerC#) В подзапросе спрашивается, есть ли в каждом кортеже фш1ьм с тем же названием к более позднего года выпуска. Весь запрос показан на рис. 5.8. 1) SELECT ttle 2) FROM Movie AS Old 3) WHERE year < ANY 4) (SELECT year 5) FROM Movie 6) WHERE title = Old ftle 7) ) Рис. 5.S. Поиск ноааонт фильмов варечоющихся более одного разо
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |