Tu étais proche
SELECT order_id
FROM orders
WHERE product_id in (222,555)
GROUP BY order_id
HAVING COUNT(DISTINCT product_id) = 2
Concernant votre question "par curiosité" en algèbre relationnelle, cela se fait simplement avec division . AFAIK aucun RDBMS n'a implémenté d'extension qui rend cela aussi simple en SQL.