Lompati ke konten utama
Modul 4 · Pelajaran 4 dari 416/57 dalam kursus~12 min
Pelajaran modul (4/4)

Kueri di dalam subkueri lain:

Anda telah mempelajari cara mengekstrak, memfilter, mengelompokkan, menggabungkan, dan mengubah. Di sana adalah satu ide mendasar terakhir: memasukkan kueri ke dalam kueri lain. Ini adalah disebut subkueri dan merupakan langkah yang memungkinkan Anda menjawab pertanyaan seperti "siapa yang berpenghasilan di atas rata-rata?" atau "di departemen mana ada seseorang ditugaskan ke suatu proyek?".

Sintaks dasar

Subkueri adalah SELECT yang dibungkus dalam tanda kurung, digunakan sebagai pengganti satu nilai atau daftar nilai dalam kueri lain:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

Mesin menjalankan subkueri terlebih dahulu — SELECT AVG(salary) FROM employees mengembalikan satu nomor — lalu menggunakan nomor tersebut di bagian luar WHERE seolah-olah Anda menulisnya dengan tangan. Inilah keuntungannya: Anda melakukannya tidak perlu mengetahui rata-rata sebelumnya, SQL menghitungnya untuk Anda.

Tiga "tipe" yang paling umum

1. Subquery mengembalikan satu nilai

Contoh di atas: subquery menghasilkan satu baris, satu kolom (disebut skalar). Anda menggunakannya dengan =, >, < dan seterusnya.

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. Subquery mengembalikan daftar

Subkueri menghasilkan satu kolom, banyak baris. Anda menggunakannya dengan IN (...):

SQL
-- Departments that have at least one employee:
SELECT name
FROM   departments
WHERE  id IN (SELECT DISTINCT department_id
              FROM employees
              WHERE department_id IS NOT NULL);

3. Subquery sebagai "tabel" (DARI)

Subkueri juga dapat menggantikan tabel di FROM. Hal ini berguna untuk pra-hitung agregat lalu filter atau gabungkan:

SQL
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM   departments AS d
JOIN  (SELECT department_id, AVG(salary) AS stipendio_medio
       FROM employees
       GROUP BY department_id) AS medie
   ON d.id = medie.department_id
WHERE  medie.stipendio_medio > 40000;

Subkueri atau GABUNG? Kapan menggunakan yang mana

Seringkali hasil yang sama dapat diperoleh dengan JOIN atau dengan subquery. Aturan praktisnya:

  • Untuk memfilter baris dari satu tabel berdasarkan properti tabel lainnya ("karyawan yang departemennya..."), IN (subquery) sangat mudah dibaca.
  • Untuk menggabungkan kolom dari beberapa tabel pada hasil, gunakan JOIN.
  • Untuk menghitung agregat dan menggunakannya sebagai ambang batas ("di atas rata-rata"), subkueri skalar adalah pilihan yang wajar.

Dalam praktiknya, Anda akan melihat keduanya: mesin SQL sering kali mengoptimalkannya dengan cara yang sama cara. Pilih formulir yang paling baik dibaca.

Cobalah

Latihan#sql.m4.l4.e1
Upaya: 0Memuat…

Temukan nama depan (first_name), nama belakang (last_name) dan gaji (gaji) karyawan yang berpenghasilan SANGAT lebih tinggi dari rata-rata perusahaan. Tiga kolom.

Memuat editor…
Tunjukkan petunjuk

Mengganti ? dengan subkueri SELECT AVG(gaji) FROM karyawan — ia mengembalikan satu nomor untuk digunakan sebagai ambang batas.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m4.l4.e2
Upaya: 0Memuat…

Cantumkan nama (nama departemen) departemen yang memiliki setidaknya satu karyawan dengan gaji lebih besar dari 50.000. Gunakan subkueri dengan IN. Pesan berdasarkan abjad.

Memuat editor…
Tunjukkan petunjuk

Subquery dalam mengembalikan id departemen yang memiliki karyawan dengan gaji > 50000. Kemudian WHERE id IN (...) pada query luar.

Solusi tersedia setelah 3 upaya