Pernah beli barang online, terus kamu bisa lihat nama kamu, nama produknya, kategori produk, nama kurir, hingga nama kota pengiriman — semua dalam satu halaman? Di balik tampilan itu, ada satu query SQL yang menyatukan empat atau lima tabel sekaligus. Itulah kekuatan multi table JOIN MySQL yang akan kita bahas di artikel ke-22 dari seri 28 artikel Belajar Query SQL MySQL ini!
Kalau di artikel sebelumnya kamu sudah paham LEFT JOIN, RIGHT JOIN, dan CROSS JOIN antara dua tabel — sekarang kita naik level. Dunia nyata jarang punya cuma dua tabel. Aplikasi toko online yang serius bisa punya belasan tabel yang saling terhubung, dan kamu perlu bisa menarik data dari semuanya dalam satu query yang bersih dan efisien.
Di artikel ini kita akan belajar: cara menyusun multi-table JOIN, urutan tabel yang benar, menghindari jebakan alias yang bikin error, dan contoh query nyata dari studi kasus toko online kita. Siap? Mari mulai!
Sistem ERP (Enterprise Resource Planning) seperti SAP atau Odoo yang digunakan perusahaan besar seringkali memiliki query dengan 10–20 tabel yang di-JOIN sekaligus. Seorang DBA (Database Administrator) senior wajib bisa membaca dan mengoptimasi query raksasa seperti itu. Fondasi dasarnya? Persis yang kamu pelajari sekarang!
01. Konsep Dasar: Rantai JOIN
Analogi: Bayangkan kamu mau trace sebuah paket pengiriman. Kamu mulai dari struk belanja (pesanan), lalu cocokkan dengan buku produk (tabel produk), kemudian cocokkan lagi dengan data pelanggan (tabel pelanggan), dan terakhir dengan catatan pengiriman (tabel pengiriman). Kamu berpindah dari satu buku ke buku lain secara berantai — itulah multi-table JOIN!
MySQL memproses JOIN dari kiri ke kanan secara berurutan. Setiap JOIN menambahkan tabel baru ke hasil sementara yang sudah ada. Jadi multi table JOIN MySQL pada dasarnya adalah tumpukan JOIN — satu di atas yang lain.
SELECT t1.kolom_a, -- kolom dari tabel pertama t2.kolom_b, -- kolom dari tabel kedua t3.kolom_c, -- kolom dari tabel ketiga t4.kolom_d -- kolom dari tabel keempat (dst) FROM tabel1 t1 -- tabel utama (anchor/basis) INNER JOIN tabel2 t2 -- JOIN tabel kedua ON t1.id = t2.fk_id -- kondisi relasi tabel1 ↔ tabel2 INNER JOIN tabel3 t3 -- JOIN tabel ketiga ke hasil sebelumnya ON t2.id = t3.fk_id -- kondisi relasi tabel2 ↔ tabel3 LEFT JOIN tabel4 t4 -- bisa campur jenis JOIN! ON t3.id = t4.fk_id -- kondisi relasi tabel3 ↔ tabel4 WHERE t1.kolom = 'nilai' -- filter opsional ORDER BY t1.kolom_a; -- urutan opsional
Kamu tidak wajib pakai jenis JOIN yang sama untuk setiap JOIN. Dalam satu query, kamu bisa campur INNER JOIN dan LEFT JOIN sesuai kebutuhan. Tabel yang datanya wajib ada? Pakai INNER JOIN. Tabel yang opsional? Pakai LEFT JOIN.
Setup Data Toko Online (4 Tabel):
-- Tabel 1: pelanggan CREATE TABLE pelanggan ( id_pelanggan INT PRIMARY KEY, nama VARCHAR(100), kota VARCHAR(50) ); INSERT INTO pelanggan VALUES (1,'Andi','Jakarta'),(2,'Budi','Bandung'),(3,'Citra','Surabaya'); -- Tabel 2: kategori CREATE TABLE kategori ( id_kategori INT PRIMARY KEY, nama_kategori VARCHAR(50) ); INSERT INTO kategori VALUES (1,'Elektronik'),(2,'Aksesoris'),(3,'Peripheral'); -- Tabel 3: produk (relasi ke kategori) CREATE TABLE produk ( id_produk INT PRIMARY KEY, nama_produk VARCHAR(100), id_kategori INT, harga INT ); INSERT INTO produk VALUES (1,'Laptop Gaming',1,15000000), (2,'Mouse Wireless',2,250000), (3,'Mechanical Keyboard',3,750000), (4,'Monitor 4K',1,5000000); -- Tabel 4: pesanan (relasi ke pelanggan & produk) CREATE TABLE pesanan ( id_pesanan INT PRIMARY KEY, id_pelanggan INT, id_produk INT, jumlah INT, tanggal DATE ); INSERT INTO pesanan VALUES (101,1,1,1,'2024-01-15'), (102,2,2,2,'2024-01-16'), (103,1,3,1,'2024-01-17'), (104,3,4,1,'2024-01-18'), (105,2,1,1,'2024-01-19');
02. JOIN 3 Tabel: Pesanan + Pelanggan + Produk
Kasus paling umum dalam multi table JOIN MySQL adalah laporan yang butuh info dari tiga tabel: kita mau tahu siapa yang memesan (pelanggan), apa yang dipesan (produk), dan kapan dipesan (pesanan). Tabel pesanan menjadi jembatan — karena dia punya id_pelanggan dan id_produk sekaligus.
-- Laporan pesanan lengkap (3 tabel) SELECT ps.id_pesanan, ps.tanggal, pl.nama AS nama_pelanggan, pl.kota, pr.nama_produk, ps.jumlah, pr.harga, (ps.jumlah * pr.harga) AS total_bayar FROM pesanan ps -- tabel anchor/utama INNER JOIN pelanggan pl -- JOIN tabel pelanggan ON ps.id_pelanggan = pl.id_pelanggan INNER JOIN produk pr -- JOIN tabel produk ON ps.id_produk = pr.id_produk ORDER BY ps.tanggal;
| id_pesanan | tanggal | nama_pelanggan | kota | nama_produk | jumlah | total_bayar |
|---|---|---|---|---|---|---|
| 101 | 2024-01-15 | Andi | Jakarta | Laptop Gaming | 1 | 15.000.000 |
| 102 | 2024-01-16 | Budi | Bandung | Mouse Wireless | 2 | 500.000 |
| 103 | 2024-01-17 | Andi | Jakarta | Mechanical Keyboard | 1 | 750.000 |
| 104 | 2024-01-18 | Citra | Surabaya | Monitor 4K | 1 | 5.000.000 |
| 105 | 2024-01-19 | Budi | Bandung | Laptop Gaming | 1 | 15.000.000 |
⬆️ Kolom total_bayar dihitung langsung di SELECT — kamu bisa bikin kolom kalkulasi langsung dalam query tanpa perlu tabel baru!
Jadikan tabel yang menjadi penghubung antar tabel lain (seperti tabel pesanan yang punya FK ke mana-mana) sebagai tabel utama di klausa FROM. Ini membuat alur join lebih logis dan mudah diikuti.
03. JOIN 4 Tabel: Tambahkan Kategori Produk
Sekarang kita tambah satu tabel lagi — kategori — agar di laporan muncul nama kategori produk, bukan cuma nama produknya. Ini adalah contoh klasik multi table JOIN MySQL empat tabel, yang sering muncul di tugas akhir dan proyek kampus.
Perhatikan urutannya: pesanan → pelanggan → produk → kategori. Setiap JOIN harus "masuk akal" — relasi antara tabel yang sedang di-JOIN dan hasil gabungan sebelumnya harus jelas.
-- Laporan lengkap dengan kategori (4 tabel) SELECT ps.id_pesanan, ps.tanggal, pl.nama AS pelanggan, pl.kota, k.nama_kategori AS kategori, -- dari tabel kategori pr.nama_produk, pr.harga, ps.jumlah, (ps.jumlah * pr.harga) AS subtotal FROM pesanan ps INNER JOIN pelanggan pl ON ps.id_pelanggan = pl.id_pelanggan INNER JOIN produk pr ON ps.id_produk = pr.id_produk INNER JOIN kategori k -- JOIN ke tabel kategori lewat produk ON pr.id_kategori = k.id_kategori ORDER BY k.nama_kategori, ps.tanggal;
| id | tanggal | pelanggan | kota | kategori | nama_produk | subtotal |
|---|---|---|---|---|---|---|
| 102 | 2024-01-16 | Budi | Bandung | Aksesoris | Mouse Wireless | 500.000 |
| 101 | 2024-01-15 | Andi | Jakarta | Elektronik | Laptop Gaming | 15.000.000 |
| 104 | 2024-01-18 | Citra | Surabaya | Elektronik | Monitor 4K | 5.000.000 |
| 105 | 2024-01-19 | Budi | Bandung | Elektronik | Laptop Gaming | 15.000.000 |
| 103 | 2024-01-17 | Andi | Jakarta | Peripheral | Mechanical Keyboard | 750.000 |
Kondisi ON di setiap JOIN harus merujuk ke tabel yang sudah ada di hasil JOIN sebelumnya atau tabel yang baru dimasukkan. Kamu tidak bisa merujuk tabel yang belum di-JOIN. Urutan JOIN menentukan tabel mana yang "tersedia" di kondisi ON berikutnya.
04. Jebakan Umum & Cara Menghindarinya
Semakin banyak tabel yang di-JOIN, semakin banyak peluang untuk error atau hasil yang tidak terduga. Ini tiga jebakan paling sering dialami mahasiswa saat pertama kali mencoba multi table JOIN MySQL:
SELECT nama, nama_produk, harga -- "nama" ada di tabel pelanggan DAN produk! FROM pesanan INNER JOIN pelanggan ON pesanan.id_pelanggan = pelanggan.id_pelanggan INNER JOIN produk ON pesanan.id_produk = produk.id_produk; -- ERROR: Column 'nama' in field list is ambiguous
SELECT pl.nama AS nama_pelanggan, -- eksplisit: dari tabel pelanggan pr.nama_produk, -- dari tabel produk pr.harga FROM pesanan ps INNER JOIN pelanggan pl ON ps.id_pelanggan = pl.id_pelanggan INNER JOIN produk pr ON ps.id_produk = pr.id_produk; -- ✓ Query berjalan dengan benar
| nama_pelanggan | nama_produk | harga |
|---|---|---|
| Andi | Laptop Gaming | 15.000.000 |
| Budi | Mouse Wireless | 250.000 |
| Andi | Mechanical Keyboard | 750.000 |
| Citra | Monitor 4K | 5.000.000 |
| Budi | Laptop Gaming | 15.000.000 |
Selalu gunakan alias tabel yang pendek dan konsisten. Jangan pernah sebutkan nama kolom tanpa prefix alias ketika JOIN lebih dari satu tabel — bahkan jika kamu "yakin" nama kolomnya unik. Kebiasaan ini menyelamatkan kamu dari berjam-jam debugging!
๐งช Panduan Praktikum Step-by-Step
Buka MySQL Workbench, buat database baru, dan jalankan semua CREATE TABLE + INSERT INTO dari bagian setup di atas.
USE toko_online_v2;
-- Lalu jalankan semua script setup di atas
Cek setiap tabel sebelum mulai JOIN — pastikan data sudah masuk dengan benar.
SELECT * FROM kategori; -- 3 baris
SELECT * FROM produk; -- 4 baris
SELECT * FROM pesanan; -- 5 baris
Jangan langsung JOIN 4 tabel. Mulai dari 2 tabel, pastikan hasilnya benar, baru tambah JOIN berikutnya satu per satu.
FROM pesanan ps
INNER JOIN pelanggan pl
ON ps.id_pelanggan = pl.id_pelanggan;
-- Cek: 5 baris? Bagus, lanjut tambah JOIN ketiga
Setelah JOIN 2 tabel berhasil, tambahkan INNER JOIN produk. Jumlah baris seharusnya tetap 5 (karena semua pesanan punya produk yang valid).
Setelah 3 tabel sukses, sambungkan tabel kategori lewat produk. Tambahkan kolom kalkulasi dan ORDER BY untuk laporan profesional.
WHERE pl.kota = 'Jakarta'
-- Harusnya muncul 2 baris (pesanan Andi)
๐ Ringkasan: Pola Multi-Table JOIN
| Skenario | Pola JOIN | Cocok Untuk | Risiko |
|---|---|---|---|
| 2 tabel wajib ada | INNER JOIN INNER JOIN |
Laporan yang butuh data valid semua tabel | Rendah |
| 1 tabel opsional | INNER JOIN LEFT JOIN |
Data utama wajib, data tambahan boleh kosong | Rendah |
| Semua opsional | LEFT JOIN LEFT JOIN |
Rekap komprehensif dengan banyak NULL | Sedang |
| Self JOIN | tabel JOIN tabel AS alias |
Hierarki dalam satu tabel (atasan-bawahan) | Sedang |
| 5+ tabel | Campuran sesuai kebutuhan | Sistem ERP, laporan kompleks | Tinggi (perlu index!) |
Di dunia kerja, developer sering membangun query multi-table JOIN secara incremental — tambahkan satu JOIN, cek hasilnya, baru tambah lagi. Jangan langsung tulis 5 JOIN sekaligus kalau belum yakin relasi antar tabelnya!
Semakin banyak tabel yang di-JOIN, semakin penting untuk punya INDEX pada kolom yang dipakai di kondisi ON. Tanpa index, MySQL harus scan seluruh tabel untuk setiap baris — bisa sangat lambat di data besar!
✅ Kesimpulan
- Multi table JOIN MySQL adalah kemampuan menggabungkan tiga tabel atau lebih dalam satu query menggunakan klausa JOIN yang dirantai secara berurutan.
- Setiap JOIN ditambahkan setelah yang sebelumnya — MySQL memproses dari kiri ke kanan, membangun hasil sementara di setiap tahap.
- Alias tabel bukan opsional — di multi-table JOIN, alias adalah wajib untuk menghindari ambiguitas kolom dan membuat query mudah dibaca.
- Kamu bisa campur jenis JOIN (INNER dan LEFT) dalam satu query sesuai apakah tabel tersebut wajib ada datanya atau opsional.
- Bangun query secara incremental — mulai dari 2 tabel, verifikasi, baru tambah JOIN berikutnya. Hindari menulis 5 JOIN sekaligus tanpa mengecek tiap tahapnya.
- Untuk multi table JOIN MySQL di data besar, selalu pastikan ada INDEX pada kolom yang dipakai sebagai kondisi ON untuk performa optimal.
"Database yang baik adalah yang bisa bercerita. Dan multi-table JOIN adalah cara kamu membuat semua tabel bercerita bersama-sama dalam satu kalimat yang kohesif. Kuasai ini, dan kamu selangkah lebih dekat jadi database developer yang sesungguhnya. ๐"
๐ฌ Sudah coba JOIN lebih dari 3 tabel?
Ceritakan pengalaman kamu di kolom komentar — berhasil langsung atau ada yang bikin pusing dulu? Kalau artikel ini berguna, share ke teman satu kelas dan bookmark halaman ini untuk referensi tugas! ⭐
Menyarangkan query di dalam query lain — teknik powerful untuk analisis data yang lebih kompleks dan fleksibel!
No comments:
Post a Comment