Thời gian đọc: 9 phút
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.
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
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;
OrderID | Product | CustomerName |
---|---|---|
101 | Laptop | John Smith |
102 | Smartphone | Ana Williams |
NULL | NULL | Maria Anders |
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;
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 |
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.
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ạ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.
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;
SupplierName | ProductName | Price | TotalQuantity |
---|---|---|---|
Tech Supplies | Laptop | 800 | 5 |
Global Gadgets | Smartphone | 500 | 10 |
NULL | Tablet | 300 | NULL |
Infinity Goods | Smartwatch | 200 | 7 |
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;
SupplierName | ProductName | Price |
---|---|---|
Tech Supplies | Laptop | 800 |
Global Gadgets | Smartphone | 500 |
NULL | Tablet | 300 |
Infinity Goods | Smartwatch | 200 |
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;
SupplierName | ProductName | Price |
---|---|---|
Tech Supplies | Laptop | 800 |
Global Gadgets | Smartphone | 500 |
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;
ProductName | Price |
---|---|
Tablet | 300 |
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.