You should not avoid it — you should embrace it. If you haven't used JOIN, you're probably not normalizing your databases,.
Here's a simple example. Say you have this table
play_id play_title play_category
1 All's Well That Ends Well Comedy
2 As You Like It Comedy
3 Antony and Cleopatra Tragedy
4 Cymbeline Romance
5 Henry IV, Part 1 History
6 Henry IV, Part 2 History
You can query this all day without a JOIN. However, the data is not "normalized", meaning that you have redundancies. Notice how "Comedy" and "History" are repeated. A more proper way to store these labels would be in a dedicated table:
play_category_id play_category_name
1 Comedy
2 Tragedy
3 History
4 Romance
Now you can "normalize" the play table,
play_id play_title play_category
1 All's Well That Ends Well 1
2 As You Like It 1
3 Antony and Cleopatra 2
4 Cymbeline 4
5 Henry IV, Part 1 3
6 Henry IV, Part 2 3
Not only is this more efficient, it is less error-prone.
The problem is, how do you get back to the view that shows the meaningful labels together. (Since we replaced a meaningful field with an arbitrary key, play_category_id.)
This is where JOIN comes in.
SELECT play_id, play_title, play_category_name
FROM play
LEFT OUTER JOIN play_category ON play_category = play_category_id
There's a lot more to the mechanics and art of JOINing, but the basic reason generally boils down to this situation.
Hope this helps.