Chuyển đến nội dung chính

Cách JOIN 3 bảng trong SQL: Phương pháp và ví dụ

Tìm hiểu cách JOIN hiệu quả ba bảng trong SQL. Khám phá phương pháp thực tiễn và ví dụ để nâng cao kỹ năng thao tác dữ liệu. Làm chủ JOIN trong SQL một cách dễ dàng.
Đã cập nhật 5 thg 6, 2026  · 7 phút đọc

Mặc dù JOIN trong SQL thường được dùng để kết hợp dữ liệu từ hai bảng, bạn không cần dừng lại ở đó. Bạn thực sự có thể gộp dữ liệu từ ba hay thậm chí nhiều bảng hơn để khám phá các mối quan hệ và thông tin chuyên sâu phức tạp hơn từ dữ liệu của mình.

Trong bài viết này, tôi sẽ hướng dẫn bạn các ví dụ JOIN ba bảng trong SQL; chúng ta cũng sẽ xem xét các triển khai theo từng hệ quản trị cơ sở dữ liệu và các thực tiễn tốt nhất. Tôi cũng rất khuyến nghị học các khóa Introduction to SQLLearn SQL để nắm vững những kiến thức nền tảng quan trọng.

TL;DR

  • Dùng INNER JOIN khi bạn chỉ muốn các bản ghi khớp ở tất cả các bảng, LEFT JOIN khi bạn muốn lấy toàn bộ từ bảng chính ngay cả khi không có khớp, và RIGHT JOIN nếu ưu tiên là bảng ngoài cùng bên phải.

  • SQL xử lý JOIN từ trái sang phải, vì vậy thứ tự rất quan trọng. Hãy xây dựng truy vấn từng bước và kiểm tra kết quả trong quá trình thực hiện.

  • Để hiệu năng tốt hơn, hãy lập chỉ mục cho các cột JOIN, lọc sớm bằng WHERE, JOIN các bảng nhỏ trước, và chỉ chọn những cột bạn cần.

Các bước JOIN 3 bảng trong SQL

JOIN ba bảng trong SQL cho phép bạn thực hiện các truy vấn phức tạp để truy xuất dữ liệu trên nhiều bảng. Khi JOIN ba bảng, chúng ta dùng mệnh đề JOIN để kết hợp dữ liệu từ các bảng này.

Giả sử bạn có ba bảng sau: Customers, Products, và Orders.

Ví dụ bảng Customers trong SQL.

Ví dụ bảng Customers trong SQL. Ảnh: Tác giả.

Ví dụ bảng Products trong SQL.

Ví dụ bảng Products trong SQL. Ảnh: Tác giả.

Ví dụ bảng Orders trong SQL.

Ví dụ bảng Orders trong SQL. Ảnh: Tác giả.

Trước hết, bạn có thể JOIN bảng CustomersOrders để cho biết khách hàng nào đã đặt hàng và chi tiết đơn hàng của họ, chẳng hạn như order_id, order_datequantity đặt mua.

-- Select data from Customers
SELECT 
    Customers.customer_id, 
    Customers.first_name, 
    Customers.last_name, 
    Orders.order_id, 
    Orders.order_date, 
    Orders.quantity 
FROM Customers
-- Join Orders table
INNER JOIN Orders 
ON Customers.customer_id = Orders.customer_id;

Ví dụ JOIN SQL giữa bảng Customers và Orders.

Ví dụ JOIN SQL giữa bảng Customers và Orders. Ảnh: Tác giả.

Cuối cùng, bạn có thể kết hợp cả ba bảng Customers, OrdersProducts để có cái nhìn tổng thể về khách hàng, các đơn hàng của họ, sản phẩm đã mua và tổng chi phí cho mỗi đơn.

-- Select data starting with Customers
SELECT 
    Customers.customer_id,
    Customers.first_name,
    Customers.last_name,
    Orders.order_id,
    Orders.order_date,
    Products.product_name,
    Orders.quantity,
    Products.price,
    (Orders.quantity * Products.price) AS total_cost -- Total cost calculation
FROM Customers
-- Join the Orders table based on customer_id
INNER JOIN Orders 
ON Customers.customer_id = Orders.customer_id
-- Join the Products table based on product_id
INNER JOIN Products 
ON Orders.product_id = Products.product_id;

Ví dụ JOIN SQL ba bảng.

Ví dụ JOIN SQL ba bảng. Ảnh: Tác giả.

Hãy cùng xem các ví dụ thực tiễn khi dùng INNER JOIN, LEFT JOINRIGHT JOIN để JOIN ba bảng. Xem hướng dẫn Introduction to SQL Joins để tìm hiểu thêm về các loại JOIN và ví dụ.

