Check this out:
TblJob
Name, Surname, Job
John, White, Developer
John, Black, Tester
John, Grey, Manager
TblDrinksPref
Name, Surname, Drink
John, White, Coffee
John, Black, Tea
John, Grey, Orange Juice
SELECT * FROM tbljob j JOIN tbldrinkspref p ON j.name = p.name
John, White, Developer, John, White, Coffee
John, White, Developer, John, Black, Tea
John, White, Developer, John, Grey, Orange Juice
John, Black, Tester, John, White, Coffee
John, Black, Tester, John, Black, Tea
John, Black, Tester, John, Grey, Orange Juice
John, Grey, Manager, John, White, Coffee
John, Grey, Manager, John, Black, Tea
John, Grey, Manager, John, Grey, Orange Juice
By joining in just first name every row in each table matches the other. 3 rows in each table result in 3x3 tables output; more than the sum of the rows. The most rows you'll get out of a join is the multiplication of the numbers of rows heading into the join. We call this a Cartesian product and it's usually an indication that there is a bug in your SQL joins. Any join can do this, not just outer ones. There exists a join (called a CROSS JOIN) whose sole purpose is to produce an output that is a perfect Cartesian product because sometimes we do want to do it but mostly it indicates a problem
What can you do about it? Don't join rows to rows that are unrelated, by making your join conditions better/more accurate:
SELECT *
FROM tbljob j JOIN tbldrinkspref p
ON j.name = p.name
--the last name is vital to associate rows correctly in this case
AND j.surname = p.surname
If you have written a large SQL and are getting certain rows unexpectedly duplicated it means one of your joins is faulty. Comment them all out back to just the first table, and comment the select block, then keep rerunning the sql as you add joins back in. When you see the rowcount increase unexpectedly that's possibly the fail but be aware that a join may cause rows to disappear too, and you might be in a situation where adding a join may cause half the rows to disappear because they don't match the join predicate but the other half of the rows to double because the join is faulty. You must keep in mind the data you're joining when assessing how the row count should change as a result of adding a table in, versus how it does actually change