Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БД.doc
Скачиваний:
70
Добавлен:
23.09.2019
Размер:
1.93 Mб
Скачать

Предикаты, определенные на подзапросах

В состав логических выражений SQL могут входить предикаты, определенные на подзапросах: признак того, что подзапрос не пуст (Exists), признак того, что все элементы удовлетворяют некоторому условию (All) и признак того, что существует хотя бы один элемент, удовлетворяющий некоторому условию (Any, Some).

Функция Exists истинна, если ее аргумент (подзапрос) содержит хотя бы один элемент, в противном случае она ложна. Легко видеть, что в подзапросе этой функции использование агрегатных функций бессмысленно. Рассмотрим применение функции Exists на примерах.

Пример

Выбрать всех покупателей из Тулы, если хотя бы один из них сделал заказ:

Select * From Покупатели Where город=’Тулаand

Exists(Select * From Заказы Where ном_пок in

(Select ном_пок From Покупатели Where город=’Тула’));

Заметим, что здесь в подзапросе используется конструкция Select *… Использование ее в Exists – это единственный случай корректного употребления варианта «*» в подзапросе.

Выбрать номера всех продавцов, у которых более одного покупателя:

Select Distinct ном_прод From Заказы a Where

Exists(Select * From Заказы b Where a.ном_прод=b.ном_прод

and a.ном_пок<>b.ном_пок);

В данном случае Exists используется в сочетании со связанным подзапросом. Дополним предыдущий пример соединением: выберем имена всех продавцов, у которых более одного покупателя:

Select Distinct a.ном_прод, имя_прод From Заказы a, Продавцы c Where

Exists(Select * From Заказы b

Where a.ном_прод=b.ном_прод

and a.ном_пок<>b.ном_пок) and a.ном_прод=c.ном_прод;

Конец примера

Функция All истинна, если каждое значение ее аргумента (подзапроса) удовлетворяет условию, в которое она входит. Естественно, эта функция редко может применяться для операции равенства: в этом случае все элементы выборки должны быть равны между собой. Неравенство – более содержательная операция, она обозначает, что левая часть не равна ни одному из элементов выборки. Правда, этот предикат легко реализуется операцией in. Более интересны операции «больше», «меньше» и т.п. Рассмотрим применение функции All на примерах.

Пример

Выбрать всех покупателей, значимость которых выше значимости любого покупателя из Тулы:

Select * From Покупатели Where значимость>

All(Select значимость From Покупатели Where город=’Тула’);

Этот же запрос можно сформулировать с Exists:

Select * From Покупатели a Where

not Exists(Select * From Покупатели b

Where a.значимость<=b.значимость and b.город=’Тула’);

Конец примера

Функция Any (синоним – Some) истинна, если хотя бы одно значение ее аргумента (подзапроса) удовлетворяет условию, в которое она входит. Эта функция чаще используется для операции равенства, чем для «больше», «меньше» и т.п. Рассмотрим применение функции Any на примерах.

Пример

Выбрать всех покупателей, живущих в одном городе с продавцами:

Select * From Покупатели Where город= Any(Select город From Продавцы;

Этот же запрос можно сформулировать с in. С Exists этот запрос выглядит так:

Select * From Покупатели a Where

Exists(Select * From Продавцы b Where a.город=b.город);

Конец примера

Любой запрос как с Any, так и с All, может быть выражен через Exists, но в этом случае требуется более глубокая вложенность запросов и нередко встречаются связанные подзапросы.

Уточним, как ведут себя функции Any, All и Exists в особых случаях. Для пустой выборки All принимает значение истина, Any и Existsложь. При сравнении с null функции Any и All принимают неопределенное значение, Exists никогда неопределенное значение не принимает.