Ví dụ JOIN 3 bảng trong SQL

Bây giờ, hãy xem một số ví dụ thực tế bằng cách dùng INNER JOIN, LEFT JOINRIGHT JOIN để JOIN ba bảng.

Nếu bạn còn bối rối về ý nghĩa của các JOIN này và muốn luyện tập thêm để thực sự thành thạo kỹ thuật phù hợp, hãy đăng ký khóa Joining Data in SQL, khóa học không chỉ giúp bạn về JOIN trong SQL mà còn dạy về lý thuyết tập hợp quan hệ và truy vấn lồng (subquery).

Sử dụng INNER JOIN

INNER JOIN truy xuất các bản ghi có giá trị khớp ở cả ba bảng, loại bỏ mọi bản ghi không khớp. Dùng INNER JOIN là lý tưởng khi bạn chỉ cần kết quả có quan hệ trực tiếp trong tất cả các bảng liên quan.

Giả sử bạn có ba bảng: Customers, Orders, và Products. Truy vấn dưới đây chỉ truy xuất những khách hàng đã đặt hàng và bao gồm chi tiết sản phẩm gắn với mỗi đơn hàng.

-- Select customer details, order information, and associated product names
SELECT 
    Customers.customer_id, 
    Customers.customer_name, 
    Orders.order_id, 
    Products.product_name 
-- Select from Customers table
FROM Customers
    -- Join Orders table
    INNER JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
    -- Join Products table
    INNER JOIN Products 
        ON Orders.product_id = Products.product_id;

Sử dụng LEFT JOIN

LEFT JOIN trả về tất cả bản ghi từ bảng thứ nhất (bên trái) và các bản ghi khớp từ hai bảng còn lại. Nếu không có khớp, các cột từ bảng bên phải sẽ nhận giá trị NULL. LEFT JOIN hữu ích khi truy xuất toàn bộ bản ghi từ bảng chính, ngay cả khi một số hàng không có dữ liệu liên quan ở các bảng khác.

Trong ví dụ sau, tất cả khách hàng sẽ xuất hiện trong kết quả, ngay cả khi họ chưa đặt hàng. Các trường dữ liệu sẽ trả về NULL nếu không có dữ liệu đơn hàng hoặc sản phẩm tương ứng.

-- Select customer details, order information, and product names
SELECT 
    Customers.customer_id, 
    Customers.customer_name,
    Orders.order_id, 
    Products.product_name
FROM Customers
    -- Join Orders table
    LEFT JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
    -- Join Products table
    LEFT JOIN Products 
        ON Orders.product_id = Products.product_id;

Xin lưu ý, LEFT JOIN tương đương với LEFT OUTER JOIN trong SQL. Chúng tôi có một hướng dẫn chi tiết: SQL LEFT JOIN vs. LEFT OUTER JOIN.

Sử dụng RIGHT JOIN

RIGHT JOIN truy xuất tất cả bản ghi từ bảng thứ ba (ngoài cùng bên phải) và các bản ghi khớp từ các bảng bên trái. Mặc dù RIGHT JOIN ít phổ biến hơn, nó vẫn hữu ích khi bạn cần ưu tiên các bản ghi ở bảng ngoài cùng bên phải.

Ví dụ, trong phân tích tồn kho, bạn có thể muốn biết sản phẩm nào có đơn hàng hoặc tương tác với khách hàng. Tất cả sản phẩm sẽ được liệt kê trong truy vấn dưới đây, kèm theo bất kỳ dữ liệu đơn hàng hoặc khách hàng liên quan. Nếu có sản phẩm chưa được đặt hàng, các trường order_idcustomer_name sẽ hiển thị NULL.

-- Select customer details, order information, and product names
SELECT 
    Customers.customer_id,
    Customers.customer_name,
    Orders.order_id,
    Products.product_name
 -- Select from Customers table
FROM Customers
 -- Join Orders table
    RIGHT JOIN Orders 
        ON Customers.customer_id = Orders.customer_id
 -- Join Products table
    RIGHT JOIN Products 
        ON Orders.product_id = Products.product_id;

Mặc dù các ví dụ trên minh họa việc dùng một loại JOIN duy nhất (INNER JOIN, LEFT JOIN hoặc RIGHT JOIN), hoàn toàn có thể—và thường là cần thiết—kết hợp các loại JOIN khác nhau trong cùng một truy vấn để xử lý các mối quan hệ dữ liệu phức tạp hơn. Chẳng hạn, bạn có thể dùng LEFT JOIN để bao gồm tất cả bản ghi từ một bảng, đồng thời dùng INNER JOIN cho một quan hệ khác trong cùng truy vấn.

