Làm Sáng Tỏ Các Kiểu Join Trong SQL: Inner Join vs. Outer Join (Left Join, Right Join, Full Join)

Gặp khó khăn trong việc hiểu cách các Join hoạt động trong SQL? Bài viết này sẽ giải thích rõ về Inner Join vs. Outer Join (Left Join, Right Join, Full Join) một cách đơn giản. Học cách sử dụng từng loại để lấy dữ liệu chính xác bạn cần từ cơ sở dữ liệu quan hệ của mình.
Làm Sáng Tỏ Các Kiểu Join Trong SQL: Inner Join vs. Outer Join (Left Join, Right Join, Full Join)

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