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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | +-----------+-------------+------------+----------------+-------------------+
Perhatikan bahwa:
PetTypeIdkolomPetstabel adalah kunci asing dariPetTypeIddariPetTypestabel (yang merupakan kunci utama dari tabel tersebut).OwnerIdkolomPetstabel adalah kunci asing dariOwnerIdkolomOwnersmeja.
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.