Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
интернет отвт.doc
Скачиваний:
10
Добавлен:
27.10.2018
Размер:
300.03 Кб
Скачать

10.2.2. Условия уровня отношения

В SQL предусмотрен ряд операторов, которые применяются к некоторому отношению R в целом и возвращают булево значение. В данном случае R - итог выполнения определенного подзапроса вида "select-from-where".

Некоторые из упомянутых операторов - IN, ALL и ANY - вначале рассмотрим в их простой форме, когда подзапрос возвращает скалярное значение s. В этой ситуации подразумевается, что отношение R содержит только один атрибут.

Определения операторов:

1. Условие EXISTS R равно TRUE, если и только если R не пусто.

2. Условие s IN R равно TRUE, если и только если s равно одному из значений в R. Напротив, условие s NOT IN R обращается в TRUE, если и только если, s не равно ни одному из значений в R.

3. Условие s > ALL R равно TRUE, если и только если s превосходит все значения в R. Оператор > может быть заменен любым из пяти других операторов сравнения (=, >=, <, <= и <>); соответственно изменится и смысл условия в целом: например, условие s < ALL R равно TRUE, если и только если s меньше всех значений в R. Выражения s <> ALL R и s NOT IN R эквивалентны.

    1. Условие s > ANY R равно TRUE, если и только если s превосходит по меньшей мере одно значение в R. Оператор> может быть заменен любым из пяти других операторов cравнения. Выражения s = ANY R и s IN R эквивалентны.

10.2.3. Условия уровня кортежа

Задание 6. Найти имена продюсеров всех кинофильмов, в съемках которых принимал участие актер Гаррисон Форд.

В запросе используются три отношения из "кинематографической" базы данных

Movie (title, year, length, inColor, studioName, producerC#)

StarsIn (movieTitle, movieYear, starName)

MovieExec (name, address, cert#, netWorth),

Запрос содержит два подзапроса, вложенных один в другой.

1) SELECT nаmе

2) FROM MovieExec

3) WНERE cert# IN

4) (SELECT producerC#

5) FROM Movie

6) WНERE (title, year) IN

7) (SELECT movieTitle, movieYear

8) FROM StarsIn

9) WНERE starName = 'Harrison Ford‘));

10.2.4. Коррелированные подзапросы

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

Задание 7. Найти все кинофильмы, названия которых повторяются два раза и более. Начнем с построения внешнего запроса, который предполагает просмотр всех кортежей отношения

Movie(title, year, length, inColor, studioName, producerC#).

Для каждого из кортежей выполняется подзапрос, призванный определить, существуют ли другие кинофильмы с тем же названием и датой выпуска, превосходящей значение даты для текущего кортежа-"кинофильма".

1) SELECT title

2) FROM Movie 0ld

3 ) WНERE year < ANY

4) (SELECT year

5) FROM Movie

б) WНERE title = Old.title ) ;

Рассмотрим вначале внутренний запрос, определенный в строках 4-6. Если мысленно заменить атрибут Old.title конкретным строковым значением, таким как 'King Kong', станет ясно, что подзапрос предполагает поиск значений года выпуска всех кинофильмов с названием "Кing Kong", но отличается от подзапроса, описанного в строках 7-9 запроса к заданию 6, тем, что точное значение Old.title заранее не известно.

Однако по мере просмотра кортежей Movie в процессе обработки внешнего запроса (см. строки 1-3) каждый из них предоставляет значение Old.title для использования во вложенном запросе с целью вычисления условия предложения WНERE, охватывающего строки 3-6.

Условие, заданное в строке 3, выполняется, если любой кинофильм с названием, совпадающим с содержимым Old.title, обладает большим значением year, нежели то, которое хранится в кортеже, представляемом текущим значением переменной кортежа Old. Условие сохраняет значение TRUE, если только содержимое компонента year переменной кортежа Оld не равно максимальной из дат выпуска кинофильмов с тем же названием. Следовательно, при выполнении строк 1-3 запроса будет возвращено количество копий определенного названия, на единицу меньщее общего количества фильмов с этим названием: строка, использованная в качестве названия фильмов дважды, будет выведена один раз, одинаковое название трех фильмов в итоговом отношении будет упомянуто два раза и т.д.