INNER JOIN: Menggabungkan Data dari Dua Tabel atau Lebih

Menyatukan data yang tersebar di beberapa tabel dengan JOIN, alias tabel, ON, dan menggabungkan tiga tabel atau lebih.

Part 16 dari 25 ± 40 menit Gratis

Analogi: INNER JOIN itu seperti mencocokkan tiket dengan daftar penonton: hanya yang punya pasangan di kedua daftar yang boleh masuk. Kolom ON adalah nomor kursi yang dipakai menghubungkan keduanya.

Kenapa perlu JOIN?

Tabel buku hanya menyimpan kategori_id (angka 1, 2, 3...). Untuk menampilkan nama kategorinya ("Novel", "Komik"), kita harus menggabungkan dengan tabel kategori. Itulah JOIN.

SELECT buku.judul, kategori.nama
FROM buku
INNER JOIN kategori ON buku.kategori_id = kategori.id;

Dua bagian wajib:

  • FROM buku INNER JOIN kategori: tabel mana yang digabung.
  • ON buku.kategori_id = kategori.id: aturan pencocokan, yaitu FK di satu tabel sama dengan PK di tabel lainnya.

Analogi: JOIN itu seperti mencocokkan daftar peserta dengan daftar nomor kursi lewat nomor peserta. Hanya peserta yang nomornya ada di kedua daftar yang muncul di hasil.

Alias tabel agar tidak panjang

SELECT b.judul, k.nama AS kategori
FROM buku b
JOIN kategori k ON b.kategori_id = k.id
ORDER BY b.judul;

INNER JOIN boleh ditulis JOIN saja. Memberi huruf pendek (b, k) disebut alias tabel; hampir semua orang melakukannya.

Kolom ambigu

Kalau kedua tabel punya kolom bernama sama (misalnya id atau nama), kamu wajib menyebut tabelnya: b.id, k.id. Kalau tidak, Postgres mengeluh column reference "id" is ambiguous.

Hanya baris yang cocok yang ikut

INNER JOIN hanya menampilkan baris yang punya pasangan di kedua tabel. Buku Catatan Tanpa Kategori (kategori_id NULL) tidak punya pasangan, jadi tidak muncul. Kalau ingin ia tetap muncul, pakai LEFT JOIN (bab berikutnya).

Menggabungkan tiga tabel atau lebih

Tambahkan JOIN berikutnya. Setiap JOIN punya ON sendiri:

SELECT p.id AS pesanan_id, pl.nama AS pelanggan, b.judul, d.jumlah
FROM detail_pesanan d
JOIN pesanan   p  ON d.pesanan_id   = p.id
JOIN pelanggan pl ON p.pelanggan_id = pl.id
JOIN buku      b  ON d.buku_id      = b.id
WHERE p.status = 'lunas'
ORDER BY p.id, b.judul;

Cara membacanya: mulai dari baris detail, cari pesanannya, dari pesanan cari pelanggannya, dari detail cari bukunya. Baru setelah semua tergabung, WHERE menyaring dan ORDER BY mengurutkan.

JOIN + hitungan

SELECT p.id, SUM(d.jumlah * d.harga_satuan) AS total
FROM pesanan p
JOIN detail_pesanan d ON d.pesanan_id = p.id
GROUP BY p.id
ORDER BY p.id;

Tips debug: bangun JOIN selangkah demi selangkah. Mulai dua tabel, pastikan hasilnya benar, baru tambah tabel ketiga.

Kasus nyata: daftar pesanan lengkap dengan nama pelanggan dan judul buku

SELECT p.id AS no_pesanan, pl.nama, b.judul, d.jumlah,
       d.jumlah * d.harga_satuan AS subtotal
FROM pesanan p
JOIN pelanggan pl     ON pl.id = p.pelanggan_id
JOIN detail_pesanan d ON d.pesanan_id = p.id
JOIN buku b           ON b.id = d.buku_id
ORDER BY p.id;

Tiga JOIN menyatukan empat tabel menjadi satu laporan yang bisa langsung dibaca tim penjualan.

Kesalahan yang sering terjadi

  • Lupa kondisi ON sehingga terjadi cross join (setiap baris dikalikan setiap baris, hasilnya meledak).
  • Menyebut kolom ambigu seperti id tanpa alias tabel. Selalu awali dengan p.id, b.id.
  • Heran kenapa baris hilang. INNER JOIN membuang baris yang tidak punya pasangan; pakai LEFT JOIN jika perlu mempertahankannya.

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