Courses
Trong hướng dẫn này, tôi sẽ giải thích sự khác nhau giữa SQL INNER JOIN và OUTER JOIN kèm ví dụ minh họa. Sau khi bạn nắm được nội dung này, bạn có thể muốn tham gia khóa học Joining Data in SQL của chúng tôi, khóa này còn đề cập đến các kiểu join thú vị khác như SELF JOIN và CROSS JOIN, cũng như những khái niệm rộng hơn như lý thuyết tập hợp.
Câu trả lời nhanh
INNER JOIN chỉ trả về các hàng khớp giữa các bảng dựa trên một cột chung, loại trừ các hàng không khớp. Ví dụ, truy vấn dưới đây chỉ hiển thị đơn hàng kèm chi tiết khách hàng khi có sự khớp.
-- Inner Join: Returns only matching rows from both tables
SELECT o.OrderID, c.CustomerName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID;
OUTER JOIN bao gồm cả các hàng khớp và không khớp từ một hoặc cả hai bảng. Truy vấn dưới đây trả về tất cả khách hàng, bao gồm cả những người không có đơn hàng.
-- Left Outer Join: Returns all rows from Customers and matching rows from Orders
SELECT c.CustomerName, o.OrderID
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
Xem kỹ SQL INNER JOIN và OUTER JOIN
Giờ hãy xem chi tiết SQL INNER JOIN và OUTER JOIN, từng loại một. Khi xem từng loại, hãy cân nhắc hai bảng sau:

Ví dụ bảng employees. Ảnh: Tác giả.

Ví dụ bảng departments. Ảnh: Tác giả.
Cách hoạt động của INNER JOIN
Một INNER JOIN chỉ truy xuất các hàng có khớp ở cả hai bảng dựa trên điều kiện chỉ định.
Truy vấn sau chọn employee_id, demployee_name, department_name và salary rồi trả về các hàng nơi department_id tồn tại.
-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

Ví dụ bảng được gộp bằng SQL INNER JOIN. Ảnh: Tác giả.
Cách hoạt động của OUTER JOIN
OUTER JOIN bao gồm các hàng không khớp từ một hoặc cả hai bảng, tùy thuộc vào loại OUTER JOIN được dùng.
LEFT OUTER JOIN (LEFT JOIN)
LEFT OUTER JOIN trả về tất cả bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phả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.
Ví dụ sau truy xuất tất cả bản ghi từ bảng employees, kể cả nơi có bản ghi không khớp. department_name bị thiếu của nhân viên sẽ trả về NULL.
-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

Ví dụ bảng được join bằng SQL left outer join. Ảnh: Tác giả.
LEFT JOIN và LEFT OUTER JOIN được dùng thay thế cho nhau trong SQL vì cả hai truy vấn đều lấy tất cả hàng từ bảng bên trái và các hàng khớp từ bảng bên phải.
RIGHT OUTER JOIN (RIGHT JOIN)
RIGHT OUTER JOIN trả về tất cả bản ghi từ bảng bên phải và các bản ghi khớp từ bảng bên trái. Các hàng không khớp ở bảng bên trái sẽ trả về NULL.
Truy vấn dưới đây trả về tất cả bản ghi từ bảng departments, kể cả nơi không có nhân viên khớp.
-- Get all departments, even those without employees
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.department_id;

Ví dụ bảng được join bằng SQL Right outer join. Ảnh: Tác giả.
FULL OUTER JOIN
FULL OUTER JOIN kết hợp kết quả từ cả left và right outer join. Nó trả về tất cả bản ghi từ cả hai bảng, điền NULL ở nơi không có khớp.
Truy vấn dưới đây trả về tất cả bản ghi của bảng employees và departments, kể cả các hàng không khớp.
-- Combine all employees and departments
SELECT employees.employee_id, employees.employee_name, departments.department_name, employees.salary
FROM employees
FULL JOIN departments
ON employees.department_id = departments.department_id;

Ví dụ bảng được join bằng SQL Full outer join. Ảnh: Tác giả.
INNER JOIN so với OUTER JOIN: Những khác biệt chính
INNER JOIN và OUTER JOIN khác nhau căn bản ở cách xử lý các hàng không khớp khi gộp bảng. Hiểu rõ những khác biệt này rất quan trọng để chọn đúng loại join trong truy vấn cơ sở dữ liệu của bạn. Hãy cùng so sánh.
INNER JOIN trả về gì
INNER JOIN chỉ trả về các hàng có giá trị khớp ở cả hai bảng. Kiểu join này dùng khi bạn cần dữ liệu xuất hiện ở cả hai tập dữ liệu.
Truy vấn sau truy xuất các bản ghi từ employees với các hàng khớp từ bảng departments.
-- Example: Get employees with matching departments
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
INNER JOIN departments
-- Returns only employees assigned to a department
ON employees.department_id = departments.department_id;

