Тази статия предоставя общ преглед на LEFT JOIN
в SQL, както и някои основни примери.
LEFT JOIN
, или LEFT OUTER JOIN
, връща редове, които имат данни в лявата таблица (вляво от JOIN
ключова дума), дори ако в дясната таблица няма съвпадащи редове.
Синтаксис
Посочвате ляво присъединяване в FROM
клауза. Можете да използвате или LEFT JOIN
или LEFT OUTER JOIN
синтаксис.
Използване на LEFT JOIN
синтаксис:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Използване на LEFT OUTER JOIN
синтаксис:
SELECT *
FROM Table1 LEFT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
И двете правят абсолютно едно и също нещо. Просто OUTER
ключовата дума не е задължителна.
Примери
Ето няколко примера за демонстрация.
Примерни данни
Първо, ето таблиците, които ще използваме за примерите.
PetTypes
таблица:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
таблица:
+---------+-------------+-----------+-----------+------------+ | 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
таблица:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Имайте предвид, че:
PetTypeId
колона наPets
таблицата е външен ключ наPetTypeId
наPetTypes
таблица (което е първичният ключ на тази таблица).OwnerId
колона наPets
таблицата е външен ключ наOwnerId
колона наOwners
маса.
Заявката за ляво присъединяване
Ето пример за извършване на ляво свързване срещу две от тези таблици.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Резултат:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Лявото присъединяване ни кара да получим PetType
стойност, която не съответства на PetName
. Няма зайци като домашни любимци. Но лявото присъединяване причинява Rabbit
да бъдат върнати, въпреки че в Pets
няма домашен любимец таблица от този тип. Това води до NULL
стойност в PetName
колона срещу Rabbit
.
Това се случи само защото Rabbit
беше в лявата таблица (т.е. вляво от LEFT JOIN
ключови думи). Добре, моето форматиране го прави повече „отгоре“, отколкото „вляво“, но получавате картината.
Ето какво се случва, ако променим реда на таблицата в нашата заявка.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Резултат:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Този път Rabbits
не е върнат. Това е така, защото неговата таблица (PetTypes
) беше от дясната страна на съединението.
Ще трябва да го променим на дясно или пълно присъединяване, ако искаме Rabbits
да бъдат върнати с помощта на този ред на таблицата.
Ляво присъединяване на 3 маси
Ето пример за извършване на ляво присъединяване и на трите маси.
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;
Резултат:
+-----------+-----------+----------------+ | 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)
Този път имаме собственик на домашен любимец, който няма домашен любимец.
Бихме могли отново да разместим подредбата на масите и да получим различен резултат.
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;
Резултат:
+-----------+-----------+---------------+ | 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)
Този път получихме допълнителния тип домашен любимец (Rabbit
), но не и допълнителния собственик.
Ако се чудите защо последният PetOwner
не е NULL
(като последното PetName
е), защото е резултат от конкатенация на низове. Използвах T-SQL CONCAT()
функция за свързване на името и фамилията на собственика.