
Использование слов any и all
Ключевые слова ANY и ALL могут использоваться с подзапросами, которые возвращают один столбец чисел.
Если подзапросу предшествует слово ALL, то условие сравнения считается выполненным, если оно выполняется для всех значений результирующего столбца подзапроса.
Если подзапросу предшествует слово ANY, то условие сравнения считается выполненным, если оно выполняется хотя бы для одного из значений результирующего столбца подзапроса.
Если в результате выполнения подзапроса возвращается пустое значение, то для ключевого слова ALL условие сравнения будет считаться выполненным, а для ANY – невыполненным.
Пример 13. Определить клиентов, совершивших сделки с максимальным количеством товара.
SELECT
Клиенты.Фамилия,
Продажи.Количество_ед_товара
FROM Клиенты INNER JOIN Продажи
(ON Клиенты.ID_клиента = Продажи.Клиент
WHERE Продажи. Количество_ед_товара >= ALL ( SELECT Количество_ед_товара FROM Продажи)
В этом примере определены клиенты, в сделках которых количество товара больше или равно количеству товара в каждой из сделок.
Пример 14. Найти клиента, купившего товаров на сумму, превышающую 30000 рублей.
SELECT
Клиенты.Фамилия,
Sum(Товары.Цена_ед_товара * Продажи.Количество_ед_товара) AS Общая_стоимость
FROM
Товар INNER JOIN (Клиенты INNER JOIN Продажи
ON Клиенты.ID_клиента = Продажи.Клиент )
ON Товар.ID_товара = Продажи.Товар
GROUP BY Клиенты.Фамилия
HAVING Sum(Товары.Цена_ед_товара * Продажи.Количество_ед_товара) > 30000
Пример 15. Определить клиента, который приобрел товаров на самую большую сумму.
SELECT
Клиенты.Фамилия,
Sum(Товары.Цена_ед_товара * Продажи.Количество_ед_товара) AS Общая_стоимость
FROM Товар INNER JOIN (Клиенты INNER JOIN Продажи
ON Клиенты.ID_клиента = Продажи.Клиент )
ON Товар.ID_товара = Продажи.Товар
GROUP BY Клиенты.Фамилия
HAVING Sum(Товары.Цена_ед_товара * Продажи.Количество_ед_товара) >=
ALL
(SELECT
Sum(Товары.Цена_ед_товара * Продажи.Количество_ед_товара)
FROM Товар INNER JOIN Продажи ON Товар.ID_товара = Продажи.Товар)
Здесь вложенный подзапрос подсчитывает общую стоимость покупок каждого клиента.
Внешний подзапрос также подсчитывает общую стоимость покупок каждого клиента и определяет тех, для кого эта сумма, по сравнению с другими покупателями, оказалась больше или точно такой же.
Использование операций exists и not exists
Ключевые слова EXISTS и NOT EXISTS предназначены для использования только совместно с подзапросами.
Результат их обработки представляет собой логическое значение True или False.
Для ключевого слова EXISTS результат равен True в том случае, когда в возвращаемой подзапросом результирующей таблице присутствует хотя бы одна строка.
Если результирующая таблица подзапроса пуста, результатом обработки операции EXISTS будет значение False.
Для ключевого слова NOT EXISTS используются правила обработки, обратные по отношению к ключевому слову EXISTS.
То есть по этим ключевым словам возвращается лишь факт наличия строк, удовлетворяющих запросу.
Пример 16. Вывести список товаров из категории «Хлебобулочные».
SELECT
Название_товара
FROM Товары
WHERE EXISTS
(SELECT ID_категории
FROM Категории_товаров
WHERE Товары.Категория = Категории_товаров.ID_товара)
Тот же самый результат можно было получить с помощью запроса
SELECT Товар.Название
FROM Категории INNER JOIN Товар
ON Категория.ID_категории=Товар.Категория
WHERE Категория.Название='Хлебобулочные'
Задания для самостоятельной работы
Вывести список поставщиков, у которых в базе данных не указан телефон.
Вывести список категории товаров, которые ни разу не продавались.
Вывести список невостребованных товаров (тех товаров, которые не продавались за последние 3 месяца.
Найти фирмы, в сделках которых количество товара превышает такой же показатель хотя бы в одной сделке клиентов из Самары.
Определить имеются ли в наличии товары из категории «Мясные».
Вывести список клиентов, покупающих товары только одной категории.