Здавалка
Главная | Обратная связь

Скалярні підзапити. Функції в підзапиті



Скалярнийпідзапит повертає одне-єдине значення. Такі підзапити вигідно використовувати тоді, коли в умові вибору має стояти порівняння не з заздалегідь відомою величиною, а з величиною, яка обчислюється за допомогою агрегатних функцій. Оскільки застосовувати агрегатні функції у WHERE заборонено, доводиться використати під запит. При цьому вибірка даних може здійснюватися як з одної, так і з кількох таблиць.

Приклад.Визначити дату продажу і розмір максимальної партії товару.

Не можна прямо використати речення WHERE Кількість=Max(Кіількість), оскільки застосовувати агрегатні функції у WHERE заборонено. Створюють підзапит, що обчислює максимальне значення кількості товарів, а потім використовують його в зовнішньому операторові SELECT, призначеному для вибірки дат угод, де кількість товару збіглася з максимальним значенням.

SELECT Угода.Дата, Угода.Кількість

FROM Угода

WHERE Угода.Кількість =

(SELECT Max(Угода.Кількість)

FROM Угода);

Приклад.Визначити клієнтів, що здійснили угоди із максимальною кількістю товару.

SELECT Клієнт.Прізвище

FROM Клієнт, Угода

WHERE Клієнт.КодКлієнта=Угода.КодКлієнта

AND Угода.Кількість =

(SELECT Max(Угода.Кількість)

FROM Угода);

 

Приклад.Визначити клієнтів, в угодах яких кількість товару відрізняється від максимального не більше ніж на 10%.

SELECT DISTINCT Клієнт.Прізвище

FROM Клієнт, Угода

WHERE Клієнт.КодКлієнта=Угода.КодКлієнта

AND Угода.Кількість>=0.9*(SELECT Max(Угода.Кількість)

FROM Угода);

Підзапити у реченні HAVING

Скалярні підзапити аналогічним чином можуть застосовуватися у реченні HAVING.

Приклад.Визначити дати, коли середня кількість проданого за день товару була більше 20 штук, та ці кількості.

Тут підзапит непотрібний, оскільки визначана в основному запиті середня кількість товару за кожен день порівнюється із зазделегідь відомим числом 20:

SELECT Угода.Дата, Avg(Угода.Кількість) AS Среднє_за_день

FROM Угода

GROUP BY Угода.Дата

HAVING Avg(Угода.Кількість)>20;

Приклад.Визначити дати, коли середня кількість проданого за день товару була більше середнього показника по всіх угодах загалом.

Тут підзапит потрібний, оскільки середній показник по всіх угодах заздалегідь невідомий.

SELECT Угода.Дата, Avg(Угода.Кількість) AS Среднє_за_день

FROM Угода

GROUP BY Угода.Дата

HAVING Avg(Угода.Кількість) >

(SELECT Avg(Угода.Кількість)

FROM Угода);

Внутрішній підзапит визначає середній по всіх угодах показник, із яким в зовнішньому запиті порівнюється середня за кожен день кількість товару.

 

Табличні підзапити

Табличнийпідзапит повертає множину значень, тобто значення одного або кількох стовпців таблиці, розміщені в більш ніж одному рядку.

У багатьох випадках значення, що підлягає порівнянню в пропозиціях WHERE або HAVING, являє собою не одне, а набір значень. У цьому випадку застосовують табличні вкладені підзапити генерують непойменоване проміжне відношення, тимчасову таблицю. Це відношення може використовуватися тільки в тому місці, де з'являється в підзапиті; до нього неможливо звернутися по імені з якого-небудь іншого місця запиту.

Операції, які використовують підзапит як аргумент, засновані на тих самих операціях, які застосовуються до множин, а саме:

· { WHERE | HAVING } вираз [ NOT ] IN ( підзапит );

· { WHERE | HAVING } вираз оператор_порівняння { ALL | SOME | ANY } ( підзапит );

· {WHERE | HAVING } [ NOT ] EXISTS ( підзапит );







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.