Web Cơ Bản

Cách sử dụng LEFT JOIN trong MySQL

- Trong hệ quản trị cơ sở dữ liệu MySQL, lệnh LEFT JOIN được 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ứ nhất (table1) 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ứ hai (table2)
  • 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ứ nhất (table1) không bắt cặp được với bất kỳ hàng nào bên trong cái bảng thứ hai (table2) 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
LEFT 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
LEFT JOIN Orders
ON Total > 230000
ORDER BY Customers.CustomerID ASC, OrderID 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ơ 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 3 2019-03-11 7 280000
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 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 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
Ví dụ 2:
SELECT *
FROM Customers
LEFT JOIN Orders
ON Total > 500000
ORDER BY Customers.CustomerID ASC, OrderID 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ơ NULL NULL NULL NULL
2 Hoàng Nghĩa Tuyến Vĩnh Long NULL NULL NULL NULL
3 Trần Nguyễn Anh Thư Hậu Giang NULL NULL NULL NULL
4 Đinh Nguyên Dương Trà Vinh NULL NULL NULL NULL
Ví dụ 3:
SELECT Customers.CustomerID, CustomerName, City, OrderID, OrderDate, Total
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerID ASC, OrderID 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 Total
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long NULL NULL NULL
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 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
LEFT JOIN Orders
ON Total > 230000
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Tất cả các hàng bên trong cái bảng thứ nhất (Customers) 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ứ hai (Orders)

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 1 2019-02-07 4 180000
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
1 Nguyễn Thành Nhân Cần Thơ 3 2019-03-11 7 280000
1 Nguyễn Thành Nhân Cần Thơ 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 1 2019-02-07 4 180000
2 Hoàng Nghĩa Tuyến Vĩnh Long 2 2019-02-18 1 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long 3 2019-03-11 7 280000
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
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 1 2019-02-07 4 180000
3 Trần Nguyễn Anh Thư Hậu Giang 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 3 2019-03-11 7 280000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
3 Trần Nguyễn Anh Thư Hậu Giang 5 2019-06-13 4 220000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 2 2019-02-18 1 140000
4 Đinh Nguyên Dương Trà Vinh 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
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 Total > 230000 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ơ 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 3 2019-03-11 7 280000
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 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 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000

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
LEFT JOIN Orders
ON Total > 500000
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Tất cả các hàng bên trong cái bảng thứ nhất (Customers) 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ứ hai (Orders)

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 1 2019-02-07 4 180000
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
1 Nguyễn Thành Nhân Cần Thơ 3 2019-03-11 7 280000
1 Nguyễn Thành Nhân Cần Thơ 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 1 2019-02-07 4 180000
2 Hoàng Nghĩa Tuyến Vĩnh Long 2 2019-02-18 1 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long 3 2019-03-11 7 280000
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
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 1 2019-02-07 4 180000
3 Trần Nguyễn Anh Thư Hậu Giang 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 3 2019-03-11 7 280000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
3 Trần Nguyễn Anh Thư Hậu Giang 5 2019-06-13 4 220000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 2 2019-02-18 1 140000
4 Đinh Nguyên Dương Trà Vinh 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
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 Total > 500000 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 Customers, cả bốn hàng đều không bắt cặp được với bất kỳ hàng nào trong bảng Orders 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
1 Nguyễn Thành Nhân Cần Thơ NULL NULL NULL NULL
2 Hoàng Nghĩa Tuyến Vĩnh Long NULL NULL NULL NULL
3 Trần Nguyễn Anh Thư Hậu Giang NULL NULL NULL NULL
4 Đinh Nguyên Dương Trà Vinh NULL NULL NULL NULL

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 Customers.CustomerID, CustomerName, City, OrderID, OrderDate, Total
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Tất cả các hàng bên trong cái bảng thứ nhất (Customers) 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ứ hai (Orders)

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 1 2019-02-07 4 180000
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
1 Nguyễn Thành Nhân Cần Thơ 3 2019-03-11 7 280000
1 Nguyễn Thành Nhân Cần Thơ 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 1 2019-02-07 4 180000
2 Hoàng Nghĩa Tuyến Vĩnh Long 2 2019-02-18 1 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long 3 2019-03-11 7 280000
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
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 1 2019-02-07 4 180000
3 Trần Nguyễn Anh Thư Hậu Giang 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 3 2019-03-11 7 280000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
3 Trần Nguyễn Anh Thư Hậu Giang 5 2019-06-13 4 220000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 2 2019-02-18 1 140000
4 Đinh Nguyên Dương Trà Vinh 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
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
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 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 4 220000

- Trong cái bảng Customers, hàng có CustomerID là 2 không bắt cặp được với bất kỳ hàng nào trong bảng Orders 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
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 NULL NULL NULL NULL
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
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 sáu cột Customers.CustomerID CustomerName City OrderID OrderDate Total cho nên cột CustomerID từ bảng Orders sẽ bị loại bỏ khỏi bảng kết hợp phía trên.

CustomerID CustomerName City OrderID OrderDate Total
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long NULL NULL NULL
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 220000