Ví dụ bảng được join bằng SQL INNER JOIN. Ảnh: Tác giả.
OUTER JOIN trả về gì
OUTER JOIN bao gồm các hàng không khớp từ một hoặc cả hai bảng, tùy thuộc vào loại OUTER JOIN. Ví dụ, LEFT OUTER JOIN trả về tất cả hàng từ bảng bên trái và các hàng khớp từ bảng bên phải. Các hàng không khớp từ bảng bên phải sẽ có giá trị NULL.
Truy vấn sau truy xuất bản ghi nhân viên, kể cả những người không thuộc phòng ban nào.
-- Get all employees, even those without a department
SELECT employees.employee_id, employees.employee_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;

Ví dụ dữ liệu truy xuất bằng SQL LEFT OUTER JOIN. Ảnh: Tác giả.
Khi nào dùng SQL INNER JOIN và OUTER JOIN
INNER JOIN và OUTER JOIN cũng khác nhau về các tình huống sử dụng thực tế trong truy xuất dữ liệu.
Khi nào dùng INNER JOIN
INNER JOIN hiệu quả nhất khi bạn chỉ cần dữ liệu giao nhau từ hai bảng. Ví dụ, bạn có thể dùng INNER JOIN khi phân tích dữ liệu bán hàng để tìm các sản phẩm đã được bán, tức là khi cả bảng sản phẩm và bảng bán hàng đều có bản ghi khớp.
Khi nào dùng OUTER JOIN
OUTER JOIN phù hợp khi bạn cần trả về bộ dữ liệu đầy đủ, bao gồm cả các hàng không khớp. Chẳng hạn, khi tạo báo cáo liệt kê tất cả nhân viên, kể cả những người chưa được gán phòng ban, hoặc tất cả phòng ban, kể cả những phòng ban chưa có nhân viên.
Kết luận
Hiểu sự khác nhau giữa INNER JOIN và OUTER JOIN rất quan trọng để viết truy vấn hiệu quả. Học các kỹ thuật này cũng giúp cải thiện tối ưu hoá truy vấn để truy xuất dữ liệu nhanh hơn. Tôi khuyến khích bạn tiếp tục luyện tập để trau dồi thêm kỹ năng quản trị cơ sở dữ liệu.
Tôi đề xuất bạn thử lộ trình nghề nghiệp Associate Data Analyst in SQL của chúng tôi để trở thành một nhà phân tích dữ liệu giỏi. Khóa học Reporting in SQL cũng sẽ giúp bạn thành thạo xây dựng báo cáo và bảng điều khiển phức tạp để trình bày dữ liệu hiệu quả. Nếu bạn đang chuẩn bị phỏng vấn có yêu cầu trình diễn kỹ năng SQL, hãy xem bài blog 20 Top SQL Joins Interview Questions để hỗ trợ việc chuẩn bị.
SQL INNER JOIN và OUTER JOIN: Câu hỏi thường gặp
Sự khác nhau giữa INNER JOIN và OUTER JOIN trong SQL là gì?
INNER JOIN chỉ trả về các hàng khớp từ cả hai bảng, trong khi OUTER JOIN bao gồm cả các hàng không khớp, với NULL lấp đầy khoảng trống khi không tìm thấy dữ liệu tương ứng.
Khi nào tôi nên dùng INNER JOIN trong SQL?
Hãy dùng INNER JOIN khi bạn cần truy xuất chỉ các hàng có giá trị khớp ở cả hai bảng.
Các loại OUTER JOIN trong SQL là gì?
Các loại OUTER JOIN gồm có LEFT OUTER JOIN, RIGHT OUTER JOIN và FULL OUTER JOIN.
LEFT OUTER JOIN hoạt động như thế nào trong SQL?
Left outer join trả về tất cả hàng từ bảng bên trái, các hàng khớp từ bảng bên phải, và cả các hàng không khớp từ bảng bên trái.
FULL OUTER JOIN trong SQL là gì?
FULL OUTER JOIN trả về tất cả hàng từ cả hai bảng, bao gồm các hàng không khớp từ mỗi bảng.
