До этого времени мы получали данные из базы данных с помощью простых запросов и одного оператора SELECT. Однако все-таки чаще нам нужно будет выбирать данные, соответствующие многим условиям, и здесь не обойтись без расширенных запросов. Для этого в SQL существуют подзапросы или вложенные запросы, когда один оператор SELECT вкладывается в другой.
Подзапрос – это оператор SELECT, вложенный в другой SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE или внутри другого подзапроса.
Текст подзапроса должен быть размещен в скобках. Часто подзапросы используют вместо сочетания таблиц (JOIN).
Таблицы баз данных, используемых в СУБД Access, являются реляционными таблицами, т.е. все таблицы можно связать между собой по общим полям. Допустим у нас хранятся данные в двух разных таблицах и нам нужно выбрать данные в одной из них, в зависимости от того, какие данные в другой. Для этого мы создадим еще одну таблицу в нашей базе данных. Это будет, например, таблица Sellers с информацией о поставщиках:
Теперь у нас две таблицы - Sumproduct и Sellers, которые имеют одинаковое поле City. Предположим, нам нужно посчитать, сколько товаров было продано только в Канаде. Сделать это нам помогут подзапросить. Итак, сначала напишем запрос для выборки городов, находящихся в Канаде:
Run SQLSELECT City
FROM Sellers
WHERE Country = 'Canada'
Теперь передадим эти данные в следующий запрос, который будет выбирать данные из таблицы Sumproduct:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN ('Montreal','Toronto')
Также мы можем объединить эти два запроса в один. Таким образом, один запрос, который выводит данные, будет главным, а второй запрос, который передает входящие данные, будет вспомогательным (подзапросом). Для вложения подзапроса используем конструкцию WHERE ... IN (...), о которой говорилось в разделе
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN (SELECT City
FROM Sellers
WHERE Country = 'Canada')
Мы видим, что мы получили аналогичные данные, как и с помощью двух отдельных запросов. Таким же образом, мы можем увеличивать глубину вложенности запросов, вкладывая подзапрос сколько раз.
Мы также можем использовать подзапросы в качестве расчетных полей. Отразим, например, количество реализуемой продукции по каждому продавцу с помощью следующего запроса:
Run SQLSELECT Seller_name, (SELECT SUM(Quantity)
FROM Sumproduct
WHERE Sellers.City = Sumproduct.City) AS Qty
FROM Sellers
Первый оператор SELECT отображает два столбца - Seller_name и Qty. Поле Qty является расчетным, оно формируется в результате выполнения подзапроса, взятого в круглые скобки. Этот подзапрос выполняется по одному разу для каждой записи в поле Seller_name и в общем будет выполнен четыре раза, поскольку выбраны имена четырех продавцов.
Также, в подзапросе, предложение WHERE выполняет функцию сочетания, поскольку с помощью WHERE мы соединили две таблицы по полю City, используя полные названия столбцов (Таблица.Поле).