Подзапрос одиночной строки

Подзапрос - это запрос в запросе. Выглядит как обычный запрос, которые мы рассматривали ранее, и так же возвращает набор строк.

Подзапросы могут использоваться в любой части основного запроса. Его можно использовать для определения значения столбца в списке выборки SELECT. Его можно использовать вместо таблицы в предложении FROM, определять значение для условий отсечения строк в WHERE и HAVING, проверять наличие строк в другой таблице. Еще много чего можно... Подзапросы - мощный инструмент языка SQL.

Обо всем по порядку. Начнем с подзапросов, возвращающих одно значение (single-row subquery или подзапрос одиночной строки). Такой запрос должен возвращать не более одной строки и один единственный столбец.

Подзапрос одиночной строки можно использовать везде, где может быть использована константа или значение столбца таблицы.

Для использования значения из подзапроса, достаточно в месте, в котором должно быть значение, открыть круглые скобки и написать подзапрос. Например, вот так: WHERE (SELECT ...) > 100.

Найдем в каталоге самый дешевый товар:

SELECT *
  FROM product_price pp
 WHERE pp.price = (SELECT min(ppm.price)
                     FROM product_price ppm)
# product_id store_id price
1 7 301 4900.00

Как это работает? Сначала вычисляется значение подзапроса

SELECT min(ppm.price)
  FROM product_price ppm
# min
1 4900.00

Затем выполняется запрос, в котором подзапрос заменен результатом его выполнения:

SELECT *
  FROM product_price pp
 WHERE pp.price = 4900.00
# product_id store_id price
1 7 301 4900.00

Если хочется знать больше информации о товаре и магазине, то можно присоединить таблицы product и store:

SELECT s.name AS store_name,
       p.name AS product_name,
       pp.price
  FROM product_price pp
  JOIN product p
    ON p.product_id = pp.product_id
  JOIN store s
    ON s.store_id = pp.store_id
 WHERE pp.price = (SELECT min(ppm.price)
                     FROM product_price ppm)
# store_name product_name price
1 Адалин-family Deepbox 4900.00

5.8 Несколько операций

6.2 Коррелированный подзапрос