LEFT JOIN trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu về cách sử dụng mệnh đề LEFT JOIN trong SQL Server để truy vấn dữ liệu từ nhiều bảng.

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

Mệnh đề LEFT JOIN cho phép bạn truy vấn dữ liệu từ nhiều bảng. Nó trả về tất cả các bản ghi từ bảng bên trái và các bản ghi phù hợp từ bảng bên phải.

Nếu không có bản ghi phù hợp được tìm thấy trong bảng bên phải, các cột của bảng bên phải sẽ có giá trị NULL.

Sau đây minh họa cách join hai bảng T1 và T2 bằng mệnh đề LEFT JOIN:

SELECT
    select_list
FROM
    T1
LEFT JOIN T2 ON
    join_predicate;

Trong cú pháp này, T1 và T2 lần lượt là các bảng bên trái và bên phải.

Đối với mỗi bản ghi từ bảng T1, truy vấn so sánh nó với tất cả các bản ghi từ bảng T2. Nếu một cặp bản ghi làm cho biểu thức join được đánh giá là TRUE, giá trị các cột từ các bản ghi này sẽ được kết hợp để tạo thành một bản ghi mới sau đó được đưa vào trong tập kết quả.

Nếu một bản ghi từ bảng bên trái (T1) không có bất kỳ bản ghi phù hợp nào từ bảng T2, truy vấn kết hợp các giá trị cột của bản ghi từ bảng bên trái với các giá trị NULL cho mỗi cột từ bảng bên phải.

Nói tóm lại, mệnh đề LEFT JOIN trả về tất cả các bản ghi từ bảng bên trái (T1) và các bản ghi khớp từ bảng bên phải (T2) hoặc các giá trị NULL nếu không khớp.

Dưới đây minh họa LEFT JOIN hai bảng T1 (1, 2, 3) và T2 (A, B, C). Mệnh đề LEFT JOIN sẽ khớp các bản ghi từ bảng T1 với các bản ghi từ bảng T2 bằng cách sử dụng các mẫu:

LEFT JOIN trong SQL Server

Trong hình minh họa này, không có bản ghi nào từ bảng T2 khớp với bản ghi 1 từ bảng T1, do đó, giá trị NULL được sử dụng. Bản ghi 2 và 3 từ bảng T1 khớp với các bản ghi A và B từ bảng T2 tương ứng.

Ví dụ LEFT JOIN trong SQL Server

Xem các bảng productsorder_items sau đây:

Ví dụ LEFT JOIN trong SQL Server

Mỗi chi tiết đơn hàng có một sản phẩm. Liên kết giữa bảng order_items và bảng products là cột product_id.

Câu lệnh sau sử dụng mệnh đề LEFT JOIN để truy vấn dữ liệu từ bảng: productsorder_items

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;

Đây là kết quả:

Ví dụ LEFT JOIN trong SQL Server

Như bạn thấy rõ từ tập kết quả, một danh sách NULL trong cột order_id biểu thị rằng các sản phẩm tương ứng chưa được bán cho bất kỳ khách hàng nào.

Có thể sử dụng mệnh đề WHERE để giới hạn tập kết quả. Truy vấn sau đây trả về các sản phẩm không xuất hiện trong bất kỳ đơn đặt hàng nào:

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 IS NULL
ORDER BY
    order_id;

Đây là kết quả:

Ví dụ LEFT JOIN trong SQL Server

Như mọi khi, SQL Server xử lý mệnh đề WHERE sau mệnh đề LEFT JOIN.

Ví dụ sau đây cho thấy cách join ba bảng: production.products, sales.orderssales.order_items sử dụng mệnh đề LEFT JOIN:

Ví dụ LEFT JOIN trong SQL Server
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;

Đây là kết quả:

Ví dụ LEFT JOIN trong SQL Server

Điều kiện trong mệnh đề ON với WHERE

Truy vấn sau đây tìm thấy các sản phẩm thuộc về id đơn hàng là 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;

Đây là kết quả:

Ví dụ LEFT JOIN trong SQL Server

Hãy chuyển điều kiện order_id = 100 sang mệnh đề ON:

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;

Đây là kết quả:

Ví dụ LEFT JOIN trong SQL Server

Truy vấn trả về tất cả các sản phẩm nhưng chỉ những sản phẩm của đơn hàng có id 100 mới có thông tin của đơn hàng.

Sở dĩ có kết quả như vậy là do mệnh đề LEFT JOIN ở trên sẽ lấy tất cả các bản ghi ở bảng products kết hợp với các bản ghi có order_id = 100 ở bảng order_items (không phải tất cả bản ghi ở bảng order_items).

Do đó bạn phải thật chú ý khi sử dụng điều kiện lọc ở mệnh đề join.

Lưu ý: đối với mệnh đề INNER JOIN, điều kiện trong mệnh đề ON là tương đương về chức năng nếu nó được đặt 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 SQL Server để lấy dữ liệu từ nhiều bảng liên quan.

SQL Server
Bài Viết Liên Quan:
INTERSECT trong SQL Server
Trung Nguyen 22/11/2020
INTERSECT trong SQL Server

Tìm hiểu cách sử dụng toán tử INTERSECT trong SQL Server để trả về phần giao nhau của các tập kết quả của hai truy vấn.

EXCEPT trong SQL Server
Trung Nguyen 22/11/2020
EXCEPT trong SQL Server

Tìm hiểu cách sử dụng EXCEPT trong SQL Server để loại trừ tập kết quả của một truy vấn ra khỏi tập kết quả của một truy vấn khác.

SQL Server: Hướng dẫn subquery trong SQL Server từ A-Z
Trung Nguyen 22/11/2020
SQL Server: Hướng dẫn subquery trong SQL Server từ A-Z

Tìm hiểu về subquery, toán tử EXISTS, ANY, ALL trong SQL Server và cách sử dụng truy vấn con để truy vấn dữ liệu.

UNION trong SQL Server
Trung Nguyen 22/11/2020
UNION trong SQL Server

Tìm hiểu cách sử dụng UNION trong SQL Server để kết hợp kết quả của hai hoặc nhiều truy vấn thành một tập kết quả duy nhất.