Trong SQL Server (Transact-SQL) JOIN được sử 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. Đây là 4 loại JOIN trong SQL Server
- THAM GIA INNER - còn được gọi là hình thức kết nối đơn giản
- THAM GIA BÊN NGOÀI TRÁI - hoặc THAM GIA TRÁI
- THAM GIA BÊN NGOÀI PHẢI - hoặc PHẢI THAM GIA
- THAM GIA NGOÀI TRỜI ĐẦY ĐỦ - hoặc THAM GIA ĐẦY ĐỦ
Bây giờ chúng ta hãy xem cú pháp, hình minh họa và ví dụ để hiểu rõ hơn về JOIN trong SQL Server.
THAM GIA BÊN TRONG
Nhiều khả năng bạn đã sử dụng INNER JOIN trong một số lệnh nhất định. Đây là kiểu kết nối phổ biến nhất, trả về tất cả các hàng từ bảng khi các điều kiện kết nối được đáp ứng.
Cú pháp INNER JOIN
SELECT cot
FROM bang1
INNER JOIN bang2
ON bang1.
cot = bang2.cot;
Hình ảnh minh họa củ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 = d
onhang.nhacung_id;
Kết quả trả về trong ví dụ trên là dòng thông tin trong bảng 'nhà cung cấp' và bảng 'đơn hàng' khi giá trị của nhacung_id bằng 2 bảng.
Hãy xem một ví dụ với dữ liệu cụ thể để hiểu rõ hơn.
Bảng nhacung có 2 trường thông tin:nhacung_id và nhacung_ten.
nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIABảng donhang bao 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/14Nếu chạy lệnh SELECT (sử dụng INNER JOIN) bên dưới:
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_
id = donhang.nhacung_id;
Đây là tập kết quả được trả về:
nhacung_id mười IBM donhang_ngay 10000 2003/05/12 10001 Hewlett Packard 2003/05/13Các sản phẩm của Microsoft và NVIDIA bị loại khỏi bảng vì nhacung_id (10002 và 10003) chỉ có sẵn trong 1 bảng. Hàng 500127 (donhang_id) trong bảng donhang bị xóa 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 với cú pháp cũ như bên dưới (nhưng nên sử dụng cú pháp có chứa từ khóa INNER JOIN)
SELECT musicung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM donhang, nhacung
WHERE nhacung.n
hacung_id = donhang.nhacung_id;
THAM GIA BÊN NGOÀI TRÁI
Một số cơ sở dữ liệu sử dụng LEFT JOIN thay vì LEFT OUTER JOIN. Loại kết nối này trả về các hàng trong bảng điều khiển bên trái ở điều kiện BẬT và chỉ lấy các bảng còn lại đáp ứng các điều kiện đã đặt.
Cú pháp THAM GIA TRÁI
SELECT cot
FROM bang1
LEFT [OUTER] JOIN bang2
ON bang1.co
t = bang2.cot;
Minh họa LEFT JOIN do vùng màu xanh lam
Kết quả trả về bao gồm state1 và các bản ghi nằm trong bang2 được gán cho state1 (vùng màu xanh lam trong hình).
Ví dụ về LEFT JOIN
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhac
ung_id = donhang.nhacung_id;
Ví dụ trên sẽ trả về tất cả các hàng từ bảng và chỉ những hàng đáp ứng yêu cầu trong bảng donhang. Nếu giá trị nhacung_id trong bảng không tồn tại trong bảng donhang, tất cả các trường trong donhang sẽ hiển thị kết quả trong bảng kết quả.
Dưới đây là một ví dụ cụ thể. Bảng chứa nhacung_id và nhacung_ten.
nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIABảng Donhang bao gồm donhang_id, nhacung_id và donhang_ngay.
donhang_id nhacung_id donhang_ngay 500125 10000 2003/05/12 500126 10001 2003/05/13Nếu chạy lệnh SELECT bên dưới:
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhacun
g_id = donhang.nhacung_id;
Kết quả sẽ như sau:
nhacung_id nhacung_ten 10000 IBM donhang_ngay 2003/05/12 10001 Hewlett Packard 2003/05/13 10002 Microsoft 10003 NVIDIAHàng Microsoft và NVIDIA vẫn nằm trong tập kết quả vì chúng đang sử dụng LEFT OUTER JOIN (lấy tất cả các bảng ở bên trái) . Khi đó, donhang_ngay trong số các bản ghi này sẽ hợp lệ.
THAM GIA NGAY NGƯỜI RA ĐÚNG
Một số cơ sở dữ liệu sử dụng RIGHT JOIN thay vì RIGHT OUTER JOIN. Kiểu kết nối này trả về các hàng trong bảng bên phải ở điều kiện BẬT và chỉ lấy các bảng còn lại đáp ứng các điều kiện đã đặt.
Cú pháp RIGHT THAM GIA
SELECT cot
FROM bang1
RIGHT [OUTER] JOIN bang2
ON bang1.cot =
bang2.cot;
Minh họa QUYỀN THAM GIA
Kết quả trả về bao gồm bang2 và các bản ghi ở trạng thái1 được gán cho bang2 (vùng màu xanh lam trong hình).
Ví dụ về RIGHT JOIN
SELECT donhang.donhang_id, donhang.donhang_ngay, nhacung.nhacung_ten
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nha
cung_id = donhang.nhacung_id;
Kết quả trả về là tất cả các hàng trong bảng donhang và chỉ những hàng đáp ứng yêu cầu trong bảng nhacung.
Nếu giá trị của nhacung_id trong bảng donhang không tồn tại trong bảng, tất cả các trường trong danh sách sẽ hiển thị trong bảng kết quả.
Dưới đây là một ví dụ cụ thể. Bảng chứa nhacung_id và nhacung_ten.
nhacung_id nhacung_ten 10000 Apple 10001 GoogleBảng Donhang bao gồm donhang_id, nhacung_id và donhang_ngay.
donhang_id nhcung_id donhang_ngay 500125 10000 2003/08/12 500126 10001 2003/08/13 500127 10002 2003/08/14Nếu chạy lệnh SELECT bên dưới:
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ả sẽ như sau:
donhang_id donhang_ngay nhacung_id 500125 2003/08/12 Apple 500126 2003/08/13 Google 500127 2003/08/14Hàng 500127 (donhang_id) vẫn nằm trong bảng kết quả vì THAM GIA RIGHT OUTER là đang được sử dụng. Lưu ý rằng nhacung_ten cho bản ghi đó có chứa giá trị.
THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
Một số cơ sở dữ liệu sử dụng FULL JOIN thay vì FULL OUTER JOIN. Loại kết nối này trả về tất cả các hàng trong bảng bên trái và bên phải và các giá trị NULL được đặt trong điều kiện không đáp ứng điều kiện.
Cú pháp FULL JOIN
SELECT cot
FROM bang1
FULL [OUTER] JOIN bang2
ON bang1.c
ot = bang2.cot;
Minh họa FULL JOIN với kết quả là vùng màu xanh lá cây
Kết quả trả về bao gồm tất cả cá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_i
d = donhang.nhacung_id;
Ví dụ trên sẽ trả về tất cả các hàng từ bảng và donhang, nhưng khi điều kiện không được đáp ứng, giá trị sẽ được đặt thành bảng kết quả.
Nếu nhacung_id trong bảng nhạc không có trong bảng donhang hoặc giá trị nhacung_id trong bảng donhang không có trong bảng nhạc, các trường thông tin sẽ được hiển thị.
Dưới đây là ví dụ cụ thể về FULL OUTER JOIN. Bảng chứa nhacung_id và nhacung_ten.
nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIABảng Donhang bao gồm donhang_id, nhacung_id và donhang_ngay.
donhang_id nhacung_id donhang_ngay 500125 10000 2003/08/12 500126 10001 2003/08/13 500127 10004 2003/08/14Nếu chạy lệnh SELECT bên dưới:
SELECT nhacung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_i
d = donhang.nhacung_id;
Kết quả sẽ như sau:
nhacung_id nhacung_ten 10.000 donhang_ngay IBM 2003/08/12 10001 Hewlett Packard 2003/08/13 10002 Microsoft 10003 NVIDIA 2003/08/14Các sản phẩm của Microsoft và NVIDIA vẫn nằm trong tập kết quả vì họ đang sử dụng THAM GIA NGOÀI TRỜI ĐẦY ĐỦ. Sau đó donhang_ngay của các bản ghi này chứa các giá trị. 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 các giá trị.