В языке SQL можно вкладывать запросы друг в друга. Внутренний (вложенный) запрос генерирует значение, которое проверяется в предикате внешнего запроса. Подзапрос, который не произведет никакого вывода, вынудит предикат стать неизвестным, что приведет к пустому выводу от основного запроса.
Имеются два вида подзапросов: простой и соотнесенный.
Соотнесенный подзапрос использует во внутреннем запросе таблицу, указанную в предложении внешнего запроса FROM , а простой подзапрос – нет.
Простой подзапрос обычно выполняется один раз и возвращает одно значение.
Например, предположим, что мы хотим извлечь данные на отца ребен-ка, но знаем только фамилию ребенка ‘фио2’. Запрос должен быть следующим:
SELECT * FROM СТУДЕНТ
WHERE ФИО_НТ =( SELECT РЕБЕНОК.ФИО_НТ FROM РЕБЕНОК
WHERE ФИО_Р = фио2);
Для неключевых атрибутов можно применить DISTINCT, чтобы вынудить простой подзапрос генерировать одиночное значение.
Простой подзапрос может вывести более одной строки, если в нем использован специальный оператор IN. В этом случае подзапрос выполняется многократно и формируется набор значений для оператора IN.
Простой подзапрос можно поместить внутрь предложения HAVING, и он будет выполняться по одному разу для очередного значения из поля в предложении GROUP BY.
Простой подзапрос может содержать агрегатные функции, производящие одиночное значение, или предложения GROUP BY и HAVING.
Соотнесенный подзапрос выполняется неоднократно, по одному разу для каждой строки таблицы основного запроса.
Например, выведем данные на студентов, имеющих детей 1995 года рождения посредством соотнесенного подзапроса:
SELECT * FROM СТУДЕНТ
WHERE 1995 IN ( SELECT Год_рождения FROM РЕБЕНОК
WHERE СТУДЕНТ.ФИО_НТ = РЕБЕНОК .ФИО_НТ );
Запрос, содержащий соотнесенный запрос, выполняется следующим образом.
Шаг 1. Выбирается строка из таблицы, именованной во внешнем запросе. Эта строка называется текущей строкой-кандидатом.
Шаг 2. Значение из этой строки-кандидата запоминается.
Шаг 3. Выполняется подзапрос, причем во всех местах появления имени таблицы из внешнего запроса используется значение из текущей строки-кандидата.
Шаг 4. Оценивается предикат внешнего запроса и в случае его истинности выводится строка-кандидат.
Процедура повторяется для всех строк таблицы.
Для того чтобы ссылаться к одной и той же таблице во внутреннем и внешнем запросах, используют разные псевдонимы этой таблицы.