Subkueri Berkorelasi
Subkueri yang bergantung pada baris luar.
Subkueri Berkorelasi adalah pelajaran SQL Academy 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Apa Itu Subkueri Berkorelasi?
Subkueri berkorelasi adalah subkueri yang merujuk pada kolom dari kueri luar (yang memuatnya). Berbeda dari subkueri biasa yang dijalankan sekali dan mengembalikan hasil tetap, subkueri berkorelasi dievaluasi sekali untuk setiap baris yang diproses oleh kueri luar.
Hal ini membuatnya sangat berguna untuk perbandingan baris demi baris, tetapi juga lebih mahal daripada subkueri sederhana.
Subkueri Biasa vs Subkueri Berkorelasi
Perbedaan utamanya: subkueri biasa tidak memiliki rujukan ke kueri luar dan dapat berdiri sendiri. Subkueri berkorelasi bergantung pada baris luar—Anda dapat melihat alias tabel luar muncul di dalam subkueri.
Pada contoh di bawah, SELECT bagian dalam merujuk pada e1.department_id dari kueri luar, sehingga tercipta korelasi.
-- Regular subquery (runs once)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated subquery (runs once per outer row)
SELECT name, salary, department_id
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);Menyiapkan Tabel Contoh
Mari buat dua tabel yang akan kita gunakan sepanjang pelajaran ini: employees dan departments. Tabel-tabel ini menyediakan data realistis untuk mendemonstrasikan subkueri berkorelasi dalam berbagai skenario.
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT REFERENCES departments(id),
salary NUMERIC(10,2),
hire_date DATE
);
INSERT INTO departments VALUES (1,'Engineering'),(2,'Sales'),(3,'HR');
INSERT INTO employees VALUES
(1,'Alice', 1, 90000, '2020-03-01'),
(2,'Bob', 1, 75000, '2021-06-15'),
(3,'Carol', 2, 60000, '2019-01-10'),
(4,'David', 2, 68000, '2022-09-01'),
(5,'Eve', 3, 55000, '2020-07-20'),
(6,'Frank', 1, 95000, '2018-11-05'),
(7,'Grace', 3, 52000, '2023-02-28'),
(8,'Henry', 2, 71000, '2021-04-12');Karyawan yang Berpenghasilan di Atas Rata-Rata Departemennya
Salah satu kasus penggunaan klasik subkueri berkorelasi adalah menemukan setiap karyawan yang gajinya melebihi rata-rata gaji departemennya sendiri. Kueri bagian dalam menghitung ulang rata-rata departemen untuk setiap baris karyawan dalam kueri luar.
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id, e1.salary DESC;Menggunakan Subkueri Berkorelasi dalam SELECT
Subkueri berkorelasi tidak terbatas pada klausa WHERE—subkueri tersebut juga dapat muncul dalam daftar SELECT untuk menghitung nilai bagi setiap baris. Di sini kita mengambil gaji setiap karyawan beserta rata-rata gaji departemennya, semuanya dalam satu kueri.
SELECT
e.name,
e.salary,
(
SELECT ROUND(AVG(e2.salary), 2)
FROM employees e2
WHERE e2.department_id = e.department_id
) AS dept_avg_salary
FROM employees e
ORDER BY e.department_id, e.name;Menemukan Karyawan Bergaji Tertinggi per Departemen
Kita dapat menggunakan subkueri berkorelasi untuk menemukan karyawan dengan gaji maksimum di setiap departemen. Kueri bagian dalam menemukan gaji maksimum untuk departemen pada baris saat ini, lalu kueri luar hanya mempertahankan baris yang cocok dengan nilai tersebut.
SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary = (
SELECT MAX(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id;EXISTS dengan Subkueri Berkorelasi
Operator EXISTS sering dipasangkan dengan subkueri berkorelasi. Operator ini mengembalikan TRUE jika kueri bagian dalam menghasilkan setidaknya satu baris. Di sini kita mencantumkan semua departemen yang memiliki setidaknya satu karyawan yang direkrut sebelum 2021.
SELECT d.name AS department
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
AND e.hire_date < '2021-01-01'
);NOT EXISTS dengan Subkueri Berkorelasi
NOT EXISTS adalah kebalikannya—operator ini mengembalikan TRUE ketika subkueri berkorelasi tidak menemukan baris yang cocok. Fitur ini berguna untuk menemukan rekaman induk yang tidak memiliki rekaman turunan, seperti departemen tanpa karyawan.
SELECT d.name AS department_without_employees
FROM departments d
WHERE NOT EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
);Subkueri Berkorelasi dalam UPDATE
Subkueri berkorelasi juga dapat digunakan di dalam pernyataan UPDATE. Contoh berikut menambahkan kolom dept_avg, lalu menggunakan subkueri berkorelasi untuk mengisinya dengan rata-rata gaji departemen setiap karyawan.
ALTER TABLE employees ADD COLUMN dept_avg NUMERIC(10,2);
UPDATE employees e1
SET dept_avg = (
SELECT ROUND(AVG(e2.salary), 2)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
SELECT name, salary, dept_avg FROM employees ORDER BY department_id, name;Subkueri Berkorelasi dalam DELETE
Anda juga dapat menggunakan subkueri berkorelasi dalam pernyataan DELETE untuk menghapus baris berdasarkan data dari tabel terkait. Kueri di bawah menghapus karyawan yang gajinya kurang dari 60% rata-rata departemennya—sebuah pola pembersihan data.
DELETE FROM employees e1
WHERE e1.salary < (
SELECT AVG(e2.salary) * 0.60
FROM employees e2
WHERE e2.department_id = e1.department_id
);
SELECT name, salary, department_id FROM employees ORDER BY department_id;Kiat Kinerja: Subkueri Berkorelasi vs JOIN
Subkueri berkorelasi dijalankan sekali untuk setiap baris luar, sehingga dapat lambat pada tabel besar. Banyak subkueri berkorelasi dapat ditulis ulang sebagai JOIN dengan tabel turunan atau CTE untuk kinerja yang lebih baik. Pahami kedua pola tersebut dan pilih berdasarkan keterbacaan serta rencana eksekusi.
-- Correlated version (potentially slower)
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
-- Equivalent JOIN + derived table (often faster)
SELECT e.name, e.salary
FROM employees e
JOIN (
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
) dept_avg ON dept_avg.department_id = e.department_id
WHERE e.salary > dept_avg.avg_sal;Uji Singkat
Uji pemahaman Anda tentang subkueri berkorelasi.
Ringkasan: Subkueri Berkorelasi
Dalam pelajaran ini, Anda mempelajari bahwa subkueri berkorelasi merujuk pada kolom dari kueri luarnya dan dievaluasi ulang untuk setiap baris luar. Hal-hal penting:
- Subkueri tersebut dapat muncul dalam SELECT, WHERE, UPDATE, dan DELETE.
- EXISTS / NOT EXISTS secara alami dipasangkan dengan subkueri berkorelasi untuk memeriksa baris terkait.
- Subkueri tersebut ekspresif tetapi dapat lambat—pertimbangkan untuk menulis ulang sebagai JOIN ketika kinerja penting.
- Alias tabel luar di dalam subkueri itulah yang menciptakan korelasi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Subkueri Berkorelasi” gratis?
Ya — teks lengkap “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 Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Subkueri Berkorelasi”?
Subkueri yang bergantung pada baris luar. 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 1 dari 4.
Berapa lama pelajaran “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 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 Berkorelasi
- EXISTS dan NOT EXISTS
- IN vs ANY vs ALL
- Kinerja EXISTS vs JOIN