Khi làm việc với cơ sở dữ liệu, việc sử dụng các phép JOIN để kết hợp dữ liệu từ nhiều bảng là một kỹ thuật rất phổ biến. Tuy nhiên, các loại phép JOIN như INNER JOIN, LEFT JOIN, và RIGHT JOIN có những đặc điểm riêng biệt và cách hoạt động khác nhau. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về sự khác biệt giữa các loại JOIN này trong SQL, cách sử dụng chúng, và các trường hợp áp dụng cụ thể.
INNER JOIN là phép JOIN được sử dụng để trả về các hàng có dữ liệu khớp nhau giữa các bảng dựa trên một điều kiện cụ thể. Chỉ những hàng có giá trị khớp ở cả hai bảng mới được trả về trong kết quả.
Khi sử dụng INNER JOIN, SQL sẽ so sánh các giá trị từ hai bảng dựa trên điều kiện được chỉ định. Nếu giá trị trong cả hai bảng khớp nhau, hàng đó sẽ xuất hiện trong kết quả. Nếu không có sự khớp, hàng đó sẽ bị loại bỏ khỏi kết quả trả về.
Giả sử bạn có hai bảng: Customers (khách hàng) và Orders (đơn hàng).
Customers
CustomerID | Name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
Orders
OrderID | CustomerID | Product |
---|---|---|
101 | 1 | Laptop |
102 | 2 | Phone |
103 | 2 | Tablet |
Câu truy vấn sau sử dụng INNER JOIN để lấy thông tin về khách hàng và các đơn hàng của họ:
SELECT Customers.Name, Orders.Product FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Kết quả:
Name | Product |
---|---|
Alice | Laptop |
Bob | Phone |
Bob | Tablet |
Trong trường hợp này, INNER JOIN chỉ trả về những khách hàng có đơn hàng. Khách hàng Charlie không có đơn hàng nên không xuất hiện trong kết quả.
LEFT JOIN trả về tất cả các hàng từ bảng bên trái (left table), kể cả khi không có hàng tương ứng ở bảng bên phải (right table). Nếu không có sự khớp ở bảng bên phải, các cột tương ứng sẽ có giá trị NULL
.
Khi sử dụng LEFT JOIN, tất cả các hàng của bảng bên trái đều được trả về. Nếu có hàng tương ứng ở bảng bên phải, dữ liệu sẽ được hiển thị; nếu không có, các cột từ bảng bên phải sẽ được điền bằng NULL
.
Tiếp tục với ví dụ về Customers và Orders, câu truy vấn sau sẽ sử dụng LEFT JOIN:
SELECT Customers.Name, Orders.Product FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Kết quả:
Name | Product |
---|---|
Alice | Laptop |
Bob | Phone |
Bob | Tablet |
Charlie | NULL |
Trong trường hợp này, khách hàng Charlie không có đơn hàng, nhưng vẫn được liệt kê trong kết quả với cột Product có giá trị NULL
.
RIGHT JOIN ngược lại với LEFT JOIN, trả về tất cả các hàng từ bảng bên phải (right table), kể cả khi không có hàng tương ứng ở bảng bên trái. Nếu không có sự khớp ở bảng bên trái, các cột tương ứng sẽ có giá trị NULL
.
Với RIGHT JOIN, tất cả các hàng từ bảng bên phải đều được trả về, ngay cả khi không có dữ liệu tương ứng ở bảng bên trái. Nếu không có hàng khớp ở bảng bên trái, các cột của bảng bên trái sẽ được điền NULL
.
Tiếp tục với ví dụ trên, câu truy vấn sau sử dụng RIGHT JOIN:
SELECT Customers.Name, Orders.Product FROM Customers RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Kết quả:
Name | Product |
---|---|
Alice | Laptop |
Bob | Phone |
Bob | Tablet |
Trong trường hợp này, vì tất cả các đơn hàng đều có khách hàng tương ứng, kết quả sẽ giống với INNER JOIN. Tuy nhiên, nếu có đơn hàng không có khách hàng tương ứng, chúng sẽ được hiển thị với cột Name có giá trị NULL
.
JOIN Type | Trả về những hàng nào? |
---|---|
INNER JOIN | Trả về các hàng có giá trị khớp nhau ở cả hai bảng. |
LEFT JOIN | Trả về tất cả các hàng từ bảng bên trái. Nếu không có giá trị khớp ở bảng bên phải, giá trị sẽ là NULL . |
RIGHT JOIN | Trả về tất cả các hàng từ bảng bên phải. Nếu không có giá trị khớp ở bảng bên trái, giá trị sẽ là NULL . |
Việc chọn loại JOIN phù hợp phụ thuộc vào yêu cầu dữ liệu của bạn. INNER JOIN phù hợp khi bạn chỉ muốn dữ liệu khớp từ cả hai bảng. LEFT JOIN và RIGHT JOIN hữu ích khi bạn muốn lấy tất cả các hàng từ một bảng nhất định, kể cả khi không có dữ liệu khớp ở bảng còn lại. Việc hiểu rõ sự khác biệt giữa các loại JOIN sẽ giúp bạn làm việc với cơ sở dữ liệu hiệu quả hơn và tối ưu hóa các truy vấn SQL của mình.