Подзапрос (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;
Связанные термины
Анекдоты по теме
— Чем коррелированный подзапрос отличается от обычного? — Обычный выполняется один раз. Коррелированный — для каждой строки внешнего запроса. — Это плохо? — Зависит от размера таблицы. При миллионе строк — миллион подзапросов.
— Почему ORDER BY в подзапросе бессмысленен? — Потому что результат подзапроса — это множество, а множество не имеет порядка. — Но у меня работает! — Случайно. Порядок не гарантирован. ORDER BY имеет смысл только в финальном SELECT.
Собеседование: — Напишите запрос для нахождения второй по величине зарплаты. Кандидат пишет подзапрос. — А можно без подзапроса? Пишет DENSE_RANK(). — А одной строкой? Пишет ORDER BY salary DESC LIMIT 1 OFFSET 1. Интервьюер: — Молодец. Это был вопрос на знание разных подходов, а не на правильный ответ.