SQLПодзапросы и CTEMediumБесплатно

Товары, которые ни разу не заказали

// Условие

Найдите товары, которые ни разу не появлялись ни в одном заказе (не только в завершённых — вообще ни в каком). Выведите product_id, product_name и category. Отсортируйте по category, затем по product_name.

// Таблицы

sandbox.products
product_idINT
product_nameVARCHAR(100)
categoryVARCHAR(30)
priceNUMERIC(10,2)
seller_idINT
sandbox.order_items
item_idINT
order_idINT
product_idINT
quantityINT
unit_priceNUMERIC(10,2)

// Что тренирует

NOT EXISTSLEFT JOINIS NULL
▶ Решить в SQL-песочнице

// Решение

Подсказка

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 часто эффективнее по производительности.

// Похожие задачи

// Разобраться в теме

→ CTE против подзапросов