Bayangkan kamu punya dua buku daftar hadir: satu untuk kelas pagi, satu untuk kelas siang. Sekarang kamu diminta bikin laporan gabungan — siapa yang hadir di pagi, siang, atau keduanya. Masalahnya, ada nama yang cuma ada di satu buku. Kamu mau tampilin semua? Atau cuma yang ada di keduanya? Nah, itulah persis yang diselesaikan oleh LEFT JOIN RIGHT JOIN MySQL!
Di artikel ke-21 dari seri 28 artikel Belajar Query SQL MySQL ini, kita akan bedah tuntas tiga jenis JOIN yang sering bikin mahasiswa TI semester awal garuk-garuk kepala: LEFT JOIN, RIGHT JOIN, dan CROSS JOIN. Ketiganya punya karakter beda, kegunaan beda, dan kalau salah pakai — hasilnya bisa mengejutkan (dalam artian yang buruk ๐ ).
Kita akan pakai studi kasus toko online — dengan tabel produk, pelanggan, dan pesanan yang realistis — supaya setiap konsep langsung kebayang dan bisa kamu praktikkan sendiri. Yuk mulai!
Menurut survei Stack Overflow Developer Survey, JOIN adalah salah satu operasi SQL yang paling sering digunakan oleh database developer profesional — tapi juga salah satu yang paling sering menyebabkan query lambat kalau tidak dioptimasi! Makanya penting banget paham konsepnya dari dasar dulu.
๐️ Setup Data: Toko Online Kita
Sebelum masuk ke JOIN, kita siapkan dulu tiga tabel yang akan jadi playground kita sepanjang artikel ini.
-- Tabel 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'), (4, 'Dewi', 'Yogyakarta'); -- Dewi belum pernah pesan -- Tabel Pesanan CREATE TABLE pesanan ( id_pesanan INT PRIMARY KEY, id_pelanggan INT, produk VARCHAR(100), total INT ); INSERT INTO pesanan VALUES (101, 1, 'Laptop', 15000000), (102, 2, 'Mouse', 250000), (103, 1, 'Keyboard', 750000), (104, 5, 'Headset', 500000); -- id_pelanggan 5 tidak ada di tabel pelanggan! -- Tabel Produk CREATE TABLE produk ( id_produk INT PRIMARY KEY, nama_produk VARCHAR(100), kategori VARCHAR(50), harga INT ); INSERT INTO produk VALUES (1, 'Laptop Gaming', 'Elektronik', 15000000), (2, 'Mouse Wireless', 'Aksesoris', 250000), (3, 'Mechanical KB', 'Aksesoris', 750000), (4, 'Monitor 4K', 'Elektronik', 5000000); -- Monitor belum ada yang pesan
Perhatikan data yang sengaja "tidak cocok" — Dewi belum pernah pesan, Monitor belum ada yang beli, dan ada pesanan dari id_pelanggan 5 yang tidak ada di tabel pelanggan. Data seperti ini yang akan membedakan hasil dari tiap jenis JOIN!
01. LEFT JOIN — "Semua dari Kiri, Cocok atau Tidak"
Analogi: Bayangkan kamu punya daftar semua anggota klub (tabel kiri), dan buku catatan kehadiran rapat (tabel kanan). LEFT JOIN akan menampilkan semua anggota, mau dia hadir di rapat atau enggak. Yang tidak hadir? Datanya tetap muncul, tapi kolom kehadirannya diisi NULL.
Dalam konteks LEFT JOIN RIGHT JOIN MySQL, LEFT JOIN mengambil semua baris dari tabel kiri, dan hanya baris yang cocok dari tabel kanan. Kalau tidak ada kecocokan, kolom dari tabel kanan akan bernilai NULL.
SELECT kolom1, kolom2, ... FROM tabel_kiri -- semua baris dari sini diambil LEFT JOIN tabel_kanan -- hanya yang cocok dari sini ON tabel_kiri.kolom_id = tabel_kanan.kolom_id;
Contoh: Tampilkan semua pelanggan beserta pesanannya (termasuk yang belum pernah pesan):
SELECT p.id_pelanggan, p.nama, p.kota, ps.id_pesanan, ps.produk, ps.total FROM pelanggan p LEFT JOIN pesanan ps ON p.id_pelanggan = ps.id_pelanggan;
| id_pelanggan | nama | kota | id_pesanan | produk | total |
|---|---|---|---|---|---|
| 1 | Andi | Jakarta | 101 | Laptop | 15.000.000 |
| 1 | Andi | Jakarta | 103 | Keyboard | 750.000 |
| 2 | Budi | Bandung | 102 | Mouse | 250.000 |
| 3 | Citra | Surabaya | NULL | NULL | NULL |
| 4 | Dewi | Yogyakarta | NULL | NULL | NULL |
⬆️ Baris berwarna kuning = Dewi yang belum pernah pesan tetap muncul, dengan kolom pesanan berisi NULL. Citra juga muncul meski tidak punya pesanan.
Gunakan LEFT JOIN ketika kamu ingin memastikan semua data dari tabel utama tampil, meski tidak ada pasangannya di tabel lain. Contoh kasus nyata: laporan pelanggan yang belum pernah belanja, produk yang belum pernah dipesan, guru yang belum mengampu kelas.
02. RIGHT JOIN — "Kebalikan LEFT JOIN, Tapi Sama Konsepnya"
RIGHT JOIN adalah cermin dari LEFT JOIN. Sekarang yang dijamin tampil semua adalah tabel kanan, dan tabel kiri hanya muncul kalau ada data yang cocok. Dalam konfigurasi LEFT JOIN RIGHT JOIN MySQL, keduanya sebenarnya bisa saling menggantikan — tinggal ubah urutan tabelnya saja.
SELECT kolom1, kolom2, ... FROM tabel_kiri RIGHT JOIN tabel_kanan -- semua baris dari sini diambil ON tabel_kiri.kolom_id = tabel_kanan.kolom_id;
Contoh: Tampilkan semua pesanan beserta data pelanggannya (termasuk pesanan dari pelanggan yang tidak terdaftar):
SELECT p.nama, p.kota, ps.id_pesanan, ps.produk, ps.total FROM pelanggan p RIGHT JOIN pesanan ps ON p.id_pelanggan = ps.id_pelanggan;
| nama | kota | id_pesanan | produk | total |
|---|---|---|---|---|
| Andi | Jakarta | 101 | Laptop | 15.000.000 |
| Budi | Bandung | 102 | Mouse | 250.000 |
| Andi | Jakarta | 103 | Keyboard | 750.000 |
| NULL | NULL | 104 | Headset | 500.000 |
⬆️ Baris merah = pesanan id 104 dari pelanggan tidak terdaftar (id 5) tetap muncul, tapi nama dan kota NULL karena tidak ada di tabel pelanggan.
Di industri, RIGHT JOIN jarang digunakan karena apapun yang bisa dilakukan RIGHT JOIN, bisa juga dilakukan LEFT JOIN dengan menukar posisi tabel. Banyak developer lebih prefer LEFT JOIN supaya arah joinnya konsisten dan query lebih mudah dibaca.
03. CROSS JOIN — "Semua Kemungkinan Kombinasi"
Analogi: Kamu punya 3 warna kaos (merah, biru, hijau) dan 2 ukuran (S, L). Berapa total kombinasi yang mungkin? 3 × 2 = 6 kombinasi. Itulah CROSS JOIN — dia menghasilkan cartesian product, yaitu setiap baris dari tabel kiri dipasangkan dengan setiap baris dari tabel kanan.
Tidak ada kondisi ON di sini. CROSS JOIN tidak peduli relasi — dia cuma pasangkan semua ke semua. Kalau tabel A punya 4 baris dan tabel B punya 4 baris, hasilnya: 4 × 4 = 16 baris.
SELECT kolom1, kolom2, ... FROM tabel_a CROSS JOIN tabel_b; -- tidak ada kondisi ON! -- Atau cara lama (implicit CROSS JOIN): SELECT kolom1, kolom2 FROM tabel_a, tabel_b; -- hasilnya sama
Contoh: Buat semua kombinasi pelanggan dan produk (untuk keperluan marketing/promo):
SELECT p.nama AS pelanggan, pr.nama_produk AS produk, pr.harga FROM pelanggan p CROSS JOIN produk pr ORDER BY p.nama, pr.nama_produk LIMIT 8; -- tampilkan 8 baris pertama saja dari 16 total
| pelanggan | produk | harga |
|---|---|---|
| Andi | Laptop Gaming | 15.000.000 |
| Andi | Mechanical KB | 750.000 |
| Andi | Monitor 4K | 5.000.000 |
| Andi | Mouse Wireless | 250.000 |
| Budi | Laptop Gaming | 15.000.000 |
| Budi | Mechanical KB | 750.000 |
| Budi | Monitor 4K | 5.000.000 |
| Budi | Mouse Wireless | 250.000 |
CROSS JOIN bisa sangat berbahaya di tabel besar! Tabel A dengan 1.000 baris di-CROSS JOIN tabel B yang 1.000 baris = 1.000.000 baris hasil. Server kamu bisa kelelahan kalau tidak hati-hati. Selalu gunakan LIMIT atau pastikan tabelnya kecil!
Berguna untuk membuat data uji coba (test data), kombinasi produk-variasi untuk toko (ukuran × warna × bahan), membuat jadwal round-robin (tim A vs B, A vs C, dst), atau keperluan analitik komparasi semua kombinasi.
๐งช Panduan Praktikum: Coba Sendiri Dari Nol
Buka MySQL Workbench atau phpMyAdmin, buat database baru dan jalankan script setup di atas.
USE toko_online;
Salin dan jalankan semua perintah CREATE TABLE dan INSERT INTO dari bagian setup di atas. Pastikan tidak ada error.
SELECT * FROM pesanan; -- cek: harus ada 4 baris
Coba query LEFT JOIN dari contoh di atas. Perhatikan baris dengan NULL — itu pelanggan yang belum pernah pesan.
Ini trik keren! Kamu bisa gunakan LEFT JOIN + WHERE IS NULL untuk cari pelanggan yang belum pernah pesan:
FROM pelanggan p
LEFT JOIN pesanan ps ON p.id_pelanggan = ps.id_pelanggan
WHERE ps.id_pesanan IS NULL; -- hanya yang belum pesan
Coba CROSS JOIN antara pelanggan dan produk, lalu hitung totalnya. Tambahkan LIMIT untuk keamanan.
FROM pelanggan
CROSS JOIN produk; -- harusnya: 16
๐ Tabel Perbandingan: LEFT vs RIGHT vs CROSS JOIN
| Aspek | LEFT JOIN | RIGHT JOIN | CROSS JOIN |
|---|---|---|---|
| Yang dijamin tampil | Semua baris tabel kiri | Semua baris tabel kanan | Semua kombinasi semua baris |
| Kondisi ON | Wajib ada | Wajib ada | Tidak ada |
| Jumlah hasil | ≥ jumlah baris tabel kiri | ≥ jumlah baris tabel kanan | Baris A × Baris B |
| Nilai NULL muncul di | Kolom tabel kanan | Kolom tabel kiri | Tidak ada NULL |
| Use case utama | Cari data tanpa pasangan | Kebalikan LEFT JOIN | Generate kombinasi |
| Risiko performa | Rendah (ada filter ON) | Rendah (ada filter ON) | Tinggi di tabel besar! |
| Popularitas di industri | ⭐⭐⭐⭐⭐ Sangat umum | ⭐⭐ Jarang dipakai | ⭐⭐⭐ Use case spesifik |
Di dunia kerja, LEFT JOIN adalah yang paling sering kamu temui. Kalau kamu bisa menguasai LEFT JOIN dengan WHERE IS NULL, kamu sudah bisa menyelesaikan 80% masalah "cari data yang hilang" di database.
Selalu beri alias pada tabel (contoh: FROM pelanggan p) supaya query JOIN-mu lebih pendek dan mudah dibaca, terutama saat join lebih dari 2 tabel.
✅ Kesimpulan
- LEFT JOIN mengambil semua baris tabel kiri + baris yang cocok dari tabel kanan (NULL jika tidak cocok). Paling populer!
- RIGHT JOIN adalah kebalikan LEFT JOIN — semua dari tabel kanan dijamin muncul. Bisa diganti LEFT JOIN dengan tukar posisi tabel.
- CROSS JOIN menghasilkan cartesian product (semua kombinasi). Powerful tapi berbahaya di tabel besar — selalu pakai LIMIT.
- Trik LEFT JOIN + WHERE IS NULL = cara elegan menemukan data yang "tidak punya pasangan" di tabel lain.
- Selalu gunakan alias tabel dan pastikan ada kondisi ON yang tepat untuk menghindari hasil yang tidak terduga.
- LEFT JOIN RIGHT JOIN MySQL adalah fondasi penting untuk query multi-tabel — kuasai ini sebelum lanjut ke subquery dan optimasi!
"JOIN bukan sihir — itu logika sederhana yang kamu pun sudah pakai di kehidupan sehari-hari. Setiap kali kamu mencocokkan dua daftar, itulah JOIN. Sekarang kamu tinggal tulis dalam bahasa SQL. ๐"
๐ฌ Punya pertanyaan atau pengalaman menarik pakai JOIN?
Tulis di kolom komentar di bawah — kita diskusi bareng! Kalau artikel ini membantu, jangan lupa share ke teman-teman sekelas dan bookmark halaman ini biar gampang dibuka lagi saat lagi ngerjain tugas database. ⭐
Pelajari cara menyarangkan query di dalam query lain — teknik powerful untuk analisis data yang lebih kompleks!
No comments:
Post a Comment