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

03/05/2023 - lượt xem
Chia sẻ
 
5/5 - (1 bình chọn)

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.

Giới thiệu về mệnh đề LEFT JOIN trong MySQL

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:

MySQL LEFT JOIN – Biểu đồ Venn
MySQL LEFT JOIN – Biểu đồ Venn

Ví dụ về mệnh đề LEFT JOIN trong MySQL

Hãy lấy một số ví dụ về việc sử dụng mệnh đề LEFT JOIN.

1) Sử dụng mệnh đề LEFT JOIN để nối hai bảng

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.

2) Sử dụng mệnh đề MySQL LEFT JOIN để tìm các hàng chưa khớp

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ả:

3) Sử dụng MySQL LEFT JOIN để nối ba bảng

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

Ví dụ này sử dụng hai mệnh đề LEFT JOIN để nối ba bảng employeescustomers, 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.

  • Đầu tiên 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.
  • Thứ hai 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.

Condition in WHERE clause vs. ON clause

Xem 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 ordersorderDetails. 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:

Tổng kết

  • Lưu ý rằng đối với mệnh đề INNER JOIN, điều kiện trong mệnh đề ON tương đương với điều kiện trong mệnh đề WHERE.
  • Trong hướng dẫn này, bạn đã học cách sử dụng mệnh đề LEFT JOIN trong MySQL để nối dữ liệu từ hai hoặc nhiều bảng.

Bài viết liên quan:

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    5/5 - (1 bình chọn)

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm