TOP

SQL-Урок 9. Подзапросы (Subqueries)

До этого времени мы получали данные из базы данных с помощью простых запросов и одного оператора SELECT. Однако все-таки чаще нам нужно будет выбирать данные, соответствующие многим условиям, и здесь не обойтись без расширенных запросов. Для этого в SQL существуют подзапросы или вложенные запросы, когда один оператор SELECT вкладывается в другой.

Подзапрос – это оператор SELECT, вложенный в другой SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE или внутри другого подзапроса.

Текст подзапроса должен быть размещен в скобках. Часто подзапросы используют вместо сочетания таблиц (JOIN).


1. Фильтрация с помощью подзапросов

Таблицы баз данных, используемых в СУБД 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')

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

2. Использование подзапросов в качестве расчетных полей

Мы также можем использовать подзапросы в качестве расчетных полей. Отразим, например, количество реализуемой продукции по каждому продавцу с помощью следующего запроса:

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, используя полные названия столбцов (Таблица.Поле).