Bayangkan kamu punya dua buku catatan: satu berisi daftar nama pelanggan, satu lagi berisi daftar pesanan. Masalahnya, di buku pesanan cuma ada nomor ID pelanggan, bukan nama lengkapnya. Kalau mau tahu "pesanan ini milik siapa", kamu harus buka kedua buku sekaligus dan mencocokkan ID-nya satu per satu. Lelah? Di sinilah INNER JOIN MySQL hadir menyelamatkan harimu!
INNER JOIN adalah perintah SQL yang memungkinkan kamu menggabungkan baris-baris dari dua tabel berbeda berdasarkan kolom yang nilainya cocok — seperti kunci dan gembok yang pas. Ini adalah artikel ke-20 dari seri 28 artikel Belajar Query SQL MySQL, dan topik ini adalah salah satu yang paling game-changing dalam perjalanan belajar database kamu.
Di artikel ini kita akan bahas: apa itu JOIN dan mengapa database perlu lebih dari satu tabel, cara kerja INNER JOIN secara visual, studi kasus nyata dari toko online, hingga latihan langsung yang bisa kamu coba sendiri. Yuk mulai! ๐
Fakta Menarik
Menurut survei Stack Overflow Developer Survey, SQL adalah bahasa yang paling banyak digunakan oleh data engineer dan backend developer. Dan dari semua perintah SQL, JOIN adalah yang paling sering muncul di soal interview kerja. Artinya, menguasai INNER JOIN bukan cuma soal lulus kuliah — tapi soal dapat kerja! ๐ฏ
๐ Sintaks INNER JOIN MySQL
Sebelum masuk ke contoh, pahami dulu kerangka dasar sintaksnya agar nggak kebingungan saat membaca query yang lebih kompleks:
SELECT tabel_a.kolom1, -- kolom dari tabel pertama tabel_a.kolom2, tabel_b.kolom1, -- kolom dari tabel kedua tabel_b.kolom2 FROM tabel_a -- tabel utama (kiri) INNER JOIN tabel_b -- tabel yang digabungkan (kanan) ON tabel_a.kolom_kunci = tabel_b.kolom_kunci -- kondisi pencocokan (harus bernilai sama) WHERE kondisi_tambahan -- opsional: filter tambahan ORDER BY kolom_urut; -- opsional: urutan hasil
Kunci memahami INNER JOIN: Klausa ON adalah jantungnya. Di sinilah kamu memberitahu MySQL: "Cocokkan baris dari tabel_a dengan tabel_b kalau nilai kolom ini sama." Baris yang tidak punya pasangan di kedua tabel akan otomatis dibuang.
1. Kenapa Database Butuh Lebih dari Satu Tabel?
Coba bayangkan toko online kamu menyimpan semua data dalam satu tabel raksasa: nama pelanggan, alamat, nomor HP, nama produk, harga, stok, tanggal pesanan... semuanya jadi satu baris. Kalau pelanggan yang sama pesan 100 kali, data nama dan alamatnya tersalin 100 kali. Boros, rawan salah, dan susah diupdate!
Solusinya adalah normalisasi — memecah data ke tabel-tabel terpisah yang saling berhubungan via foreign key. Tabel pelanggan menyimpan data pelanggan, tabel pesanan menyimpan transaksi. Nah, saat butuh laporan lengkap, INNER JOIN MySQL-lah yang menyatukan mereka kembali.
-- Tabel pelanggan CREATE TABLE pelanggan ( id_pelanggan INT PRIMARY KEY, nama VARCHAR(50), kota VARCHAR(30) ); -- Tabel pesanan (id_pelanggan = foreign key) CREATE TABLE pesanan ( id_pesanan VARCHAR(10) PRIMARY KEY, id_pelanggan INT, total_harga DECIMAL(12,2), status VARCHAR(20), FOREIGN KEY (id_pelanggan) REFERENCES pelanggan(id_pelanggan) );
✅ Tip Praktis
Kolom yang dijadikan penghubung antara dua tabel disebut Foreign Key (FK). Nilainya harus sama persis — baik tipe data maupun isinya — agar INNER JOIN berhasil mencocokkan baris-barisnya. Pastikan tipe data FK di kedua tabel identik (misalnya: keduanya INT)!
2. Cara Kerja INNER JOIN MySQL — Hanya Baris yang "Cocok" yang Lolos
Analogi paling pas untuk INNER JOIN adalah acara blind date yang ketat: hanya pasangan yang saling setuju (ID cocok di kedua tabel) yang bisa duduk bersama. Kalau di tabel kiri ada pelanggan yang belum pernah pesan apapun, dia tidak akan muncul di hasil. Begitu pula sebaliknya — pesanan dengan ID pelanggan yang tidak ada di tabel pelanggan juga ikut tersingkir.
(tidak cocok)
JOIN
✓
(tidak cocok)
Hanya irisan tengah yang dikembalikan oleh INNER JOIN
-- Gabungkan tabel pesanan dengan data pelanggan SELECT pe.id_pesanan, pl.nama AS nama_pelanggan, pl.kota, pe.total_harga, pe.status FROM pesanan pe INNER JOIN pelanggan pl ON pe.id_pelanggan = pl.id_pelanggan ORDER BY pe.total_harga DESC;
๐ Hasil Query:
| id_pesanan | nama_pelanggan | kota | total_harga | status |
|---|---|---|---|---|
| P-0086 | Rini Susanti | Surabaya | 620.000 | dikirim |
| P-0091 | Budi Santoso | Jakarta | 250.000 | selesai |
| P-0082 | Dewi Lestari | Bandung | 185.000 | dikirim |
| P-0078 | Budi Santoso | Jakarta | 130.000 | selesai |
⚠️ Peringatan
Perhatikan penggunaan alias tabel seperti pe untuk pesanan dan pl untuk pelanggan. Alias wajib digunakan saat dua tabel punya nama kolom yang sama (misalnya keduanya punya kolom id), agar MySQL tidak bingung kolom milik tabel mana yang kamu maksud.
3. INNER JOIN MySQL dengan Tiga Tabel — Level Up!
Di dunia nyata, toko online punya setidaknya tiga tabel utama: pelanggan, pesanan, dan produk. Untuk menampilkan laporan lengkap seperti "Siapa beli apa dan bayar berapa", kita perlu menggabungkan ketiganya dengan cara menjahit INNER JOIN lebih dari sekali — seperti merangkai rantai.
Biasanya ada tabel perantara detail_pesanan yang menghubungkan pesanan dengan produknya, karena satu pesanan bisa berisi banyak produk.
-- Laporan: siapa beli produk apa, berapa qty, total bayar SELECT pl.nama AS pelanggan, pr.nama_produk, dp.qty, dp.harga_satuan, (dp.qty * dp.harga_satuan) AS subtotal, pe.tanggal_pesan FROM pesanan pe INNER JOIN pelanggan pl ON pe.id_pelanggan = pl.id_pelanggan INNER JOIN detail_pesanan dp ON pe.id_pesanan = dp.id_pesanan INNER JOIN produk pr ON dp.id_produk = pr.id_produk ORDER BY pe.tanggal_pesan DESC;
๐ Hasil Query:
| pelanggan | nama_produk | qty | harga_satuan | subtotal | tanggal_pesan |
|---|---|---|---|---|---|
| Rini Susanti | Sepatu Lari X200 | 1 | 450.000 | 450.000 | 2025-08-11 |
| Rini Susanti | Kaus Olahraga Pro | 2 | 85.000 | 170.000 | 2025-08-11 |
| Budi Santoso | Tas Ransel Casual | 1 | 250.000 | 250.000 | 2025-08-15 |
| Dewi Lestari | Topi Baseball Unisex | 3 | 60.000 | 180.000 | 2025-08-10 |
✅ Tip Praktis
Saat JOIN lebih dari 2 tabel, buat sketsa relasinya dulu di kertas: tabel mana yang jadi "jembatan"? Alurnya seperti: pesanan → detail_pesanan → produk. Dengan peta relasi yang jelas, urutan INNER JOIN-mu tidak akan salah!
4. Kombinasi INNER JOIN + WHERE + GROUP BY — Laporan Siap Pakai
JOIN sendiri sudah powerful. Tapi JOIN yang dikombinasikan dengan WHERE dan GROUP BY? Itu baru namanya senjata sesungguhnya. Di sinilah kamu bisa bikin laporan seperti "Total belanja per pelanggan bulan ini" — persis seperti fitur di dashboard admin e-commerce sungguhan.
-- Rekap total belanja per pelanggan, bulan Agustus 2025 SELECT pl.nama AS pelanggan, pl.kota, COUNT(pe.id_pesanan) AS jumlah_transaksi, SUM(pe.total_harga) AS total_belanja FROM pelanggan pl INNER JOIN pesanan pe ON pl.id_pelanggan = pe.id_pelanggan WHERE MONTH(pe.tanggal_pesan) = 8 AND YEAR(pe.tanggal_pesan) = 2025 GROUP BY pl.id_pelanggan, pl.nama, pl.kota ORDER BY total_belanja DESC;
๐ Hasil Query:
| pelanggan | kota | jumlah_transaksi | total_belanja |
|---|---|---|---|
| Rini Susanti | Surabaya | 1 | 620.000 |
| Budi Santoso | Jakarta | 2 | 380.000 |
| Dewi Lestari | Bandung | 1 | 185.000 |
⚠️ Peringatan
Saat menggunakan GROUP BY bersama JOIN, semua kolom di SELECT yang bukan agregat (bukan SUM, COUNT, dll) harus ikut di GROUP BY. Jika tidak, MySQL bisa mengembalikan hasil yang tidak terduga atau bahkan error di mode strict SQL.
๐งช Langkah Praktikum — Dari Nol Sampai Bisa!
Buat dan Isi Tabel Pelanggan
Mulai dengan membuat tabel induk terlebih dahulu sebelum membuat tabel yang punya foreign key.
USE db_toko; INSERT INTO pelanggan VALUES (101, 'Budi Santoso', 'Jakarta'), (102, 'Dewi Lestari', 'Bandung'), (103, 'Rini Susanti', 'Surabaya'), (104, 'Ahmad Fauzi', 'Medan'); -- Ahmad belum pernah pesan → tidak akan muncul di INNER JOIN
Isi Tabel Pesanan
Perhatikan bahwa id_pelanggan 104 (Ahmad) tidak punya pesanan — ini sengaja untuk membuktikan perilaku INNER JOIN.
INSERT INTO pesanan VALUES ('P-0078', 101, 130000, 'selesai', '2025-08-08'), ('P-0082', 102, 185000, 'dikirim', '2025-08-10'), ('P-0086', 103, 620000, 'dikirim', '2025-08-11'), ('P-0091', 101, 250000, 'selesai', '2025-08-15');
Jalankan INNER JOIN Pertamamu
Jalankan query ini dan perhatikan hasilnya — Ahmad tidak muncul karena tidak punya pesanan!
SELECT pl.nama, pl.kota, pe.id_pesanan, pe.total_harga, pe.status FROM pesanan pe INNER JOIN pelanggan pl ON pe.id_pelanggan = pl.id_pelanggan;
Tantangan Mini — Buktikan Sendiri!
Coba tambahkan filter WHERE pl.kota = 'Jakarta' setelah INNER JOIN. Berapa pesanan yang muncul? Lalu ganti dengan GROUP BY pl.nama untuk menghitung total belanja per pelanggan Jakarta!
๐ Perbandingan Jenis-Jenis JOIN di MySQL
INNER JOIN adalah yang paling umum, tapi MySQL punya beberapa jenis JOIN lain yang akan kita pelajari di artikel-artikel berikutnya. Berikut gambaran singkatnya agar kamu tidak kaget:
| Jenis JOIN | Yang Dikembalikan | Analogi | Paling Sering? |
|---|---|---|---|
| INNER JOIN | Baris yang cocok di kedua tabel | Irisan dua lingkaran | ⭐⭐⭐⭐⭐ |
| LEFT JOIN | Semua baris tabel kiri + yang cocok di kanan | Semua pelanggan, pesanan jika ada | ⭐⭐⭐⭐ |
| RIGHT JOIN | Semua baris tabel kanan + yang cocok di kiri | Kebalikan LEFT JOIN | ⭐⭐ |
| CROSS JOIN | Semua kombinasi baris kedua tabel | Kartu remi dikali kartu remi | ⭐ |
Tips dari Lapangan #1
Selalu gunakan alias tabel pendek saat JOIN: FROM pesanan pe dan INNER JOIN pelanggan pl. Query jadi lebih pendek, mudah dibaca, dan nggak error karena nama kolom ambigu. Trainer lapangan selalu melihat ini sebagai tanda programmer yang rapi dan profesional.
Tips dari Lapangan #2
Kalau hasil INNER JOIN kamu terlihat lebih banyak dari yang diharapkan (baris terduplikasi), kemungkinan ada relasi one-to-many yang tidak terkendali. Cek apakah kamu sudah GROUP BY dengan benar, atau tambahkan DISTINCT untuk membersihkan duplikat.
๐ Kesimpulan — Kamu Sudah Bisa JOIN!
Artikel ke-20 ini membahas salah satu topik terpenting dalam SQL — INNER JOIN MySQL. Ini bukan sekadar perintah, ini adalah cara kamu mulai berpikir secara relasional tentang data. Berikut poin kunci yang sudah kita kuasai:
- ✦Normalisasi database adalah alasan kita perlu lebih dari satu tabel
- ✦INNER JOIN hanya mengembalikan baris yang cocok di kedua tabel (via klausa ON)
- ✦Alias tabel (pe, pl) wajib digunakan untuk kejelasan dan menghindari ambiguitas kolom
- ✦JOIN bisa dirantai lebih dari dua tabel — cukup tambahkan INNER JOIN berikutnya
- ✦Kombinasi INNER JOIN + WHERE + GROUP BY menghasilkan laporan bisnis yang powerful
- ✦MySQL memiliki 4 jenis JOIN — INNER, LEFT, RIGHT, dan CROSS — masing-masing untuk kasus berbeda
Kalau sebelumnya kamu cuma bisa query satu tabel, sekarang kamu sudah naik level! Dunia JOIN masih luas — LEFT JOIN menanti di artikel berikutnya. Keep going! ๐ช
Bagikan ke teman TI-mu yang lagi belajar SQL! ๐
Ada pertanyaan soal JOIN? Atau punya kasus JOIN yang bikin kamu pusing? Tulis di kolom komentar — kita bedah bareng! Dan jangan lupa bookmark seri ini biar nggak kelewatan.
Artikel 19/28: Fungsi Tanggal — NOW, DATE, YEAR, MONTH
Mengolah dan menghitung nilai tanggal/waktu menggunakan fungsi date bawaan MySQL secara lengkap.
Artikel 21/28: LEFT JOIN, RIGHT JOIN, dan CROSS JOIN
Tiga jenis JOIN lanjutan: LEFT JOIN, RIGHT JOIN, dan CROSS JOIN beserta kapan menggunakannya.
No comments:
Post a Comment