Есть payments(user_id) и refunds(user_id). Нужно получить пользователей, у которых был платёж, но не было возврата. Какой вариант корректнее всего описывает задачу?

ASELECT user_id FROM payments INTERSECT SELECT user_id FROM refunds;
BSELECT user_id FROM payments UNION SELECT user_id FROM refunds;
CSELECT p.user_id FROM payments p INNER JOIN refunds r ON p.user_id = r.user_id;
DSELECT user_id FROM payments EXCEPT SELECT user_id FROM refunds;
Правильный ответ. EXCEPT возвращает разность множеств: значения из первой выборки, которых нет во второй.

Разбор

Для «платили, но не возвращали» нужна именно разность наборов пользователей. EXCEPT делает это напрямую на уровне множеств. INNER JOIN и INTERSECT дадут пользователей, которые есть в обеих таблицах, то есть как раз тех, у кого были и платежи, и возвраты.

Проверь себя · 1/3разбор после ответа
Два запроса: SELECT * FROM orders JOIN users ON orders.user_id = users.user_id и SELECT * FROM orders JOIN users USING(user_id). В чём ключевое ограничение USING?
Тренировать SQL в Telegram

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