Табличные подзапросы

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<подзапрос>;