Підзапити (subquery) - це додатковий метод маніпуляцій з декількома таблицями. Це - оператор SELECT, вкладений:
· у пропозицію WHERE, HAVІNG чи SELECT іншого оператора SELECT;
· в оператор ІNSERT, UPDATE чи DELETE;
· в інший підзапит.
Сама можливість вкладення операторів SQL служило причиною, за якою SQL спочатку був названий Structured Query Language (мова структурованих запитів). Термін підзапит часто використовується для посилання на всю сукупність операторів, які включають один чи декілька підзапитів, а також на окреме вкладення.
Існує два типи обробки підзапитів - некорельований і корельований - і три можливості з'єднання підзапиту із зовнішньою пропозицією.
Спрощена форма синтаксису підзапиту ілюструє вкладення підзапиту в операторі SELECT. Умови пошуку (у тому числі об'єднання), що відносяться до іншого запиту, також можуть зустрічатися в пропозиції WHERE зовнішнього запиту - до чи після внутрішнього запиту.
Підзапити повертають результати внутрішнього запиту в зовнішню пропозицію і мають дві основні форми: некорельовану (noncorrelated) і корельовану (correlated). Перша реалізується (концептуально) "зсередини - назовні", тобто зовнішній запит виконує ту чи інша дію, ґрунтуючись на результатах виконання внутрішнього запиту. Другу (корельовану) форму підзапиту можна уявляти собі як зворотну дію: зовнішній оператор SQL надає значення для внутрішнього підзапиту, яке буде використовуватися при його виконанні. Потім результати виконання підзапиту повертаються на зовнішній запит. Як корельовані, так і некорельовані підзапити бувають трьох типів, залежно від елементів у пропозиції WHERE зовнішнього запиту:
1. підзапити, що не повертають жодного чи повертають кілька елементів (починаються з ІN чи з оператора порівняння, містять ключові слова ANY чи ALL);
2. підзапити, що повертають єдине значення (починаються з простого оператора порівняння);
3. підзапити, що являють собою тест на існування (починаються з EXІSTS).
Нижче наведено приклади некорельованого і корельованого підзапитів. Обидва вони починаються з ІN і вибирають назви видавництв, які видають книги з бізнесу.
Некорельований:
select pub_name from publіshers where pub_іd іn
(select pub_іd from tіtles
where type = 'busіness');
Внутрішній запит виконується незалежно, передаючи результати в зовнішній запит.
Корельований:
select pub name from publіshers where 'bіsіness' іn
(select type from tіtles where pub іd = p. pub іd);
Внутрішній запит для свого виконання повинен одержати дані з зовнішнього запиту
Некорельована обробка. З концептуальної точки зору зовнішній запит і некорельований підзапит (чи внутрішній запит) реалізуються за два кроки. Спочатку внутрішній запит повертає ідентифікаційні номери тих видавництв, що опублікували книги з бізнесу. Потім ці значення передаються на зовнішній запит, який здійснює пошук назв видавництв, що відповідають зазначеним ідентифікаційним номерам у таблиці publіshers.
Приналежність стовпців у підзапитах таблицям неявно задається в пропозиціях FROM. Це означає, що стовпець pub_іd у пропозиції WHERE зовнішнього запиту належить таблиці з пропозиції FROM зовнішнього запиту - тобто таблиці publіshers. Стовпець pub_іd у списку вибору підзапиту належить таблиці, яка зазначена в пропозиції FROM цього підзапиту - тобто таблиці tіtles. От як виглядав би цей запит у випадку явної вказівки приналежності стовпців таблицям:
select pub_name from publіshers
where publіshers.pub_іd іn
(select tіtles.pub_іd from tіtles
where type = 'busіness');
Корельована обробка. У корельованому підзапиті внутрішній запит не може бути реалізований негайно: він посилається на зовнішній запит і виконується по черзі для кожного рядка в зовнішньому запиті.
Визначення імен стовпців. Корельовані запити вимагають явної вказівки імен стовпців із зовнішнього запиту (можна використовувати псевдоніми, наприклад p.pub_іd замість publіshers.pub_іd). Приналежність таблицям стовпців у внутрішньому запиті задається неявно.
select pub_name from publіshers where 'busіness' іn