0Pricing
SQL Interview Prep · Pelajaran

Anatomi Subkueri Berkorelasi

Pelajari cara kueri bagian dalam mereferensikan baris luar dan model eksekusi per baris.

Anatomi Subkueri Berkorelasi adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 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 Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang Membuat Subkueri Berkorelasi

Pewawancara membagi subkueri menjadi dua kelompok. Subkueri biasa (tidak berkorelasi) dapat berjalan sendiri. Subkueri berkorelasi mereferensikan kolom dari kueri luar, sehingga tidak dapat berjalan secara mandiri.

  • Tidak berkorelasi: dievaluasi sekali, lalu hasilnya digunakan kembali untuk setiap baris luar.
  • Berkorelasi: dievaluasi ulang sekali untuk setiap baris luar, karena bergantung pada baris tersebut.

Tanda khasnya adalah kolom dari tabel luar yang muncul di dalam kueri dalam. Jika Anda melihatnya, Anda dapat langsung mengenali polanya.

Model Eksekusi Per Baris

Bayangkan mesin melakukan perulangan pada baris-baris luar. Untuk setiap baris luar, mesin memasukkan nilai dari baris tersebut ke dalam kueri dalam, menjalankannya, lalu menggunakan hasilnya untuk menentukan atau menghitung sesuatu.

Inilah model mental yang ingin Anda jelaskan dalam wawancara: "kueri dalam dijalankan sekali untuk setiap baris luar."

Ungkapan itu juga mengisyaratkan pertanyaan lanjutan yang umum: subkueri berkorelasi dapat berjalan lambat karena kueri dalam mungkin dijalankan ribuan kali. Kita akan mengatasinya di pelajaran 4.

Menemukan Referensi Luar

Di sini, karyawan dan alias luar e1 untuk karyawan bergaji menggerakkan kueri dalam yang membaca e1.dept_id. Referensi ke baris luar itulah korelasinya.

Hapus awalan alias tersebut, dan kueri dalam tidak lagi dapat dikompilasi sendiri. Ketergantungan itulah yang membuatnya berkorelasi.

SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary)
    FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Membaca Kueri Itu dengan Lantang

Terjemahkan kueri sebelumnya ke dalam bahasa sederhana seperti yang akan Anda lakukan dalam wawancara:

"Untuk setiap karyawan e1, cari rata-rata gaji departemennya sendiri, lalu pertahankan karyawan tersebut hanya jika gajinya lebih besar daripada rata-rata departemen itu."

Bagian WHERE e2.dept_id = e1.dept_id pada kueri dalam mengaitkan rata-rata dengan departemen milik karyawan ini. Tanpa baris tersebut, Anda akan membandingkan semua orang dengan rata-rata seluruh perusahaan.

Alias Wajib Digunakan

Ketika kueri dalam dan kueri luar menyentuh tabel yang sama, Anda harus memberikan alias pada keduanya agar mesin mengetahui baris mana yang menjadi milik suatu kolom.

  • e1 = baris luar yang sedang diuji.
  • e2 = pemindaian dalam terhadap tabel tersebut.

Hapus alias-alias itu dan dept_id menjadi ambigu; banyak mesin kemudian akan mengaitkannya secara diam-diam dengan tabel dalam, sehingga korelasinya rusak. Pewawancara sering sengaja menyisipkan kesalahan persis seperti ini.

Subkueri Berkorelasi dalam SELECT

Subkueri berkorelasi tidak terbatas pada WHERE. Dalam daftar SELECT, subkueri ini menghasilkan kolom hasil perhitungan yang juga dievaluasi untuk setiap baris luar.

Di bawah ini, setiap pesanan menunjukkan jumlah pesanan lain yang dibuat oleh pelanggan yang sama. Perhitungan dalam berkorelasi melalui o.customer_id.

