Замечания

Подчиненный запрос может использоваться вместо выражения в списке полей инструкции SELECT или в предложениях WHERE и HAVING. В подчиненном запросе инструкция SELECT используется для получения набора одного или нескольких заданных значений, оценка которого производится в выражении WHERE или HAVING.

С помощью предикатов ANY или SOME, которые являются синонимами, извлекаются записи в главном запросе, удовлетворяющие сравнению с любыми записями, извлеченными в подчиненном запросе. В следующем примере выводятся все товары, цена которых больше цены любого товара, проданного со скидкой от 25% и выше.

SELECT * FROM Товары

WHERE Цена > ANY

(SELECT Цена FROM Заказано

WHERE Скидка >= .25);

С помощью предиката ALL извлекаются только те записи в главном запросе, которые удовлетворяют сравнению со всеми записями, извлеченными в подчиненном запросе. При замене оператора ANY оператором ALL в предыдущем примере выводятся только те товары, цена которых больше цены всех товаров, проданных со скидкой от 25% и выше. Этот оператор в большей степени ограничивает результаты запроса.

С помощью предиката IN извлекаются только те записи в главном запросе, для которых какие-либо записи в подчиненном запросе содержат одинаковые значения. В следующем примере выводятся все товары со скидкой от 25% и выше.

SELECT * FROM Товары

WHERE КодТовара IN

(SELECT Товар FROM Заказано

WHERE Скидка >= .25);

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

Предикат EXISTS (с необязательным зарезервированным словом NOT) используется в сравнениях true/false для определения того, возвращаются ли записи в подчиненном запросе.

В подчиненном запросе можно также использовать псевдонимы таблиц для обращения к таблицам, перечисленным в предложении FROM за пределами подчиненного запроса. В следующем примере выводятся имена сотрудников, заработная плата которых равна или больше средней заработной платы всех сотрудников, занимающих одну должность. Таблице «Сотрудники» присвоен псевдоним «Т1».

SELECT Фамилия,

Имя, Должность, Зарплата

FROM Сотрудники AS Т1

WHERE Зарплата >=

(SELECT Avg(Зарплата)

FROM Сотрудники

WHERE T1.Должность = Сотрудники.Должность) Сортировать по должности;

В предыдущем примере резервное слово AS не является обязательным.

Некоторые подчиненные запросы разрешены в перекрестных запросах только в качестве предикатов (в предложении WHERE). Подчиненные запросы в качестве выходных данных (в списке SELECT) в перекрестных запросах запрещены.