HAVING
SELECT
SELECT
SELECT
Скалярные подзапросы
Пример 1. Определить дату продажи максимальной партии товара.
SELECT Дата, Количество_ед_товара
FROM Продажи
WHERE Количество_ед_товара =
(SELECT Max (Количество_ед_товара) FROM Продажи)
Отметим, что здесь нельзя прямо использовать предложение
WHERE Количество_ед_товара = Max (Количество_ед_товара),
так как просто использовать агрегирующие функции в предложении WHERE запрещено.
Пример 2. Определить даты продаж, в которых количество проданного товара превышало среднее значение от всего проданного товара.
Для этих сделок указать превышение над средним значением.
Дата, Количество_ед_товара,
(Количество_ед_товара – (SELECT Avg (Количество_ед_товара)) FROM Продажи) AS Превышение
FROM Продажи
WHERE Количество_ед_товара) >
(SELECT Avg (Количество_ед_товара) FROM Продажи)
Пример 3. Вывести клиентов, совершивших сделки с максимальным количеством товара.
SELECT Клиенты.Фамилия
FROM Клиенты INNER JOIN Продажи
ON Клиенты.ID_Клиента = Продажи.Клиент
WHERE Продажи. Количество_ед_товара =
(SELECT Max (Количество_ед_товара)) FROM Продажи)
Пример 4. Вывести список клиентов, в сделках которых количество товара отличается от максимального не более чем на 10%.
SELECT Клиенты.Фамилия, Продажи.Количество_ед_товара
FROM Клиенты INNER JOIN Продажи
ON Клиенты.ID_Клиента = Продажи.Клиент
WHERE Продажи. Количество_ед_товара >
0.9 * (SELECT Max (Количество_ед_товара)) FROM Продажи)
Покажем, как применяются подзапросы в предложении HAVING
Пример 5. Определить даты, когда среднее количество проданного товара за день оказалось больше 20 единиц.
Дата, Avg (Количество_ед_товара) AS Среднее
FROM Продажи
GROUP BY Дата
HAVING Avg (Продажи. Количество_ед_товара)>20
Напомним, что при помощи HAVING отражаются все предварительно сгруппированные посредством GROUP BY блоки данных, удовлетворяющие заданным в HAVING условиям.
В приведенном запросе за каждый день определяется среднее количество товара, которое сравнивается с числом 20.
Пример 6. Определить даты, когда среднее количество проданного товара за день оказалось больше среднего показателя по всем сделкам вообще.
Дата,
Avg (Продажи. Количество_ед_товара)) AS Среднее
FROM Продажи
GROUP BY Дата
Avg( Количество_ед_товара)) > (SELECT Avg (Количество_ед_товара)) FROM Продажи)
Здесь внутренний подзапрос определяет средний по сделкам показатель, с которым во внешнем запросе сравнивается среднее за каждый день количество товара.
Во многих случаях значение, подлежащее сравнению в предложениях WHERE и HAVING, представляет собой не одно, а несколько значений.
Подзапросы генерируют виртуальную таблицу (непоименованное промежуточное отношение), которое может использоваться только в том месте, где оно появляется в подзапросе.
К такому отношению невозможно обратиться по имени из какого – либо другого места запроса.
Какие операции можно применять к такому промежуточному множеству:
1. { WHERE | HAVING } <выражение> [ NOT ] IN <подзапрос>;
2. { WHERE | HAVING } <выражение> оператор сравнения { ALL | SOME | ANY } <подзапрос>;
3. { WHERE | HAVING } [ NOT ] IN EXISTS <подзапрос>;