Select Name as Customers from Customers
where Name not in
From Customers join Orders
on Customers.id=Orders.customerId )
Theoretically your code should be working. However, Id in table 1 is the primary key with no duplicates, whereas Name is not. There is no guarantee that the event where two or more customers share the same name but different Id-s, would not happen.
The sub query of your code is to find all customers who have ordered. Lets say James(a) with id of 3 and James (b) with id of 7. James (a) did order but James (b) didn't. The name list that your join clause returns will have James (a). When the outer structure kicks in, your code will not select all customers named James. That's why your code is not working. Hope it helps.