Короткий ответ
Подзапрос — это вложенный SELECT-запрос, результат которого используется как часть внешнего запроса — в WHERE, FROM, SELECT или вместе с IN/EXISTS/сравнением; он позволяет выразить условие, зависящее от результата отдельного вычисления.
Как это работает подробнее
СУБД должна оценить подзапрос, чтобы получить множество значений или единичное значение, которое затем используется внешним запросом для фильтрации или сопоставления.
Пример кода
example.sql
-- Клиенты, у которых есть хотя бы один заказ дороже 1000
SELECT id, name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id AND o.amount > 1000
);Что использовать на практике
- Практика. Подзапросы с IN/EXISTS хорошо читаются для условий «есть хотя бы одна связанная запись»; для больших объёмов данных эквивалентный JOIN иногда даёт более эффективный план — конкретный выбор проверяют через EXPLAIN.
Подводные камни
- Ошибка. Используют NOT IN с подзапросом, который может вернуть NULL в списке значений — из-за трёхзначной логики SQL это приводит к тому, что NOT IN никогда не возвращает TRUE; в таких случаях предпочтительнее NOT EXISTS.