|
Программирование >> Реляционные базы данных
s Таког рахтичне можно предотсратить доумя способаин. рассмотренными в папе б Пример 5.15. Можно найти также разность между миожестпами людей, выбранными из двух отношений. Запрос i SELECT name, address FROM MovieStar) EXCEPT (SELECT name, address, FROM MovieExec) дает имена и адреса кинозвезд, не являющихся администраторами, независимо or их дохода. □ В двух предыдущих примерах отношения, иа которых выполняются операшш пересечения и разности, по соглашению имеют одни и те же атрибуты. Но при необходимости создания общего множества атрибутов можно применить и переименовать атрибуты, как было показано в примере 5.3. Пример 5.16. Предположим, нужно найти все названия и годы выпуска фильмов, в.\одяших в отношение Movie тн Starsin: j Movie(title, year, length, inColor. studioName, producerCff) Starsln(movleTille, movieYear. starName) В идеальном случае эти множества фильмов совпадают, но на практике они обычно различаются. Например, могут быть фильмы без кинозвезд или кортеж Starsin. в котором упоминается фильм, отсутствующий в отношении Movie.* Итак, можно сформулировать следующий запрос: (SELECT title, year FROM Movie) UNION (SELECT movieTitle AS title. movieYear AS year FROM Starsin); Результатом будут все фильмы, упомянутые в любом из этих отношений с атрибутами результирующего отношения title и year. О 5.2.6 Упражнения к разделу 5-2 Упрожнение 5.2.1. Используя схему БД фильмов Movie(title, year length. inColor. studioName, producerC*) Starsln(movleTltle. movieYear, starName) MovieStar(name. address, gender, birthdate) MovieExec(name. address. cert#. netWorth) StudlD(name, address, presC#) запишите следующие запросы: *a) Какие женшины-кинозвезяы играют в фильме Terms of Endearment . b) Какие кинозвезды играют в филь.ча?(. снятых на студии МСМ в 1995 г.? c) Кто является президентом студии MGM? *! d) Какие филымы длиннее фильма Cotte With the Wind ! !e) Какие админисграторы богаче, чем Merv GrifTin? Цпрожненис 5.2.2. Запишите перечисленные ниже запросы, основанные на схеме ВД Product(maker. modeL fype) PC(model, speed, ram, hd, cd, price) Laptop(modeL speed, ram, hd. screen, price) Printer(model. color, type, price) h3 примера 4.1.1 и ошните их с помошью данных этого упражнения. *а) Укажите производителя и скорость ПК-блокнотов с жестким диском объемом не менее I Гбайт. *Ь) На1 днтс номера моделей и цены всех продуктов (любого типа), выпущенных производителем В. с) Най.ашс произволителя, продающего ПК-блокноты, но не ПК. d) HaibTHTe размеры жестких дисков, совпадающие у двух или более ПК. !е) )Найлите пары моде.пей ПК, имеющих одинаковые скорость и RAIVI. В результате каждая пара указывается только один раз. т.е. указывается (/.У), но не (/, О !. О Найдите производителей по меньшей мере двух различных кокшьютеров (ПК или ПК-блокнотов), имеющих скорость не менее 133 МГц. Упрожнение 5.2.3. Запишите перечисленные ниже запросы, основанные на схеме БД: Classes(class, type, country, numGuns. bore, displacement) Ships(name. class, launched) Battles(name, date) Outcomes(shlp, battle result) , из при 1сра 4.1.3 н оцешгте нх с помошью данных этого упражнения. a) Найдите корабли водоизмещением более 35 тыс. тонн. b) Перечислите названия, водоизмещение и число орудий кораблей, участвовавших в сражении при Гвадаканалс (Guadacanal). c) Перечислите все корабли, упомянутые в этой БД. (Помните, что некоторые корабли MOIYT не входить в отношение Ships.) !d) Укажите страны, имеющие линкоры и крейсеры. !е) Укажите корабли, которые были повреждены в одном сражении, но позднее участвовали в другом. ! f) Укаж1гге сражения, в которы\ участвовало по меньшей мере три корабля одной и той же страны. ! Упрожнение 5.2.4. Общая форма запроса в нотации реляиионной алгебры; 7ti(oc(/f, >:ЛгХ...хЛ )) Здесь L- произвольный список атрнб>тов, а С - произвольное отношение. Список д. Л;. -., Л может содержать одно н то же многократно повторяющееся отноше- ние. При этом предполагается, что этот список можно переименовать подходящим образом Покажите, как выразить в SQL любой запрос такой формы. I Упрожнение 5.2.5. Другой формо11 запроса в нотации реляиионной алгебры является выражение л, (ac(R,x Rjtx ...tx Л )) При этом принимаются такие же допущения, как и п упражнении 5.2.4. Единст ненное отличие состоит в том, что здесь вместо произведения применяется нат>раль-ное объединение. Покаж1т, как выразить о SQL любой запрос такой формы. 5-3 Подзапросы в этом разделе рассматривается более широкая область выражений, которые мог/т появляться в предложения.ч WHERE. Раисе в условии сравнивались скалярные значения (простые значения типа целых или реальных чисел, строк и дат или же выражения, представляющие значения). Теперь мы будем сравнивать целые кортежи и даже отношения Сначала рассмотрим, как в условиях применяются подзапросы. Подзапрос - эхо выражение, приписывающее значение отношению. Например, подзапросом может быть выражение типа .wlect-from-wliere. Рассмотрев, как создаются значения, являющиеся отношениями, мы опишем операторы SQL, позволяющие сравнивать кортежи и отношения в предложении WHERE. 5.3-1 Подзапросы, порождающие скалярные значения Выражения типа seleci-from-where могут порождать отношения с любым числом атрибутов в схеме, и в этих отношениях может быть любое число кортежей. Однако часто нужно знать значения единственного атрибута. Более того, иногда из информации о ключах можно сделать вывод, что для данного атрибута порождается единственное значение. В таком случае допускается использовать заключенный в скобки простой запрос как константу. В частности, он может стоять в пункте WHERE на любом месте, на котором предполагается вхождение константы или атрибута, представляющего компонент кортежа. Например, результат такого подзапроса можно сравнить с константой или атрибутом. Пример 5.17. Рассмотрим пример 5.10, в котором запрос относился к продюсеру фильма Star Wars . Для него нужны были два отношения: Movie(tltte, year, length, inColor, studioName, producerC#) MovieExec(name, address, cert#, netWorth) поскольку только в первом из них есть информация о названии фильма, а имена продюсеров только во втором. Эта информаиия связана номерами сертификатов, которые уникальным образом идентифицируют продюсеров. В результате был построен запрос: SELECT name FROM Movie, MovieExec WHERE title - Star Wars AND producerC# = cert# Ha этот запрос можно посмотреть иначе. Для получения номера сертификата продюсера фильма Star Wan необходимо только отношение Movie. Зная этот номер, можно адресовать отношению MovieExec запрос о человеке с этим сертификатом. Первую проблему можно решить с помощью подзапроса, а его результат, являющийся, по нашему предположению, единственным значением, использовать в главном запросе для получения тогоже эффекта, что и в случае с предыдущим запросом. Такая форма запроса показана на рис. 5.4.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |