В.Н.Лукин. Базы данных. Конспект лекций, ред 3.51, 08.12.09
Select Distinct a.* From Покупатель a, Заказ b
Where a.ном_пок=b.ном_пок and дата=’03.10’;
Очевидно, Distinct в этом случае необходим, если хотя бы один покупатель сделал бо-
лее одного заказа. В результате эта операция потребует значительного времени, что
снизит эффективность запроса.
Выбрать имена и номера продавцов, обслуживающих более одного покупателя:
Select ном_прод, имя_прод From Продавец a
Where 1<(Select COUNT(Distinct ном_пок) From Заказ
Where ном_прод=a.ном_прод);
Конец примера
Связанный запрос во внутреннем подзапросе может содержать ту же таблицу,
что и во внешнем, то есть таблица связывается сама с собой. В этом случае одна и та же
таблица в разных подзапросах играет разные роли, но обработка идет по приведенным
ранее правилам. Разумеется, одновременно с выборкой строки-кандидата фиксируется
и состояние таблицы, чтобы восстановить его после выполнения подзапроса.
Пример
Для каждого покупателя выбрать все заказы на сумму, большую средней суммы его
заказов:
Select * From Заказ a
Where сумма>(Select AVG(сумма) From Заказ b
Where a.ном_пок=b.ном_пок);
Конец примера
Так же, как и в случае вложенного запроса, связанный подзапрос может исполь-
зоваться во фразе Having, если условие накладывается на группу записей.
Предикаты, определенные на подзапросах
В состав логических выражений 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