Trong bài viết này, chúng ta sẽ cùng tìm hiểu về mệnh đề LEFT JOIN MySQL và cách áp dụng nó để truy vấn dữ liệu từ hai bảng trở lên.
Mệnh đề LEFT JOIN cho phép bạn truy vấn dữ liệu từ hai hoặc nhiều bảng. Tương tự như mệnh đề INNER JOIN, the LEFT JOIN là mệnh đề tùy chọn của câu lệnh SELECT, xuất hiện ngay sau mệnh đề FROM.
Giả sử rằng bạn muốn nối hai bảng t1 và t2.
Câu lệnh sau đây cho biết cách sử dụng mệnh đề LEFT JOIN để nối hai bảng:
SELECT
select_list
FROM
t1
LEFT JOIN t2 ON
join_condition;Khi bạn sử dụng mệnh đề LEFT JOIN, các khái niệm về bảng bên trái và bảng bên phải sẽ được giới thiệu.
Trong cú pháp trên, t1 là bảng bên trái và t2 là bảng bên phải.
Mệnh đề LEFT JOIN chọn dữ liệu bắt đầu từ bảng bên trái ( t1). Nó khớp từng hàng từ bảng bên trái ( t1) với mọi hàng từ bảng bên phải( t2) dựa trên join_condition.
Nếu các hàng từ cả hai bảng khiến điều kiện nối được ước tính thành true, thì LEFT JOIN sẽ kết hợp các cột của các hàng từ cả hai bảng thành một hàng mới và bao gồm hàng mới này trong các hàng kết quả.
Trong trường hợp hàng từ bảng bên trái ( t1) không khớp với bất kỳ hàng nào từ bảng bên phải( t2), thì LEFT JOIN vẫn kết hợp các cột của các hàng từ cả hai bảng thành một hàng mới và bao gồm hàng mới trong các hàng kết quả. Tuy nhiên, nó sử dụng NULL cho tất cả các cột của hàng từ bảng bên phải.
Nói cách khác, LEFT JOIN trả về tất cả các hàng từ bảng bên trái bất kể hàng từ bảng bên trái có khớp với hàng từ bảng bên phải hay không.
Nếu không khớp, các cột của hàng từ bảng bên phải sẽ chứa NULL.
Sơ đồ Venn sau đây giúp bạn hình dung cách hoạt động của mệnh đề LEFT JOIN:

Hãy lấy một số ví dụ về việc sử dụng mệnh đề LEFT JOIN.
Chúng ta sẽ sử dụng hai bảng customers và orders trong cơ sở dữ liệu mẫu .

Mỗi khách hàng có thể có 0 đơn hàng hoặc nhiều đơn hàng nhưng mỗi đơn hàng phải thuộc về một khách hàng.
Truy vấn này sử dụng mệnh đề LEFT JOIN để tìm tất cả khách hàng và đơn đặt hàng của họ:
SELECT
customers.customerNumber,
customerName,
orderNumber,
status
FROM
customers
LEFT JOIN orders ON
orders.customerNumber = customers.customerNumber;Ngoài ra, bạn có thể tiết kiệm một số thao tác nhập bằng cách sử dụng bí danh (alias):
SELECT
c.customerNumber,
customerName,
orderNumber,
status
FROM
customers c
LEFT JOIN orders o
ON c.customerNumber = o.customerNumber;Kết quả:

Trong ví dụ này:
customers là bảng bên trái và orders là bảng bên phải.LEFT JOIN trả lại tất cả các khách hàng bao gồm cả những khách hàng không có đơn đặt hàng. Nếu một khách hàng không có đơn đặt hàng, các giá trị trong cột orderNumber và status là NULL.Vì cả bảng customers và order đều có cùng tên cột ( customerNumber) trong điều kiện nối với toán tử bằng nên bạn có thể sử dụng cú pháp USING như sau:
SELECT customerNumber, customerName, orderNumber, status FROM customers LEFT JOIN orders USING (customerNumber);
Các mệnh đề sau là tương đương:
USING (customerNumber)
Và:
ON c.customerNumber = o.customerNumber
Nếu bạn thay mệnh đề LEFT JOIN bằng mệnh đề INNER JOIN, bạn sẽ nhận được những khách hàng duy nhất có ít nhất một đơn hàng.
Mệnh đề này LEFT JOINrất hữu ích khi bạn muốn tìm các hàng trong một bảng không có hàng phù hợp từ một bảng khác.
Ví dụ sau sử dụng LEFT JOIN để tìm những khách hàng không có đơn đặt hàng:
SELECT
c.customerNumber,
c.customerName,
o.orderNumber,
o.status
FROM
customers c
LEFT JOIN orders o
ON c.customerNumber = o.customerNumber
WHERE
orderNumber IS NULL;Kết quả:

Chúng ta sẽ dử dụng 3 bảng employees, customers và payments:

Ví dụ này sử dụng hai mệnh đề LEFT JOIN để nối ba bảng employees, customers, và payments:
SELECT
lastName,
firstName,
customerName,
checkNumber,
amount
FROM
employees
LEFT JOIN customers ON
employeeNumber = salesRepEmployeeNumber
LEFT JOIN payments ON
payments.customerNumber = customers.customerNumber
ORDER BY
customerName,
checkNumber;Hình ảnh này cho thấy một phần kết quả:

Làm thế nào nó hoạt động.
LEFT JOIN trả về tất cả nhân viên và khách hàng đại diện cho từng nhân viên hoặc trả về null NULL nếu nhân viên không phụ trách bất kỳ khách hàng nào.LEFT JOIN trả về các khoản thanh toán của từng khách hàng được đại diện bởi một nhân viên hoặc NULL nếu khách hàng không có khoản thanh toán nào.WHERE clause vs. ON clauseXem ví dụ sau.
SELECT
o.orderNumber,
customerNumber,
productCode
FROM
orders o
LEFT JOIN orderDetails
USING (orderNumber)
WHERE
orderNumber = 10123;Ví dụ này đã sử dụng mệnh đề LEFT JOIN để truy vấn dữ liệu từ các bảng orders và orderDetails. Truy vấn trả về đơn đặt hàng và các chi tiết đơn hàng của số đơn đặt hàng 10123.

Tuy nhiên, nếu bạn chuyển điều kiện từ mệnh đề WHERE này sang mệnh đề ON khác:
SELECT
o.orderNumber,
customerNumber,
productCode
FROM
orders o
LEFT JOIN orderDetails d
ON o.orderNumber = d.orderNumber AND
o.orderNumber = 10123;Nó sẽ có một ý nghĩa khác.
Trong trường hợp này, truy vấn trả về tất cả các đơn đặt hàng nhưng chỉ đơn đặt hàng 10123 mới có các mục hàng được liên kết với nó như trong hình sau:

INNER JOIN, điều kiện trong mệnh đề ON tương đương với điều kiện trong mệnh đề WHERE.LEFT JOIN trong MySQL để nối dữ liệu từ hai hoặc nhiều bảng.Bài viết liên quan:
Bình luận: