– Trong hệ quản trị cơ sở dữ liệu MySQL, lệnh RIGHT JOIN được sử dụng để kết hợp các hàng (từ hai cái bảng) lại thành một cái bảng tổng hợp.
– Trong đó, việc kết hợp các hàng sẽ được thực hiện dựa trên nguyên tắc như sau:
- Tất cả các hàng bên trong cái bảng thứ hai (table2) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ nhất (table1)
- Những hàng mà dữ liệu trên nó thỏa điều kiện (condition) thì sẽ được giữ lại, còn những hàng mà dữ liệu trên nó không thỏa điều kiện thì sẽ bị loại bỏ.
- Đối với những hàng trong cái bảng thứ hai (table2) không bắt cặp được với bất kỳ hàng nào bên trong cái bảng thứ nhất (table1) mà thỏa điều kiện thì nó sẽ được ghép với một hàng chứa toàn giá trị NULL.
SELECT *
FROM table1
RIGHT JOIN table2
ON condition;
– Lưu ý: Khi hai cái bảng được kết hợp với nhau, các hàng trong cái bảng thứ nhất (table1) sẽ được đặt bên trái, các hàng trong cái bảng thứ hai (table2) sẽ được ghép bên phải.
MỘT SỐ VÍ DỤ THAM KHẢO
– Trong bài học này, tôi sẽ sử dụng hai cái bảng Customers & Orders như bên dưới để làm một số ví dụ minh họa.
CustomerID | CustomerName | City |
1 | Nguyễn Thành Nhân | Cần Thơ |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long |
3 | Trần Nguyễn Anh Thư | Hậu Giang |
4 | Đinh Nguyên Dương | Trà Vinh |
OrderID | OrderDate | CustomerID | Total |
1 | 2019-02-07 | 4 | 180000 |
2 | 2019-02-18 | 1 | 140000 |
3 | 2019-03-11 | 7 | 280000 |
4 | 2019-04-22 | 3 | 235000 |
5 | 2019-06-13 | 4 | 220000 |
SELECT *
FROM Customers
RIGHT JOIN Orders
ON City="Cần Thơ" OR City="Hậu Giang"
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như sau.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
1 | Nguyễn Thành Nhân | Cần Thơ | 1 | 2019-02-07 | 4 | 180000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 2 | 2019-02-18 | 1 | 140000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 3 | 2019-03-11 | 7 | 280000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 4 | 2019-04-22 | 3 | 235000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 5 | 2019-06-13 | 4 | 220000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 5 | 2019-06-13 | 4 | 220000 |
SELECT *
FROM Customers
RIGHT JOIN Orders
ON City="Sóc Trăng"
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như sau.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
NULL | NULL | NULL | 1 | 2019-02-07 | 4 | 180000 |
NULL | NULL | NULL | 2 | 2019-02-18 | 1 | 140000 |
NULL | NULL | NULL | 3 | 2019-03-11 | 7 | 280000 |
NULL | NULL | NULL | 4 | 2019-04-22 | 3 | 235000 |
NULL | NULL | NULL | 5 | 2019-06-13 | 4 | 220000 |
SELECT OrderID, OrderDate, CustomerName, City, Total
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như sau.
OrderID | OrderDate | CustomerName | City | Total |
1 | 2019-02-07 | Đinh Nguyên Dương | Trà Vinh | 180000 |
2 | 2019-02-18 | Nguyễn Thành Nhân | Cần Thơ | 140000 |
3 | 2019-03-11 | NULL | NULL | 280000 |
4 | 2019-04-22 | Trần Nguyễn Anh Thư | Hậu Giang | 235000 |
5 | 2019-06-13 | Đinh Nguyên Dương | Trà Vinh | 220000 |
GIẢI THÍCH VÍ DỤ 1
CustomerID | CustomerName | City |
1 | Nguyễn Thành Nhân | Cần Thơ |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long |
3 | Trần Nguyễn Anh Thư | Hậu Giang |
4 | Đinh Nguyên Dương | Trà Vinh |
OrderID | OrderDate | CustomerID | Total |
1 | 2019-02-07 | 4 | 180000 |
2 | 2019-02-18 | 1 | 140000 |
3 | 2019-03-11 | 7 | 280000 |
4 | 2019-04-22 | 3 | 235000 |
5 | 2019-06-13 | 4 | 220000 |
SELECT *
FROM Customers
RIGHT JOIN Orders
ON City="Cần Thơ" OR City="Hậu Giang"
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Tất cả các hàng bên trong cái bảng thứ hai (Orders) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ nhất (Customers)
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
1 | Nguyễn Thành Nhân | Cần Thơ | 1 | 2019-02-07 | 4 | 180000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 1 | 2019-02-07 | 4 | 180000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 1 | 2019-02-07 | 4 | 180000 |
4 | Đinh Nguyên Dương | Trà Vinh | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 2 | 2019-02-18 | 1 | 140000 |
4 | Đinh Nguyên Dương | Trà Vinh | 2 | 2019-02-18 | 1 | 140000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 3 | 2019-03-11 | 7 | 280000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 3 | 2019-03-11 | 7 | 280000 |
4 | Đinh Nguyên Dương | Trà Vinh | 3 | 2019-03-11 | 7 | 280000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 4 | 2019-04-22 | 3 | 235000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 4 | 2019-04-22 | 3 | 235000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
4 | Đinh Nguyên Dương | Trà Vinh | 4 | 2019-04-22 | 3 | 235000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 5 | 2019-06-13 | 4 | 220000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 5 | 2019-06-13 | 4 | 220000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 5 | 2019-06-13 | 4 | 220000 |
4 | Đinh Nguyên Dương | Trà Vinh | 5 | 2019-06-13 | 4 | 220000 |
– Những hàng nào thỏa điều kiện City=”Cần Thơ” OR City=”Hậu Giang” thì được giữ lại, còn những hàng không thỏa điều kiện thì bị loại bỏ.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
1 | Nguyễn Thành Nhân | Cần Thơ | 1 | 2019-02-07 | 4 | 180000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 2 | 2019-02-18 | 1 | 140000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 3 | 2019-03-11 | 7 | 280000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 4 | 2019-04-22 | 3 | 235000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 5 | 2019-06-13 | 4 | 220000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 5 | 2019-06-13 | 4 | 220000 |
GIẢI THÍCH VÍ DỤ 2
CustomerID | CustomerName | City |
1 | Nguyễn Thành Nhân | Cần Thơ |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long |
3 | Trần Nguyễn Anh Thư | Hậu Giang |
4 | Đinh Nguyên Dương | Trà Vinh |
OrderID | OrderDate | CustomerID | Total |
1 | 2019-02-07 | 4 | 180000 |
2 | 2019-02-18 | 1 | 140000 |
3 | 2019-03-11 | 7 | 280000 |
4 | 2019-04-22 | 3 | 235000 |
5 | 2019-06-13 | 4 | 220000 |
SELECT *
FROM Customers
RIGHT JOIN Orders
ON City="Sóc Trăng"
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Tất cả các hàng bên trong cái bảng thứ hai (Orders) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ nhất (Customers)
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
1 | Nguyễn Thành Nhân | Cần Thơ | 1 | 2019-02-07 | 4 | 180000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 1 | 2019-02-07 | 4 | 180000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 1 | 2019-02-07 | 4 | 180000 |
4 | Đinh Nguyên Dương | Trà Vinh | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 2 | 2019-02-18 | 1 | 140000 |
4 | Đinh Nguyên Dương | Trà Vinh | 2 | 2019-02-18 | 1 | 140000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 3 | 2019-03-11 | 7 | 280000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 3 | 2019-03-11 | 7 | 280000 |
4 | Đinh Nguyên Dương | Trà Vinh | 3 | 2019-03-11 | 7 | 280000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 4 | 2019-04-22 | 3 | 235000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 4 | 2019-04-22 | 3 | 235000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
4 | Đinh Nguyên Dương | Trà Vinh | 4 | 2019-04-22 | 3 | 235000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 5 | 2019-06-13 | 4 | 220000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 5 | 2019-06-13 | 4 | 220000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 5 | 2019-06-13 | 4 | 220000 |
4 | Đinh Nguyên Dương | Trà Vinh | 5 | 2019-06-13 | 4 | 220000 |
– Những hàng nào thỏa điều kiện City=”Sóc Trăng” thì được giữ lại, còn những hàng không thỏa điều kiện thì bị loại bỏ (trong cái bảng phía trên không có bất kỳ hàng nào thỏa điều kiện, cho nên tất cả đều bị loại bỏ)
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
– Trong cái bảng Orders, cả năm hàng đều không bắt cặp được với bất kỳ hàng nào trong bảng Customers thỏa điều kiện, cho nên mỗi hàng sẽ được ghép với một hàng chứa toàn giá trị NULL.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
NULL | NULL | NULL | 1 | 2019-02-07 | 4 | 180000 |
NULL | NULL | NULL | 2 | 2019-02-18 | 1 | 140000 |
NULL | NULL | NULL | 3 | 2019-03-11 | 7 | 280000 |
NULL | NULL | NULL | 4 | 2019-04-22 | 3 | 235000 |
NULL | NULL | NULL | 5 | 2019-06-13 | 4 | 220000 |
GIẢI THÍCH VÍ DỤ 3
CustomerID | CustomerName | City |
1 | Nguyễn Thành Nhân | Cần Thơ |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long |
3 | Trần Nguyễn Anh Thư | Hậu Giang |
4 | Đinh Nguyên Dương | Trà Vinh |
OrderID | OrderDate | CustomerID | Total |
1 | 2019-02-07 | 4 | 180000 |
2 | 2019-02-18 | 1 | 140000 |
3 | 2019-03-11 | 7 | 280000 |
4 | 2019-04-22 | 3 | 235000 |
5 | 2019-06-13 | 4 | 220000 |
SELECT OrderID, OrderDate, CustomerName, City, Total
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY OrderID ASC, Customers.CustomerID ASC;
– Tất cả các hàng bên trong cái bảng thứ hai (Orders) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ nhất (Customers)
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
1 | Nguyễn Thành Nhân | Cần Thơ | 1 | 2019-02-07 | 4 | 180000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 1 | 2019-02-07 | 4 | 180000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 1 | 2019-02-07 | 4 | 180000 |
4 | Đinh Nguyên Dương | Trà Vinh | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 2 | 2019-02-18 | 1 | 140000 |
4 | Đinh Nguyên Dương | Trà Vinh | 2 | 2019-02-18 | 1 | 140000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 3 | 2019-03-11 | 7 | 280000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 3 | 2019-03-11 | 7 | 280000 |
4 | Đinh Nguyên Dương | Trà Vinh | 3 | 2019-03-11 | 7 | 280000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 4 | 2019-04-22 | 3 | 235000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 4 | 2019-04-22 | 3 | 235000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
4 | Đinh Nguyên Dương | Trà Vinh | 4 | 2019-04-22 | 3 | 235000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 5 | 2019-06-13 | 4 | 220000 |
2 | Hoàng Nghĩa Tuyến | Vĩnh Long | 5 | 2019-06-13 | 4 | 220000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 5 | 2019-06-13 | 4 | 220000 |
4 | Đinh Nguyên Dương | Trà Vinh | 5 | 2019-06-13 | 4 | 220000 |
– Những hàng nào thỏa điều kiện Customers.CustomerID = Orders.CustomerID thì được giữ lại, còn những hàng không thỏa điều kiện thì bị loại bỏ.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
4 | Đinh Nguyên Dương | Trà Vinh | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
4 | Đinh Nguyên Dương | Trà Vinh | 5 | 2019-06-13 | 4 | 220000 |
– Trong cái bảng Orders, hàng có OrderID là 3 không bắt cặp được với bất kỳ hàng nào trong bảng Customers thỏa điều kiện, cho nên nó sẽ được ghép với một hàng chứa toàn giá trị NULL.
CustomerID | CustomerName | City | OrderID | OrderDate | CustomerID | Total |
4 | Đinh Nguyên Dương | Trà Vinh | 1 | 2019-02-07 | 4 | 180000 |
1 | Nguyễn Thành Nhân | Cần Thơ | 2 | 2019-02-18 | 1 | 140000 |
NULL | NULL | NULL | 3 | 2019-03-11 | 7 | 280000 |
3 | Trần Nguyễn Anh Thư | Hậu Giang | 4 | 2019-04-22 | 3 | 235000 |
4 | Đinh Nguyên Dương | Trà Vinh | 5 | 2019-06-13 | 4 | 220000 |
– Ngoài ra, bởi vì lệnh SELECT chỉ lấy năm cột OrderID OrderDate CustomerName City Total cho nên hai cột CustomerID sẽ bị loại bỏ khỏi cái bảng kết hợp phía trên, đồng thời các cột sẽ được sắp xếp theo thứ tự như bên dưới.
OrderID | OrderDate | CustomerName | City | Total |
1 | 2019-02-07 | Đinh Nguyên Dương | Trà Vinh | 180000 |
2 | 2019-02-18 | Nguyễn Thành Nhân | Cần Thơ | 140000 |
3 | 2019-03-11 | NULL | NULL | 280000 |
4 | 2019-04-22 | Trần Nguyễn Anh Thư | Hậu Giang | 235000 |
5 | 2019-06-13 | Đinh Nguyên Dương | Trà Vinh | 220000 |