Bài viết này cung cấp tổng quan về RIGHT JOIN
trong SQL, cũng như một số ví dụ cơ bản.
Còn được gọi là RIGHT OUTER JOIN
, RIGHT JOIN
trả về các hàng có dữ liệu trong bảng bên phải (bên phải của JOIN
từ khóa), ngay cả khi không có hàng phù hợp nào trong bảng bên trái.
Cú pháp
Bạn chỉ định một liên kết phù hợp trong FROM
mệnh đề. Bạn có thể sử dụng RIGHT JOIN
hoặc RIGHT OUTER JOIN
cú pháp.
Sử dụng RIGHT JOIN
cú pháp:
SELECT *
FROM Table1 RIGHT JOIN Table2
ON Table1.Column = Table2.Column;
Sử dụng RIGHT OUTER JOIN
cú pháp:
SELECT *
FROM Table1 RIGHT 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 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
bảng:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Owners
bảng:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | 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 phù hợp
Dưới đây là một ví dụ về việc thực hiện phép nối phải đối với hai trong số các bảng đó.
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Việc tham gia phù hợp khiến chúng tôi nhận được PetType
giá trị không tương ứng với PetName
. Cụ thể, không có thỏ làm thú cưng. Nhưng kết hợp đúng 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
.
Điều này chỉ xảy ra vì Rabbit
ở trong bảng bên phải (tức là bên phải của RIGHT 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.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Lần này Rabbits
đã không được trả lại. Đó là vì bảng của nó (PetTypes
) ở bên trái của phép nối.
Chúng tôi sẽ cần thay đổi nó thành liên kết bên trái hoặc liên kết đầy đủ nếu chúng tôi muốn Rabbits
sẽ được trả lại bằng cách sử dụng thứ tự bảng này.
Tham gia ngay trên 3 bảng
Dưới đây là một ví dụ về việc thực hiện phép nối phải trên cả ba bảng.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId;
Kết quả:
+-----------+-----------+----------------+ | PetName | PetType | PetOwner | |-----------+-----------+----------------| | Tweet | Bird | Homer Connery | | Scratch | Cat | Bart Pitt | | Bark | Dog | Bart Pitt | | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Meow | Cat | Boris Trump | | NULL | NULL | Woody Eastwood | +-----------+-----------+----------------+ (9 rows affected)
Lần này chúng tôi có một chủ sở hữu vật nuôi không có vật nuôi.
Chúng tôi lại có thể xáo trộn thứ tự các bàn xung quanh và chúng tôi sẽ nhận được một kết quả khác.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Kết quả:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Tweet | Bird | Homer Connery | | Fluffy | Cat | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Meow | Cat | Boris Trump | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | NULL | Rabbit | | +-----------+-----------+---------------+ (9 rows affected)
Lần này, chúng tôi có thêm loại thú cưng (Rabbit
), nhưng không phải là chủ sở hữu phụ.
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-SQL CONCAT()
có chức năng nối họ và tên của chủ sở hữu.