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 JOINRIGHT JOIN cùng với toán tử UNION.

Cú pháp mô phỏng FULL JOIN trong MySQL

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;

  • LEFT JOIN: Lấy tất cả các hàng từ bảng bên trái và các giá trị khớp từ bảng bên phải (hoặc NULL nếu không có hàng khớp).
  • RIGHT JOIN: Lấy tất cả các hàng từ bảng bên phải và các giá trị khớp từ bảng bên trái (hoặc NULL nếu không có hàng khớp).
  • UNION: Kết hợp kết quả từ cả hai truy vấn, loại bỏ các bản ghi trùng lặp.

Ví dụ về FULL JOIN

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.

Truy vấn mô phỏng FULL JOIN trong MySQL:

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;

Kết quả:

CustomerID CustomerName OrderID Product
1 John Smith 101 Laptop
2 Ana Williams 102 Smartphone
3 Maria Anders NULL NULL
NULL NULL 103 Tablet

Giải thích:

  • John SmithAna Williams có đơn hàng, nên thông tin khách hàng và đơn hàng của họ được hiển thị.
  • Maria Anders không có đơn hàng, nên các cột liên quan đến đơn hàng là NULL.
  • Đơn hàng với OrderID 103 không có khách hàng tương ứng (CustomerID không tồn tại trong bảng Customers), do đó các cột liên quan đến khách hàng là NULL.

Sử dụng FULL JOIN với nhiều bảng

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;

Kết quả:

CustomerName OrderID ProductName Price
John Smith 101 Laptop 800
Ana Williams 102 Smartphone 500
NULL 103 Tablet 300
Maria Anders NULL NULL NULL

Giải thích:

  • John Smith đã đặt Laptop, và thông tin khách hàng, đơn hàng, và sản phẩm đều có.
  • Ana Williams đã đặt Smartphone, và tất cả thông tin được hiển thị.
  • Đơn hàng 103 là đơn hàng cho Tablet, nhưng không có khách hàng tương ứng.
  • Maria Anders không có đơn hàng hoặc sản phẩm, nên các cột liên quan đến đơn hàng và sản phẩm là NULL.

Khi nào nên sử dụng FULL JOIN?

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:

  • Khi bạn muốn giữ lại tất cả dữ liệu từ cả hai bảng mà không mất đi bất kỳ bản ghi nào.
  • Khi bạn cần kết hợp dữ liệu từ hai bảng mà không biết liệu có các bản ghi tương ứng trong cả hai bảng hay không.

Ví dụ:

  • Kết hợp danh sách khách hàng và đơn hàng để hiển thị tất cả khách hàng (kể cả chưa có đơn hàng) và tất cả các đơn hàng (kể cả những đơn hàng không có khách hàng).