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ó.
Mục lục
- 1. Cú pháp Left Join trong SQL Server
- 2. Ví dụ về Left Join trong SQL Server
- 3. Thêm lệnh Where trong Left Join
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:
1 2 3 4 5 6 | 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.
1 2 3 4 5 6 7 8 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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
.
1 2 3 4 5 6 7 8 9 10 | 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é.
1 2 3 4 5 6 7 8 9 10 11 | 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é.
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty