Lệnh Left Join trong SQL Server

Trong bài này chúng ta sẽ tìm hiểu Left Join trong SQL Server. Nếu Inner Join là tích hai bảng và chỉ lấy các dòng trùng khóa ngoại với nhau thì Left Join sẽ lấy thêm cả các dòng mà bảng bên trái có nhưng bên phải không có.

1. Cú pháp Left Join trong SQL Server

Left Join sẽ hợp hai bảng lại và lấy những cặp record thỏa mãn ở điều kiện ON + Những dòng dữ liệu ở bảng bên trái có nhưng bảng bên phải không có.

Bạn có đọc phần lý tuyết về Left Join trong SQL để hiểu rõ hơn. Trong bài này mình chỉ nói đến cú pháp và cách dùng mà thôi.

Cú pháp:

SELECT
    select_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;

Trong đó select_list là những field mà bạn muốn câu lệnh này tra về. Bạn có thể chọn các field bất kì, miễn là nó thuộc một trong hai bảng T1T2.

join_predicate chính là điều kiện kiểm tra ràng buộc giữa hai bảng. Nếu dòng record nào thỏa điều kiện này thì ta gọi là thỏa điều kiện ON.

Left Join sẽ trả về những dòng thỏa điện kiện ở ON với nhau và những dòng mà bảng T1 có dữ liệu nhưng bảng T2 không có.

SQL Server LEFT JOIN png

2. Ví dụ về Left Join trong SQL Server

Hãy thực hành ví dụ để bạn hiểu rõ hơn lệnh Left Join trong SQL Server.

Giả sử ta có ba table gồm: products, order_itemsorders có mối liên hệ như lược đồ diagram sau:

orders order items products png

Mỗi đơn hàng sẽ có nhiều sản phẩm, vì vậy ta sẽ có bảng trung gian nằm giữa để chia mối quan hệ (n - n) này thành hai mối quan hệ mới:

  • Gữa productsorder_items là (1 - n)
  • Giữa ordersorder_items là (1 - n)

Bây giờ cần lấy danh sách tên sản phẩm và mã số order_id của các đơn hàng, nhưng với điều kiện là lấy luôn những sản phẩm không có đơn nào, vì vậy ta sẽ đặt bảng products nằm bên trái và order_items nằm bên phải.

SELECT
    product_name,
    order_id
FROM
    production.products p
LEFT JOIN sales.order_items o ON o.product_id = p.product_id
ORDER BY
    order_id;

SQL Server Left Join example png

Như bạn thấy, có một số sản phẩm không có đơn hàng nào và cung có một số sản phẩm có nhiều đơn hàng. Như trong hình thì ta thấy có nhiều sản phẩm nằm trong đơn hàng có order_id = 1.

Đấy là join 2 bảng, bây giờ ta sẽ làm một ví dụ join 3 bảng với nhau.

SELECT
    p.product_name,
    o.order_id,
    i.item_id,
    o.order_date
FROM
    production.products p
	LEFT JOIN sales.order_items i
		ON i.product_id = p.product_id
	LEFT JOIN sales.orders o
		ON o.order_id = i.order_id
ORDER BY
    order_id;

Với trường hợp này thì SQL Server sẽ thực hiện 2 lần Join như sau:

  • Lần thứ nhất join bảng products với order_items => tạo ra danh sách các record và nói là một bảng tạm. Lúc này bảng products là bảng bên trái.
  • Lần thứ hai join bảng tạm đó với bảng orders, lúc này bảng tạm chính là bảng bên trái.

Và đây là kết quả:

SQL Server LEFT JOIN join three tables png

3. Thêm lệnh Where trong Left Join

Nếu bạn muốn lọc thêm điều kiện thì hãy đặt nó trong lệnh WHERE nhé.

Giả sử mình cần lấy thông tin tên các sản phẩm mã đơn hàng của đơn hàng có order_id = 100.

SELECT
    product_name,
    order_id
FROM
    production.products p
LEFT JOIN sales.order_items o 
   ON o.product_id = p.product_id
WHERE order_id = 100
ORDER BY
    order_id;

Như bạn thấy mình đã đặt thêm điều kiện WHERE order_id = 100 để lọc dữ liệu theo yêu cầu bài toán.

SQL Server Left Join and WHERE clause png

Hãy thử di chuyển order_id = 100 vào ON xem thế nào nhé.

SELECT
    p.product_id,
    product_name,
    order_id
FROM
    production.products p
    LEFT JOIN sales.order_items o 
         ON o.product_id = p.product_id AND 
            o.order_id = 100
ORDER BY
    order_id DESC;

SQL Server LEFT JOIN move condition to ON clause png

Kết quả hoàn toàn khác, bởi vì ta đang sử dụng Left Join nên nó trả về luôn cả những record mà bảng bên trái có dữ liệu mà bảng bên phải không có.

Trên là tất cả những kiến thức cơ bản về lệnh Left Join trong SQL Server. Nếu còn vướng mắc thì hãy đặt câu hỏi ở phần bình luận nhé.

Ngẫu nhiên