Header Ads

Seo Services

Hế lô anh em ✌️✌️✌️

Trong bài viết trước mình đã cùng anh em tìm hiểu về câu lệnh INNER JOIN trong MySQL. Anh em nào chưa đọc thì có thể đọc thêm tại đây.

Trong bài viết tiếp theo này vẫn là về các câu lệnh JOIN nhưng mình sẽ cùng anh em tìm hiểu về LEFT JOIN - cũng là một trong những câu lệnh JOIN được sử dụng rất nhiều.

1/ Định nghĩa, Cú pháp, Tính chất

1.1 - Định nghĩa.

Về mặt định nghĩa thì LEFT JOIN cũng giống như INNER JOIN. Sử dụng LEFT JOIN cho phép chúng ta kết hợp dữ liệu ở hai hay nhiều bảng với nhau.

Tuy nhiên khi sử dụng LEFT JOIN chúng ta sẽ có hai khái niệm đó là "left table" và "right table". Anh em phải lưu ý chỗ này.

1.2 - Cú pháp, tính chất. 

Về cú pháp thì câu lệnh LEFT JOIN có cú pháp tổng quát như sau:

SELECT 
select_list
FROM
t1
LEFT JOIN t2 ON
join_condition;

Quay lại với khái niệm "left table" và "right table" thì trong cú pháp bên trên t1 chính là left tablet2 chính là right table.

Câu lệnh LEFT JOIN sẽ kết hợp từng hàng từ t1 với mỗi hàng của t2 thông qua điều kiện (join condition)

+ Nếu điều kiện thỏa mãn thì LEFT JOIN sẽ kết hợp dữ liệu (những cột được chọn) của hàng tương ứng ở bảng t1 với dữ liệu của hàng tương ứng (cột) ở bảng t2 thành một hàng mới.

+ Trường hợp điều kiện không thỏa mãn thì LEFT JOIN vẫn sẽ kết hợp nhưng tất cả các thông tin của hàng tương ứng ở bảng t2 sẽ có giá trị "null".

+ Nói cách khác thì LEFT JOIN trả về tất cả các hàng của bảng bên trái bất kể một hàng từ bảng bên trái có khớp điều kiện với hàng nào của bảng bên phải hay không.

Lý thuyết có thể hơi khó hiểu chút, bây giờ mình sẽ cùng anh em vào phần ví dụ thì dễ hình dung hơn.

2/ Ví dụ.

Như thường lệ thì mình có sử dụng một database mẫu, anh em có thể download tai đây.

Ví dụ 1: Sử dụng LEFF JOIN để join 2 bảng

Với ví dụ đầu tiên này mình sẽ sử dụng hai bảng customersorders để làm ví dụ. Cấu trúc của hai bảng anh em có thể thấy như sau:

Với mỗi khách hàng (customer) trong bảng customers thì không nhất thiết phải có đơn hàng (order) trong bảng orders.

Nhưng ngược lại với mỗi đơn hàng (order) trong bảng orders thì lại bắt buộc phải thuộc về một khách hàng (customer) trong bảng customers.

Vậy làm sao để kết hợp hai bảng này để chúng ta có được danh sách khách hàng và đơn hàng tương ứng của họ? Chắc chắn chúng ta phải "join" rồi nhưng nếu sử dụng INNER JOIN thì các khách hàng mà không có đơn hàng sẽ không được hiển thị.

Chính vì vậy chúng ta sẽ sử dụng LEFT JOIN (với left table là bảng customersright table là bảng orders) như sau:

SELECT 
c.customerNumber,
c.customerName,
c.phone,
o.orderNumber,
o.status
FROM
customers c
LEFT JOIN orders o ON
c.customerNumber = o.customerNumber;

Khi đó output sẽ như sau:

customerNumber|customerName                     |phone            |orderNumber|status   
--------------+---------------------------------+-----------------+-----------+---------
103|Atelier graphique |40.32.2555 | 10123|Shipped |
103|Atelier graphique |40.32.2555 | 10298|Shipped |
103|Atelier graphique |40.32.2555 | 10345|Shipped |
112|Signal Gift Stores |7025551838 | 10124|Shipped |
...|... |... | ...|... |
125|Havel & Zbyszek Co |(26) 642-7555 | null|null |
128|Blauer See Auto, Co. |+49 69 66 90 2555| 10101|Shipped |
...|... |... | ...| ...|

Toàn bộ danh sách khách hàng sẽ được lấy hết, nếu khách hàng nào không có đơn hàng thì hai trường orderNumberstatus ở bảng orders sẽ có giá trị null. Đó chính là LEFT JOIN!

Note:

+ Cũng giống như INNER JOIN, với LEFT JOIN anh em hoàn toàn có thể sử dụng USING thay cho ON với cú pháp như sau:

SELECT 
c.customerNumber,
c.customerName,
c.phone,
o.orderNumber,
o.status
FROM
customers c
LEFT JOIN orders o USING(customerNumber);

Kết quả cũng sẽ tương tự như khi sử dụng với ON chỉ có điều là ở đây cả hai bảng trường customerNumber (khóa ngoại) phải trùng tên mới được.

