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

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

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

Таблицы баз данных, которые используются в СУБД Access являются реляционными таблицами, т.е. все таблицы можно связать между собой по общим полям. Допустим у нас хранятся данные в двух разных таблицах и нам нужно выбрать данные в одной из них, в зависимости от того, какие данные в другой. Для этого создадим еще одну таблицу в нашей базе данных. Это будет, например, таблица Sellers с информацией о поставщиках:

Теперь мы имеем две таблицы - Sumproduct и Sellers, которые имеют одинаковое поле City . Предположим, нам нужно посчитать сколько товаров было продано только в Канаде. Сделать это нам помогут подзапросы. Итак, сначала напишем запрос для выборки городов, которые находятся в Канаде:

SELECT City FROM Sellers WHERE Country = 'Canada'

Теперь передадим эти данные в следующий запрос, который будет выбирать данные из таблицы Sumproduct:

SELECT SUM(Quantity) AS Qty_Canada FROM Sumproduct WHERE City IN ('Montreal','Toronto')

Также мы можем объединить эти два запроса в один. Таким образом, один запрос, который выводит данные будет главным, а второй запрос, которий передает входные данные, будет вспомогательным (подзапросом). Для вложения подзапроса используем конструкцию WHERE ... IN (...), о которой говорилось в разделе Расширенное фильтрование:

SELECT SUM(Quantity) AS Qty_Canada FROM Sumproduct WHERE City IN (SELECT City FROM Sellers WHERE Country = 'Canada')

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

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

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

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

Статьи по теме:

  • SQL-Урок 8. Группировка данных (GROUP BY)
  • SQL-Урок 10. Объединение таблиц (INNER JOIN)