Subkueri Berkorelasi vs Tidak Berkorelasi
Pahami subkueri berkorelasi yang merujuk pada baris luar, karakteristik kinerjanya, serta kapan EXISTS lebih unggul daripada IN.
Subkueri Berkorelasi vs Tidak Berkorelasi adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Subkueri Nonkorelatif
Subkueri nonkorelatif tidak merujuk ke baris luar. Subkueri ini dijalankan satu kali dan hasilnya digunakan kembali:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = 'paid'
);Subkueri Berkorelasi
Subkueri berkorelasi merujuk ke baris luar — secara logis subkueri ini dijalankan kembali untuk setiap baris luar:
SELECT u.id, u.email
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id
AND o.total > 1000
);Cara Membedakan Keduanya
Jika SELECT bagian dalam merujuk ke kolom dari klausa FROM luar, berarti subkueri tersebut berkorelasi.
Dampak terhadap Kinerja
Subkueri berkorelasi yang naif memiliki kompleksitas O(jumlah baris luar × jumlah baris dalam). Perencana modern sering menulis ulangnya menjadi semi-gabung atau gabung hash — tetapi Anda tetap sebaiknya menulis bentuk yang lebih sederhana jika memungkinkan.
EXISTS vs IN
Untuk "setidaknya satu kecocokan":
-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);
-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);NOT EXISTS Selalu Lebih Baik daripada NOT IN
NOT IN bermasalah ketika kumpulan bagian dalam berisi NULL. NOT EXISTS tidak demikian. Selalu pilih NOT EXISTS untuk anti-gabung:
-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);
-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);Subkueri Berkorelasi dalam SELECT
Pola "pencarian untuk setiap baris":
SELECT u.id, u.email,
(SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;
-- Often readable, but consider a LEFT JOIN + GROUP BY.Subkueri Berkorelasi dalam UPDATE
Ambil nilai turunan untuk setiap baris:
UPDATE products p
SET review_count = (
SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);LATERAL JOIN: Pola Berkorelasi yang Lebih Bersih
Untuk "mencari beberapa baris untuk setiap baris luar", LATERAL sering kali lebih jelas dan lebih cepat — hal ini dibahas dalam Pola JOIN Tingkat Lanjut.
Penyimpanan Tembolok Subkueri
PostgreSQL secara bawaan tidak menyimpan hasil subkueri di tembolok antarbaris. Jika hasil bagian dalam yang sama diperlukan berkali-kali, gunakan CTE.
Buat Indeks pada Kolom Korelasi
Subkueri bagian dalam memfilter berdasarkan kunci baris luar. Tanpa indeks pada kunci tersebut, Anda akan mendapatkan pemindaian penuh untuk setiap baris luar.
-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);Ringkasan
Subkueri berkorelasi merujuk ke baris luar.
- EXISTS adalah bentuk berkorelasi yang umum
- Lebih baik gunakan NOT EXISTS daripada NOT IN
- Buat indeks pada kolom korelasi
- LATERAL adalah alternatif yang lebih bersih untuk banyak kasus
Pemeriksaan Cepat
Mengapa NOT EXISTS lebih aman daripada NOT IN ketika himpunan bagian dalam mungkin berisi NULL?
Belajar SQL dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 46
- Pelajaran
- 183
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Subkueri Berkorelasi vs Tidak Berkorelasi” gratis?
Ya — teks lengkap “Subkueri Berkorelasi vs Tidak Berkorelasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Subkueri Berkorelasi vs Tidak Berkorelasi”?
Pahami subkueri berkorelasi yang merujuk pada baris luar, karakteristik kinerjanya, serta kapan EXISTS lebih unggul daripada IN. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Subkueri Berkorelasi vs Tidak Berkorelasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Subkueri Skalar, Baris, dan Tabel
- Subkueri Berkorelasi vs Tidak Berkorelasi
- Ekspresi Tabel Umum (WITH)
- CTE RECURSIVE untuk Hierarki