Подзапрос (Subquery)
SELECT внутри другого SQL выражения. Может быть в FROM, WHERE, HAVING или SELECT.
-- В WHERE:
SELECT * FROM t WHERE col IN (SELECT col FROM t2);
-- В FROM:
SELECT * FROM (SELECT ...) sub;Объяснение
Пример
-- Некоррелированный (быстро — один раз)
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;Связанные термины
Анекдоты по теме
— Зачем нужен EXPLAIN (FORMAT JSON)? — Машиночитаемый формат плана. — Зачем? — Для инструментов: pgMustard, explain.dalibo.com визуализируют JSON план. — Текстовый формат хуже? — Для человека читаем. Для программного анализа — JSON. — explain.dalibo.com? — Вставляешь план — получаешь красивую диаграмму. Незаменимо для сложных запросов.
— Почему SELECT DISTINCT работает медленно? — Потому что сначала выбирает все строки, потом сортирует и удаляет дубли. — Как ускорить? — Часто проблема не в DISTINCT, а в том, почему вообще есть дубли. Исправь модель данных.
Собеседование: — Напишите запрос для нахождения второй по величине зарплаты. Кандидат пишет подзапрос. — А можно без подзапроса? Пишет DENSE_RANK(). — А одной строкой? Пишет ORDER BY salary DESC LIMIT 1 OFFSET 1. Интервьюер: — Молодец. Это был вопрос на знание разных подходов, а не на правильный ответ.