LEFT JOIN

Mempertahankan baris tanpa pasangan dan menemukannya dengan `LEFT JOIN`

Daftar isi

Topik ini membahas LEFT JOIN, yaitu jenis outer join yang mempertahankan seluruh baris dari tabel kiri, termasuk baris yang tidak memiliki pasangan di tabel kanan. Untuk baris tanpa pasangan, kolom dari tabel kanan akan berisi NULL. Kondisi ini dapat dimanfaatkan untuk menemukan baris yang tidak memiliki pasangan data dengan menyaring nilai NULL pada kolom tabel kanan. Dataset perpustakaan yang sama digunakan agar perbedaan jumlah baris hasil LEFT JOIN dan INNER JOIN dapat dibandingkan secara langsung.

Mempertahankan seluruh baris kiri#

LEFT JOIN meneruskan setiap baris tabel kiri ke hasil, lengkap maupun tidak pasangannya ada. Apabila pasangan ditemukan, kolom kanan diisi nilai dari baris kanan tersebut, dan apabila tidak ada, kolom kanan diisi NULL. Jalankan query berikut yang menempatkan buku sebagai tabel kiri dan peminjaman sebagai tabel kanan.

sql LEFT JOIN buku dan peminjaman
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT);
CREATE TABLE anggota (id INTEGER PRIMARY KEY, nama TEXT);
CREATE TABLE peminjaman (id INTEGER PRIMARY KEY, id_buku INTEGER, id_anggota INTEGER, tanggal_pinjam TEXT);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma'), (2, 'Peta Langit'), (3, 'Kode dan Sandi'),
  (4, 'Sejarah Kertas'), (5, 'Jejak Angin'), (6, 'Arsip Suara');
INSERT INTO anggota VALUES
  (1, 'Ali'), (2, 'Budi'), (3, 'Citra'),
  (4, 'Dewi'), (5, 'Eka'), (6, 'Farhan');
INSERT INTO peminjaman VALUES
  (1, 1, 1, '2026-03-02'), (2, 3, 2, '2026-03-04'),
  (3, 1, 3, '2026-03-06'), (4, 99, 4, '2026-03-09'),
  (5, 5, 5, '2026-03-11');
SELECT judul, id_buku, tanggal_pinjam
FROM buku
  LEFT JOIN peminjaman ON buku.id = peminjaman.id_buku
ORDER BY buku.id;
text Keluaran
Dasar Algoritma|1|2026-03-02
Dasar Algoritma|1|2026-03-06
Peta Langit||
Kode dan Sandi|3|2026-03-04
Sejarah Kertas||
Jejak Angin|5|2026-03-11
Arsip Suara||

Keluaran memuat tujuh baris, lebih banyak daripada enam baris buku karena Dasar Algoritma dipinjam dua kali sehingga menyumbang dua baris. Peta Langit, Sejarah Kertas, dan Arsip Suara tetap tampil dengan kolom id_buku dan tanggal_pinjam yang kosong karena tidak sedang dipinjam. Baris peminjaman yang menunjuk id_buku 99 tidak ikut tampil di sini karena tabel kiri adalah buku, sedangkan 99 bukan pengenal buku mana pun. Jumlah baris hasil dengan demikian bukan jumlah pasangan semata, melainkan jumlah pasangan ditambah jumlah baris kiri yang tanpa pasangan.

Membaca NULL pada kolom kanan#

Deretan kosong pada keluaran sebelumnya adalah nilai NULL yang diciptakan oleh LEFT JOIN untuk baris kiri tanpa pasangan, bukan nilai yang benar-benar tersimpan di tabel. Untuk memeriksa arah yang sebaliknya, tempatkan peminjaman sebagai tabel kiri. Query berikut memasangkan setiap peminjaman dengan bukunya, lengkap dengan yang bukunya tidak ada.

sql Peminjaman dengan judul yang mungkin kosong
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT);
CREATE TABLE anggota (id INTEGER PRIMARY KEY, nama TEXT);
CREATE TABLE peminjaman (id INTEGER PRIMARY KEY, id_buku INTEGER, id_anggota INTEGER, tanggal_pinjam TEXT);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma'), (2, 'Peta Langit'), (3, 'Kode dan Sandi'),
  (4, 'Sejarah Kertas'), (5, 'Jejak Angin'), (6, 'Arsip Suara');
INSERT INTO anggota VALUES
  (1, 'Ali'), (2, 'Budi'), (3, 'Citra'),
  (4, 'Dewi'), (5, 'Eka'), (6, 'Farhan');
