Thời gian đọc: 5 phút
FULL JOIN (hay còn gọi là FULL OUTER JOIN) là một loại liên kết trả về tất cả các hàng từ cả hai bảng, bất kể có sự khớp giữa các cột trong hai bảng hay không. Nếu không có giá trị khớp, kết quả sẽ có giá trị NULL cho các cột từ bảng không có hàng tương ứng.
Tuy nhiên, MySQL không hỗ trợ trực tiếp cú pháp FULL JOIN. Để đạt được kết quả tương tự như FULL JOIN, ta cần kết hợp LEFT JOIN và RIGHT JOIN cùng với toán tử UNION.
SELECT column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name
UNION
SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Giả sử bạn có hai bảng sau:
Bảng Customers
(thông tin khách hàng):
CustomerID | CustomerName | Country |
---|---|---|
1 | John Smith | USA |
2 | Ana Williams | Canada |
3 | Maria Anders | Germany |
Bảng Orders
(thông tin đơn hàng):
OrderID | CustomerID | Product |
---|---|---|
101 | 1 | Laptop |
102 | 2 | Smartphone |
103 | 4 | Tablet |
Bạn muốn liệt kê tất cả các khách hàng và đơn hàng, kể cả những khách hàng không có đơn hàng và những đơn hàng không có khách hàng tương ứng.
SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.Product
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
UNION
SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.Product
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
CustomerID | CustomerName | OrderID | Product |
---|---|---|---|
1 | John Smith | 101 | Laptop |
2 | Ana Williams | 102 | Smartphone |
3 | Maria Anders | NULL | NULL |
NULL | NULL | 103 | Tablet |
Customers
), do đó các cột liên quan đến khách hàng là NULL.Giả sử bạn có thêm bảng Products, và bạn muốn liệt kê tất cả các đơn hàng, sản phẩm được đặt, và khách hàng (bao gồm cả những đơn hàng hoặc sản phẩm không có khách hàng hoặc sản phẩm tương ứng).
Bảng Products
:
ProductID | ProductName | Price |
---|---|---|
1001 | Laptop | 800 |
1002 | Smartphone | 500 |
1003 | Tablet | 300 |
Truy vấn mô phỏng FULL JOIN kết hợp nhiều bảng:
SELECT Customers.CustomerName, Orders.OrderID, Products.ProductName, Products.Price
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
LEFT JOIN Products ON Orders.Product = Products.ProductName
UNION
SELECT Customers.CustomerName, Orders.OrderID, Products.ProductName, Products.Price
FROM Customers
RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
RIGHT JOIN Products ON Orders.Product = Products.ProductName;
CustomerName | OrderID | ProductName | Price |
---|---|---|---|
John Smith | 101 | Laptop | 800 |
Ana Williams | 102 | Smartphone | 500 |
NULL | 103 | Tablet | 300 |
Maria Anders | NULL | NULL | NULL |
FULL JOIN rất hữu ích khi bạn muốn lấy tất cả dữ liệu từ cả hai bảng, ngay cả khi không có bản ghi khớp. Nó thường được sử dụng trong các tình huống sau:
Ví dụ: