Однострочные вложенные подзапросы

Однострочные вложенные подзапросы чаще всего применяются совместно с агрегатными функциями, результат вычисления которых и является единственным результатом подзапроса. Например:

-- получить название хобби, имеющего максимальную степень риска

SELECT H_Name FROM Hobbys WHERE Risk =(SELECT Max(Risk) FROM Students);

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

Многострочные вложенные подзапросы

Многострочные вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN, что иллюстрируется в следующем примере:

-- определение номера зачеток студентов, которые не имеют ни одного хобби

SELECT N_z FROM Students WHERE N_z NOT IN

(SELECT DISTINCT N_z FROM St_Hobbys);

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

-- определить номера зачеток студентов, которые имеют хотя бы одно хобби

SELECT N_z FROM Students WHERE N_z IN

(SELECT DISTINCT N_z FROM St_Hobbys);

-- Эту задачу можно решить путем простого соединения таблиц

SELECT N_z FROM Students,St_Hobbys

WHERE Students.N_z= St_Hobby.N_z;

Коррелированные вложенные подзапросы

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

-- вывести фамилии студентов, названия тех их хобби, которыми каждый из них увлекается дольше всего

SELECT ST.S_Name, STH.Hobby_Name FROM Students ST, ST_Hobbys STH

WHERE STH.N_z=ST.N_z AND STH.Start_Data=

(SELECT MIN(Start_Data) FROM ST_Hobbys

WHERE N_z=ST.N_z);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: