Mục lục
ToggleTrong 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 JOIN
rấ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: