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.
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
ONsehingga terjadi cross join (setiap baris dikalikan setiap baris, hasilnya meledak). - Menyebut kolom ambigu seperti
idtanpa alias tabel. Selalu awali denganp.id,b.id. - Heran kenapa baris hilang. INNER JOIN membuang baris yang tidak punya pasangan; pakai LEFT JOIN jika perlu mempertahankannya.