JOIN SQL Adalah: Perbedaan INNER, LEFT, RIGHT, dan FULL JOIN untuk Pemula
JOIN SQL menggabungkan baris dari dua tabel berdasarkan kolom yang berhubungan. Pahami perbedaan INNER, LEFT, RIGHT, dan FULL JOIN lewat diagram Venn dan contoh query lengkap.
Pembuat Hyper Sheets & BelajarWeb.dev
JOIN adalah perintah SQL untuk menggabungkan baris dari dua tabel atau lebih berdasarkan kolom yang saling berhubungan. Di dunia nyata, data jarang disimpan dalam satu tabel raksasa, data pelanggan ada di tabel pelanggan, data pesanan ada di tabel pesanan, dan keduanya dihubungkan lewat sebuah kolom penghubung (biasanya id). JOIN adalah jembatan yang menyatukan potongan-potongan data itu menjadi satu hasil query yang utuh, sehingga kamu bisa menjawab pertanyaan seperti “siapa nama pelanggan yang memesan produk ini?” dalam satu perintah saja.
Masalahnya, ada beberapa jenis JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN, dan FULL JOIN, dan pemula sering bingung memilih yang mana. Perbedaannya sebenarnya cuma satu hal: baris mana yang ikut masuk ke hasil ketika sebuah baris tidak punya pasangan di tabel lain. Di artikel ini kamu akan memahami perbedaan itu lewat diagram Venn, contoh query yang bisa langsung ditiru, kesalahan umum yang bikin hasil query salah, sampai FAQ yang menjawab pertanyaan yang paling sering diketik orang.
JOIN SQL Adalah… (Definisi Singkat)
JOIN adalah operasi SQL yang mencocokkan baris dari satu tabel dengan baris dari tabel lain berdasarkan sebuah kondisi (biasanya kesamaan nilai di kolom penghubung), lalu menggabungkannya menjadi satu baris hasil. Kondisi pencocokan ini ditulis setelah kata kunci ON. Tanpa JOIN, kamu harus mengambil data dari tiap tabel secara terpisah lalu menggabungkannya manual di kode aplikasi, jauh lebih lambat dan berantakan.
Kenapa data dipisah ke banyak tabel sejak awal? Karena prinsip desain database yang baik menghindari pengulangan data. Kalau nama dan alamat pelanggan ikut disalin di setiap baris pesanan, satu pelanggan dengan 100 pesanan berarti nama dan alamatnya tersimpan 100 kali, boros dan rawan tidak konsisten saat ada perubahan. Jadi data dipecah, lalu JOIN yang menyatukannya kembali saat dibutuhkan.
Data Contoh yang Akan Kita Pakai
Supaya semua contoh mudah diikuti, kita pakai dua tabel sederhana. Tabel pertama pelanggan:
-- Tabel pelanggan
id | nama
---+--------
1 | Budi
2 | Sari
3 | Andi -- Andi belum pernah memesan
Tabel kedua pesanan, yang menyimpan pelanggan_id sebagai penghubung ke tabel pelanggan:
-- Tabel pesanan
id | pelanggan_id | produk
---+--------------+---------
1 | 1 | Laptop
2 | 1 | Mouse
3 | 2 | Keyboard
4 | 9 | Monitor -- pelanggan_id 9 tidak ada di tabel pelanggan
Perhatikan dua kasus “yatim” yang sengaja dibuat: Andi (id 3) belum punya pesanan, dan pesanan Monitor menunjuk ke pelanggan_id 9 yang tidak ada. Dua kasus inilah yang akan memperlihatkan perbedaan tiap jenis JOIN dengan jelas.
INNER JOIN: Hanya yang Cocok di Kedua Tabel
INNER JOIN adalah jenis yang paling sering dipakai. Ia hanya mengembalikan baris yang punya pasangan di kedua tabel. Kalau sebuah baris tidak menemukan pasangan, baris itu dibuang dari hasil.
SELECT pelanggan.nama, pesanan.produk
FROM pelanggan
INNER JOIN pesanan ON pelanggan.id = pesanan.pelanggan_id;
Hasilnya:
nama | produk
-----+----------
Budi | Laptop
Budi | Mouse
Sari | Keyboard
Andi tidak muncul (dia tidak punya pesanan), dan Monitor tidak muncul (tidak ada pelanggan dengan id 9). Hanya baris yang cocok di kedua sisi yang lolos. Kata INNER sifatnya opsional, menulis JOIN saja sudah otomatis berarti INNER JOIN di hampir semua database.
LEFT JOIN: Semua dari Tabel Kiri
LEFT JOIN (nama lengkapnya LEFT OUTER JOIN) mengembalikan semua baris dari tabel kiri, yaitu tabel yang disebut sebelum kata JOIN, ditambah data yang cocok dari tabel kanan. Kalau sebuah baris kiri tidak punya pasangan di kanan, kolom dari tabel kanan diisi NULL.
SELECT pelanggan.nama, pesanan.produk
FROM pelanggan
LEFT JOIN pesanan ON pelanggan.id = pesanan.pelanggan_id;
Hasilnya:
nama | produk
-----+----------
Budi | Laptop
Budi | Mouse
Sari | Keyboard
Andi | NULL -- Andi tetap muncul walau tidak punya pesanan
Sekarang Andi ikut muncul, dengan produk bernilai NULL. Inilah kekuatan LEFT JOIN: ia mempertahankan semua baris tabel kiri apa pun yang terjadi. Ini pilihan tepat saat kamu bertanya “tampilkan semua pelanggan, beserta pesanannya kalau ada”, misalnya untuk mencari pelanggan yang belum pernah memesan dengan menambahkan WHERE pesanan.id IS NULL.
RIGHT JOIN: Semua dari Tabel Kanan
RIGHT JOIN adalah kebalikan dari LEFT JOIN: ia mempertahankan semua baris dari tabel kanan, dan mengisi NULL untuk baris kiri yang tidak punya pasangan.
SELECT pelanggan.nama, pesanan.produk
FROM pelanggan
RIGHT JOIN pesanan ON pelanggan.id = pesanan.pelanggan_id;
Hasilnya:
nama | produk
-----+----------
Budi | Laptop
Budi | Mouse
Sari | Keyboard
NULL | Monitor -- pesanan yatim tetap muncul, nama NULL
Kali ini pesanan Monitor (yang pelanggan_id-nya 9 dan tidak punya pemilik) tetap muncul dengan nama bernilai NULL. Dalam praktiknya RIGHT JOIN jarang dipakai, karena query yang sama selalu bisa ditulis ulang sebagai LEFT JOIN cukup dengan menukar urutan tabel, dan LEFT JOIN lebih mudah dibaca karena orang cenderung berpikir dari kiri ke kanan.
FULL JOIN: Semua dari Kedua Tabel
FULL JOIN (atau FULL OUTER JOIN) menggabungkan perilaku LEFT dan RIGHT sekaligus: ia mempertahankan semua baris dari kedua tabel, mengisi NULL di sisi mana pun yang tidak punya pasangan.
SELECT pelanggan.nama, pesanan.produk
FROM pelanggan
FULL JOIN pesanan ON pelanggan.id = pesanan.pelanggan_id;
Hasilnya:
nama | produk
-----+----------
Budi | Laptop
Budi | Mouse
Sari | Keyboard
Andi | NULL -- pelanggan tanpa pesanan
NULL | Monitor -- pesanan tanpa pelanggan
Andi (pelanggan tanpa pesanan) dan Monitor (pesanan tanpa pelanggan) dua-duanya muncul. FULL JOIN berguna untuk audit data, misalnya menemukan semua ketidakcocokan antara dua tabel dalam satu query.
Perbedaan INNER, LEFT, RIGHT, dan FULL JOIN
Cara tercepat memahami keempatnya adalah membayangkan dua lingkaran yang saling tumpang tindih, satu untuk Tabel A (kiri), satu untuk Tabel B (kanan). Area oranye di tiap diagram menunjukkan baris mana yang ikut ke hasil query:
Kalau dirangkum dalam satu kalimat per jenis:
- INNER JOIN, hanya irisan: baris yang cocok di kedua tabel.
- LEFT JOIN, seluruh lingkaran kiri: semua baris A, plus yang cocok dari B.
- RIGHT JOIN, seluruh lingkaran kanan: semua baris B, plus yang cocok dari A.
- FULL JOIN, kedua lingkaran penuh: semua baris dari A dan B.
Dan inilah tabel perbandingan lengkap yang bisa kamu jadikan contekan:
| Jenis JOIN | Baris tak berpasangan di kiri | Baris tak berpasangan di kanan | Kapan dipakai |
|---|---|---|---|
INNER JOIN |
Dibuang | Dibuang | Butuh data yang lengkap di kedua sisi |
LEFT JOIN |
Dipertahankan (kanan NULL) |
Dibuang | Butuh semua data tabel utama (kiri) |
RIGHT JOIN |
Dibuang | Dipertahankan (kiri NULL) |
Jarang; biasanya ditulis ulang jadi LEFT |
FULL JOIN |
Dipertahankan | Dipertahankan | Audit / cari semua ketidakcocokan |
Menggabungkan Lebih dari Dua Tabel
JOIN tidak terbatas pada dua tabel. Kamu bisa merantai beberapa JOIN dalam satu query. Misalnya menambahkan tabel produk untuk mengambil harga:
SELECT pelanggan.nama, produk.nama_produk, produk.harga
FROM pelanggan
INNER JOIN pesanan ON pelanggan.id = pesanan.pelanggan_id
INNER JOIN produk ON pesanan.produk_id = produk.id;
Database mengevaluasinya berurutan: hasil JOIN pertama menjadi “tabel kiri” untuk JOIN berikutnya. Untuk query yang panjang dan berlapis seperti ini, Common Table Expression (CTE) sering membuat kode jauh lebih mudah dibaca karena kamu bisa memecah query bertingkat menjadi langkah-langkah bernama.
Kesalahan Umum Saat Memakai JOIN
Beberapa jebakan yang paling sering menimpa pemula:
1. Lupa klausa ON. Kalau kamu menulis JOIN tanpa ON (atau kondisinya salah), database menghasilkan cross join, setiap baris kiri dipasangkan dengan setiap baris kanan. Dua tabel berisi 1.000 baris bisa meledak jadi 1.000.000 baris. Selalu pastikan ada kondisi ON yang benar.
2. Salah pilih INNER padahal butuh LEFT. Kalau kamu ingin menampilkan semua pelanggan tapi memakai INNER JOIN, pelanggan yang belum pernah memesan akan hilang diam-diam dari hasil. Gejalanya: jumlah baris lebih sedikit dari yang kamu harapkan.
3. Memfilter kolom NULL di WHERE pada LEFT JOIN. Menambahkan WHERE pesanan.status = 'lunas' pada LEFT JOIN diam-diam mengubahnya jadi seperti INNER JOIN, karena baris dengan pesanan NULL otomatis gugur dari filter. Kalau kondisi itu memang bagian dari pencocokan, taruh di ON, bukan di WHERE.
4. Nama kolom ambigu. Kalau kedua tabel punya kolom bernama sama (misalnya id), menulis SELECT id akan error karena database bingung id yang mana. Selalu beri awalan nama tabel atau alias: pelanggan.id vs pesanan.id.
Kamu ingin menampilkan SEMUA pelanggan beserta pesanannya, termasuk pelanggan yang belum pernah memesan sama sekali. JOIN apa yang tepat?
FAQ Seputar JOIN SQL
Apa itu JOIN dalam SQL dengan bahasa sederhana?
JOIN adalah cara menyatukan data dari dua tabel yang saling berhubungan menjadi satu hasil. Bayangkan tabel pelanggan dan tabel pesanan yang dihubungkan lewat kolom id; JOIN memberi tahu database “cocokkan setiap pesanan dengan pemiliknya”, sehingga kamu bisa melihat nama pelanggan dan produk yang dipesan dalam satu baris.
Apa perbedaan INNER JOIN dan LEFT JOIN?
INNER JOIN hanya mengembalikan baris yang punya pasangan di kedua tabel, baris yatim dibuang. LEFT JOIN mengembalikan semua baris dari tabel kiri apa pun yang terjadi, dan mengisi NULL untuk kolom kanan yang tidak punya pasangan. Singkatnya: pakai INNER kalau butuh data lengkap dua sisi, pakai LEFT kalau semua baris tabel utama harus tetap muncul.
Apakah JOIN dan INNER JOIN sama?
Ya. Kalau kamu menulis JOIN saja tanpa kata depan, hampir semua database (MySQL, PostgreSQL, SQL Server) memperlakukannya sebagai INNER JOIN. Kata INNER bersifat opsional dan hanya menegaskan maksudmu supaya query lebih jelas dibaca.
Kenapa MySQL tidak punya FULL JOIN?
MySQL memang tidak mengimplementasikan FULL OUTER JOIN secara langsung. Untuk mendapatkan hasil yang sama, kamu menggabungkan LEFT JOIN dan RIGHT JOIN dengan UNION. PostgreSQL, SQL Server, dan Oracle mendukung FULL JOIN secara native, jadi kebutuhan menirunya hanya muncul di MySQL/MariaDB.
Apakah urutan tabel di JOIN berpengaruh?
Untuk INNER JOIN, urutan tabel tidak mengubah isi hasil (hanya urutan kolom yang mungkin berbeda). Tapi untuk LEFT dan RIGHT JOIN, urutan sangat penting: A LEFT JOIN B mempertahankan semua baris A, sedangkan B LEFT JOIN A mempertahankan semua baris B. Menukar posisi tabel bisa mengubah baris mana yang dipertahankan.
Berapa banyak tabel yang bisa di-JOIN sekaligus?
Secara praktis tidak ada batas keras yang sering kamu temui, merantai 3 sampai 5 tabel adalah hal biasa. Tapi semakin banyak JOIN, semakin berat query-nya, jadi pastikan kolom penghubung punya index agar tetap cepat. Kalau query jadi sulit dibaca, pecah dengan CTE.
Lanjut Belajar JOIN
JOIN adalah salah satu keterampilan SQL paling penting sekaligus paling sering keliru diterapkan, jadi cara terbaik menguasainya adalah langsung praktik menulis query dan melihat hasilnya. Kamu bisa mengerjakan materi INNER JOIN interaktif di Hyper Sheets yang menjalankan query sungguhan di browser tanpa perlu install database apa pun, lalu lanjut ke pelajaran LEFT dan RIGHT JOIN untuk mendalami kasus baris tanpa pasangan.
Setelah nyaman dengan JOIN, langkah berikutnya yang masuk akal adalah mempelajari agregasi (GROUP BY, COUNT, SUM) untuk merangkum data hasil JOIN, lalu subquery dan CTE untuk menyusun query yang lebih kompleks dengan rapi. JOIN adalah fondasinya, hampir setiap laporan dan dashboard yang pernah kamu lihat dibangun di atasnya. Mulai dari dua tabel sederhana, pahami betul kapan sebuah baris dipertahankan dan kapan dibuang, dan sisanya akan mengikuti.