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:
-- 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.
-- 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 (...):
-- 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:
-- 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
Temukan nama depan (first_name), nama belakang (last_name) dan gaji (gaji) karyawan yang berpenghasilan SANGAT lebih tinggi dari rata-rata perusahaan. Tiga kolom.
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
Cantumkan nama (nama departemen) departemen yang memiliki setidaknya satu karyawan dengan gaji lebih besar dari 50.000. Gunakan subkueri dengan IN. Pesan berdasarkan abjad.
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