Ten artykuł zawiera omówienie LEFT JOIN
w SQL, a także kilka podstawowych przykładów.
LEFT JOIN
lub LEFT OUTER JOIN
, zwraca wiersze, które zawierają dane w lewej tabeli (po lewej stronie JOIN
słowa kluczowego), nawet jeśli w prawej tabeli nie ma pasujących wierszy.
Składnia
Określasz lewe sprzężenie w FROM
klauzula. Możesz użyć opcji LEFT JOIN
lub LEFT OUTER JOIN
składnia.
Korzystanie z LEFT JOIN
składnia:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Korzystanie z LEFT OUTER JOIN
składnia:
SELECT *
FROM Table1 LEFT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Oba robią dokładnie to samo. Po prostu OUTER
słowo kluczowe jest opcjonalne.
Przykłady
Oto kilka przykładów do zademonstrowania.
Przykładowe dane
Najpierw oto tabele, których użyjemy w przykładach.
PetTypes
tabela:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabela:
+---------+-------------+-----------+-----------+------------+ | 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
tabela:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Pamiętaj, że:
PetTypeId
kolumnaPets
tabela jest kluczem obcymPetTypeId
PetTypes
tabela (która jest kluczem podstawowym tej tabeli).OwnerId
kolumnaPets
tabela jest kluczem obcymOwnerId
kolumnaOwners
stół.
Zapytanie o połączenie lewe
Oto przykład wykonania lewego sprzężenia przeciwko dwóm z tych tabel.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Wynik:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Lewe sprzężenie powoduje, że otrzymujemy PetType
wartość, która nie odpowiada PetName
. Nie ma królików jako zwierząt domowych. Ale lewe połączenie powoduje Rabbit
do zwrotu, nawet jeśli w Pets
nie ma żadnego zwierzaka tabeli tego typu. Powoduje to NULL
wartość w PetName
kolumna przeciwko Rabbit
.
Stało się tak tylko dlatego, że Rabbit
był w lewej tabeli (tj. na lewo od LEFT JOIN
słowa kluczowe). OK, moje formatowanie sprawia, że jest bardziej „nad” niż „po lewej”, ale masz obraz.
Oto, co się stanie, jeśli zmienimy kolejność tabel w naszym zapytaniu.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Wynik:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Tym razem Rabbits
nie został zwrócony. To dlatego, że jego tabela (PetTypes
) znajdował się po prawej stronie połączenia.
Musielibyśmy to zmienić na prawe lub pełne, jeśli chcielibyśmy Rabbits
do zwrotu przy użyciu tej kolejności tabel.
Dołącz od lewej na 3 stołach
Oto przykład wykonania lewego sprzężenia na wszystkich trzech stołach.
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;
Wynik:
+-----------+-----------+----------------+ | 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)
Tym razem mamy właściciela zwierzaka, który nie ma zwierzaka.
Moglibyśmy ponownie przetasować kolejność stołów i otrzymalibyśmy inny wynik.
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;
Wynik:
+-----------+-----------+---------------+ | 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)
Tym razem otrzymaliśmy dodatkowy typ zwierzaka (Rabbit
), ale nie dodatkowego właściciela.
Jeśli zastanawiasz się, dlaczego ostatni PetOwner
nie jest NULL
(jak ostatnio PetName
jest), to dlatego, że jest wynikiem konkatenacji ciągów. Użyłem T-SQL CONCAT()
funkcja łączenia imienia i nazwiska właściciela.