– 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;
– 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
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 |
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 |
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 |