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.

Part 24 dari 38 ± 45 menit Gratis

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 p memberi nama pendek p. Kata AS boleh dibuang.
  • JOIN saja berarti INNER 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X