For each implementation in joins deliveries Table has customer_id and the item_id they want to buy. items table has items with item_id as primary as below

 deliveries                                 items
id  customer_id  item_id               item_id       item_name
1    10           100                     100        Delicious
2    10           111                     111        Super Delicious 
3    12           100


I want to see for every customer (10, 12) whether they bought the two items (Delicious and Super Delicious). 

This I tried:

SELECT * FROM items LEFT JOIN deliveries ON items.item_id = deliveries.item_id




Here specifically, I want to see customer with id 12 has not bought item_id 111 as Null, which would be 4th row in the result.
To get the full domain you need a cartesian product (cross join in sql lingo) between the two sets:

select distinct d.customer_id, i.item_id 
from deliveries d 
cross join items i;


from this set you can subtract the actual deliveries:

select distinct d.customer_id, i.item_id 
from deliveries d 
cross join items i 
where not exists (
    select 1 from deliveries d2 
    where i.item_id = d2.item_id 
    and d.customer_id = d2.customer_id
);


I'm not clear on how this null comes into play, but you can add a flag that says that this product has not been bought by this customer as:

select distinct d.customer_id, i.item_id, 'NOT BOUGHT' as status 
from deliveries d 
cross join items i 
where not exists (
    select 1 from deliveries d2 
    where i.item_id = d2.item_id 
    and d.customer_id = d2.customer_id
);


Finally, you can add the deliveries table to this set as:

select distinct d.customer_id, i.item_id, 'NOT BOUGHT' as status 
from deliveries d 
cross join items i 
where not exists (
    select 1 from deliveries d2 
    where i.item_id = d2.item_id 
    and d.customer_id = d2.customer_id
);
union all 
select d.customer_id, d.item_id, 'BOUGHT' as status 
from deliveries d;


Not sure if it answers your question, but I think it will give you a start.