Subquery
Subquery adalah query SQL yang ditulis di dalam query lain - bisa ada di WHERE, FROM, atau SELECT clause. Berguna banget buat situasi di mana kamu butuh hasil kalkulasi dari satu query untuk dipakai sebagai filter atau input di query yang lain.
Apa Itu Subquery?
Subquery, kadang disebut juga nested query atau inner query, adalah query SQL yang ditulis di dalam query SQL lain. Query yang menampung subquery ini biasa disebut outer query atau main query.
Subquery berguna buat situasi di mana kamu butuh hasil dari satu query untuk menentukan apa yang dilakukan query lain. Contoh klasik: kamu mau filter produk yang harganya di atas rata-rata, tapi rata-ratanya perlu dihitung dulu dari seluruh dataset. Itulah gunanya subquery.
Tiga Tempat Subquery Bisa Muncul
Di WHERE clause: Ini yang paling sering ditemukan. Kamu pakai subquery buat ngambil nilai atau sekumpulan nilai yang jadi tolok ukur filter. Misalnya: ambil semua pelanggan yang pernah beli produk dari kategori tertentu.
Di FROM clause: Subquery juga bisa jadi tabel virtual yang kamu query ulang. Ini disebut derived table atau inline view. Berguna banget buat kalkulasi bertahap - hitung aggregate dulu di subquery, baru filter hasilnya di outer query.
Di SELECT clause: Subquery di sini menambahkan kolom kalkulasi dinamis untuk setiap baris hasil. Tapi hati-hati - subquery di SELECT yang berjalan untuk setiap baris bisa jadi lambat kalau tabelnya besar.
Correlated vs Non-Correlated Subquery
| Tipe | Karakteristik | Kapan Dieksekusi | Dampak Performa |
|---|---|---|---|
| Non-Correlated | Nggak bergantung pada outer query, bisa jalan sendiri | Sekali saja, hasilnya di-reuse | Biasanya lebih cepat |
| Correlated | Merujuk ke kolom dari outer query, nggak bisa berdiri sendiri | Satu kali untuk setiap baris di outer query | Bisa lambat di tabel besar |
Correlated subquery bukan selalu masalah - kadang itu solusi paling bersih untuk masalah tertentu. Tapi kalau kamu lihat query yang lambat dan ada correlated subquery di dalamnya, itu kandidat pertama buat dioptimasi.
Subquery, CTE, atau JOIN?
Gak ada aturan keras, tapi ada panduan praktis yang bisa kamu pakai:
Pakai subquery kalau logikanya simpel, sekali pakai, dan nggak perlu dirujuk lagi di tempat lain. Pakai CTE kalau logic-nya perlu dirujuk lebih dari sekali atau butuh keterbacaan yang lebih baik. Pakai JOIN kalau kamu butuh menggabungkan kolom dari beberapa tabel dalam satu baris hasil.
Performa dan Optimasi
Beberapa tip praktis soal performa subquery:
Hindari WHERE column IN (subquery yang kembalikan banyak nilai) di tabel besar. Alternatifnya, coba EXISTS yang biasanya lebih efisien karena berhenti begitu ketemu match pertama.
Correlated subquery yang dieksekusi berulang untuk setiap baris outer query bisa sangat mahal. Pertimbangkan untuk rewrite pakai JOIN atau CTE.
Sebelum optimasi, cek dulu query plan-nya menggunakan EXPLAIN atau EXPLAIN ANALYZE. Mungkin database sudah cukup pintar buat ngoptimasinya sendiri, dan kamu gak perlu refactor apapun.
Udah paham Subquery? Lanjut latihan SQL dan Excel yuk!
Latihan interaktif, langsung di browser.