Нужно выбрать заказы, у которых amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?
A
SELECT * FROM orders o WHERE o.amount > (SELECT AVG(amount) FROM orders)B
SELECT * FROM orders o WHERE o.amount > (SELECT AVG(amount) FROM orders WHERE user_id = 123)C
SELECT * FROM orders o WHERE o.amount > (SELECT AVG(o2.amount) FROM orders o2 WHERE o2.user_id = o.user_id)D
SELECT * FROM orders o WHERE o.user_id IN (SELECT AVG(amount) FROM orders GROUP BY user_id)Правильный ответ. Коррелированный подзапрос ссылается на колонку внешнего запроса (например,
o.user_id), поэтому среднее считается отдельно для каждого пользователя.Разбор
В варианте с корреляцией условие внутри подзапроса связывает строки таблицы orders (алиас o2) со строкой внешней таблицы orders (алиас o). Так подзапрос вычисляет среднее только по заказам текущего пользователя, а не по всей таблице. Некоррелированный подзапрос посчитает одно глобальное значение и сравнит с ним все строки.
Проверь себя · 1/3разбор после ответа
Нужно выбрать заказы, у которых
amount выше среднего amount по тому же пользователю. Какой вариант WHERE корректно использует коррелированный подзапрос?Ещё вопросы по теме «Подзапросы и CTE»
- В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период. Какой подход обычно делает запрос более читаемым и позволяет переиспользовать шаг фильтрации?
- Вы выбираете пользователей, у которых есть хотя бы один платеж. В таблице `payments` поле `user_id` иногда бывает `NULL` (например, анонимные платежи). Почему в такой ситуации часто предпочитают `EXISTS`, а не `IN`?
- Вы пишете `SELECT u.user_id, (SELECT order_id FROM orders o WHERE o.user_id = u.user_id) AS last_order_id FROM users u`. Что может пойти не так и как исправить, чтобы подзапрос стал скалярным?
- Вы готовите дашборд: нужно (1) топ товаров по выручке за период и (2) общая выручка за тот же период. Какой вариант снижает риск, что фильтр по периоду рассинхронизируется между расчётами?
- Вы ищете пользователей без заказов. Почему запрос `SELECT u.user_id FROM users u WHERE u.user_id NOT IN (SELECT o.user_id FROM orders o)` может вернуть 0 строк и какой подход безопаснее?
- Все вопросы по «Подзапросы и CTE» →