Вложенный запрос — это инструкция SELECT, вложенная в select, SELECT... INTO, INSERT... Инструкции INTO, DELETE или UPDATE или внутри другого вложенного запроса.
Синтаксис
Для создания вложенного запроса можно использовать три формы синтаксиса:
сравнение [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Вложенный запрос состоит из следующих частей:
Часть |
Описание |
Сравнение |
выражение и оператор сравнения, который сравнивает выражение с результатами вложенного запроса. |
выражение |
Выражение, для которого выполняется поиск результирующий набор вложенного запроса. |
инструкция_SQL |
Инструкция SELECT, следующая тому же формату и правилам, что и любая другая инструкция SELECT. Он должен быть заключен в круглые скобки. |
Замечания
Вложенный запрос можно использовать вместо выражения в списке полей инструкции SELECT или в предложении WHERE или HAVING. Во вложенном запросе оператор SELECT используется для предоставления набора из одного или нескольких конкретных значений для вычисления в выражении предложения WHERE или HAVING.
Используйте предикат ANY или SOME, которые являются синонимами, чтобы получить записи в запросе main, удовлетворяющие сравнению с любыми записями, извлеченными во вложенном запросе. В следующем примере возвращаются все продукты, цена за единицу которых больше, чем у любого продукта, проданного со скидкой 25 процентов или более:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Используйте предикат ALL для получения только тех записей в запросе main, которые удовлетворяют сравнению со всеми записями, извлеченными во вложенном запросе. Если в предыдущем примере вы изменили ANY на ALL, запрос вернет только те продукты, у которых цена за единицу больше, чем у всех продуктов, проданных со скидкой 25 процентов или более. Это гораздо более ограничительно.
Используйте предикат IN для получения только тех записей в запросе main, для которых некоторые записи во вложенном запросе содержат равное значение. В следующем примере возвращаются все продукты со скидкой 25% или более:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
И наоборот, вы можете использовать NOT IN для получения только тех записей в запросе main, для которых ни запись во вложенном запросе не содержит равное значение.
Используйте предикат EXISTS (с дополнительным зарезервированным словом NOT) в сравнениях true/false, чтобы определить, возвращает ли вложенный запрос какие-либо записи.
Вы также можете использовать псевдонимы имен таблиц во вложенном запросе, чтобы ссылаться на таблицы, перечисленные в предложении FROM за пределами вложенного запроса. В следующем примере возвращаются имена сотрудников, заработная плата которых равна средней заработной плате всех сотрудников с одинаковыми должностями или превышает ее. Таблице Employees присваивается псевдоним "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
В предыдущем примере зарезервированное слово AS является необязательным.
Некоторые вложенные запросы разрешены в перекрестных запросах, в частности, в качестве предикатов (в предложении WHERE). Вложенные запросы в качестве выходных данных (в списке SELECT) не допускаются в перекрестных запросах.