INSERT INTO peminjaman VALUES
  (1, 1, 1, '2026-03-02'), (2, 3, 2, '2026-03-04'),
  (3, 1, 3, '2026-03-06'), (4, 99, 4, '2026-03-09'),
  (5, 5, 5, '2026-03-11');
SELECT peminjaman.id, id_anggota, id_buku, judul
FROM peminjaman
  LEFT JOIN buku ON buku.id = peminjaman.id_buku
ORDER BY peminjaman.id;
text Keluaran
1|1|1|Dasar Algoritma
2|2|3|Kode dan Sandi
3|3|1|Dasar Algoritma
4|4|99|
5|5|5|Jejak Angin

Kelima baris peminjaman kini seluruhnya ditampilkan, termasuk baris dengan id_buku 99 yang sebelumnya tidak muncul pada hasil INNER JOIN. Kolom judul buku pada baris tersebut bernilai NULL karena tidak ditemukan buku yang cocok. Arah penulisan tabel menentukan sisi yang dipertahankan: seluruh baris dari tabel kiri tetap ditampilkan, sedangkan kolom dari tabel kanan dapat bernilai NULL jika tidak ditemukan pasangan. Sifat inilah yang menjadikan LEFT JOIN berguna untuk menampilkan seluruh data, termasuk data yang tidak memiliki pasangan.

Menemukan baris tanpa pasangan#

Baris yang tidak memiliki pasangan dapat ditemukan dengan menyaring kolom dari tabel kanan yang bernilai NULL setelah melakukan LEFT JOIN dari tabel yang datanya diperiksa ke tabel yang menjadi rujukannya. Jalankan kueri berikut untuk mencari data peminjaman yang tidak memiliki pasangan pada tabel buku.

sql Peminjaman yang bukunya tidak ada
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT);
CREATE TABLE anggota (id INTEGER PRIMARY KEY, nama TEXT);
CREATE TABLE peminjaman (id INTEGER PRIMARY KEY, id_buku INTEGER, id_anggota INTEGER, tanggal_pinjam TEXT);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma'), (2, 'Peta Langit'), (3, 'Kode dan Sandi'),
  (4, 'Sejarah Kertas'), (5, 'Jejak Angin'), (6, 'Arsip Suara');
INSERT INTO anggota VALUES
  (1, 'Ali'), (2, 'Budi'), (3, 'Citra'),
  (4, 'Dewi'), (5, 'Eka'), (6, 'Farhan');
INSERT INTO peminjaman VALUES
  (1, 1, 1, '2026-03-02'), (2, 3, 2, '2026-03-04'),
  (3, 1, 3, '2026-03-06'), (4, 99, 4, '2026-03-09'),
  (5, 5, 5, '2026-03-11');
SELECT peminjaman.id, id_anggota, id_buku, tanggal_pinjam
FROM peminjaman
  LEFT JOIN buku ON buku.id = peminjaman.id_buku
WHERE buku.id IS NULL;
text Keluaran
4|4|99|2026-03-09

Satu baris yang muncul adalah peminjaman id 4 milik Dewi yang menunjuk id_buku 99. Logikanya terbaca dua tahap, yaitu LEFT JOIN mencoba memasangkan setiap peminjaman dengan bukunya, kemudian WHERE buku.id IS NULL membuang semua baris yang berhasil dipasangkan sehingga tersisa baris tanpa pasangan. Pola penyaringan seperti ini disebut anti-join, yaitu cara mengambil isi satu tabel yang justru tidak terwakili di tabel lain.

Anti-join sebagai pola#

Anti-join adalah pola penyaringan, bukan kata kunci SQL, sehingga bentuknya selalu LEFT JOIN diikuti IS NULL pada kolom kunci tabel kanan. Pola yang sama berlaku pada arah mana pun. Jalankan query berikut untuk menemukan anggota yang belum pernah meminjam.

sql Anggota yang belum pernah meminjam
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT);
CREATE TABLE anggota (id INTEGER PRIMARY KEY, nama TEXT);
CREATE TABLE peminjaman (id INTEGER PRIMARY KEY, id_buku INTEGER, id_anggota INTEGER, tanggal_pinjam TEXT);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma'), (2, 'Peta Langit'), (3, 'Kode dan Sandi'),
  (4, 'Sejarah Kertas'), (5, 'Jejak Angin'), (6, 'Arsip Suara');
