- •1. Побудова нетривіальних запитів. Поняття нетривіального запиту та підзапиту
- •2. Типи підзапитів. Прості і корельовані підзапити
- •3. Скалярні підзапити. Функції в підзапиті
- •4. Підзапити у реченні having
- •5. Табличні підзапити
- •6. Використання операцій in і not in у нетривіальних запитах
- •7. Використання ключових слів any та all
- •8. Використання операцій exists (exist) та not exists
- •9. Реалізація операцій реляційної алгебри засобами sql
- •9.1. Операція вибірки
- •9.2. Операція проекції
- •9.3. Операція об'єднання
- •9.4. Операція взяття різниці
- •9.5. Операція перетину
- •Intersect
- •9.6. Декартів добуток таблиць
- •9.7. Операція з'єднання
- •9.8. Операція ділення
3. Скалярні підзапити. Функції в підзапиті
Скалярний підзапит повертає одне-єдине значення. Такі підзапити вигідно використовувати тоді, коли в умові вибору має стояти порівняння не з заздалегідь відомою величиною, а з величиною, яка обчислюється за допомогою агрегатних функцій. Оскільки застосовувати агрегатні функції у 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 Угода);
4. Підзапити у реченні having
Скалярні підзапити аналогічним чином можуть застосовуватися у реченні HAVING.
Приклад. Визначити дати, коли середня кількість проданого за день товару була більше 20 штук, та ці кількості.
Тут підзапит непотрібний, оскільки визначана в основному запиті середня кількість товару за кожен день порівнюється із зазделегідь відомим числом 20:
SELECT Угода.Дата, Avg(Угода.Кількість) AS Среднє_за_день
FROM Угода
GROUP BY Угода.Дата
HAVING Avg(Угода.Кількість)>20;
Приклад. Визначити дати, коли середня кількість проданого за день товару була більше середнього показника по всіх угодах загалом.
Тут підзапит потрібний, оскільки середній показник по всіх угодах заздалегідь невідомий.
SELECT Угода.Дата, Avg(Угода.Кількість) AS Среднє_за_день
FROM Угода
GROUP BY Угода.Дата
HAVING Avg(Угода.Кількість) >
(SELECT Avg(Угода.Кількість)
FROM Угода);
Внутрішній підзапит визначає середній по всіх угодах показник, із яким в зовнішньому запиті порівнюється середня за кожен день кількість товару.
5. Табличні підзапити
Табличний підзапит повертає множину значень, тобто значення одного або кількох стовпців таблиці, розміщені в більш ніж одному рядку.
У багатьох випадках значення, що підлягає порівнянню в пропозиціях WHERE або HAVING, являє собою не одне, а набір значень. У цьому випадку застосовують табличні вкладені підзапити генерують непойменоване проміжне відношення, тимчасову таблицю. Це відношення може використовуватися тільки в тому місці, де з'являється в підзапиті; до нього неможливо звернутися по імені з якого-небудь іншого місця запиту.
Операції, які використовують підзапит як аргумент, засновані на тих самих операціях, які застосовуються до множин, а саме:
{ WHERE | HAVING } вираз [ NOT ] IN ( підзапит );
{ WHERE | HAVING } вираз оператор_порівняння { ALL | SOME | ANY } ( підзапит );
{WHERE | HAVING } [ NOT ] EXISTS ( підзапит );
