Inner Join vs. Outer Join
- Inner Join: Returns only matching rows from both tables
- Outer Join: Returns all rows from one or both tables, including non-matches
Example Data
Table 1 (students)
id | name
1 | alice
2 | bob
3 | charlie
Table 2 (grades)
student_id | subject | grade
1 | math | a
2 | math | b
4 | science | c
INNER JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
INNER JOIN grades ON students.id = grades.student_id;
This query returns only the rows where there's a match in both tables.
Result:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
Explanation: Only Alice and Bob have matching records in both tables.
OUTER JOIN
LEFT (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
LEFT JOIN grades ON students.id = grades.student_id;
This query returns all rows from the left table (students) and matching rows from the right table (grades). If there's no match, NULL values are returned for the right table columns.
Result:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
charlie | NULL | NULL
Explanation: Charlie is included even though there's no matching grade.
RIGHT (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
RIGHT JOIN grades ON students.id = grades.student_id;
This query returns all rows from the right table (grades) and matching rows from the left table (students). If there's no match, NULL values are returned for the left table columns.
Result:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
NULL | science | c
Explanation: The science grade for student_id 4 is included, even though there's no matching student.
FULL (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
FULL JOIN grades ON students.id = grades.student_id;
This query returns all rows when there's a match in either table. If there's no match, NULL values are returned for the columns from the table without a match.
Result:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
charlie | NULL | NULL
NULL | science | c
Explanation: This includes all students and all grades, even when there's no match between the tables.
When to use
- inner join: when you only need matching data from both tables
- outer join: when you need all data from one table, even without matches