+ Ngoài ra sử dụng LEFT JOIN anh em hoàn toàn có thể lọc được danh sách những khách hàng không có đơn hàng nào một cách rất đơn giản như sau:

SELECT 
c.customerNumber,
c.customerName,
c.phone,
o.orderNumber,
o.status
FROM customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber
WHERE o.orderNumber IS NULL;

Khi đó output sẽ là toàn bộ khách hàng không có đơn hàng:

customerNumber|customerName                  |phone           |orderNumber|status|
--------------+------------------------------+----------------+-----------+-------+
125|Havel & Zbyszek Co |(26) 642-7555 | null| null|
168|American Souvenirs Inc |2035557845 | null| null|
169|Porto Imports Co. |(1) 356-5555 | null| null|
206|Asian Shopping Network, Co |+612 9411 1555 | null| null|
223|Natürlich Autos |0372-555188 | null| null|
237|ANG Resellers |(91) 745 6555 | null| null|
247|Messner Shopping Network |069-0555984 | null| null|
...|... |... |... |... |

Ví dụ 2: Sử dụng LEFF JOIN để join 3 bảng

Trong ví dụ tiếp theo này mình sẽ cùng anh em thực hiện join 3 bảng thông qua việc sử dụng LEFT JOIN. Ở đây mình sử dụng các bảng payments, customers và employees như hình bên dưới.

Về quan hệ của 3 bảng này thì đầu tiên là giữa employeescustomers chúng ta có sự liên hệ thông qua trường salesRepEmployeeNumber ở bảng customersemployeeNumber ở bảng employees. Còn hai bảng customerspayments thì liên kết với nhau thông qua trường customerNumber.

Khách hàng (customer) sẽ được phụ trách bởi nhân viên (employee) và mỗi khách hành sẽ có những thanh toán khác nhau (payment)

Vậy làm sao bây giờ mình muốn lấy thông tin của toàn bộ nhân viên kèm theo khách hàng mà họ phụ trách và danh sách những thanh toán của khách hàng đó?

Tất nhiên không phải nhân viên nào cũng có khách hàng đang phụ trách và không phải khách hàng nào cũng có thanh toán.

Khi đó mình sẽ sử dụng câu lệnh LEFT JOIN như sau:

SELECT 
CONCAT(e.lastName, ' ', e.firstName) AS employeeName ,
c.customerName,
p.checkNumber,
p.amount
FROM
employees e
LEFT JOIN customers c ON
e.employeeNumber = c.salesRepEmployeeNumber
LEFT JOIN payments p ON
p.customerNumber = c.customerNumber

Kết quả sẽ như sau:

employeeName     |customerName                     |checkNumber|amount   |
-----------------+---------------------------------+-----------+---------+
Murphy Diane |null |null |null |
Patterson Mary |null |null |null |
Firrelli Jeff |null |null |null |
Patterson William|null |null |null |
Bondur Gerard |null |null |null |
Bow Anthony |null |null |null |
Jennings Leslie |Mini Gifts Distributors Ltd. |AE215433 |101244.59|
Jennings Leslie |Mini Gifts Distributors Ltd. |BG255406 | 85410.87|
Jennings Leslie |Mini Gifts Distributors Ltd. |CQ287967 | 11044.30|
Jennings Leslie |Mini Gifts Distributors Ltd. |ET64396 | 83598.04|
Jennings Leslie |Mini Gifts Distributors Ltd. |HI366474 | 47142.70|
Jennings Leslie |Mini Gifts Distributors Ltd. |HR86578 | 55639.66|
Jennings Leslie |Mini Gifts Distributors Ltd. |KI131716 |111654.40|
Jennings Leslie |Mini Gifts Distributors Ltd. |LF217299 | 43369.30|
Jennings Leslie |Mini Gifts Distributors Ltd. |NT141748 | 45084.38|
Jennings Leslie |Mini Wheels Co. |DM826140 | 26248.78|
Jennings Leslie |Mini Wheels Co. |ID449593 | 23923.93|
Jennings Leslie |Mini Wheels Co. |PI42991 | 16537.85|
Jennings Leslie |Technics Stores Inc. |BR352384 | 2434.25|
Jennings Leslie |Technics Stores Inc. |BR478494 | 50743.65|
Jennings Leslie |Technics Stores Inc. |KG644125 | 12692.19|
Jennings Leslie |Technics Stores Inc. |NI908214 | 38675.13|
Jennings Leslie |Corporate Gift Ideas Co. |DJ15149 | 85559.12|
... |... |... |... |

3/ Lời kết.

Trong nhiều trường hợp LEFT JOIN thực sự là một câu lệnh hữu ích. Đặc biệt là trong các trường hợp chúng ta muốn lấy dữ liệu từ nhiều bảng thông qua điều kiện nhưng điều kiện này không phải lúc nào cũng tồn tại dữ liệu ở cả left table và right table.

Hi vọng qua bài viết này sẽ giúp anh em hiểu thêm về cú pháp cũng như cách thức hoạt động của câu lệnh LEFT JOIN.

Hẹn gặp lại anh em trong các bài viết tiếp theo!

Tham khảo:

https://www.mysqltutorial.org/mysql-left-join.aspx

Thank all ❤️❤️❤️

Không có nhận xét nào:

Được tạo bởi Blogger.