Ответ
Подзапросы делятся на несколько типов по месту их использования и возвращаемому результату:
- Скалярные — возвращают одно значение, используются в SELECT, WHERE, HAVING:
SELECT name, (SELECT AVG(price) FROM products) AS avg_price
FROM products;
- Столбцовые — возвращают один столбец, часто с IN, ANY, ALL:
SELECT * FROM orders
WHERE customer_id IN (SELECT id FROM customers WHERE status = 'active');
- Табличные — возвращают таблицу, используются в FROM:
SELECT avg_price FROM
(SELECT category, AVG(price) AS avg_price FROM products GROUP BY category) AS subq;
- Коррелированные — зависят от внешнего запроса, выполняются для каждой строки:
SELECT p.name FROM products p
WHERE p.price > (SELECT AVG(price) FROM products WHERE category = p.category);
Также подзапросы могут быть вложенными (подзапрос внутри подзапроса) и некоррелированными (не зависят от внешнего запроса).