Inner Join vs. Outer Join
- Inner Join: Trả về chỉ các hàng khớp từ cả hai bảng
- Outer Join: Trả về tất cả các hàng từ một hoặc cả hai bảng, bao gồm cả những hàng không khớp
Ví Dụ Dữ Liệu
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;
Truy vấn này trả về chỉ các hàng có khớp trong cả hai bảng.
Kết quả:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
Giải thích: Chỉ có Alice và Bob có các bản ghi khớp trong cả hai bảng.
OUTER JOIN
LEFT (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
LEFT JOIN grades ON students.id = grades.student_id;
Truy vấn này trả về tất cả các hàng từ bảng trái (students) và các hàng khớp từ bảng phải (grades). Nếu không có khớp, các giá trị NULL được trả về cho các cột từ bảng phải.
Kết quả:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
charlie | NULL | NULL
Giải thích: Charlie được bao gồm mặc dù không có điểm khớp.
RIGHT (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
RIGHT JOIN grades ON students.id = grades.student_id;
Truy vấn này trả về tất cả các hàng từ bảng phải (grades) và các hàng khớp từ bảng trái (students). Nếu không có khớp, các giá trị NULL được trả về cho các cột từ bảng trái.
Kết quả:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
NULL | science | c
Giải thích: Điểm môn khoa học cho student_id 4 được bao gồm, mặc dù không có học sinh khớp.
FULL (OUTER) JOIN
SELECT students.name, grades.subject, grades.grade
FROM students
FULL JOIN grades ON students.id = grades.student_id;
Truy vấn này trả về tất cả các hàng khi có khớp trong một trong hai bảng. Nếu không có khớp, các giá trị NULL được trả về cho các cột từ bảng không có khớp.
Kết quả:
name | subject | grade
--------|---------|------
alice | math | a
bob | math | b
charlie | NULL | NULL
NULL | science | c
Giải thích: Điều này bao gồm tất cả học sinh và tất cả điểm, ngay cả khi không có khớp giữa các bảng.
Khi Nào Sử Dụng
- inner join: khi bạn chỉ cần dữ liệu khớp từ cả hai bảng
- outer join: khi bạn cần tất cả dữ liệu từ một bảng, ngay cả khi không có khớp