Cũng cần nói thêm rằng SQL xử lý JOIN tuần tự từ trái sang phải, vì thế thứ tự sẽ quyết định cách các bảng được kết hợp và cách xử lý các giá trị NULL. Đó là lý do tôi bắt đầu bài viết bằng cách trình bày quy trình theo hai bước. Xây dựng truy vấn từng bước và kiểm tra kết quả dần dần là cách tiếp cận hiệu quả. LEFT JOIN rồi đến INNER JOIN thường khác với INNER JOIN rồi đến LEFT JOIN.

Tại sao phải JOIN 3 bảng trong SQL

Hãy dành chút thời gian nói về thiết kế cơ sở dữ liệu. Lý do hiện nay thường phải JOIN hơn hai bảng là vì chuẩn hoá cơ sở dữ liệu đã trở nên phổ biến. Cơ sở dữ liệu (và thực ra là những người thiết kế cơ sở dữ liệu) làm điều này bằng cách tổ chức thông tin thành các bảng riêng biệt nhưng có liên hệ. Cách làm này nhằm loại bỏ dư thừa (và vì các lý do khác nữa). Việc phân rã cơ sở dữ liệu như vậy có nghĩa là dữ liệu liên quan đến các thực thể khác nhau—như các bảng Customers, OrdersProducts mà chúng ta đã xem—được lưu trữ tách biệt.

Nói cách khác, vì dữ liệu thường được lưu trong sơ đồ cơ sở dữ liệu đã chuẩn hoá, việc truy xuất thông tin thường đòi hỏi phải kết hợp dữ liệu từ nhiều bảng. Vì vậy, chúng ta nên biết cách viết các truy vấn có nhiều JOIN bởi đơn giản đó là cách dữ liệu thường được cấu trúc. Khóa học Database Design của chúng tôi là một nguồn tham khảo tốt cho những ý tưởng này.

Tính năng JOIN theo từng hệ quản trị

Mặc dù JOIN trong SQL nhất quán trên hầu hết các cơ sở dữ liệu quan hệ, vẫn có một số khác biệt khi xử lý nhiều JOIN liên quan đến ba bảng trở lên. Hãy xem các triển khai và lưu ý cụ thể theo từng hệ để tránh lỗi và vấn đề tối ưu hóa.

MySQL

MySQL thường xử lý tốt các JOIN cơ bản nhưng có thể gặp khó với truy vấn phức tạp liên quan đến nhiều bảng. Lệnh EXPLAIN của MySQL hữu ích để hiểu hiệu năng JOIN và xác định cách tối ưu hoá truy vấn bằng lập chỉ mục hoặc viết lại truy vấn. MySQL cũng hỗ trợ từ khóa STRAIGHT_JOIN, buộc thứ tự JOIN, có thể cải thiện hiệu năng trong trường hợp tối ưu hoá JOIN mặc định không lý tưởng.

PostgreSQL

Bộ tối ưu mạnh mẽ của PostgreSQL giúp nó rất hiệu quả với các JOIN phức tạp, ngay cả với tập dữ liệu lớn. Hỗ trợ truy vấn đệ quy bằng mệnh đề WITH RECURSIVE cho phép JOIN dữ liệu phân cấp trên nhiều bảng. Window functions của PostgreSQL rất tiên tiến và có thể bổ trợ cho JOIN bằng cách cho phép phân tích theo từng hàng trong một tập dữ liệu đã JOIN.

SQL Server

SQL Server cho phép các gợi ý JOIN cụ thể (MERGE JOIN, LOOP JOINHASH JOIN) để ghi đè hành vi mặc định, cải thiện hiệu năng JOIN nhiều bảng. Các toán tử CROSS APPLYOUTER APPLY trong SQL Server là công cụ mạnh để JOIN với các hàm trả về bảng, mang lại nhiều linh hoạt hơn cho truy vấn nhiều bảng.

Tôi khuyến nghị học khóa Introduction to SQL Server của DataCamp để hiểu các chức năng khác nhau của SQL Server trong truy vấn dữ liệu. Ngoài ra, hãy thử lộ trình kỹ năng SQL Server Fundamentals để cải thiện kỹ năng JOIN bảng và phân tích dữ liệu. Lộ trình nghề nghiệp SQL Server Developer sẽ trang bị cho bạn kỹ năng viết, xử lý sự cố và tối ưu hoá truy vấn bằng SQL Server.

