RIGHT JOIN (hay còn gọi là RIGHT OUTER JOIN) là một kiểu liên kết trong MySQL, tương tự như LEFT JOIN, nhưng nó trả về tất cả các hàng từ bảng bên phải (bảng thứ hai được khai báo), và chỉ trả về các hàng tương ứng từ bảng bên trái nếu có giá trị khớp. Nếu không có bản ghi khớp từ bảng bên trái, các cột của bảng bên trái sẽ có giá trị NULL.

Cú pháp của RIGHT JOIN:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

Giải thích:

  • SELECT column_name(s): Chọn các cột bạn muốn lấy dữ liệu.
  • FROM table1: Bảng bên trái trong liên kết.
  • RIGHT JOIN table2: Bảng bên phải trong liên kết, bảng này sẽ được giữ nguyên tất cả các bản ghi.
  • ON table1.column_name = table2.column_name: Điều kiện liên kết giữa hai bảng dựa trên cột có giá trị khớp.

Ví dụ cơ bản về RIGHT JOIN:

Giả sử bạn có hai bảng sau:

Bảng Customers (thông tin khách hàng):

CustomerID CustomerName Country
1 John Smith USA
2 Ana Williams Canada
3 Maria Anders Germany

Bảng Orders (thông tin đơn hàng):

OrderID CustomerID Product
101 1 Laptop
102 2 Smartphone
103 4 Tablet

Giả sử bạn muốn liệt kê tất cả các đơn hàng và tên khách hàng của chúng. Bạn sẽ sử dụng RIGHT JOIN để lấy tất cả đơn hàng, ngay cả khi không có khách hàng tương ứng.

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

Kết quả:

OrderID Product CustomerName
101 Laptop John Smith
102 Smartphone Ana Williams
NULL NULL Maria Anders

Giải thích:

  • John SmithAna Williams có đơn hàng, nên thông tin đơn hàng của họ được hiển thị.
  • Maria Anders không có đơn hàng, nhưng do sử dụng RIGHT JOIN, tên của cô ấy vẫn xuất hiện trong kết quả, và giá trị của các cột OrderIDProduct sẽ là NULL.

So sánh RIGHT JOIN và LEFT JOIN:

  • LEFT JOIN trả về tất cả các hàng từ bảng bên trái và các giá trị khớp từ bảng bên phải.
  • RIGHT JOIN trả về tất cả các hàng từ bảng bên phải và các giá trị khớp từ bảng bên trái.

Ví dụ nâng cao với RIGHT JOIN:

Giả sử bạn có thêm một bảng Products và bạn muốn kết hợp dữ liệu từ các bảng này để liệt kê tất cả các sản phẩm đã được bán (nếu có), và tên của khách hàng đã mua chúng. Nếu một sản phẩm chưa được bán, nó vẫn sẽ xuất hiện trong kết quả với giá trị NULL cho cột khách hàng.

Bảng Products:

ProductID ProductName Price
1001 Laptop 800
1002 Smartphone 500
1003 Tablet 300
1004 Smartwatch 200

Truy vấn sử dụng RIGHT JOIN trên ba bảng để liệt kê tất cả sản phẩm và thông tin đơn hàng (nếu có):

SELECT Products.ProductName, Products.Price, Customers.CustomerName, Orders.OrderDate
FROM Orders
RIGHT JOIN Products ON Orders.ProductID = Products.ProductID
LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Kết quả:

ProductName Price CustomerName OrderDate
Laptop 800 John Smith 2024-01-01
Smartphone 500 Ana Williams 2024-01-03
Tablet 300 NULL NULL
Smartwatch 200 NULL NULL

Giải thích:

  • Các sản phẩm LaptopSmartphone đã được bán, và thông tin khách hàng và ngày đặt hàng của chúng được hiển thị.
  • Sản phẩm TabletSmartwatch chưa được bán, nhưng do sử dụng RIGHT JOIN, chúng vẫn xuất hiện trong kết quả, và giá trị cho các cột khách hàng và ngày đặt hàng là NULL.

Khi nào nên sử dụng RIGHT JOIN:

  • RIGHT JOIN hữu ích khi bạn muốn lấy tất cả dữ liệu từ bảng bên phải và chỉ bổ sung dữ liệu từ bảng bên trái nếu có sự khớp. Điều này đặc biệt hữu ích khi bạn muốn ưu tiên các bản ghi trong bảng bên phải mà không muốn bỏ qua những bản ghi không có đối tác trong bảng bên trái.
  • Ví dụ, nếu bạn cần danh sách tất cả các sản phẩm đã hoặc chưa bán, nhưng vẫn cần hiển thị thông tin đơn hàng nếu có, RIGHT JOIN sẽ rất phù hợp.

RIGHT JOIN thường ít được sử dụng hơn LEFT JOIN, vì bạn có thể chỉ cần đảo ngược thứ tự của các bảng trong LEFT JOIN để có kết quả tương tự. Tuy nhiên, trong một số tình huống nhất định, RIGHT JOIN có thể là lựa chọn tốt hơn tùy vào logic của bài toán.

Ví dụ nâng cao về RIGHT JOIN trong MySQL

Giả sử bạn quản lý một hệ thống quản lý kho hàng với các bảng dữ liệu sau:

Bảng Suppliers (thông tin nhà cung cấp):

