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:
Sequence trong SQL Server
Trung Nguyen 31/07/2021
Sequence trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu về các đối tượng Sequence trong SQL Server để tạo ra một chuỗi các giá trị số dựa trên một đặc tả cụ thể.

Cột Identity trong SQL Server
Trung Nguyen 30/07/2021
Cột Identity trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng thuộc tính IDENTITY trong SQL Server để thêm cột định danh vào bảng.

CREATE TABLE trong SQL Server
Trung Nguyen 29/07/2021
CREATE TABLE trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh CREATE TABLE trong SQL Server để tạo một bảng mới.

Ràng buộc NOT NULL trong SQL Server
Trung Nguyen 28/07/2021
Ràng buộc NOT NULL trong SQL Server

Trong hướng dẫn này, bạn sẽ học cách sử dụng ràng buộc NOT NULL trong SQL Server để đảm bảo một cột không chứa dữ liệu NULL.