Оформить и купить диплом на бланке ГОЗНАК без предоплаты

SQL подзапросы

В языке 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. Оценивается предикат внешнего запроса и в случае его истинности  выводится строка-кандидат.

Процедура повторяется для всех строк таблицы.

Для того чтобы ссылаться к одной и той же таблице во внутреннем и внешнем запросах, используют разные псевдонимы этой таблицы.