Ответ
Подзапрос (subquery) — это SQL-запрос, вложенный внутрь другого основного запроса (SELECT, INSERT, UPDATE, DELETE). Его результат используется внешним запросом как условие, источник данных или вычисляемое значение.
Основные типы и использование:
- Скалярный подзапрос (возвращает одно значение):
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); - Подзапрос, возвращающий множество строк (используется с
IN,ANY,ALL):SELECT name FROM departments WHERE id IN (SELECT department_id FROM projects WHERE budget > 100000); - Подзапрос в качестве таблицы (в
FROM):SELECT dept_name, avg_sal FROM (SELECT department_id, AVG(salary) as avg_sal FROM employees GROUP BY department_id) AS dept_stats WHERE avg_sal > 50000;
Коррелированные vs. Некоррелированные:
- Некоррелированный выполняется один раз независимо от внешнего запроса.
- Коррелированный выполняется для каждой строки внешнего запроса, ссылаясь на его значения (может быть менее производительным).
Производительность: Часто подзапрос можно переписать с использованием JOIN, что может быть эффективнее, особенно для коррелированных подзапросов. Выбор зависит от оптимизатора СУБД и структуры данных.