A join combines rows that satisfy its condition. For orders and customers, match orders.customer_id to customers.id. Matching order id to customer id can produce believable rows with the wrong people. Qualify shared names with table aliases so the engine can tell which id you mean.
An inner join returns matched rows. A left join retains every left-side row, with NULLs for a missing customer. A left anti join returns the unmatched left rows, while a left semi join tests whether a match exists without adding customer columns. Joins can multiply rows when a key repeats on both sides. DISTINCT can hide that symptom, but it doesn't fix the relationship. Check the intended grain before summing amounts after a join. The exercises include unmatched keys so a left join and an inner join cannot quietly mean the same thing.