Artikel ini memberikan gambaran umum tentang LEFT JOIN
dalam SQL, serta beberapa contoh dasar.
LEFT JOIN
, atau LEFT OUTER JOIN
, menampilkan baris yang memiliki data di tabel kiri (kiri dari JOIN
kata kunci), meskipun tidak ada baris yang cocok di tabel kanan.
Sintaks
Anda menentukan gabungan kiri di FROM
ayat. Anda dapat menggunakan salah satu LEFT JOIN
atau LEFT OUTER JOIN
sintaks.
Menggunakan LEFT JOIN
sintaks:
SELECT *
FROM Table1 LEFT JOIN Table2
ON Table1.Column = Table2.Column;
Menggunakan LEFT OUTER JOIN
sintaks:
SELECT *
FROM Table1 LEFT OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Keduanya melakukan hal yang persis sama. Hanya saja bagian OUTER
kata kunci adalah opsional.
Contoh
Berikut adalah beberapa contoh untuk ditunjukkan.
Contoh Data
Pertama, berikut adalah tabel yang akan kita gunakan untuk contoh.
PetTypes
tabel:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabel:
+---------+-------------+-----------+-----------+------------+ | 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
tabel:
+-----------+-------------+------------+----------------+-------------------+ | 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] | +-----------+-------------+------------+----------------+-------------------+
Perhatikan bahwa:
PetTypeId
kolomPets
tabel adalah kunci asing dariPetTypeId
dariPetTypes
tabel (yang merupakan kunci utama dari tabel tersebut).OwnerId
kolomPets
tabel adalah kunci asing dariOwnerId
kolomOwners
meja.
Kueri Gabung Kiri
Berikut adalah contoh melakukan gabungan kiri terhadap dua tabel tersebut.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Gabung kiri menyebabkan kita mendapatkan PetType
nilai yang tidak sesuai dengan PetName
. Tidak ada kelinci sebagai hewan peliharaan. Tapi join kiri menyebabkan Rabbit
untuk dikembalikan, meskipun tidak ada hewan peliharaan di Pets
tabel jenis itu. Ini menghasilkan NULL
nilai dalam PetName
kolom melawan Rabbit
.
Ini hanya terjadi karena Rabbit
berada di tabel kiri (yaitu kiri LEFT JOIN
kata kunci). Oke, pemformatan saya membuatnya lebih "di atas" daripada "kiri", tetapi Anda mendapatkan gambarannya.
Inilah yang terjadi jika kita mengganti urutan tabel dalam kueri kita.
SELECT
p.PetName,
pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Hasil:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Kali ini Rabbit
tidak dikembalikan. Itu karena tabelnya (PetTypes
) berada di sisi kanan gabungan.
Kita perlu mengubahnya menjadi gabungan kanan atau gabungan penuh jika kita ingin Rabbit
untuk dikembalikan menggunakan urutan tabel ini.
Kiri Gabung di 3 Tabel
Berikut adalah contoh melakukan join kiri pada ketiga tabel.
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;
Hasil:
+-----------+-----------+----------------+ | 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)
Kali ini kami memiliki pemilik hewan peliharaan yang tidak memiliki hewan peliharaan.
Kami dapat kembali mengacak urutan meja, dan kami akan mendapatkan hasil yang berbeda.
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;
Hasil:
+-----------+-----------+---------------+ | 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)
Kali ini kita mendapatkan jenis pet tambahan (Rabbit
), tetapi bukan pemilik tambahan.
Jika Anda bertanya-tanya mengapa PetOwner
terakhir bukan NULL
(seperti terakhir PetName
is), itu karena ini adalah hasil dari rangkaian string. Saya menggunakan T-SQL CONCAT()
berfungsi untuk menggabungkan nama depan dan belakang pemilik.