JOIN trong SQL Server – Quantrimang.com – Tin 24h

Công nghệ

Trong SQL Server (Transact-SQL) JOIN được tiêu dùng để lđấy dữ liệu từ nhiều bảng, xảy ra lúc 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 thuầ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ư những ví dụ để hiểu hơn về JOIN trong SQL Server.

INNER JOIN

Nhiều khả năng bạn đã tiêu 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ả những hàng từ những bảng lúc điều kiện kết nối được hoàn thành.

Cú pháp INNER JOIN

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

Hình ảnh minh họa INNER JOIN
Hì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 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ề trong ví dụ trên là hàng thông tin trong bảng “nhà cung” và bảng “đơn hàng” lúc 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 sở hữu 2 trường thông tin là 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

Nếu chạy lệnh SELECT (sở hữu tiêu 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;

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

nhacung_id ten donhang_ngay
10000 IBM 2003/05/12
10001 Hewlett Packard 2003/05/13

Hàng Microsoft và NVIDIA từ bảng nhacung bị bỏ ra do nhacung_id (10002 và 10003) chỉ sở hữu trong 1 bảng. Hàng 500127 (donhang_id) từ bảng donhang bị bỏ do nhacung_id 10004 ko sở hữu trong bảng nhacung.

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

INNER JOIN sở hữu thể được viết lại bằng cú pháp cũ như dưới đây (nhưng khuyến khích nên tiêu dùng cú pháp sở hữu chứa 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 tiêu dùng LEFT JOIN thay vì LEFT OUTER JOIN. Kiểu kết nối này trả về những hàng nằm ở bảng bên trái trong điều kiện ON và chỉ lđấy ở những bảng còn lại những hàng hoàn thành được điều kiện đặt ra

Cú pháp LEFT JOIN

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

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

Kết quả trả về gồm bang1 và những bản ghi nằm trong bang2 giao với bang1 (vùng màu 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 sẽ trả về tất cả những hàng từ bảng nhacung và chỉ những hàng nào hoàn thành được yêu cầu trong bảng donhang. Nếu giá trị nhacung_id trong bảng nhacung ko tồn tại trong bảng donhang thì tất cả những 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_id nhacung_ten
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

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

donhang_id nhacung_id donhang_ngay
500125 10000 2003/05/12
500126 10001 2003/05/13

Nếu 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;

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

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 nằm trong bộ kết quả do đang tiêu dùng LEFT OUTER JOIN (lđấy tất cả bảng bên trái). Khi đó, donhang_ngay của những bản ghi này sẽ là giá trị <null>.

RIGHT OUTER JOIN

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

Cú pháp RIGHT JOIN

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

Kết quả trả về gồm bang2 và những bản ghi nằm trong bang1 giao với bang2
Minh họa RIGHT JOIN

Kết quả trả về gồm bang2 và những bản ghi nằm trong bang1 giao với bang2 (vùng màu 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 hoàn thành được yêu cầu trong bảng nhacung.

Nếu giá trị nhacung_id trong bảng donhang ko tồn tại trong bảng nhacung thì tất cả những 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_id nhacung_ten
10000 Apple
10001 Google

Bảng donhang 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/14

Nếu 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;

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

donhang_id donhang_ngay nhacung_id
500125 2003/08/12 Apple
500126 2003/08/13 Google
500127 2003/08/14 <null>

Hàng 500127 (donhang_id) vẫn nằm trong bảng kết quả vì đang tiêu 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 tiêu dùng FULL JOIN thay vì FULL OUTER JOIN. Kiểu kết nối này trả về tất cả những hàng nằm ở bảng trái và phải và giá trị NULL đặt ở những nơi ko hoàn thành được điều kiện.

Cú pháp FULL JOIN

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

Minh họa FULL JOIN với kết quả là vùng màu xanh
Minh 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 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 sẽ trả về tất cả những hàng từ bảng nhacung và donhang, còn tự dưng hoàn thành đượ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 ko nằm trong bảng donhang, hay giá trị nhacung_id trong bảng donhang ko nằm trong bảng nhacung thì những 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_id nhacung_ten
10000 IBM
10001 Hewlett Packard
10002 Microsoft
10003 NVIDIA

Bảng donhang 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/14

Nếu 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;

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

nhacung_id nhacung_ten donhang_ngay
10000 IBM 2003/08/12
10001 Hewlett Packard 2003/08/13
10002 Microsoft <null>
10003 NVIDIA <null>
<null> <null> 2003/08/14

Các hàng Microsoft và NVIDIA vẫn nằm trong bộ kết quả do đang tiêu dùng FULL OUTER JOIN. Khi đó donhang_ngay của những 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 những 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

Các bạn đang xem tin tức tại Tin 24h 24h – Chúc những bạn một ngày vui vẻ

Từ khóa: JOIN trong SQL Server – Quantrimang.com

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai.