VISEN GROUP
Technology & Engineering

JOIN trong SQL là gì? Hiểu bản chất INNER, LEFT, RIGHT JOIN và OUTER JOIN

September 11, 20263 min readUncategorized

Tại sao bạn luôn thấy nó khó hiểu?

Nếu bạn đang học SQL, có lẽ bạn đã từng gặp JOIN.

Lúc mới nhìn qua, bạn nghĩ JOIN khá đơn giản: chỉ cần lấy dữ liệu từ hai bảng rồi nối chúng lại với nhau. Nhưng càng học, bạn càng gặp nhiều khái niệm như INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN,… và bắt đầu thấy khá rối.

Thực tế, có thể hiểu JOIN rất đơn giản:

JOIN là cách kết hợp dữ liệu từ nhiều bảng dựa trên một mối quan hệ chung.

Ví dụ có hai bảng:

Users

idname
1An
2Bình
3Cường

Orders

iduser_idamount
1011500
1022300
1035700

Ta có thể liên kết:

users.id = orders.user_id

Từ đó biết đơn hàng nào thuộc về user nào.


INNER JOIN

INNER JOIN chỉ lấy những dữ liệu có sự tương ứng ở cả hai bảng.

SELECT *
FROM users u
INNER JOIN orders o
    ON u.id = o.user_id;

Kết quả chỉ có An và Bình, vì họ có order tương ứng.

An500
Bình300

Bạn có thể nhớ:

INNER JOIN → Chỉ lấy dữ liệu khớp ở hai bên.


LEFT JOIN

LEFT JOIN giữ toàn bộ dữ liệu của bảng bên trái, kể cả khi không tìm thấy dữ liệu tương ứng ở bảng bên phải.

SELECT *
FROM users u
LEFT JOIN orders o
    ON u.id = o.user_id;

Kết quả sẽ có cả Cường:

An500
Bình300
CườngNULL

Cường vẫn xuất hiện, nhưng thông tin về đơn hàng sẽ là NULL.

Điều này rất hữu ích khi bạn muốn lấy tất cả người dùng, kể cả những người chưa có đơn hàng (tìm những đối tượng chưa có dữ liệu liên quan ).


RIGHT JOIN

RIGHT JOIN hoạt động tương tự LEFT JOIN, nhưng ưu tiên giữ toàn bộ dữ liệu của bảng bên phải.

SELECT *
FROM users u 
RIGHT JOIN orders o
    ON u.id = o.user_id;

Order có user_id = 5 vẫn xuất hiện, mặc dù không tìm thấy user tương ứng:

An500
Bình300
NULL700

Trong thực tế, LEFT JOIN thường được sử dụng nhiều hơn RIGHT JOIN vì có thể đổi vị trí hai bảng để đạt được kết quả tương đương.


Vậy OUTER JOIN là gì?

OUTER JOIN là cách gọi nhóm JOIN cho phép giữ lại những bản ghi không có dữ liệu tương ứng.

SELECT *
FROM users u
FULL OUTER JOIN orders o
ON u.id = o.user_id;

Kết quả:

u.idnameo.iduser_id
1An1011
1An1021
2Bình1032
3CườngNULLNULL

Có thể hiểu đơn giản:

FULL OUTER JOIN
→ Giữ toàn bộ cả hai bảng

Do đó, khi nhìn thấy chữ OUTER, hãy nghĩ đến:

“Có giữ lại những dữ liệu không khớp hay không?”


Vậy JOIN khác nhau ở đâu?

Điểm quan trọng nhất không nằm ở việc nhớ tên.

Khi gặp một bài toán JOIN, tôi thường đặt câu hỏi:

“Tôi muốn giữ lại những dòng nào?”

JOINDữ liệu được giữ lại
INNER JOINChỉ những dòng khớp
LEFT JOINToàn bộ bảng bên trái
RIGHT JOINToàn bộ bảng bên phải
FULL OUTER JOINToàn bộ dữ liệu của cả hai bảng

Chỉ cần bạn hiểu được bảng nào được giữ lại và bảng nào có thể xuất hiện NULL, việc phân biệt các loại JOIN sẽ trở nên đơn giản hơn rất nhiều.

Kết luận

JOIN không khó vì cú pháp. Nó khó chủ yếu vì bạn chưa hình dung được kết quả sau khi hai bảng được kết hợp.

Thay vì học thuộc:

INNER = ?
LEFT = ?
RIGHT = ?

Hãy tập trung vào một câu hỏi:

“Sau khi JOIN, tôi muốn giữ lại dữ liệu của bên nào?”

Khi trả lời được câu hỏi này, bạn sẽ dễ dàng chọn được loại JOIN phù hợp.

Leave a Reply

Your email address will not be published. Required fields are marked *