Saat bekerja dengan database relasional, hampir tidak mungkin Anda hanya bekerja dengan satu tabel. Anda pasti perlu menggabungkan data dari dua tabel atau lebih. Di MySQL, operasi penggabungan tabel ini dilakukan dengan JOIN. Ada beberapa jenis JOIN yang paling sering digunakan: INNER JOIN, LEFT JOIN, dan RIGHT JOIN. Artikel ini menjelaskan perbedaannya secara praktis dengan contoh nyata.
Persiapan Tabel Contoh
Sebelum membahas perbedaan JOIN, kita siapkan dua tabel sebagai contoh: tabel karyawan dan tabel departemen.
-- Buat tabel departemen
CREATE TABLE departemen (
id_dept INT AUTO_INCREMENT PRIMARY KEY,
nama_dept VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
-- Buat tabel karyawan
CREATE TABLE karyawan (
id_karyawan INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
id_dept INT,
gaji DECIMAL(10, 2)
) ENGINE=InnoDB;
-- Insert data departemen
INSERT INTO departemen (nama_dept) VALUES
('Engineering'),
('Marketing'),
('HR'),
('Finance');
-- Insert data karyawan (beberapa tidak punya departemen)
INSERT INTO karyawan (nama, id_dept, gaji) VALUES
('Andi', 1, 8000000),
('Budi', 1, 7500000),
('Citra', 2, 6000000),
('Deni', NULL, 5500000),
('Eka', 5, 6500000); -- id_dept 5 tidak ada di tabel departemen
Perhatikan bahwa Deni tidak memiliki departemen (NULL), dan Eka memiliki id_dept yang tidak ada di tabel departemen. Kondisi ini penting untuk memahami perbedaan setiap jenis JOIN.
INNER JOIN โ Hanya Data yang Cocok
INNER JOIN mengembalikan baris-baris yang memiliki kecocokan di kedua tabel. Jika salah satu sisi tidak memiliki pasangan, baris tersebut tidak akan muncul di hasil.
-- INNER JOIN: hanya tampilkan karyawan yang punya departemen valid
SELECT
k.nama AS nama_karyawan,
d.nama_dept AS departemen,
k.gaji
FROM karyawan k
INNER JOIN departemen d ON k.id_dept = d.id_dept
ORDER BY k.nama;
Hasil: Hanya Andi, Budi, dan Citra yang muncul. Deni (id_dept NULL) dan Eka (id_dept tidak valid) tidak muncul karena tidak ada kecocokan di tabel departemen.
LEFT JOIN โ Semua Data dari Tabel Kiri
LEFT JOIN mengembalikan semua baris dari tabel kiri, ditambah baris yang cocok dari tabel kanan. Jika tidak ada kecocokan di tabel kanan, kolomnya diisi NULL.
-- LEFT JOIN: tampilkan semua karyawan, termasuk yang tidak punya departemen
SELECT
k.nama AS nama_karyawan,
d.nama_dept AS departemen,
k.gaji
FROM karyawan k
LEFT JOIN departemen d ON k.id_dept = d.id_dept
ORDER BY k.nama;
Hasil: Semua 5 karyawan muncul. Deni dan Eka tetap tampil, namun kolom departemen mereka berisi NULL.
Menemukan Data Tanpa Pasangan dengan LEFT JOIN
LEFT JOIN sangat berguna untuk mencari data yang tidak memiliki pasangan di tabel lain.
-- Temukan karyawan yang belum memiliki departemen
SELECT
k.nama AS nama_karyawan,
k.id_dept
FROM karyawan k
LEFT JOIN departemen d ON k.id_dept = d.id_dept
WHERE d.id_dept IS NULL;
RIGHT JOIN โ Semua Data dari Tabel Kanan
RIGHT JOIN adalah kebalikan dari LEFT JOIN. Ia mengembalikan semua baris dari tabel kanan, ditambah baris yang cocok dari tabel kiri. Kolom dari tabel kiri akan NULL jika tidak ada kecocokan.
-- RIGHT JOIN: tampilkan semua departemen, termasuk yang tidak punya karyawan
SELECT
k.nama AS nama_karyawan,
d.nama_dept AS departemen
FROM karyawan k
RIGHT JOIN departemen d ON k.id_dept = d.id_dept
ORDER BY d.nama_dept;
Hasil: Departemen Finance dan HR muncul meski tidak ada karyawan, dengan kolom nama_karyawan berisi NULL.
Menemukan Departemen Tanpa Karyawan dengan RIGHT JOIN
-- Temukan departemen yang belum memiliki karyawan
SELECT
d.id_dept,
d.nama_dept
FROM karyawan k
RIGHT JOIN departemen d ON k.id_dept = d.id_dept
WHERE k.id_karyawan IS NULL;
JOIN dengan Lebih dari Dua Tabel
Anda bisa menggabungkan lebih dari dua tabel dalam satu query. Misalnya, menambahkan tabel proyek:
-- Gabungkan tiga tabel sekaligus
SELECT
k.nama AS karyawan,
d.nama_dept AS departemen,
p.nama_proyek AS proyek
FROM karyawan k
INNER JOIN departemen d ON k.id_dept = d.id_dept
LEFT JOIN proyek p ON k.id_karyawan = p.id_karyawan
ORDER BY k.nama;
Perbandingan Singkat
- INNER JOIN: Hanya baris yang ada kecocokan di kedua tabel. Cocok untuk mengambil data yang pasti terhubung.
- LEFT JOIN: Semua baris tabel kiri + kecocokan tabel kanan. Ideal untuk mencari data yang mungkin belum punya pasangan.
- RIGHT JOIN: Semua baris tabel kanan + kecocokan tabel kiri. Jarang dipakai, bisa diganti dengan LEFT JOIN dengan urutan tabel ditukar.
Tips Praktis
- Gunakan alias tabel (seperti
kuntuk karyawan) agar query lebih ringkas dan mudah dibaca. - RIGHT JOIN bisa selalu dikonversi menjadi LEFT JOIN dengan menukar posisi tabel, sehingga banyak developer hanya pakai LEFT JOIN untuk konsistensi.
- Selalu sertakan kondisi ON yang tepat untuk menghindari Cartesian Product (perkalian semua baris).
- Tambahkan index pada kolom yang digunakan sebagai kondisi JOIN untuk performa yang lebih baik.
Kesimpulan
INNER JOIN, LEFT JOIN, dan RIGHT JOIN adalah tiga jenis JOIN yang paling sering digunakan di MySQL. INNER JOIN hanya mengambil data yang cocok di kedua tabel, LEFT JOIN mengambil semua data dari tabel kiri, dan RIGHT JOIN mengambil semua data dari tabel kanan. Memahami kapan harus menggunakan masing-masing jenis JOIN adalah kunci untuk menulis query yang efisien dan menghasilkan data yang akurat sesuai kebutuhan aplikasi Anda.