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 Smith và Ana 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 OrderID và Product 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 Laptop và Smartphone đã đượ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 Tablet và Smartwatch 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 SupplierName và TotalQuantity là NULL.
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 Laptop và Global 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 SupplierName là NULL.
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. Tablet và Smartwatch 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.
This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.
Strictly Necessary Cookies
Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.
If you disable this cookie, we will not be able to save your preferences. This means that every time you visit this website you will need to enable or disable cookies again.