SQL JOIN adalah salah satu konsep paling penting sekaligus paling sering membingungkan. Artikel ini menggunakan data dan visualisasi nyata agar kamu benar-benar paham — bukan sekadar hafal syntax.

Data yang Dipakai

Kita akan pakai dua tabel sederhana sepanjang artikel ini:

Tabel users

idname
1Alice
2Bob
3Charlie
4Diana

Tabel orders

iduser_idproduct
11Laptop
21Mouse
32Monitor
45Keyboard

* user_id=5 tidak ada di tabel users

1. INNER JOIN — Hanya yang Cocok di Kedua Tabel

INNER JOIN mengambil baris yang ada di kedua tabel. Kalau salah satu tidak cocok, baris itu tidak muncul.

SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Hasil:

nameproduct
AliceLaptop
AliceMouse
BobMonitor

Charlie dan Diana tidak muncul (tidak punya order). Order user_id=5 tidak muncul (user tidak ada).

2. LEFT JOIN — Semua dari Tabel Kiri + yang Cocok dari Kanan

LEFT JOIN mengambil semua baris dari tabel kiri (users), ditambah data dari tabel kanan (orders) yang cocok. Kalau tidak ada yang cocok, kolom kanan diisi NULL.

SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

Hasil:

nameproduct
AliceLaptop
AliceMouse
BobMonitor
CharlieNULL
DianaNULL

Charlie dan Diana tetap muncul meski tidak punya order. Ini berguna untuk mencari user yang belum pernah order: WHERE orders.id IS NULL.

3. RIGHT JOIN — Semua dari Tabel Kanan + yang Cocok dari Kiri

Kebalikan LEFT JOIN. Semua baris dari tabel kanan (orders) diambil, tabel kiri (users) diisi NULL jika tidak cocok. Jarang dipakai — biasanya lebih mudah menukar posisi tabel dan pakai LEFT JOIN.

SELECT users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;

Hasil:

nameproduct
AliceLaptop
AliceMouse
BobMonitor
NULLKeyboard

Order Keyboard (user_id=5) tetap muncul meski user-nya tidak ada.

4. FULL OUTER JOIN — Semua dari Kedua Tabel

Mengambil semua baris dari kedua tabel. Yang tidak punya pasangan diisi NULL. MySQL tidak support syntax ini — gunakan UNION dari LEFT JOIN + RIGHT JOIN.

-- PostgreSQL / SQL Server
SELECT users.name, orders.product
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;

-- MySQL (workaround dengan UNION)
SELECT users.name, orders.product
FROM users LEFT JOIN orders ON users.id = orders.user_id
UNION
SELECT users.name, orders.product
FROM users RIGHT JOIN orders ON users.id = orders.user_id;

5. CROSS JOIN — Semua Kombinasi

Menghasilkan perkalian dari kedua tabel. 4 users × 4 orders = 16 baris. Jarang dipakai kecuali untuk generate kombinasi.

SELECT users.name, orders.product
FROM users
CROSS JOIN orders;

6. SELF JOIN — Join Tabel dengan Dirinya Sendiri

Berguna untuk data hierarkis, misalnya tabel karyawan yang punya kolom manager_id yang merujuk ke tabel yang sama.

SELECT e.name AS karyawan, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Ringkasan Kapan Pakai Apa

Jenis JOIN Gunakan ketika…
INNER JOINHanya butuh data yang ada di kedua tabel
LEFT JOINButuh semua data dari tabel utama + data relasi jika ada
RIGHT JOINKebalikan LEFT JOIN (biasanya bisa diubah ke LEFT JOIN)
FULL OUTER JOINButuh semua data dari kedua tabel
SELF JOINData hierarkis dalam satu tabel
💡 Tips Penting

  • Selalu gunakan alias tabel untuk query yang panjang: FROM users u INNER JOIN orders o ON u.id = o.user_id
  • LEFT JOIN adalah jenis JOIN yang paling sering dipakai dalam aplikasi nyata
  • Untuk cari data yang tidak punya relasi: LEFT JOIN ... WHERE tabel_kanan.id IS NULL