SQL позволяет вкладывать запросы друг в друга. Внешний запрос использует значения, которые генерируются во внутреннем запросе.
Предположим, необходимо извлечь всю информацию о банке с которым
работает Киров.
Вот один из способов решения:
SELECT * FROM БАНКИ
WHERE IDN =(SELECT IDN_БАНКА FROM КЛИЕНТ WHERE ИМЯ=‘Киров’)
Выходные данные:
IDN | РЕКВИЗИТЫ |
Менатеп |
Чтобы оценить основной запрос, SQL должен оценить внутренний запрос (или подзапрос) в предложении WHERE. Подзапрос оценивается так как если бы он был основным запросом: просматриваются все строки таблицы Клиент и выбираются те строки, для которых значение поля имя равно Киров, для таких строк выбираются значения поля IDN_БАНКА.
В результате выбранной оказывается строка с IDN_БАНКА = 323. SQL подставляет его в предикат основного запроса вместо подзапроса, теперь предикат читается следующим образом:
WHERE IDN =323
После этого основной запрос выполняется как обычный, его результат показан
выше.
Если указать просто:
WHERE IDN =323
можно освободиться от подзапроса, но использование подзапроса
|
|
делает процедуру более гибкой.
В следующем примере использование подзапроса обязательно.
Получить все банки, которые не используются клиентами:
SELECT * FROM Банки
WHERE
(SELECT COUNT(*) FROM Клиент WHERE Клиент.Idn_банка = Банки.Idn) = 0
Еще один пример, когда необходимо использовать подзапрос:
Для каждой группы товаров найти товар с минимальной ценой, вывести название группы, название товара, цену:
SELECT Г.НАЗВАНИЕ, М НАЗВАНИЕ, П.ЦЕНА
FROM Группы Г, МАТ.ЦЕННОСТИ М, ПЕРЕМЕЩЕНИЕ П
WHERE М.IDN_ГРУППЫ = П.IDN_ГРУППЫ
AND М.IDN_МАТ.ЦЕН. = П.IDN_МАТ.ЦЕН.
AND Г.IDN = П.IDN_ГРУППЫ
AND П.ЦЕНА = (SELECT MIN (ЦЕНА) FROM Перемещение ПВНУТР
WHERE П.IDN_ГРУППЫ = ПВНУТР.IDN_ГРУППЫ)