Correlated Subquery di SQL: Cara Kerja dan Contoh Praktis (2026)
TL;DR
Correlated subquery adalah subquery yang nyebut kolom dari query luar, jadi dia dijalanin ulang buat tiap baris di query luar. Bedanya dari subquery biasa yang cuma jalan sekali, correlated subquery ngecek kondisi per baris, misalnya nyari transaksi yang di atas rata-rata kategorinya sendiri. Karena jalan berulang, dia lebih fleksibel tapi bisa lebih lambat di data besar.
Correlated subquery adalah subquery yang nyebut kolom dari query luar, jadi dia dijalanin ulang buat tiap baris di query luar. Bedanya sama subquery biasa: dia nggak berdiri sendiri, tapi bergantung ke baris yang lagi diproses.
Ini yang bikin dia kuat buat perbandingan per baris. Contohnya nyari transaksi yang nilainya di atas rata-rata kategorinya sendiri, bukan rata-rata semua data.
Aku bahas cara kerjanya, bedanya dari subquery biasa, contoh praktis dengan dataset toko Indonesia, dan kapan sebaiknya dipakai atau dihindari.
Apa itu correlated subquery di SQL?
Correlated subquery adalah subquery yang mereferensikan kolom dari query luar, sehingga hasilnya bergantung pada baris yang sedang diproses. Karena bergantung baris, database menjalankannya ulang untuk setiap baris di query luar, bukan sekali di awal. Ini beda dari subquery biasa yang berdiri sendiri dan dievaluasi cuma sekali.
Nama correlated berasal dari kaitannya: subquery ini terhubung ke query luar lewat kolom yang dibagi. Tanpa referensi ke query luar, dia cuma subquery biasa.
Apa beda correlated subquery dan subquery biasa?
Subquery biasa jalan sekali dan hasilnya dipakai query luar. Correlated subquery jalan berkali-kali, sekali per baris, karena tiap baris ngasih nilai berbeda ke subquery. Ini beda mendasar yang ngaruh ke cara nulis dan ke performa.
| Aspek | Subquery biasa | Correlated subquery |
|---|---|---|
| Referensi query luar | Nggak ada | Ada |
| Berapa kali jalan | Sekali | Sekali per baris |
| Bisa jalan sendiri | Bisa | Nggak bisa |
| Performa di data besar | Umumnya lebih cepat | Bisa lebih lambat |
Kalau kamu masih baru sama subquery secara umum, mulai dari contoh subquery SQL dasar dulu. Correlated subquery itu tingkat lanjutnya.
Gimana cara kerja correlated subquery?
Database ambil satu baris dari query luar, kirim nilainya ke subquery, jalanin subquery, lalu pakai hasilnya buat nentuin baris itu masuk atau nggak. Habis itu lanjut ke baris berikutnya dan ngulang. Begitu terus sampai semua baris kecek.
SELECT nama_produk, kategori, harga
FROM produk p
WHERE harga > (
SELECT AVG(harga)
FROM produk
WHERE kategori = p.kategori
);Baris kunci ada di WHERE kategori = p.kategori. Bagian p.kategori nyebut kolom dari query luar. Jadi buat tiap produk, subquery ngitung rata-rata harga di kategori produk itu sendiri, bukan rata-rata semua produk.
Hasilnya: query ini ngambil produk yang harganya di atas rata-rata kategorinya. Produk mahal di kategori murah tetap ketangkap, dan sebaliknya.
Kapan sebaiknya pakai correlated subquery?
Pakai correlated subquery waktu kamu butuh bandingin tiap baris dengan grup atau kondisi yang berkaitan sama baris itu sendiri. Perbandingan per baris kayak gini susah ditulis dengan cara lain yang sama jelasnya.
- Nyari nilai di atas atau di bawah rata-rata grupnya sendiri
- Ngecek keberadaan baris terkait pakai EXISTS
- Ngambil nilai terbaru per grup, misalnya transaksi terakhir tiap pelanggan
- Filter berdasarkan hitungan yang bergantung baris
Pola EXISTS ini sering kepakai buat ngecek apakah ada data terkait tanpa perlu narik datanya.
SELECT nama_pelanggan
FROM pelanggan c
WHERE EXISTS (
SELECT 1
FROM transaksi t
WHERE t.id_pelanggan = c.id_pelanggan
AND t.tanggal >= '2026-01-01'
);Contoh kasus: transaksi di atas rata-rata cabang toko_berkah
Toko_berkah punya tabel transaksi dari 15 cabang, total 2,1 juta baris setahun. Manajer mau tau transaksi mana yang nilainya di atas rata-rata cabangnya masing-masing, buat cari pola pembelian besar per lokasi.
Pakai rata-rata global nggak adil, soalnya cabang di Jakarta beda daya beli dari cabang di kota kecil. Correlated subquery bikin tiap transaksi dibandingin sama rata-rata cabangnya sendiri.
SELECT id_transaksi, cabang, nilai
FROM transaksi t
WHERE nilai > (
SELECT AVG(nilai)
FROM transaksi
WHERE cabang = t.cabang
)
ORDER BY cabang, nilai DESC;Hasilnya: query nangkep 318 ribu transaksi yang di atas rata-rata cabangnya, sekitar 15% dari total. Menariknya, cabang kota kecil ternyata punya proporsi transaksi besar yang lebih tinggi, tanda ada segmen pembeli grosir di sana yang sebelumnya nggak keliatan pakai rata-rata global.
Insight itu ngubah strategi. Cabang kecil yang tadinya dikira pasar eceran ternyata punya pembeli grosir, dan itu bikin tim atur ulang stok barang partai besar di lokasi tersebut.
Kesalahan umum soal correlated subquery
- Pakai di data besar tanpa mikir performa. Karena jalan per baris, di jutaan baris bisa lambat. Cek dulu pakai EXPLAIN.
- Lupa alias tabel. Tanpa alias yang jelas di query luar dan dalam, referensi kolomnya ambigu dan hasilnya salah.
- Pakai correlated padahal JOIN lebih cepat. Sebagian kasus bisa ditulis ulang jadi JOIN atau window function yang lebih ngebut.
- Salah kira jalan sekali. Correlated subquery jalan tiap baris. Nyadar ini bikin kamu paham kenapa bisa lambat.
- Nggak nguji hasil di data kecil. Logika per baris gampang keliru. Tes di beberapa baris dulu sebelum jalanin ke seluruh tabel.
FAQ
Apa beda correlated subquery dan JOIN?
JOIN nggabungin baris dari dua tabel jadi satu hasil, sedangkan correlated subquery ngecek kondisi per baris tanpa nggabungin kolomnya. JOIN umumnya lebih cepat di data besar karena database bisa ngoptimasi dengan lebih baik. Tapi correlated subquery kadang lebih jelas dibaca buat perbandingan per baris, misalnya nyari nilai di atas rata-rata grupnya. Buat banyak kasus, dua-duanya bisa ngasih hasil sama.
Apakah correlated subquery lambat?
Bisa lambat, karena dia dijalanin ulang buat tiap baris di query luar. Di tabel jutaan baris, ini kerasa banget. Tapi database modern sering ngoptimasi correlated subquery jadi bentuk yang lebih efisien di balik layar. Selalu cek rencana eksekusi pakai EXPLAIN buat tau performanya. Kalau kelewat lambat, coba tulis ulang jadi JOIN atau window function yang biasanya lebih ngebut.
Kapan pakai EXISTS dan correlated subquery?
Pakai EXISTS dengan correlated subquery waktu kamu cuma mau ngecek apakah ada baris terkait, bukan narik datanya. Misalnya nyari pelanggan yang punya minimal satu transaksi tahun ini. EXISTS berhenti begitu nemu satu baris yang cocok, jadi sering lebih cepat dari menghitung semua baris. Ini pola yang bersih buat filter berdasarkan keberadaan data di tabel lain.
Bisakah correlated subquery diganti window function?
Sering bisa, dan hasilnya biasanya lebih cepat. Window function kayak AVG() OVER (PARTITION BY kategori) ngitung rata-rata per grup dalam sekali jalan, tanpa ngulang per baris. Buat kasus nyari nilai di atas rata-rata grup, window function umumnya lebih efisien di data besar. Tapi correlated subquery kadang lebih gampang dipahami buat yang baru belajar, karena logikanya lebih lurus.
Kenapa correlated subquery-ku error kolom nggak dikenal?
Biasanya karena kamu lupa kasih alias tabel, jadi database bingung kolom mana yang dari query luar dan mana dari dalam. Kasih alias jelas ke tabel di query luar, misalnya FROM transaksi t, lalu sebut t.cabang di dalam subquery. Alias itu yang bikin database tau kamu lagi ngereferensiin baris dari query luar. Tanpa alias, referensi jadi ambigu dan query gagal.
Lanjut belajar
Ringkasnya: correlated subquery nyebut kolom dari query luar dan jalan sekali per baris, cocok buat perbandingan per baris kayak nyari nilai di atas rata-rata grupnya, tapi perlu hati-hati soal performa di data besar.
Mau kuatin dasar subquery dulu? Baca subquery SQL contoh praktis. Mau ngebut query yang lambat? Cek composite index di SQL. Buat istilah dasarnya, ada di glossary subquery dan glossary JOIN.
Detail resmi soal subquery ada di dokumentasi resmi PostgreSQL. Mau latihan nulis query sampai lancar? Coba modul SQL di NgulikSQL dengan dataset yang cukup besar.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.
Running Max dan Min dengan Window Function SQL
Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.
Analisa Afinitas Produk (Cross-Sell) dengan SQL
Produk apa yang sering dibeli bareng? Analisa afinitas produk pakai SQL self JOIN jawab itu. Ini cara hitung support, confidence, dan lift buat strategi cross-sell.