An INNER JOIN keeps only matched rows, but many real questions are precisely about the unmatched ones: which players have not batted yet, which teams have no recorded matches, which records failed to link. Outer joins exist to preserve rows that lack a counterpart, filling the missing side with NULLs instead of discarding them, so absence itself becomes visible and queryable.
There are three outer join variants. A LEFT JOIN keeps every row from the left table, a RIGHT JOIN keeps every row from the right, and a FULL OUTER JOIN keeps every row from both. Wherever a match is missing, the columns from the absent side come back as NULL. Choosing the right variant is simply deciding which table's rows you refuse to lose.
Outer joins are essential for completeness and for data-quality work. Reports that must list every player regardless of activity, dashboards that show zero where there is no data, and checks that hunt for orphaned or missing records all depend on outer joins. Mastering how they generate NULLs, and how filtering interacts with those NULLs, prevents a whole family of subtle and common reporting errors.