Пользователи без заказов
// Условие
Найдите пользователей, которые зарегистрировались, но не сделали ни одного заказа. Выведите user_id, registration_date и city. Отсортируйте по registration_date.
// Таблицы
sandbox.users
user_id | INT |
registration_date | DATE |
acquisition_channel | VARCHAR(20) |
platform | VARCHAR(10) |
city | VARCHAR(50) |
is_premium | BOOLEAN |
sandbox.orders
order_id | INT |
user_id | INT |
order_date | TIMESTAMP |
amount | NUMERIC(10,2) |
status | VARCHAR(20) |
delivery_days | INT |
promo_code | VARCHAR(20) |
// Что тренирует
LEFT JOINIS NULLNOT EXISTS
// Решение
Подсказка
LEFT JOIN users → orders, затем WHERE o.order_id IS NULL. Или подзапрос с NOT IN / NOT EXISTS.
Сначала попробуй сам → Показать решение
SELECT
u.user_id,
u.registration_date,
u.city
FROM sandbox.users u
LEFT JOIN sandbox.orders o ON u.user_id = o.user_id
WHERE o.order_id IS NULL
ORDER BY u.registration_date;
Классический паттерн «найти то, чего нет» через LEFT JOIN + IS NULL. Альтернативы: WHERE u.user_id NOT IN (SELECT user_id FROM orders) или WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id). Все три варианта корректны. На практике LEFT JOIN + IS NULL часто самый читаемый.