Подзапросы

SQL позволяет использовать одни запросы внутри других запросов, то есть вкладывать запросы друг в друга. Такие вложенные запросы называются подзапросами.

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

Ниже представлена упрощенная форма синтаксиса подзапроса, иллюстрирующая вложение подзапроса в операторе SELECT.

---------------Начало внешнего оператора SELECT------------
SELECT [DISTINCT] [<table_name>.]<column_name>
FROM <table_name>
WHERE {expr { [NOT] IN | <condition_operator>[ANY | ALL] } | [NOT] EXISTS}
--------------------Внутренний подзапрос-------------------
(SELECT [DISTINCT] <column_name>
FROM <table_name>
[WHERE <condition>])
------Необязательная часть внешнего оператора SELECT-------
[GROUP BY <column_name>[,...
[HAVING <condition>] ]
[ORDER_BY <column_name>|<column_number> [ASC | DESC][,...]

Подзапросы возвращают результат внутреннего подзапроса во внешнее предложение и имеют две основные формы: коррелированную и некоррелированную.

Первая реализуется «изнутри наружу», т.е. внешний запрос выполняет то или иное действие, основываясь на результатах выполнения внутреннего запроса. Вторую (коррелированную) форму подзапроса можно представлять себе как обратное действие: внешний оператор предоставляет значение, которое будет использоваться при выполнении внутреннего подзапроса. Затем результаты выполнения подзапроса возвращаются на внешний запрос.