Web Cơ Bản

Tìm hiểu RIGHT JOIN trong MySQL

- 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;
table1
table2

- 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
Ví dụ 1:
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
Ví dụ 2:
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
Ví dụ 3:
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