Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> SQL Server

JOIN trong SQL Server

Trong SQL Server (Transact-SQL), JOIN được dùng để truy xuất dữ liệu từ nhiều bảng, xảy ra khi hai 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:

  1. INNER JOIN – còn gọi là kết nối đơn giản
  2. LEFT OUTER JOIN – hoặc LEFT JOIN
  3. RIGHT OUTER JOIN – hoặc RIGHT JOIN
  4. FULL OUTER JOIN – hoặc FULL JOIN

Hãy xem cú pháp, minh họa và ví dụ để hiểu rõ hơn về JOIN trong SQL Server.

INNER JOIN

Đâ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 thỏa mãn.

Cú pháp INNER JOIN

SELECT cot
FROM bang1
INNER JOIN bang2
ON bang1.cot = bang2.cot;

JOIN trong SQL Server
Minh họa INNER JOIN

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

Ví dụ INNER JOIN

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Kết quả trả về là hàng thông tin trong bảng 'nhà cung cấp' và bảng 'đơn hàng' khi giá trị nhacung_id bằng nhau ở 2 bảng.

Ví dụ với dữ liệu cụ thể

Bảng nhacung có 2 trường: nhacung_id và nhacung_ten.

nhacung_idnhacung_ten
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

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

donhang_idnhacung_iddonhang_ngay
500125100002003/05/12
500126100012003/05/13
500127100042003/05/14

Chạy lệnh SELECT (dùng INNER JOIN) dưới đây:

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Tập kết quả trả về:

nhacung_idnhacung_tendonhang_ngay
10000IBM2003/05/12
10001Hewlett Packard2003/05/13

Microsoft và NVIDIA từ bảng nhacung bị loại vì nhacung_id (10002, 10003) chỉ có ở 1 bảng. Dòng 500127 (donhang_id) từ bảng donhang bị loại vì nhacung_id 10004 không có trong bảng nhacung.

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

INNER JOIN có thể viết lại với cú pháp cũ như sau (nhưng khuyên dùng cú pháp có từ khóa INNER JOIN):

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM donhang, nhacung
WHERE nhacung.nhacung_id = donhang.nhacung_id;

LEFT OUTER JOIN

Một số cơ sở dữ liệu dùng LEFT JOIN thay cho LEFT OUTER JOIN. Loại kết nối này trả về các hàng trong bảng bên trái (left table) theo điều kiện ON và chỉ lấy các bảng còn lại thỏa mãn điều kiện thiết lập.

Cú pháp LEFT JOIN

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

JOIN trong SQL Server
Minh họa LEFT JOIN – kết quả là vùng xanh

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

Ví dụ LEFT JOIN

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Ví dụ trên trả về tất cả hàng từ bảng nhacung và chỉ những hàng thỏa mãn điều kiện trong bảng donhang. Nếu giá trị nhacung_id trong bảng nhacung không tồn tại trong donhang, tất cả trường trong donhang sẽ hiển thị NULL trong bảng kết quả.

Ví dụ với dữ liệu cụ thể

Bảng nhacung chứa nhacung_id và nhacung_ten.

nhacung_idnhacung_ten
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

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

donhang_idnhacung_iddonhang_ngay
500125100002003/05/12
500126100012003/05/13

Chạy lệnh SELECT dưới đây:

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Kết quả:

nhacung_idnhacung_tendonhang_ngay
10000IBM2003/05/12
10001Hewlett Packard2003/05/13
10002MicrosoftNULL
10003NVIDIANULL

Các hàng Microsoft và NVIDIA vẫn có trong kết quả vì dùng LEFT OUTER JOIN (lấy tất cả bảng bên trái). Còn donhang_ngay của các bản ghi này sẽ là NULL.

RIGHT OUTER JOIN

Một số cơ sở dữ liệu dùng RIGHT JOIN thay cho RIGHT OUTER JOIN. Loại này trả về các hàng trong bảng bên phải (right table) theo điều kiện ON và chỉ lấy các bảng còn lại thỏa mãn điều kiện.

Cú pháp RIGHT JOIN

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

JOIN trong SQL Server
Minh họa RIGHT JOIN

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

Ví dụ RIGHT JOIN

SELECT donhang.donhang_id, donhang.donhang_ngay, nhacung.nhacung_ten
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Kết quả trả về là tất cả hàng trong bảng donhang và chỉ những hàng thỏa mãn trong bảng nhacung. Nếu giá trị nhacung_id trong donhang không tồn tại trong nhacung, tất cả trường trong nhacung sẽ hiển thị NULL.

Ví dụ với dữ liệu cụ thể

Bảng nhacung chứa nhacung_id và nhacung_ten.

nhacung_idnhacung_ten
10000Apple
10001Google

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

donhang_idnhacung_iddonhang_ngay
500125100002003/08/12
500126100012003/08/13
500127100022003/08/14

Chạy lệnh SELECT dưới đây:

SELECT donhang.donhang_id, donhang.donhang_ngay, nhacung.nhacung_ten
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Kết quả:

donhang_iddonhang_ngaynhacung_ten
5001252003/08/12Apple
5001262003/08/13Google
5001272003/08/14NULL

Hàng 500127 (donhang_id) vẫn có trong bảng kết quả vì dùng RIGHT OUTER JOIN. Lưu ý nhacung_ten cho bản ghi đó là NULL.

FULL OUTER JOIN

Một số cơ sở dữ liệu dùng FULL JOIN thay cho FULL OUTER JOIN. Loại kết nối này trả về tất cả hàng ở bảng trái và phải, đặt giá trị NULL ở những điều kiện không thỏa mãn.

Cú pháp FULL JOIN

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

JOIN trong SQL Server
Minh họa FULL JOIN – kết quả là vùng xanh

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

Ví dụ FULL JOIN

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Ví dụ trên trả về tất cả hàng từ nhacung và donhang, nhưng khi điều kiện không thỏa mãn, giá trị sẽ là NULL.

Nếu nhacung_id trong bảng nhacung không có trong donhang, hoặc nhacung_id trong donhang không có trong nhacung, các trường thông tin sẽ hiển thị NULL.

Ví dụ với dữ liệu cụ thể

Bảng nhacung chứa nhacung_id và nhacung_ten.

nhacung_idnhacung_ten
10000IBM
10001Hewlett Packard
10002Microsoft
10003NVIDIA

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

donhang_idnhacung_iddonhang_ngay
500125100002003/08/12
500126100012003/08/13
500127100042003/08/14

Chạy lệnh SELECT dưới đây:

SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

Kết quả:

nhacung_idnhacung_tendonhang_ngay
10000IBM2003/08/12
10001Hewlett Packard2003/08/13
10002MicrosoftNULL
10003NVIDIANULL
10004NULL2003/08/14

Microsoft và NVIDIA vẫn có trong kết quả vì dùng FULL OUTER JOIN. donhang_ngay của các bản ghi này là NULL. Hàng nhacung_id 10004 cũng có trong kết quả nhưng nhacung_id và nhacung_ten là NULL.