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.
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:
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.
Xem các bảng products
và order_items
sau đây:
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: products
và order_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ả:
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ả:
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.orders
và sales.order_items
sử dụng mệnh đề LEFT JOIN
:
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ả:
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ả:
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ả:
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.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ tìm hiểu về GUID trong SQL Server và cách sử dụng hàm NEWID() để tạo giá trị GUID.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATETIMEOFFSET trong SQL Server để thao tác datetime với múi giờ.
Trong hướng dẫn này, bạn sẽ học cách lưu trữ thời gian trong ngày trong cơ sở dữ liệu bằng cách sử dụng kiểu dữ liệu TIME trong SQL Server.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATE trong SQL Server để lưu trữ dữ liệu ngày tháng trong một bảng.