Tutorial8 Februari 2026

Stop Menghafal SQL JOIN! Cara Ini Bikin Kamu Paham Seumur Hidup (Gak Pake Pusing)

Cong Fandi
Cong Fandi5 min read
...
Stop Menghafal SQL JOIN! Cara Ini Bikin Kamu Paham Seumur Hidup (Gak Pake Pusing)

Jujur deh, berapa kali kamu buka Google cuma buat search "SQL Join Types" atau "SQL Join Venn Diagram"? 🤔

Saya dulu juga gitu. Hafalin bulat-bulat gambar lingkaran (Venn Diagram) itu, tapi pas ketemu kasus nyata di database... BLANK. Lupa lagi mana yang LEFT, mana yang INNER, apalagi yang OUTER.

SQL Join Venn Diagram

Ternyata, cara terbaik memahami SQL JOIN itu BUKAN dengan menghafal diagram venn. Tapi dengan memahami SIFAT HUBUNGAN ANTAR 2 TABEL.

Yuk, kita bedah tuntas pakai studi kasus yang gampang dicerna. Gak perlu pusing, cukup siapin kopi! ☕


Studi Kasus: Warung Coding

Anggap kita punya 2 tabel sederhana: Products (Barang Dagangan) dan Transactions (Catatan Pembelian).

Tabel 1: Products (Daftar Barang)

idname
1Kopi Susu
2Pisang Goreng
3Nasi Goreng
4Mie Rebus
5Air Mineral

Catatan: Air Mineral (id 5) belum pernah laku.

Tabel 2: Transactions (Catatan Transaksi)

idproduct_idamount
101115000
102115000
10325000
1049950000

Catatan: Transaksi 104 punya product_id = 99. Produk ini nggak ada di tabel Products (mungkin produk hantu atau udah dihapus dari database).


1. Saya mau tau Produk yang LAKU saja

(INNER JOIN)

Ini adalah join paling dasar. Kita cuma peduli sama data yang ADA DI KEDUA TABEL. Kalau ada produk tapi gak laku -> Gak usah tampil. Kalau ada transaksi tapi produknya gaib -> Gak usah tampil.

SELECT * 
FROM Products p
INNER JOIN Transactions t ON p.id = t.product_id;

Hasil:

  • Kopi Susu (Ada transaksinya) ✅
  • Pisang Goreng (Ada transaksinya) ✅
  • Air Mineral (Gak laku) ❌
  • Transaksi Gaib (Produknya gak ada) ❌

2. Saya mau tau SEMUA data Produk dan SEMUA data Transaksi

(FULL OUTER JOIN)

Pokoknya tampilin semuanya! bodo amat nyambung atau enggak. Yang nyambung dijodohin, yang jomblo biarin tampil sendirian (kolom pasangannya bakal NULL).

SELECT * 
FROM Products p
FULL OUTER JOIN Transactions t ON p.id = t.product_id;

Hasil:

  • Kopi Susu & Transaksinya ✅
  • Air Mineral (Transaksinya NULL) ✅
  • Transaksi Gaib (Produknya NULL) ✅

3. Saya mau tau data yang "Jomblo" di kedua sisi

(FULL OUTER JOIN ... WHERE NULL)

Ini kebalikan yang nomor 1. Kita cari produk yang GAK LAKU DAN transaksi yang GAK ADA PRODUKNYA. Yang normal-normal (berpasangan) justru kita buang.

SELECT * 
FROM Products p
FULL OUTER JOIN Transactions t ON p.id = t.product_id
WHERE p.id IS NULL OR t.id IS NULL;

Hasil:

  • Air Mineral (Jomblo Produk) ✅
  • Transaksi Gaib (Jomblo Transaksi) ✅
  • Kopi Susu (Berpasangan) ❌

4. Saya mau lihat SEMUA Produk, terserah laku atau enggak

(LEFT JOIN)

Fokus kita di tabel KIRI (Products). Pokoknya list produk harus lengkap. Kalau dia laku, tampilin transaksinya. Kalau gak laku, kolom transaksi diisi NULL aja, yang penting produknya tampil.

SELECT * 
FROM Products p
LEFT JOIN Transactions t ON p.id = t.product_id;

Hasil:

  • Kopi Susu (Ada data transaksinya) ✅
  • Air Mineral (Kolom transaksi NULL, tapi tetap tampil) ✅
  • Transaksi Gaib (Gak tampil karena nggak ada di tabel Kiri/Products) ❌

5. Saya mau cari Produk yang BELUM PERNAH laku

(LEFT JOIN ... WHERE NULL)

Ini gunanya buat nyari "Dead Stock". Kita pakai LEFT JOIN (ambil semua produk), tapi kita filter cuma yang pasangan kanannya KOSONG (NULL).

SELECT * 
FROM Products p
LEFT JOIN Transactions t ON p.id = t.product_id
WHERE t.id IS NULL;

Hasil:

  • Air Mineral ✅
  • Kopi Susu ❌ (Karena laku)

6. Saya mau lihat SEMUA Transaksi, lengkap dengan info produknya

(RIGHT JOIN)

Ini kebalikan LEFT JOIN. Fokus kita sekarang di tabel KANAN (Transactions). Pokoknya semua catatan transaksi harus tampil. Kalau produknya masih ada di database, tampilin namanya. Kalau produknya udah dihapus/gaib, biarin nama produknya NULL.

SELECT * 
FROM Products p
RIGHT JOIN Transactions t ON p.id = t.product_id;

Hasil:

  • Transaksi Kopi Susu (Ada info produknya) ✅
  • Transaksi Gaib (Info produk NULL, tapi transaksi tetap tampil) ✅
  • Air Mineral (Gak tampil karena gak ada di tabel Kanan/Transactions) ❌

7. Saya mau cari Transaksi yang datanya "Error" (Gak ada Produknya)

(RIGHT JOIN ... WHERE NULL)

Kasus ini jarang terjadi kalau database kamu bagus (pakai Foreign Key). Tapi kalau datanya "kotor", query ini penyelamat. Kita cari transaksi yang product_id-nya menunjuk ke antah berantah.

SELECT * 
FROM Products p
RIGHT JOIN Transactions t ON p.id = t.product_id
WHERE p.id IS NULL;

Hasil:

  • Transaksi Gaib (Tampil) ✅
  • Transaksi Kopi Susu ❌ (Karena punya produk valid)

Kesimpulan

Gampang kan? Kuncinya ada di FOKUS kamu:

  • Mau data yang IRISAN aja? -> INNER JOIN
  • Mau SEMUA data KIRI? -> LEFT JOIN
  • Mau SEMUA data KANAN? -> RIGHT JOIN
  • Mau SEMUANYA tanpa pandang bulu? -> FULL JOIN

Semoga setelah baca ini, kamu gak perlu lagi ngafalin diagram bulat-bulat itu ya! Selamat ngoding! 🚀

TutorialSQLDatabaseBackend