Подзапрос — это запрос внутри запроса. Он позволяет использовать результат одного SELECT в другом. Например, найти пользователей старше среднего возраста:
SELECT name, age FROM users WHERE age > (SELECT AVG(age) FROM users);
Внутренний запрос сначала вычисляет средний возраст (одно число), а внешний сравнивает с ним каждую строку.
Подзапрос со списком значений используют с оператором IN:
SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders WHERE amount > 1000 );
Здесь внутренний запрос вернёт список id тех, кто делал крупные заказы, а внешний выберет их имена.
Подзапросы делают сложные вопросы решаемыми по шагам: «сначала найди вот это, потом по найденному выбери то». Многие задачи можно решить и через JOIN, и через подзапрос — выбирайте, что читается понятнее.