Ответ
Подзапрос (subquery) — это SQL-запрос, вложенный в другой запрос (основной оператор SELECT, INSERT, UPDATE, DELETE). Он выполняется первым, а его результат используется внешним запросом в качестве условия, источника данных или вычисляемого значения.
Основные типы и использование:
- В предложении
WHERE/HAVING— для фильтрации по результату подзапроса. - В предложении
FROM— как временная таблица (алиас обязателен). - В предложении
SELECT— как вычисляемый столбец (должен возвращать одно значение).
Пример (некоррелированный подзапрос):
-- Найти всех сотрудников из отделов, расположенных в Нью-Йорке
SELECT name, department_id
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE location = 'New York'
);
Пример (коррелированный подзапрос):
-- Найти сотрудников с зарплатой выше средней по их отделу
SELECT e.name, e.salary, e.department_id
FROM employees e
WHERE e.salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
Ключевое различие:
- Некоррелированный выполняется один раз независимо от внешнего запроса.
- Коррелированный выполняется для каждой строки внешнего запроса (может быть менее производительным).