SupplierID SupplierName Country
1 Tech Supplies USA
2 Global Gadgets Canada
3 Future Tech Germany
4 Infinity Goods UK

Bảng Products (thông tin sản phẩm):

ProductID ProductName SupplierID Price
101 Laptop 1 800
102 Smartphone 2 500
103 Tablet NULL 300
104 Smartwatch 4 200

Bảng Orders (thông tin đơn hàng):

OrderID ProductID Quantity OrderDate
1001 101 5 2024-01-05
1002 102 10 2024-01-10
1003 104 7 2024-01-15

Bài toán:

Bạn muốn liệt kê tất cả các nhà cung cấp và thông tin về các sản phẩm họ cung cấp (nếu có), cùng với số lượng sản phẩm đã được đặt hàng. Bạn cũng muốn biết các nhà cung cấp chưa có sản phẩm hoặc đơn hàng nào.

Truy vấn nâng cao sử dụng RIGHT JOIN:

SELECT Suppliers.SupplierName, Products.ProductName, Products.Price, SUM(Orders.Quantity) AS TotalQuantity
FROM Suppliers
RIGHT JOIN Products ON Suppliers.SupplierID = Products.SupplierID
LEFT JOIN Orders ON Products.ProductID = Orders.ProductID
GROUP BY Suppliers.SupplierName, Products.ProductName, Products.Price;

Kết quả:

SupplierName ProductName Price TotalQuantity
Tech Supplies Laptop 800 5
Global Gadgets Smartphone 500 10
NULL Tablet 300 NULL
Infinity Goods Smartwatch 200 7

Giải thích:

  • Tech Supplies đã cung cấp sản phẩm Laptop, và tổng số lượng đặt hàng là 5.
  • Global Gadgets đã cung cấp Smartphone, và tổng số lượng đặt hàng là 10.
  • Infinity Goods cung cấp Smartwatch, với tổng số lượng đặt hàng là 7.
  • Tablet chưa được liên kết với nhà cung cấp nào (SupplierID là NULL) và cũng chưa có đơn hàng, do đó, cột SupplierNameTotalQuantityNULL.

Sử dụng RIGHT JOIN để tìm nhà cung cấp không có sản phẩm

Nếu bạn muốn liệt kê tất cả các nhà cung cấp, bao gồm cả những nhà cung cấp chưa có sản phẩm nào trong bảng Products, bạn có thể sử dụng RIGHT JOIN để đảm bảo lấy toàn bộ dữ liệu từ bảng Products và kết hợp với thông tin nhà cung cấp (nếu có).

SELECT Suppliers.SupplierName, Products.ProductName, Products.Price
FROM Suppliers
RIGHT JOIN Products ON Suppliers.SupplierID = Products.SupplierID;

Kết quả:

SupplierName ProductName Price
Tech Supplies Laptop 800
Global Gadgets Smartphone 500
NULL Tablet 300
Infinity Goods Smartwatch 200

Giải thích:

  • Tech Supplies cung cấp LaptopGlobal Gadgets cung cấp Smartphone.
  • Infinity Goods cung cấp Smartwatch.
  • Tablet không được cung cấp bởi nhà cung cấp nào (SupplierID là NULL), do đó cột SupplierNameNULL.

Ví dụ nâng cao với điều kiện lọc

Giả sử bạn muốn liệt kê tất cả các sản phẩm có giá lớn hơn 400 và thông tin về nhà cung cấp (nếu có). Bạn có thể kết hợp RIGHT JOIN với WHERE để lọc dữ liệu.

SELECT Suppliers.SupplierName, Products.ProductName, Products.Price
FROM Suppliers
RIGHT JOIN Products ON Suppliers.SupplierID = Products.SupplierID
WHERE Products.Price > 400;

Kết quả:

SupplierName ProductName Price
Tech Supplies Laptop 800
Global Gadgets Smartphone 500

Giải thích:

  • Kết quả chỉ liệt kê các sản phẩm có giá lớn hơn 400. TabletSmartwatch không xuất hiện vì giá của chúng nhỏ hơn 400.

Sử dụng RIGHT JOIN để kiểm tra sản phẩm không có nhà cung cấp

Bạn có thể sử dụng RIGHT JOIN để tìm ra các sản phẩm chưa có nhà cung cấp bằng cách lọc các bản ghi có giá trị NULL trong cột SupplierName.

SELECT Products.ProductName, Products.Price
FROM Suppliers
RIGHT JOIN Products ON Suppliers.SupplierID = Products.SupplierID
WHERE Suppliers.SupplierName IS NULL;

Kết quả:

ProductName Price
Tablet 300

Giải thích:

  • Truy vấn trả về các sản phẩm không có nhà cung cấp, trong trường hợp này là Tablet.

Khi nào nên sử dụng RIGHT JOIN?

  • Khi bạn muốn lấy toàn bộ dữ liệu từ bảng bên phải, và chỉ lấy các dữ liệu khớp từ bảng bên trái.
  • Khi bạn cần đảm bảo rằng không có dữ liệu nào từ bảng bên phải bị bỏ sót, ngay cả khi không có dữ liệu tương ứng từ bảng bên trái.

RIGHT JOIN rất hữu ích trong các trường hợp bạn cần ưu tiên bảng bên phải và muốn lấy tất cả dữ liệu từ bảng này, bất kể có bản ghi tương ứng trong bảng còn lại hay không.