Что такое подзапрос в SQL?
Подзапрос (subquery) в SQL — это запрос, вложенный во внешний запрос и возвращающий результат, который подставляется вместо обычного значения или таблицы. Его можно использовать в частях SELECT, FROM, WHERE, HAVING, а также в операторах INSERT, UPDATE, DELETE, чтобы связать одну выборку данных с другой.
Подзапрос — это SQL‑запрос, который выполняется внутри другого (внешнего) запроса и передаёт ему свой результат. Обычно он записывается в круглых скобках и используется там, где внешнему запросу нужно не фиксированное значение или таблица, а результат вычислений: при фильтрации строк, вычислении выражений или формировании источника данных.
Подзапрос может возвращать одно скалярное значение, список значений одного столбца или набор строк и столбцов, который ведёт себя как временная «виртуальная таблица». Это позволяет выразить сложные зависимости между выборками в одном SQL‑выражении, без выполнения нескольких отдельных запросов в приложении.
WHERE и HAVING — для фильтрации по результатам другого запроса; в SELECT — для вычисления отдельных скалярных значений; в FROM — как источник данных (подзапрос как таблица); в DML‑операторах INSERT, UPDATE, DELETE — для задания набора строк, с которыми нужно работать.IN, ANY, ALL) и табличные (несколько столбцов и строк, которые используются как таблица).EXISTS / NOT EXISTS.=, >, >= и др.; проверки принадлежности множеству значений через IN; проверки существования строк с помощью EXISTS и отрицания с NOT EXISTS.Коррелированные подзапросы делают выражения очень наглядными, но могут быть тяжёлыми по производительности, потому что фактически выполняются для каждой строки внешнего запроса. Во многих случаях их можно переписать через соединения JOIN или общие табличные выражения (WITH), что упрощает чтение и даёт план выполнения эффективнее.
В этом примере внутренний запрос вычисляет одно скалярное значение — среднюю зарплату по всем сотрудникам. Внешний запрос использует это значение в условии фильтрации и выбирает только тех сотрудников, чья зарплата выше среднего.
Во втором примере подзапрос является коррелированным: он ссылается на столбец внешней таблицы e.employee_id и логически выполняется для каждой строки сотрудника. Условие EXISTS проверяет, существует ли хотя бы одна строка о бонусе за 2024 год для текущего сотрудника; во внешний результат попадают только те сотрудники, для которых такая строка найдена.
Таким образом, подзапросы — это мощный инструмент для выражения зависимых выборок и сложной логики фильтрации, вычислений и модификации данных внутри одного SQL‑оператора.
Отметьте свой прогресс