SQLLab
Глоссарий/Подзапрос (Subquery)
Подзапросы / CTEСредний

Подзапрос (Subquery)

SELECT внутри другого SQL выражения. Может быть в FROM, WHERE, HAVING или SELECT.

Синтаксис
-- В WHERE:
SELECT * FROM t WHERE col IN (SELECT col FROM t2);
-- В FROM:
SELECT * FROM (SELECT ...) sub;

Объяснение

Подзапросы бывают: - Некоррелированные: выполняются один раз, независимо от внешнего запроса - Коррелированные: ссылаются на внешний запрос, выполняются для каждой строки — потенциально медленно В большинстве случаев современные оптимизаторы могут переписать подзапрос как JOIN. Но не всегда — смотри EXPLAIN.

Пример

-- Некоррелированный (быстро — один раз)
SELECT * FROM products
WHERE category_id IN (SELECT id FROM categories WHERE is_active = true);

-- Коррелированный (медленно — для каждой строки)
SELECT name,
  (SELECT COUNT(*) FROM orders WHERE user_id = u.id) AS orders
FROM users u;