JOIN trong SQL Server | Hỏi gì?

Trong SQL Server (Transact-SQL) JOIN được dùng để lấy dữ liệu từ nhiều bảng, xảy ra khi 2 hoặc nhiều bảng được kết nối với nhau trong một lệnh SQL. Dưới đây là 4 loại JOIN trong SQL Server

  • INNER JOIN – hay còn gọi là hình thức kết nối đơn giản
  • LEFT OUTER JOIN – hay LEFT JOIN
  • RIGHT OUTER JOIN – hay RIGHT JOIN
  • FULL OUTER JOIN – hay FULL JOIN

Giờ hãy cùng nhìn vào cú pháp, hình minh họa cũng như các ví dụ để hiểu hơn về JOIN trong SQL Server.

INNER JOIN

Nhiều khả năng bạn đã dùng INNER JOIN trong lệnh nào đó rồi. Đây là loại kết nối phổ biến nhất, trả về tất cả các hàng từ các bảng khi điều kiện kết nối được đáp ứng.

Cú pháp INNER JOIN

SELECT cot FROM bang1 INNER JOIN bang2 ON thoisu.com.vn = thoisu.com.vn;

Hình ảnh minh họa INNER JOINHình ảnh minh họa INNER JOIN

Kết quả trả về là những bản ghi chung giữa bang1 và bang2.

Ví dụ INNER JOIN

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung INNER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Kết quả trả về trong ví dụ trên là hàng thông tin trong bảng “nhà cung” và bảng “đơn hàng” khi giá trị nhacung_id ở 2 bảng bằng nhau.

Hãy cùng xem ví dụ với số liệu cụ thể để hiểu rõ hơn.

Bảng nhacung có 2 trường thông tin là nhacung_id và nhacung_ten.

nhacung_idnhacung_ten10000IBM10001Hewlett Packard10002Microsoft10003NVIDIA

Bảng donhang gồm 3 trường donhang_id, nhacung_id và donhang_ngay.

donhang_idnhacung_iddonhang_ngay500125100002003/05/12500126100012003/05/13500127100042003/05/14

Nếu chạy lệnh SELECT (có dùng INNER JOIN) dưới đây:

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung INNER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Thì đây là bộ kết quả trả về:

nhacung_idtendonhang_ngay10000IBM2003/05/1210001Hewlett Packard2003/05/13

Hàng Microsoft và NVIDIA từ bảng nhacung bị bỏ ra do nhacung_id (10002 và 10003) chỉ có trong 1 bảng. Hàng 500127 (donhang_id) từ bảng donhang bị bỏ do nhacung_id 10004 không có trong bảng nhacung.

Cú pháp cũ của INNER JOIN

INNER JOIN có thể được viết lại bằng cú pháp cũ như dưới đây (nhưng khuyến khích nên dùng cú pháp có chứa từ khóa INNER JOIN)

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM donhang, nhacung WHERE thoisu.com.vnung_id = thoisu.com.vnung_id;

LEFT OUTER JOIN

Một số cơ sở dữ liệu dùng LEFT JOIN thay vì LEFT OUTER JOIN. Kiểu kết nối này trả về các hàng nằm ở bảng bên trái trong điều kiện ON và chỉ lấy ở các bảng còn lại những hàng đáp ứng được điều kiện đặt ra

Cú pháp LEFT JOIN

SELECT cot FROM bang1 LEFT [OUTER] JOIN bang2 ON thoisu.com.vn = thoisu.com.vn;

Minh họa LEFT JOIN với kết quả là vùng màu xanhMinh họa LEFT JOIN với kết quả là vùng màu xanh

Kết quả trả về gồm bang1 và các bản ghi nằm trong bang2 giao với bang1 (vùng màu xanh trong hình).

Ví dụ LEFT JOIN

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung LEFT OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Ví dụ trên sẽ trả về tất cả các hàng từ bảng nhacung và chỉ các hàng nào đáp ứng được yêu cầu trong bảng donhang. Nếu giá trị nhacung_id trong bảng nhacung không tồn tại trong bảng donhang thì tất cả các trường trong donhang sẽ hiển thị thành <null> trong bảng kết quả.

Dưới đây là ví dụ cụ thể. Bảng nhacung gồm nhacung_id và nhacung_ten.

nhacung_idnhacung_ten10000IBM10001Hewlett Packard10002Microsoft10003NVIDIA

Bảng donhang gồm donhang_id, nhacung_id và donhang_ngay.

donhang_idnhacung_iddonhang_ngay500125100002003/05/12500126100012003/05/13

Nếu chạy lệnh SELECT dưới đây:

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung LEFT OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Thì kết quả sẽ như thế này:

nhacung_idnhacung_tendonhang_ngay10000IBM2003/05/1210001Hewlett Packard2003/05/1310002Microsoft<null>10003NVIDIA<null>

Các hàng Microsoft và NVIDIA vẫn nằm trong bộ kết quả do đang dùng LEFT OUTER JOIN (lấy tất cả bảng bên trái). Khi đó, donhang_ngay của các bản ghi này sẽ là giá trị <null>.

