Bài viết này cung cấp tổng quan về LEFT JOIN
trong SQL, cũng như một số ví dụ cơ bản.
LEFT JOIN
hoặc LEFT OUTER JOIN
, trả về các hàng có dữ liệu trong bảng bên trái (bên trái của JOIN
từ khóa), ngay cả khi không có hàng nào phù hợp trong bảng bên phải.
Cú pháp
Bạn chỉ định một liên kết bên trái trong FROM
mệnh đề. Bạn có thể sử dụng LEFT JOIN
hoặc LEFT OUTER JOIN
cú pháp.
Sử dụng LEFT JOIN
cú pháp:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Sử dụng LEFT OUTER JOIN
cú pháp:
SELECT *
FROM Table1 LEFT 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 Bên trái
Dưới đây là một ví dụ về thực hiện phép nối trái với hai trong số các bảng đó.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
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)
Phép nối bên trái khiến chúng ta nhận được PetType
giá trị không tương ứng với PetName
. Không có thỏ làm thú cưng. Nhưng phép nối bên trái 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
nằm trong bảng bên trái (nghĩa là bên trái của LEFT JOIN
từ khóa). OK, định dạng của tôi làm cho nó ở “phía trên” hơn là “bên trái”, nhưng bạn sẽ hiểu được bức tranh.
Đâ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 Pets p
LEFT JOIN PetTypes pt
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 phải của phép nối.
Chúng tôi cần phải thay đổi nó thành một tham gia phù hợp hoặc tham gia đầ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 bên trái trên 3 bảng
Dưới đây là một ví dụ về thực hiện phép nối trái trên cả ba bảng.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o LEFT JOIN Pets p
ON p.OwnerId = o.OwnerId
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
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ủa các bàn 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 PetTypes pt LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId
LEFT JOIN Owners o
ON p.OwnerId = o.OwnerId;
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.