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