Oracle SQL

Oracle hỗ trợ tất cả các JOIN tiêu chuẩn và cung cấp các tuỳ chọn độc đáo như NATURAL JOIN, tự động JOIN các bảng dựa trên tên cột trùng nhau. Hỗ trợ truy vấn phân cấp với CONNECT BY của Oracle đôi khi có thể giảm nhu cầu JOIN bổ sung bằng cách xử lý dữ liệu lồng nhau hiệu quả hơn.

Thực tiễn tốt khi JOIN 3 bảng trong SQL

JOIN ba bảng trong SQL có thể làm tăng độ phức tạp truy vấn và ảnh hưởng hiệu năng, đặc biệt khi dữ liệu lớn. Dưới đây là các thực tiễn tốt và kỹ thuật tối ưu hoá để cải thiện hiệu năng truy vấn.

  • Sử dụng lập chỉ mục phù hợp: Lập chỉ mục các cột thường dùng trong điều kiện JOIN sẽ tăng tốc truy xuất bằng cách giảm lượng dữ liệu phải quét.

  • Lọc sớm bằng WHERE và điều kiện JOIN: Đặt điều kiện lọc trực tiếp trong mệnh đề JOIN hoặc WHERE để giảm dữ liệu cần xử lý ở các bước JOIN tiếp theo, cải thiện hiệu năng.

  • Cân nhắc thứ tự và loại JOIN: Khi JOIN nhiều bảng, hãy JOIN các bảng nhỏ trước để thu nhỏ tập dữ liệu nhanh nhất có thể.  Tránh dùng LEFT hoặc RIGHT JOIN nếu phân tích của bạn không cần các bản ghi không khớp.

  • Giảm số cột chọn với SELECT: Tránh dùng SELECT * để đưa vào các cột không cần thiết. Hãy chọn rõ các cột cần dùng để giảm dữ liệu trả về từ mỗi bảng, giảm sử dụng bộ nhớ và cải thiện hiệu năng truy vấn.

  • Dùng subquery hoặc bảng tạm cho JOIN phức tạp: Hãy cân nhắc chia nhỏ truy vấn bằng subquery đối với các JOIN rất phức tạp. Với các JOIN lặp lại những truy vấn phức tạp, hãy cân nhắc lưu kết quả trung gian vào bảng tạm để tiết kiệm thời gian xử lý, đặc biệt cho các truy vấn cần nhiều phép tính.

Kết luận và học thêm

JOIN ba bảng trong SQL cho phép bạn kết hợp dữ liệu trên nhiều bảng để phân tích dữ liệu toàn diện và quản trị cơ sở dữ liệu hiệu quả. Thành thạo các kỹ thuật phù hợp sẽ giúp mã của bạn hiệu quả, có khả năng mở rộng và hiệu năng cao.

Nếu bạn muốn trở thành nhà phân tích dữ liệu thành thạo, hãy xem lộ trình nghề nghiệp Associate Data Analyst in SQL để học các kỹ năng cần thiết. Khóa Reporting in SQL cũng phù hợp nếu bạn muốn học cách xây dựng dashboard chuyên nghiệp bằng SQL. Cuối cùng, tôi khuyến nghị lấy SQL Associate Certification để chứng minh năng lực sử dụng SQL cho phân tích dữ liệu và giúp hồ sơ của bạn nổi bật.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

Những kiểu JOIN nào có thể dùng để JOIN ba bảng?

Bạn có thể dùng INNER JOIN, LEFT JOIN, RIGHT JOIN và đôi khi FULL JOIN để kết hợp ba bảng.

Thứ tự JOIN có quan trọng khi JOIN ba bảng không?

Thứ tự JOIN có thể ảnh hưởng đến hiệu năng, đặc biệt với các bảng lớn. Bắt đầu với các bảng nhỏ hơn hoặc đã lọc mạnh thường cải thiện hiệu quả.

Làm thế nào để tối ưu hiệu năng khi JOIN ba bảng trong SQL?

Để tối ưu hiệu năng, hãy đảm bảo lập chỉ mục đúng cho các cột dùng trong JOIN, giới hạn số hàng trả về bằng mệnh đề WHERE, và chỉ chọn các cột cần thiết.

Tôi có thể JOIN nhiều hơn ba bảng không?

Bạn có thể JOIN nhiều hơn ba bảng trong SQL, nhưng truy vấn có thể trở nên phức tạp hơn và cần tối ưu hiệu năng.

Chủ đề

Học SQL với DataCamp

Courses

Giới thiệu về SQL Server

4 giờ
170.2K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow