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

AНаписать WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id) — остановится на первом совпадении
BНаписать INNER JOIN orders o ON o.user_id = u.id — вернёт ровно по одной строке на пользователя
CНаписать WHERE u.id IN (SELECT DISTINCT user_id FROM orders)DISTINCT ускоряет поиск по индексу
DНаписать INNER JOIN (SELECT user_id FROM orders LIMIT 1) o ON o.user_id = u.id — ограничит результат
Правильный ответ. EXISTS проверяет наличие хотя бы одной строки и не дублирует результат, тогда как INNER JOIN создаст по строке на каждый заказ.

Разбор

EXISTS (подзапрос) — это полусоединение (semi-join): для каждого пользователя проверяется, существует ли хотя бы одна строка в orders, и поиск прекращается при первом совпадении. Результат — ровно одна строка на пользователя. INNER JOIN без предварительной дедупликации orders создаст столько строк, сколько заказов у пользователя. IN тоже работает корректно, но DISTINCT внутри не «быстрее индекса».

Проверь себя · 1/3разбор после ответа
Нужно посчитать число пользователей, которые сделали хотя бы 1 заказ (таблицы users(user_id) и orders(user_id, order_id)). Какой запрос посчитает правильно?
Тренировать SQL в Telegram

Ещё вопросы по теме «JOIN и операции множеств»