Khi làm việc với cơ sở dữ liệu, việc sử dụng các phép JOIN để kết hợp dữ liệu từ nhiều bảng là một kỹ thuật rất phổ biến. Tuy nhiên, các loại phép JOIN như INNER JOIN, LEFT JOIN, và RIGHT JOIN có những đặc điểm riêng biệt và cách hoạt động khác nhau. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về sự khác biệt giữa các loại JOIN này trong SQL, cách sử dụng chúng, và các trường hợp áp dụng cụ thể.

1. INNER JOIN

1.1. Khái Niệm

INNER JOIN là phép JOIN được sử dụng để trả về các hàng có dữ liệu khớp nhau giữa các bảng dựa trên một điều kiện cụ thể. Chỉ những hàng có giá trị khớp ở cả hai bảng mới được trả về trong kết quả.

1.2. Cách Hoạt Động

Khi sử dụng INNER JOIN, SQL sẽ so sánh các giá trị từ hai bảng dựa trên điều kiện được chỉ định. Nếu giá trị trong cả hai bảng khớp nhau, hàng đó sẽ xuất hiện trong kết quả. Nếu không có sự khớp, hàng đó sẽ bị loại bỏ khỏi kết quả trả về.

1.3. Ví Dụ

Giả sử bạn có hai bảng: Customers (khách hàng) và Orders (đơn hàng).

Customers

CustomerIDName
1Alice
2Bob
3Charlie

Orders

OrderIDCustomerIDProduct
1011Laptop
1022Phone
1032Tablet

Câu truy vấn sau sử dụng INNER JOIN để lấy thông tin về khách hàng và các đơn hàng của họ:

SELECT Customers.Name, Orders.Product
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Kết quả:

NameProduct
AliceLaptop
BobPhone
BobTablet

Trong trường hợp này, INNER JOIN chỉ trả về những khách hàng có đơn hàng. Khách hàng Charlie không có đơn hàng nên không xuất hiện trong kết quả.

2. LEFT JOIN (LEFT OUTER JOIN)

2.1. Khái Niệm

LEFT JOIN trả về tất cả các hàng từ bảng bên trái (left table), kể cả khi không có hàng tương ứng ở bảng bên phải (right table). Nếu không có sự khớp ở bảng bên phải, các cột tương ứng sẽ có giá trị NULL.

2.2. Cách Hoạt Động

Khi sử dụng LEFT JOIN, tất cả các hàng của bảng bên trái đều được trả về. Nếu có hàng tương ứng ở bảng bên phải, dữ liệu sẽ được hiển thị; nếu không có, các cột từ bảng bên phải sẽ được điền bằng NULL.

2.3. Ví Dụ

Tiếp tục với ví dụ về CustomersOrders, câu truy vấn sau sẽ sử dụng LEFT JOIN:

SELECT Customers.Name, Orders.Product
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Kết quả:

NameProduct
AliceLaptop
BobPhone
BobTablet
CharlieNULL

Trong trường hợp này, khách hàng Charlie không có đơn hàng, nhưng vẫn được liệt kê trong kết quả với cột Product có giá trị NULL.

3. RIGHT JOIN (RIGHT OUTER JOIN)

3.1. Khái Niệm

RIGHT JOIN ngược lại với LEFT JOIN, trả về tất cả các hàng từ bảng bên phải (right table), kể cả khi không có hàng tương ứng ở bảng bên trái. Nếu không có sự khớp ở bảng bên trái, các cột tương ứng sẽ có giá trị NULL.

3.2. Cách Hoạt Động

Với RIGHT JOIN, tất cả các hàng từ bảng bên phải đều được trả về, ngay cả khi không có dữ liệu tương ứng ở bảng bên trái. Nếu không có hàng khớp ở bảng bên trái, các cột của bảng bên trái sẽ được điền NULL.

3.3. Ví Dụ

Tiếp tục với ví dụ trên, câu truy vấn sau sử dụng RIGHT JOIN:

SELECT Customers.Name, Orders.Product
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Kết quả:

NameProduct
AliceLaptop
BobPhone
BobTablet

Trong trường hợp này, vì tất cả các đơn hàng đều có khách hàng tương ứng, kết quả sẽ giống với INNER JOIN. Tuy nhiên, nếu có đơn hàng không có khách hàng tương ứng, chúng sẽ được hiển thị với cột Name có giá trị NULL.

4. So Sánh Giữa INNER JOIN, LEFT JOIN và RIGHT JOIN

JOIN TypeTrả về những hàng nào?
INNER JOINTrả về các hàng có giá trị khớp nhau ở cả hai bảng.
LEFT JOINTrả về tất cả các hàng từ bảng bên trái. Nếu không có giá trị khớp ở bảng bên phải, giá trị sẽ là NULL.
RIGHT JOINTrả về tất cả các hàng từ bảng bên phải. Nếu không có giá trị khớp ở bảng bên trái, giá trị sẽ là NULL.

Khi Nào Sử Dụng INNER JOIN?

  • Khi bạn chỉ muốn lấy những dữ liệu khớp nhau giữa các bảng.
  • Ví dụ: lấy các khách hàng đã đặt hàng.

Khi Nào Sử Dụng LEFT JOIN?

  • Khi bạn muốn lấy tất cả dữ liệu từ bảng bên trái, kể cả khi không có sự khớp tương ứng từ bảng bên phải.
  • Ví dụ: lấy tất cả khách hàng, bao gồm cả những người chưa đặt hàng.

Khi Nào Sử Dụng RIGHT JOIN?

  • Khi bạn muốn lấy tất cả dữ liệu từ bảng bên phải, kể cả khi không có sự khớp tương ứng từ bảng bên trái.
  • Ví dụ: lấy tất cả đơn hàng, kể cả những đơn hàng không có khách hàng tương ứng (trong trường hợp dữ liệu không hoàn thiện).

Kết Luận

Việc chọn loại JOIN phù hợp phụ thuộc vào yêu cầu dữ liệu của bạn. INNER JOIN phù hợp khi bạn chỉ muốn dữ liệu khớp từ cả hai bảng. LEFT JOINRIGHT JOIN hữu ích khi bạn muốn lấy tất cả các hàng từ một bảng nhất định, kể cả khi không có dữ liệu khớp ở bảng còn lại. Việc hiểu rõ sự khác biệt giữa các loại JOIN sẽ giúp bạn làm việc với cơ sở dữ liệu hiệu quả hơn và tối ưu hóa các truy vấn SQL của mình.