RIGHT OUTER JOIN

Một số cơ sở dữ liệu dùng RIGHT JOIN thay vì RIGHT OUTER JOIN. Kiểu kết nối này trả về các hàng nằm ở bảng bên phải trong điều kiện ON và chỉ lấy ở các bảng còn lại những hàng đáp ứng được điều kiện đặt ra

Cú pháp RIGHT JOIN

SELECT cot FROM bang1 RIGHT [OUTER] JOIN bang2 ON thoisu.com.vn = thoisu.com.vn;

Kết quả trả về gồm bang2 và các bản ghi nằm trong bang1 giao với bang2Minh họa RIGHT JOIN

Kết quả trả về gồm bang2 và các bản ghi nằm trong bang1 giao với bang2 (vùng màu xanh trong hình).

Ví dụ RIGHT JOIN

SELECT thoisu.com.vnang_id, thoisu.com.vnang_ngay, thoisu.com.vnung_ten FROM nhacung RIGHT OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Kết quả trả về là tất cả hàng trong bảng donhang và chỉ các hàng đáp ứng được yêu cầu trong bảng nhacung.

Nếu giá trị nhacung_id trong bảng donhang không tồn tại trong bảng nhacung thì tất cả các trường trong nhacung sẽ hiển thị thành <null> trong bảng kết quả.

Dưới đây là ví dụ cụ thể. Bảng nhacung gồm nhacung_id và nhacung_ten.

nhacung_idnhacung_ten10000Apple10001Google

Bảng donhang gồm donhang_id, nhacung_id và donhang_ngay.

donhang_idnhcung_iddonhang_ngay500125100002003/08/12500126100012003/08/13500127100022003/08/14

Nếu chạy lệnh SELECT dưới đây:

SELECT thoisu.com.vnang_id, thoisu.com.vnang_ngay, thoisu.com.vnung_ten FROM nhacung RIGHT OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Thì kết quả sẽ như thế này:

donhang_iddonhang_ngaynhacung_id5001252003/08/12Apple5001262003/08/13Google5001272003/08/14<null>

Hàng 500127 (donhang_id) vẫn nằm trong bảng kết quả vì đang dùng RIGHT OUTER JOIN. Lưu ý nhacung_ten cho bản ghi đó chứa giá trị <null>.

FULL OUTER JOIN

Một số cơ sở dữ liệu dùng FULL JOIN thay vì FULL OUTER JOIN. Kiểu kết nối này trả về tất cả các hàng nằm ở bảng trái và phải và giá trị NULL đặt ở những nơi không đáp ứng được điều kiện.

Cú pháp FULL JOIN

SELECT cot FROM bang1 FULL [OUTER] JOIN bang2 ON thoisu.com.vn = thoisu.com.vn;

Minh họa FULL JO
IN với kết quả là vùng màu xanhMinh họa FULL JOIN với kết quả là vùng màu xanh

Kết quả trả về gồm tất cả bản ghi từ bang1 và bang2.

Ví dụ FULL JOIN

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung FULL OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Ví dụ trên sẽ trả về tất cả các hàng từ bảng nhacung và donhang, còn khi không đáp ứng được điều kiện thì giá trị sẽ được đặt là <null> trong bảng kết quả.

Nếu nhacung_id trong bảng nhacung không nằm trong bảng donhang, hay giá trị nhacung_id trong bảng donhang không nằm trong bảng nhacung thì các trường thông tin sẽ hiển thị <null>.

Dưới đây là ví dụ cụ thể về FULL OUTER JOIN. Bảng nhacung gồm nhacung_id và nhacung_ten.

nhacung_idnhacung_ten10000IBM10001Hewlett Packard10002Microsoft10003NVIDIA

Bảng donhang gồm donhang_id, nhacung_id và donhang_ngay.

donhang_idnhacung_iddonhang_ngay500125100002003/08/12500126100012003/08/13500127100042003/08/14

Nếu chạy lệnh SELECT dưới đây:

SELECT thoisu.com.vnung_id, thoisu.com.vnung_ten, thoisu.com.vnang_ngay FROM nhacung FULL OUTER JOIN donhang ON thoisu.com.vnung_id = thoisu.com.vnung_id;

Thì kết quả sẽ như thế này:

nhacung_idnhacung_tendonhang_ngay10000IBM2003/08/1210001Hewlett Packard2003/08/1310002Microsoft<null>10003NVIDIA<null><null><null>2003/08/14

Các hàng Microsoft và NVIDIA vẫn nằm trong bộ kết quả do đang dùng FULL OUTER JOIN. Khi đó donhang_ngay của các bản ghi này chứa giá trị <null>. Hàng cho nhacung_id là 10004 cũng nằm trong bảng kết quả nhưng nhacung_id và nhacung_ten của các bản ghi này chứa giá trị <null>.

Bài trước: ALIAS trong SQL Server

Bài tiếp: Điều kiện BETWEEN trong SQL Server