ляється зовнішнім оператором. До підзапитів застосовуються такі правила і обмеження:
Фраза ORDER BY не використовується, хоча і може бути присутнім в зовнішньому підзапиті;
Список в пропозиції SELECT складається з імен окремих стовпців або складених з них виразів - за винятком випадку, коли в підзапиті присутній ключове слово EXISTS. Т.е, запит, що вибирає всі стовпці з таблиці (використовує "*" в якості списку параметрів) не застосовується;
За замовчуванням імена стовпців в підзапиті відносяться до таблиці, ім'я якої зазначено в пропозиції FROM. Однак допускається посилання і на стовпчики таблиці, зазначеної у фразі FROM зовнішнього запиту, для чого застосовуються кваліфіковані імена стовпців (тобто з вказівкою таблиці);
Якщо подзапрос є одним з двох операндів, що беруть участь в операції порівняння, то запит повинен вказуватися в правій частині цієї операції.
Сьогодні SQL дозволяє використовувати вкладені вкладені запити, використовувані в логічному умови вибірки. При цьому вкладені підзапити виступають в ролі однієї з логічних частин предиката. Стандарт мови SQL не накладаються ніяких обмежень на глибину вкладених підзапитів, що свідчить про теоретичну необмеженість їх числа. p align="justify"> Розглянемо приклад:
SELECT Tl.A FROM TlTl.B IN (SELECT T2.B FROM T2 WHERE Tl.C = T2.D)
Даний запит виробляє вибірку даних з таблиці T1 значень поля A, кортежі якої задовольняють умові, при якому безліч значень поля B, таблиці T1, перетинається з безліччю значень поля B, таблиці T2, утворене при виконанні умови рівності значень поля C, таблиці T1, і поля D, таблиці T2. При такій семантиці запиту, можливий єдиний алгоритм виконання - вкладений подзапрос буде обчислюватися щоразу при перевірці умови предиката. Тому немає необхідності доводити той факт, що вкладені підзапити не завжди є найефективнішим рішенням, а також, що, в більшості випадків, можна з успіхом обійтися без їх використання. Розглянутий запит може бути перетворений до наступного вигляду:
Tl.A FROM Tl.R2
WHERE Tl.B = T2.B AND Tl.C = R2.D
Результат виконання перетвореного запиту є повністю еквівалентним результату початкового запиту. Однак, не дивлячись на це, час виконання цих запитів може істотно різнитися. Як правило, запит, до складу якого входить вкладений підзапит, матиме більший час виконання. p align="justify"> Однак, з вищеописаного не випливає, що вкладені підзапити не варто застосовувати. Іноді без них досить складно обійтися. Покажемо це на прикладі наступного завдання:
Визначити клієнтів, які вчинили угоди з максимальною кількістю товару. Вирішити це завдання можна таким, цілком лаконічним і порів...