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
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
| 4 | Diana |
Tabel orders
| id | user_id | product |
|---|---|---|
| 1 | 1 | Laptop |
| 2 | 1 | Mouse |
| 3 | 2 | Monitor |
| 4 | 5 | Keyboard |
* 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:
| name | product |
|---|---|
| Alice | Laptop |
| Alice | Mouse |
| Bob | Monitor |
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:
| name | product |
|---|---|
| Alice | Laptop |
| Alice | Mouse |
| Bob | Monitor |
| Charlie | NULL |
| Diana | NULL |
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:
| name | product |
|---|---|
| Alice | Laptop |
| Alice | Mouse |
| Bob | Monitor |
| NULL | Keyboard |
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 JOIN | Hanya butuh data yang ada di kedua tabel |
| LEFT JOIN | Butuh semua data dari tabel utama + data relasi jika ada |
| RIGHT JOIN | Kebalikan LEFT JOIN (biasanya bisa diubah ke LEFT JOIN) |
| FULL OUTER JOIN | Butuh semua data dari kedua tabel |
| SELF JOIN | Data hierarkis dalam satu tabel |
- 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
Komentar 0