The grain of a table is what one row represents. ORDERS has one row per order; ORDER_LINES has one row per product line within an order. Joining them repeats the header once for every line. Summing ORDER_TOTAL after that join overstates the order value, even though the join condition itself is correct.
Start by naming the required output grain. Aggregate detail rows to that grain before joining, or count distinct keys when the task calls for entities. A LEFT JOIN preserves the left side, but a WHERE condition on the right table can remove those preserved rows. Put restrictions in ON when they describe which matches to attach, and use WHERE when they describe which final rows to keep.