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:
- INNER JOIN – còn gọi là kết nối đơn giản
- LEFT OUTER JOIN – hoặc LEFT JOIN
- RIGHT OUTER JOIN – hoặc RIGHT JOIN
- 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;

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_id | nhacung_ten |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
Bảng donhang gồm 3 trường: donhang_id, nhacung_id và donhang_ngay.
| donhang_id | nhacung_id | donhang_ngay |
|---|---|---|
| 500125 | 10000 | 2003/05/12 |
| 500126 | 10001 | 2003/05/13 |
| 500127 | 10004 | 2003/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_id | nhacung_ten | donhang_ngay |
|---|---|---|
| 10000 | IBM | 2003/05/12 |
| 10001 | Hewlett Packard | 2003/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;

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_id | nhacung_ten |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
Bảng donhang gồm donhang_id, nhacung_id, donhang_ngay.
| donhang_id | nhacung_id | donhang_ngay |
|---|---|---|
| 500125 | 10000 | 2003/05/12 |
| 500126 | 10001 | 2003/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_id | nhacung_ten | donhang_ngay |
|---|---|---|
| 10000 | IBM | 2003/05/12 |
| 10001 | Hewlett Packard | 2003/05/13 |
| 10002 | Microsoft | NULL |
| 10003 | NVIDIA | NULL |
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;

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_id | nhacung_ten |
|---|---|
| 10000 | Apple |
| 10001 |
Bảng donhang gồm donhang_id, nhacung_id, donhang_ngay.
| donhang_id | nhacung_id | donhang_ngay |
|---|---|---|
| 500125 | 10000 | 2003/08/12 |
| 500126 | 10001 | 2003/08/13 |
| 500127 | 10002 | 2003/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_id | donhang_ngay | nhacung_ten |
|---|---|---|
| 500125 | 2003/08/12 | Apple |
| 500126 | 2003/08/13 | |
| 500127 | 2003/08/14 | NULL |
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;

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_id | nhacung_ten |
|---|---|
| 10000 | IBM |
| 10001 | Hewlett Packard |
| 10002 | Microsoft |
| 10003 | NVIDIA |
Bảng donhang gồm donhang_id, nhacung_id, donhang_ngay.
| donhang_id | nhacung_id | donhang_ngay |
|---|---|---|
| 500125 | 10000 | 2003/08/12 |
| 500126 | 10001 | 2003/08/13 |
| 500127 | 10004 | 2003/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_id | nhacung_ten | donhang_ngay |
|---|---|---|
| 10000 | IBM | 2003/08/12 |
| 10001 | Hewlett Packard | 2003/08/13 |
| 10002 | Microsoft | NULL |
| 10003 | NVIDIA | NULL |
| 10004 | NULL | 2003/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.