Подзапрос - это запрос в запросе. Выглядит как обычный запрос, которые мы рассматривали ранее, и так же возвращает набор строк.
Подзапросы могут использоваться в любой части основного запроса. Его можно использовать для определения значения столбца в списке выборки 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 |