Товары, которые ни разу не заказали
// Условие
Найдите товары, которые ни разу не появлялись ни в одном заказе (не только в завершённых — вообще ни в каком). Выведите product_id, product_name и category. Отсортируйте по category, затем по product_name.
// Таблицы
sandbox.products
product_id | INT |
product_name | VARCHAR(100) |
category | VARCHAR(30) |
price | NUMERIC(10,2) |
seller_id | INT |
sandbox.order_items
item_id | INT |
order_id | INT |
product_id | INT |
quantity | INT |
unit_price | NUMERIC(10,2) |
// Что тренирует
NOT EXISTSLEFT JOINIS NULL
// Решение
Подсказка
NOT EXISTS или LEFT JOIN order_items + IS NULL. Подумайте, через какую таблицу связаны products и orders.
Сначала попробуй сам → Показать решение
SELECT
p.product_id,
p.product_name,
p.category
FROM sandbox.products p
WHERE NOT EXISTS (
SELECT 1
FROM sandbox.order_items oi
WHERE oi.product_id = p.product_id
)
ORDER BY p.category, p.product_name;
NOT EXISTS — надёжный способ найти «отсутствие связи». Он работает корректно даже при NULL в join-колонке (в отличие от NOT IN). Альтернатива: LEFT JOIN order_items ON ... WHERE oi.item_id IS NULL. На практике NOT EXISTS часто эффективнее по производительности.