Результати, що повертаються оператором SELECT,можна використовувати в іншому операторі SELECT.Причому це стосується і до операторів, що повертають сукупні характеристики, і до операторів, що повертають множину значень. Наприклад, у попередньому розділі нам не вдалося створити запит, щоб довідатися прізвище наймолодшого співробітника. Тепер це можна зробити за допомогою вкладених запитів:
SELECT Fam, Year_b FROM Pers
WHERE Year_b=(SELECT max(Year_b) FROM Pers)
У цьому операторі другий вкладений оператор SELECT max(Year_b) FROM Persповертає максимальний рік народження, що використовується в елементі WHERE основного оператора SELECTдля пошуку співробітника (чи співробітників), чий рік народження збігається з максимальним.
Вкладені запити можуть звертатися до різних таблиць. Нехай, наприклад, є дві аналогічні за структурою таблиці Pers і Pers1, що стосуються до різних організацій, і треба за таблицею Pers знайти всіх однофамільців співробітників іншої організації. Щоб перевірити роботу з декількома таблицями, ви можете в текст файлу, використаного вами для створення бази даних, ввести додаткову таблицю Pers1. Якщо хочете, можна до неї внести записи, відмінні від таблиці Pers, щоб ці таблиці розрізнялися. Утім, можна все це і не робити, замінивши в наведених нижче прикладах таблицю Pers1 таблицею Pers, тобто працюючи з однією таблицею як із двома. Зміст операторів усе рівно буде зрозумілий.
Це можна зробити оператором
SELECT * FROM Pers WHERE Fam IN (SELECT Fam FROM Pers1)
Вкладений оператор SELECT Fam from Pers1повертає множину прізвищ з таблиці Pers1, а конструкція WHEREосновного оператора SELECT відбирає з прізвищ у таблиці Persті, котрі є в множині прізвищ з Pers1.
При роботі з множинами записів в умові WHERE можна використовувати ключові слова: Аll і Any. Allозначає, що умова виконується для всіх записів, a Any — хоча б для одного запису. Наприклад, оператор
SELECT Fam, Year_b FROM Pers
WHERE Year_b >=ALL (SELECT Year_b FROM Pers1)
шукає співробітників у Pers, що не доросліше будь-якого співробітника в Pers1. До речі, якщо в цьому операторі замінити Pers1 на Pers, то одержимо список наймолодших співробітників організації, що ми одержували раніше іншим способом. А оператор
SELECT Fam, Yеaг_b FROM Pers
WHERE Year_b > ANY (SELECT Year_b FROM Pers1)
шукає співробітників у Pers, що молодше хоча б одного співробітника в Pers1.В умовах, що містять вкладені оператори SELECT, може використовуватися ключове слово EXISTS, що означає добір тільки тих записів, для яких вкладений запит повертає одне чи більше значень. Наприклад, оператор
SELECT Num, Fam, Year_b FROM Pers ib1
WHERE EXISTS (SELECT Num, Year_b FROM Pers ib2
WHERE (ibl.Year_b = ib2.Year_b) and (ib1.Num != ib2.Num))
поверне список співробітників, що мають хоча б одного однолітка (псевдоніми ib1 і ib2).
В операторах, що працюють з декількома таблицями, як правило кожній таблиці дається псевдонім, що скорочує посилання на таблиці, а іноді додає їм деякий зміст, що випливає з даного застосування. Псевдонім таблиці записують в списку таблиць після слова FROM,відокремлюючи його від імені таблиці пробілом. Звичайно, ці псевдоніми діють тільки в даному операторі і не мають ніякого відношення до псевдонімів баз даних, що ми постійно використовуємо.
Існує також ключове слово SINGULAR, що означає добір тільки тих записів, для яких вкладений запит повертає тільки одне значення. Наприклад, оператор
SELECT Num, Fam, Year_b From Pers ib1 WHERE
SINGULAR(SELECT Num, Year_b FROM Pers ib2 WHERE ibl.Year_b = ib2.Year_b)
поверне список співробітників, що не мають жодного однолітка (рік народження яких збігається тільки з власним роком народження і більше не повторюється в таблиці).