INSERT INTO anggota VALUES
  (1, 'Ali'), (2, 'Budi'), (3, 'Citra'),
  (4, 'Dewi'), (5, 'Eka'), (6, 'Farhan');
INSERT INTO peminjaman VALUES
  (1, 1, 1, '2026-03-02'), (2, 3, 2, '2026-03-04'),
  (3, 1, 3, '2026-03-06'), (4, 99, 4, '2026-03-09'),
  (5, 5, 5, '2026-03-11');
SELECT nama
FROM anggota
  LEFT JOIN peminjaman ON peminjaman.id_anggota = anggota.id
WHERE peminjaman.id IS NULL;
text Keluaran
Farhan

Hasilnya Farhan, satu-satunya anggota tanpa baris peminjaman. Pada INNER JOIN, Farhan menghilang karena tidak punya pasangan, sedangkan LEFT JOIN mempertahankannya dengan kolom peminjaman yang NULL, lalu IS NULL mengangkatnya menjadi jawaban. Pertanyaan seperti anggota tanpa pinjaman, buku tanpa peminjam, dan peminjaman tanpa buku semuanya dijawab dengan pola yang sama pada tabel dan arah yang berbeda.

Perbandingan jumlah baris#

Perbedaan INNER JOIN dan LEFT JOIN pada dataset yang sama dirangkum paling tegas oleh dua hitungan berikut. Jalankan keduanya dalam satu blok agar selisihnya terlihat berdampingan.

sql Jumlah baris INNER JOIN dan LEFT JOIN
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT);
CREATE TABLE anggota (id INTEGER PRIMARY KEY, nama TEXT);
CREATE TABLE peminjaman (id INTEGER PRIMARY KEY, id_buku INTEGER, id_anggota INTEGER, tanggal_pinjam TEXT);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma'), (2, 'Peta Langit'), (3, 'Kode dan Sandi'),
  (4, 'Sejarah Kertas'), (5, 'Jejak Angin'), (6, 'Arsip Suara');
INSERT INTO anggota VALUES
  (1, 'Ali'), (2, 'Budi'), (3, 'Citra'),
  (4, 'Dewi'), (5, 'Eka'), (6, 'Farhan');
INSERT INTO peminjaman VALUES
  (1, 1, 1, '2026-03-02'), (2, 3, 2, '2026-03-04'),
  (3, 1, 3, '2026-03-06'), (4, 99, 4, '2026-03-09'),
  (5, 5, 5, '2026-03-11');
SELECT COUNT(*) FROM buku JOIN peminjaman ON buku.id = peminjaman.id_buku;
SELECT COUNT(*) FROM buku LEFT JOIN peminjaman ON buku.id = peminjaman.id_buku;
text Keluaran
4
7

Query pertama menghasilkan empat karena hanya pasangan yang diteruskan. Query kedua menghasilkan tujuh, yaitu empat pasangan ditambah tiga buku tanpa peminjam, dan Dasar Algoritma menyumbang dua dari empat pasangan itu. Selisih tiga baris adalah kehadiran baris kiri yang tidak berpasangan. Angka empat dan tujuh ini konsisten dengan seluruh contoh pada modul ini karena datasetnya sama.

Perbandingan yang sama berlaku pada arah mana pun join dibentuk. Dari sisi buku, INNER JOIN menghasilkan empat baris sedangkan LEFT JOIN menghasilkan tujuh. Dari sisi peminjaman, INNER JOIN tetap menghasilkan empat baris, sedangkan LEFT JOIN menghasilkan lima karena seluruh peminjaman dipertahankan, termasuk baris yatimnya. Memilih sisi kiri dengan demikian berarti menentukan tabel yang harus tampil utuh, dan pertanyaan yang dijawab biasanya sudah menunjuk sisi tersebut secara alami.

Ringkasan#

  • LEFT JOIN mempertahankan seluruh baris tabel kiri dan mengisi kolom kanan dengan NULL apabila pasangan tidak ada.
  • Baris tanpa pasangan dapat ditemukan dengan menggunakan LEFT JOIN pada arah yang tepat, kemudian menyaring baris yang kolom kuncinya dari tabel kanan bernilai NULL menggunakan WHERE ... IS NULL. Pola ini disebut anti-join.
  • Syarat biasa pada kolom tabel kanan di WHERE membuang baris kiri tanpa pasangan sehingga hasilnya setara INNER JOIN.
  • Pada dataset modul ini, INNER JOIN buku dan peminjaman menghasilkan empat baris, sedangkan LEFT JOIN menghasilkan tujuh.

Referensi#