TL;DR
RIGHT JOIN nggabungin dua tabel dan nyimpen semua baris dari tabel kanan, walau gak ada pasangannya di tabel kiri. Hasilnya identik sama LEFT JOIN yang urutan tabelnya ditukar, jadi A RIGHT JOIN B sama persis dengan B LEFT JOIN A. Kebanyakan tim SQL sepakat pakai LEFT JOIN aja biar query kebaca dari atas ke bawah tanpa mikir mundur.
RIGHT JOIN nggabungin dua tabel dan nyimpen semua baris dari tabel kanan, walau nggak ada pasangannya di tabel kiri. Kolom dari tabel kiri yang kosong diisi NULL.
Cara kerjanya cerminan persis dari LEFT JOIN. Dan di situlah masalahnya.
A RIGHT JOIN B hasilnya sama persis dengan B LEFT JOIN A. Dua-duanya ngasih baris yang identik. Jadi ngapain ada dua?
RIGHT JOIN adalah operasi yang nyocokin baris dua tabel lewat kolom kunci, tapi tetap nampilin semua baris dari tabel kanan. Yang disebut "kanan" itu tabel yang ditulis setelah kata RIGHT JOIN. Tabel di FROM itu kiri.
SELECT kolom
FROM tabel_kiri
RIGHT JOIN tabel_kanan
ON tabel_kiri.kunci = tabel_kanan.kunci;
Kata OUTER boleh ditambahin jadi RIGHT OUTER JOIN. Artinya sama.
Aku pakai data Toko Berkah. Tabel produk punya 6 barang, tabel penjualan cuma nyatet 4 transaksi dari 3 produk.
INSERT INTO produk VALUES
(1,'Beras Premium 5kg','Sembako', 68500),
(2,'Minyak Goreng 2L','Sembako', 34750),
(3,'Gula Pasir 1kg','Sembako', 16250),
(4,'Kopi Bubuk 200g','Minuman', 21375),
(5,'Teh Celup 25s','Minuman', 12000),
(6,'Sirup Pandan 600ml','Minuman', 18500);
INSERT INTO penjualan VALUES
(101,'2026-02-10', 1, 3),
(102,'2026-02-10', 3, 12),
(103,'2026-02-11', 2, 7),
(104,'2026-02-12', 1, 2);
Kopi, Teh, dan Sirup belum pernah kejual sama sekali. Tiga produk nganggur di rak.
SELECT pr.nama_produk, pr.kategori, p.tanggal, p.qty
FROM penjualan p
RIGHT JOIN produk pr ON p.id_produk = pr.id_produk
ORDER BY pr.id_produk;
| nama_produk | kategori | tanggal | qty |
|---|---|---|---|
| Beras Premium 5kg | Sembako | 2026-02-10 | 3 |
| Beras Premium 5kg | Sembako | 2026-02-12 | 2 |
| Minyak Goreng 2L | Sembako | 2026-02-11 | 7 |
| Gula Pasir 1kg | Sembako | 2026-02-10 | 12 |
| Kopi Bubuk 200g | Minuman | NULL | NULL |
| Teh Celup 25s | Minuman | NULL | NULL |
| Sirup Pandan 600ml | Minuman | NULL | NULL |
Semua 6 produk muncul. Yang belum laku nilainya NULL.
Sekarang lihat query yang hasilnya persis sama:
SELECT pr.nama_produk, pr.kategori, p.tanggal, p.qty
FROM produk pr
LEFT JOIN penjualan p ON p.id_produk = pr.id_produk
ORDER BY pr.id_produk;
Baris yang keluar identik. Yang berubah cuma urutan tabelnya ditukar dan RIGHT diganti LEFT.
Alasannya soal kebiasaan baca, bukan soal teknis.
Kita baca query dari atas ke bawah. Tabel pertama yang muncul (yang ada di FROM) kerasanya kayak tabel utama. Itu pusat perhatian kamu.
RIGHT JOIN maksa kamu mikir mundur. Tabel yang di FROM ternyata bukan yang utama. Yang utama justru yang nongol belakangan. Di query pendek sih masih oke. Di query 60 baris dengan 5 JOIN, kamu bakal bolak-balik ngecek yang mana tabel utamanya.
Terus, kalau kamu campur LEFT JOIN dan RIGHT JOIN dalam satu query, arah "pertahanan barisnya" jadi bolak-balik. Ini sumber bug yang susah dilacak.
Makanya kebanyakan tim SQL punya kesepakatan tak tertulis: pakai LEFT JOIN aja, konsisten satu arah. Dari kode SQL yang aku baca di berbagai proyek, RIGHT JOIN muncul jauh lebih jarang dibanding LEFT JOIN. Dan hampir selalu bisa ditulis ulang jadi LEFT JOIN tanpa kehilangan apa pun.
Ada satu situasi nyata, dan ini bukan teori.
Kamu udah punya query panjang. FROM-nya tabel penjualan, terus ada 3 JOIN ke tabel lain, alias udah dipakai di mana-mana, ada GROUP BY dan HAVING.
Terus kamu sadar: tabel produk yang mau kamu tambahin di akhir harus muncul semua, termasuk yang belum pernah laku.
Pilihan pertama: nulis ulang query dari nol, tukar FROM jadi produk, ganti semua arah JOIN, cek ulang selusin alias. Lima belas menit, plus risiko salah ketik.
Pilihan kedua: ganti satu kata jadi RIGHT JOIN. Lima detik.
SELECT pr.nama_produk,
COALESCE(SUM(p.qty * pr.harga), 0) AS omzet
FROM penjualan p
RIGHT JOIN produk pr ON p.id_produk = pr.id_produk
GROUP BY pr.nama_produk
ORDER BY omzet DESC;
| nama_produk | omzet |
|---|---|
| Beras Premium 5kg | 342.500 |
| Minyak Goreng 2L | 243.250 |
| Gula Pasir 1kg | 195.000 |
| Kopi Bubuk 200g | 0 |
| Teh Celup 25s | 0 |
| Sirup Pandan 600ml | 0 |
Tiga produk minuman omzetnya nol. Dari 6 produk yang distok, 50% nggak nyumbang duit sama sekali. Modalnya ngendon di rak.
Buat analisis sekali pakai, RIGHT JOIN itu pilihan yang wajar. Buat query yang bakal dipakai orang lain dan dirawat berbulan-bulan, tulis ulang pakai LEFT JOIN.
Pola anti-join yang sama kayak di LEFT JOIN, cuma arahnya dibalik:
SELECT pr.nama_produk, pr.kategori, pr.harga
FROM penjualan p
RIGHT JOIN produk pr ON p.id_produk = pr.id_produk
WHERE p.id_penjualan IS NULL;
Hasilnya tiga produk minuman tadi. Ini daftar yang perlu dievaluasi: dipromosiin, diturunin harganya, atau dihentikan.
Perhatiin IS NULL, bukan = NULL. Kenapa, aku jelasin di NULL di SQL.
RIGHT JOIN nggabungin dua tabel dan nyimpen semua baris dari tabel kanan, yaitu tabel yang ditulis setelah kata RIGHT JOIN. Baris tabel kanan yang nggak punya pasangan di tabel kiri tetap muncul, dan kolom dari tabel kiri diisi NULL. Cara kerjanya cerminan persis dari LEFT JOIN.
Cuma beda sisi tabel yang dipertahanin. LEFT JOIN nyimpen semua baris tabel yang ditulis di FROM, RIGHT JOIN nyimpen semua baris tabel yang ditulis setelah JOIN. Hasilnya identik kalau kamu tukar urutan tabelnya, jadi A RIGHT JOIN B sama persis dengan B LEFT JOIN A.
Soalnya bikin query lebih susah dibaca. Otak kita baca query dari atas ke bawah, jadi tabel pertama yang muncul terasa kayak tabel utama. RIGHT JOIN maksa kamu mikir mundur: yang penting justru tabel yang ditulis belakangan. Dan karena hasilnya bisa dicapai pakai LEFT JOIN, kebanyakan tim sepakat pakai LEFT JOIN aja biar konsisten.
Pas kamu udah punya query panjang yang FROM-nya tabel transaksi, terus baru sadar butuh nampilin semua baris dari tabel master yang mau kamu tambahin di akhir. Ganti JOIN terakhir jadi RIGHT JOIN itu satu kata, sementara nulis ulang urutan tabel bisa berarti ngubah selusin alias. Buat query sekali pakai, ini pilihan yang wajar.
Hampir semua. PostgreSQL, MySQL, SQL Server, dan Oracle udah lama dukung RIGHT JOIN. SQLite baru dukung mulai versi 3.39 yang rilis 2022, jadi kalau kamu pakai SQLite versi lama, RIGHT JOIN bakal error. Gampangnya, tulis ulang aja pakai LEFT JOIN dan tukar urutan tabelnya.
RIGHT JOIN nggak salah, dia cuma kalah enak dibaca. Semua yang bisa dia lakuin, LEFT JOIN bisa juga. Tinggal tukar urutan tabelnya.
Kalau kamu lagi ngebut benerin query panjang, pakai aja. Kalau kamu nulis query yang bakal dibaca orang lain, tulis pakai LEFT JOIN.
Sintaks lengkap RIGHT JOIN beda-beda tipis per database, dan konsep JOIN secara umum aku rangkum di glossary JOIN. Referensi resminya bisa kamu cek di dokumentasi JOIN MySQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Analisa per kuartal, hari kerja, atau musim jadi ribet kalau tiap query ngitung ulang atribut tanggal. Tabel kalender nyimpen semua atribut itu sekali, biar tinggal di-JOIN.
Laporan penjualan harian sering bolong di hari tanpa transaksi. Ini cara bikin deret tanggal lengkap di SQL biar tiap hari muncul, walau nilainya nol.
Struktur organisasi tersimpan sebagai kolom id_atasan yang saling nunjuk. Ini cara narik rantai jabatan, hitung total bawahan, dan span of control cuma pakai SQL.