Обчислювальна потужність мови SQL забезпечується можливістю вкладення блоків повного оператора SELECT один в другий за допомогою їх включення в предикат опції WHERE. Далі ці можливості демонструються на прикладі дворівневих вкладень блоків SELECT, хоча може бути декілька рівнів, але на практиці в конкретній СКБД існують певні обмеження на кількість рівнів. При дворівневій структурі будемо зовнішній оператор SELECT називати ще другим, а внутрішній – першим. Внутрішні запити можуть бути поміщені в опції WHERE та/або HAVING, в цьому випадку вони отримують назву вкладених запитів або підзапитів. Крім того, внутрішні оператори SELECT можуть вживатися в операторах INSERT, UPDATE та DELETE.
Синтаксис підзапиту:
Початок зовнішнього оператора SELECT
SELECT [DISTINCT]
FROM <список таблиць
WHERE
{<вираз>[NOT]IN| <оператор порівнянняANY|ALL]
Підзапит, який описується в дужках
(SELECT [DISTINCT] <список вибору підзапиту>
FROM <список таблиць>
WHERE <умова>)
Не обов’язкові частини зовнішнього оператора SELECT
[GROUP BY < … >]
[HAVING < … >]
[ORDER BY < … >]
Як працює підзапит: підзапити повертають результати внутрішнього запиту в зовнішній.
Підзапити поділяються на такі типи:
1. Підзапити, які не повертають жодного або повертають декілька елементів (почінаються з IN або з оператора порівняння, які містять ключові слова ANY або ALL).
2. Підзапити, які повертають єдине значення (починаються з простого оператора порівняння). При цьому, за стандартом ISO, термін «єдине значення» означає як окреме значення певного стовпця, так і певний окремий рядок у вигляді кортежу значень певних полів, але в Jet SQL це не реалізовано.
3. Підзапити, які представляють собою тест на існування (починаються з EXISTS або NOT EXISTS).
5.3.5.2 Правила формулювання підзапитів
Ці правила в основному відносяться до списку вибору підзапиту з деякими додатковими обмеженнями на функції, які можна використовувати в підзапиті.
• Список вибору внутрішнього підзапиту, що починається з оператора чи порівняння IN, може включати тільки одне ім'я стовпця. Стовпець, ім'я якого ви вказуєте в WHERE зовнішнього оператора, повинний бути сумісним для з’єднання зі стовпцем, ім'я якого ви вказуєте в списку вибору підзапиту.
• Список вибору підзапиту, що починається з EXISTS, майже завжди включає "зірочку" (*). У даному випадку немає необхідності вказувати імена стовпців, оскільки ви лише виконуєте перевірку на існування (чи "не існування") будь-яких рядків, що задовольняють зазначеним критеріям, при цьому можна задати приналежність рядків таблицям у WHERE-підзапиті.) В інших випадках правила списку вибору для підзапиту, що починаєтьсязEXISTS, ідентичні правилам для стандартного списку вибору.
• Підзапити, що починаються з немодифікованого оператора порівняння (оператор порівняння, за яким не випливає ключове слово ANY або ALL), не можуть включати GROUP BY і HAVING, якщо тільки не визначено заздалегідь, що в результаті групування буде повертатися єдине значення.
• Підзапити не можуть маніпулювати своїми результатами усередині себе, тобто підзапит не може включати ORDER BY або ключове слово INTO.
5.3.5.3 Підзапити з оператором порівняння
Розглянемо, наприклад, задачу складання списку всіх викладачів, що мають мінімальну норму навантаження (ми не знаємо коду чи назви посади, що має мінімальну норму). За допомогою з’єднань цю задачу можна було б виконати в два прийоми.
1. Знайти мінімальну норму навантаження.
SELECT MIN(NormPost)
FROM POSADA;
Min-NormPost
2. Одержати прізвища викладачів, які мають таку норму.
FROM VYKLADACH INNER JOIN POSADA ON VYKLADACH.KodPost = POSADA.KodPost
WHERE (((POSADA.NormPost)=( SELECT MIN(NormPost) FROM POSADA)));
PrizvVykl
PostVykl
NormPost
Собчак А.О.
професор
Махно Н.Є.
професор
Мунтян Р.Д.
професор
Середа І.С.
професор
Здатність обчислювати значення агрегатної функції "на льоту" і повертати його в зовнішній запит для порівняння відноситься до переваг підзапитів; з’єднання не справляється з цією задачею.