SELECT o.order_id,
       o.customer_id,
       (SELECT COUNT(*)
        FROM orders o2
        WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;

Skalar Berarti Tepat Satu Nilai

Subkueri berkorelasi yang digunakan dalam SELECT atau dibandingkan dengan =, >, < harus mengembalikan satu nilai skalar untuk setiap baris luar.

Jika subkueri tersebut mengembalikan lebih dari satu baris, basis data akan menghasilkan kesalahan seperti "subkueri menghasilkan lebih dari satu baris."

Agregat seperti COUNT, MAX, atau AVG menjamin satu nilai, sehingga umum digunakan di dalam subkueri berkorelasi skalar. Memahami aturan ini akan mencegah kejutan umum saat berjalan.

Saat Subkueri Menghasilkan NULL

Subkueri berkorelasi skalar dapat cocok dengan nol baris dalam. Agregat kemudian menghasilkan NULL (atau, untuk COUNT, menghasilkan 0).

NULL tersebut mengalir ke dalam ekspresi luar Anda. Perbandingan dengan NULL menghasilkan UNKNOWN, sehingga baris luar mungkin tidak disertakan secara diam-diam.

Jika Anda memerlukan nilai cadangan, bungkus subkueri tersebut dengan COALESCE. Pewawancara senang menanyakan apa yang terjadi saat tidak ada baris dalam yang cocok, dan mengharapkan Anda menjelaskan perilaku NULL.

SELECT c.customer_id,
       COALESCE((SELECT MAX(o.amount)
                 FROM orders o
                 WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;

Contoh: Tanggal Pesanan Terbaru

Tugas umum: tampilkan setiap pelanggan bersama tanggal pesanan terbarunya. Subkueri berkorelasi dalam SELECT dapat melakukannya secara langsung.

Untuk setiap baris pelanggan, kueri dalam mencari tanggal pesanan maksimum untuk pelanggan tersebut melalui o.customer_id = c.customer_id.

SELECT c.customer_id,
       c.name,
       (SELECT MAX(o.order_date)
        FROM orders o
        WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;

Mengapa Ini Bisa Lambat

Karena kueri dalam dijalankan sekali untuk setiap baris luar, subkueri berkorelasi pada tabel luar yang besar dapat memicu jutaan eksekusi kueri dalam.

  • Indeks pada kolom yang berkorelasi (di sini orders.customer_id) memungkinkan setiap eksekusi dalam selesai dengan cepat.
  • Tanpa indeks, setiap eksekusi mungkin memindai seluruh tabel, sehingga pekerjaan yang dilakukan kira-kira sebesar O(n*m).

Dalam wawancara, selalu sebutkan indeks dan penulisan ulang menggunakan penggabungan sebagai cara utama untuk meningkatkan kinerja.

Berkorelasi vs Tidak Berkorelasi Berdampingan

Perbedaannya hanya satu baris. Versi yang tidak berkorelasi membandingkan semua orang dengan rata-rata perusahaan; versi yang berkorelasi membandingkan setiap orang dengan departemennya sendiri.

Baca keduanya dan perhatikan bagaimana satu baris WHERE e2.dept_id = e1.dept_id mengubah seluruh makna.

-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
    SELECT AVG(e2.salary) FROM employees e2
    WHERE e2.dept_id = e1.dept_id
);

Pemeriksaan Singkat

Uji pemahaman Anda tentang hal yang mendefinisikan subkueri berkorelasi.

Rekap: Anatomi Subkueri Berkorelasi

Hal-hal penting:

  • Subkueri berkorelasi merujuk ke baris luar dan dijalankan sekali untuk setiap baris luar.
  • Berikan alias pada kedua tabel jika keduanya merupakan tabel yang sama agar korelasinya tidak ambigu.
  • Penggunaan skalar harus mengembalikan tepat satu nilai; tidak adanya kecocokan menghasilkan NULL, jadi lindungi dengan COALESCE.
  • Subkueri ini dapat ditempatkan dalam SELECT atau WHERE, dan kinerjanya sangat bergantung pada pengindeksan kolom yang berkorelasi.

Ucapkan "dijalankan sekali untuk setiap baris luar" dalam wawancara, dan Anda sudah menguasai konsep intinya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Anatomi Subkueri Berkorelasi” gratis?

Ya — teks lengkap “Anatomi Subkueri Berkorelasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Anatomi Subkueri Berkorelasi”?

Pelajari cara kueri bagian dalam mereferensikan baris luar dan model eksekusi per baris. Kamu berlatih SQL Interview Prep 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 Interview Prep?

Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep 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 1 dari 4.

Berapa lama pelajaran “Anatomi Subkueri 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 Interview Prep ini?

Ya. Setiap pelajaran SQL Interview Prep 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

  1. Anatomi Subkueri Berkorelasi
  2. Agregat Per Grup Tanpa GROUP BY
  3. EXISTS dan NOT EXISTS Berkorelasi
  4. Menulis Ulang Subkueri Berkorelasi sebagai JOIN
← Kembali ke SQL Interview Prep