Bài viết này cung cấp tổng quan về FULL JOIN
trong SQL, cũng như một số ví dụ cơ bản.
SQL FULL JOIN
(hoặc FULL OUTER JOIN
) trả về tất cả các hàng, miễn là có dữ liệu khớp trong một trong các bảng.
Nó giống như có cả kết hợp trái phải trong một kết hợp.
Cú pháp
Bạn chỉ định một tham gia đầy đủ trong FROM
mệnh đề. Bạn có thể sử dụng FULL JOIN
hoặc FULL OUTER JOIN
cú pháp.
Sử dụng FULL JOIN
cú pháp:
SELECT *
FROM Table1 FULL JOIN Table2
ON Table1.Column = Table2.Column;
Sử dụng FULL OUTER JOIN
cú pháp:
SELECT *
FROM Table1 FULL OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Cả hai điều này đều làm chính xác cùng một điều. Chỉ là OUTER
từ khóa là tùy chọn.
Ví dụ
Dưới đây là một số ví dụ để minh chứng.
Dữ liệu mẫu
Đầu tiên, đây là các bảng chúng tôi sẽ sử dụng cho các ví dụ.
PetTypes
bảng:
+ ------------- + ----------- + | PetTypeId | PetType || ------------- + ----------- || 1 | Con chim || 2 | Con mèo || 3 | Con chó || 4 | Thỏ | + ------------- + ----------- + (4 hàng bị ảnh hưởng)
Pets
bảng:
+ --------- + ------------- + ----------- + ---------- - + ------------ + | PetId | PetTypeId | OwnerId | PetName | DOB || --------- + ------------- + ----------- + ----------- + ------------ || 1 | 2 | 3 | Bông xù | 2020-11-20 || 2 | 3 | 3 | Tìm nạp | 2019-08-16 || 3 | 2 | 2 | Cào | 2018-10-01 || 4 | 3 | 3 | Wag | 2020-03-15 || 5 | 1 | 1 | Tweet | 2020-11-28 || 6 | 3 | 4 | Bông xù | 2020-09-17 || 7 | 3 | 2 | Vỏ cây | NULL || 8 | 2 | 4 | Meo meo | NULL | + --------- + ------------- + ----------- + ----------- + ------------ + (8 hàng bị ảnh hưởng)
Owners
bảng:
+ ----------- + ------------- + ------------ + ------- --------- + ------------------- + | OwnerId | FirstName | LastName | Điện thoại | Email || ----------- + ------------- + ------------ + -------- -------- + ------------------- || 1 | Homer | Kết nối | (308) 555-0100 | [email protected] || 2 | Bart | Pittông | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Thân gỗ | Eastwood | (308) 555-0112 | [email protected] | + ----------- + ------------- + ------------ + ---- ------------ + ------------------- +
Lưu ý rằng:
-
PetTypeId
cột củaPets
bảng là khóa ngoại củaPetTypeId
củaPetTypes
bảng (là khóa chính của bảng đó). -
OwnerId
cột củaPets
bảng là khóa ngoại củaOwnerId
cột củaOwners
bảng.
Truy vấn tham gia đầy đủ
Dưới đây là một ví dụ về thực hiện kết hợp đầy đủ với hai trong số các bảng đó.
SELECT
p.PetName,
pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+ ----------- + ----------- + | PetName | PetType || ----------- + ----------- || Tweet | Con chim || Bông xù | Con mèo || Cào | Con mèo || Meo meo | Con mèo || Tìm nạp | Con chó || Wag | Con chó || Bông xù | Con chó || Vỏ cây | Con chó || NULL | Thỏ | + ----------- + ----------- + (9 hàng bị ảnh hưởng)
Trong ví dụ này, chúng tôi nhận được một PetType
giá trị không tương ứng với PetName
. Điều này là do không có thỏ làm vật nuôi. Nhưng sự tham gia đầy đủ gây ra Rabbit
được trả lại, mặc dù không có vật nuôi nào trong Pets
bảng loại đó. Điều này dẫn đến NULL
giá trị trong PetName
cột chống lại Rabbit
.
Đây là kết quả tương tự mà chúng tôi sẽ nhận được nếu chúng tôi sử dụng một phép nối phù hợp, vì PetTypes
bảng ở bên phải của JOIN
từ khóa. Điều này sẽ không xảy ra với phép nối bên trái, vì PetTypes
bảng không ở bên trái của JOIN
từ khóa. Nếu chúng tôi muốn tạo lại nó với một phép nối bên trái, chúng tôi sẽ phải chuyển đổi thứ tự của các bảng để PetTypes
bảng ở bên trái của JOIN
từ khóa.
Đây là những gì sẽ xảy ra nếu chúng tôi chuyển đổi thứ tự bảng trong truy vấn của mình khi sử dụng kết hợp đầy đủ.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+ ----------- + ----------- + | PetName | PetType || ----------- + ----------- || Tweet | Con chim || Bông xù | Con mèo || Cào | Con mèo || Meo meo | Con mèo || Tìm nạp | Con chó || Wag | Con chó || Bông xù | Con chó || Vỏ cây | Con chó || NULL | Thỏ | + ----------- + ----------- + (9 hàng bị ảnh hưởng)
Chúng tôi nhận được cùng một kết quả. Điều này là do phép nối đầy đủ trả về tất cả các hàng, miễn là có dữ liệu khớp trong một trong các bảng. Như đã đề cập, nó giống như việc kết hợp trái và phải trong một phép nối.
Tham gia đầy đủ trên 3 bảng
Dưới đây là một ví dụ về việc thực hiện kết hợp đầy đủ trên cả ba bảng.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+ ----------- + ----------- + ---------------- + | PetName | PetType | PetOwner || ----------- + ----------- + ---------------- || Tweet | Chim | Homer Connery || Cào | Con mèo | Bart Pitt || Vỏ cây | Con chó | Bart Pitt || Bông xù | Con mèo | Nancy Simpson || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Meo meo | Con mèo | Boris Trump || NULL | NULL | Gỗ Eastwood || NULL | Con thỏ | | + ----------- + ----------- + ---------------- + (10 hàng bị ảnh hưởng)Lần này, chúng tôi có chủ sở hữu vật nuôi không có vật nuôi, cũng như loại vật nuôi không được chỉ định cho vật nuôi.
Nếu chúng ta xáo trộn thứ tự của các bảng xung quanh, chúng ta sẽ nhận được cùng một kết quả, mặc dù các hàng được liệt kê theo một thứ tự khác.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM PetTypes pt FULL JOIN Pets p ON p.PetTypeId = pt.PetTypeId FULL JOIN Owners o ON p.OwnerId = o.OwnerId;
Kết quả:
----------- + ----------- + ---------------- + | PetName | PetType | PetOwner || ----------- + ----------- + ---------------- || Tweet | Chim | Homer Connery || Bông xù | Con mèo | Nancy Simpson || Cào | Con mèo | Bart Pitt || Meo meo | Con mèo | Boris Trump || Tìm nạp | Con chó | Nancy Simpson || Wag | Con chó | Nancy Simpson || Bông xù | Con chó | Boris Trump || Vỏ cây | Con chó | Bart Pitt || NULL | Con thỏ | || NULL | NULL | Woody Eastwood | + ----------- + ----------- + ---------------- + (10 hàng bị ảnh hưởng)Và nếu chúng tôi xáo trộn chúng một lần nữa, chúng tôi vẫn nhận được kết quả tương tự.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM Pets p FULL JOIN Owners o ON p.OwnerId = o.OwnerId FULL JOIN PetTypes pt ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+ ----------- + ----------- + ---------------- + | PetName | PetType | PetOwner || ----------- + ----------- + ---------------- || Bông xù | Con mèo | Nancy Simpson || Tìm nạp | Con chó | Nancy Simpson || Cào | Con mèo | Bart Pitt || Wag | Con chó | Nancy Simpson || Tweet | Chim | Homer Connery || Bông xù | Con chó | Boris Trump || Vỏ cây | Con chó | Bart Pitt || Meo meo | Con mèo | Boris Trump || NULL | NULL | Gỗ Eastwood || NULL | Con thỏ | | + ----------- + ----------- + ---------------- + (10 hàng bị ảnh hưởng)Nếu bạn đang thắc mắc tại sao
PetOwner
cuối cùng không phải làNULL
(nhưPetName
cuối cùng là), đó là vì nó là kết quả của một phép nối chuỗi. Tôi đã sử dụng T-SQLCONCAT()
có chức năng nối họ và tên của chủ sở hữu.