Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?

AWHERE o.amount > (SELECT AVG(amount) FROM orders): подзапрос даёт одно глобальное среднее по всем заказам
BWHERE o.amount > (SELECT AVG(amount) FROM orders WHERE user_id = 123): среднее берётся по конкретному user_id
CWHERE o.amount > (SELECT AVG(o2.amount) FROM orders o2 WHERE o2.user_id = o.user_id): подзапрос связан через o.user_id внешнего
DWHERE o.user_id IN (SELECT AVG(amount) FROM orders GROUP BY user_id): список средних сравнивается с user_id через IN
Правильный ответ. Коррелированный подзапрос ссылается на колонку внешнего запроса (например, o.user_id), поэтому среднее считается отдельно для каждого пользователя.

Разбор

В коррелированном варианте подзапрос ссылается на колонку внешней таблицы (o.user_id), поэтому среднее считается отдельно для каждой строки внешнего запроса — то есть для каждого пользователя. Некоррелированный подзапрос вычисляет одно глобальное значение и сравнивает его со всеми строками. Вариант с захардкоженным user_id = 123 ограничивает сравнение одним пользователем, а вариант с IN ломается логически: AVG(amount) сравнивается с user_id, что бессмысленно по типу.

Проверь себя · 1/3разбор после ответа
Вы разбираете сложный отчёт коллеги: 4 уровня вложенных подзапросов в FROM без имён шагов. Решаете переписать через WITH. Какое практическое преимущество даёт CTE по сравнению с вложенными подзапросами?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»