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:
Bài viết này được đăng tại [free tuts .net]
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 T1
và T2
.
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ó.
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_items
và orders
có mối liên hệ như lược đồ diagram sau:
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
products
vàorder_items
là (1 - n) - Giữa
orders
vàorder_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;
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ớiorder_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ảngproducts
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ả:
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.
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;
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é.