INNER JOIN: Menyatukan Dua Tabel yang Berhubungan
Menggabungkan data dari dua tabel dengan JOIN ... ON, memakai alias tabel, dan memahami bahwa INNER JOIN hanya menampilkan pasangan yang cocok.
Kenapa butuh JOIN?
Tabel pesanan hanya menyimpan pelanggan_id (angka 1, 2, 3...). Untuk laporan, kita ingin melihat nama pelanggan. Nama ada di tabel pelanggan. JOIN "menjahit" dua tabel berdasarkan kolom yang berhubungan (PK↔FK).
SELECT pesanan.id, pelanggan.nama, pesanan.tanggal
FROM pesanan
INNER JOIN pelanggan ON pelanggan.id = pesanan.pelanggan_id;
+----+---------------+------------+
| id | nama | tanggal |
+----+---------------+------------+
| 1 | Budi Santoso | 2024-01-05 |
| 2 | Siti Aminah | 2024-01-07 |
| 3 | Budi Santoso | 2024-01-20 |
...
Membaca JOIN seperti kalimat
"Ambil dari pesanan, sambungkan dengan pelanggan di mana id pelanggan sama dengan pelanggan_id pesanan." Bagian setelah ON adalah aturan pencocokan: kunci kedua tabel.
Alias tabel: biar tidak capek mengetik
SELECT p.id AS no_pesanan, pl.nama AS pelanggan, p.tanggal
FROM pesanan AS p
JOIN pelanggan AS pl ON pl.id = p.pelanggan_id
WHERE p.status = 'lunas'
ORDER BY p.tanggal;
pesanan AS pmemberi nama pendekp. KataASboleh dibuang.JOINsaja berartiINNER JOIN.- Kolom bernama sama di dua tabel (
id,nama) wajib diberi awalan tabel (p.id), kalau tidak MySQL bingung: "Column 'id' is ambiguous". Biasakan memberi awalan di semua kolom.
Apa arti "INNER"?
INNER JOIN hanya menampilkan baris yang punya pasangan di kedua tabel. Pelanggan yang belum pernah memesan (Fitri, Joko) tidak muncul, karena tidak ada pesanan yang cocok. Kalau kamu ingin mereka tetap tampil, itu tugas LEFT JOIN (bab berikutnya).
Analogi pesta dansa: INNER JOIN = hanya pasangan yang sudah dapat partner yang tampil di lantai dansa. Yang tidak dapat partner tetap di pinggir dan tidak difoto.
JOIN + WHERE + fungsi: semua tetap bisa dipakai
SELECT pl.nama, p.tanggal
FROM pelanggan pl
JOIN pesanan p ON p.pelanggan_id = pl.id
WHERE pl.kota = 'Jakarta' AND p.status = 'lunas'
ORDER BY p.tanggal DESC;
Kesalahan umum
- Lupa ON → di MySQL, JOIN tanpa ON bertingkah seperti CROSS JOIN: semua pasangan mungkin (10 pelanggan × 13 pesanan = 130 baris sampah).
- Mencocokkan kolom yang salah (mis.
pl.id = p.id) → hasilnya tampak masuk akal tapi keliru. Selalu cek: yang dicocokkan adalah PK dengan FK-nya. - Baris berlipat ganda setelah JOIN adalah normal pada relasi satu-ke-banyak: satu pelanggan dengan 3 pesanan muncul 3 kali.