Subkueri dalam Klausa FROM (Tabel Turunan)
Bungkus kueri sebagai tabel virtual dan pahami mengapa alias wajib digunakan.
Subkueri dalam Klausa FROM (Tabel Turunan) adalah pelajaran SQL Interview Prep 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 Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Pengertian Tabel Turunan
Subkueri dalam klausa FROM disebut tabel turunan (atau tampilan sebaris). Alih-alih mengembalikan satu nilai, subkueri tersebut mengembalikan seluruh set hasil yang diperlakukan oleh kueri luar seolah-olah merupakan tabel sungguhan.
- Tabel ini dapat memiliki banyak baris dan banyak kolom.
- Anda dapat menjalankan kueri terhadapnya, menggabungkannya, dan memfilternya seperti tabel apa pun.
Pewawancara menggunakan tabel turunan untuk menguji apakah Anda dapat memecah suatu masalah menjadi beberapa tahap.
Alias Wajib Digunakan
Jebakan nomor satu: tabel turunan harus memiliki alias. Tanpa alias, sebagian besar mesin basis data akan menolak kueri tersebut.
- MySQL: Setiap tabel turunan harus memiliki aliasnya sendiri.
- Postgres: subkueri dalam FROM harus memiliki alias.
Berikan nama untuk tabel tersebut (di sini dept_avg), lalu Anda dapat merujuk pada kolomnya menggunakan nama itu.
SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS dept_avg;Mengapa Melakukan Agregasi Terlebih Dahulu dalam Tabel Turunan
Masalah wawancara yang sering muncul: tampilkan setiap karyawan di samping rata-rata gaji departemennya. Anda tidak dapat mencampur baris detail dengan agregat secara langsung tanpa mengalami masalah pengelompokan.
Pendekatan yang rapi adalah menghitung rata-rata per departemen dalam tabel turunan, lalu menggabungkannya kembali dengan baris detail. Tabel turunan tersebut terlebih dahulu diringkas menjadi satu baris per departemen.
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;Memfilter Hasil Agregat
Tabel turunan memungkinkan Anda memfilter agregat hasil perhitungan tanpa kerumitan HAVING dalam kueri luar. Misalkan kita hanya menginginkan departemen yang rata-rata gajinya melebihi 60000.
Kita melakukan agregasi di bagian dalam, lalu menerapkan WHERE biasa pada kolom turunan di bagian luar. Kueri luar melihat avg_salary sebagai kolom biasa.
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;Dua Tingkat Agregasi
Tabel turunan sangat berguna saat Anda memerlukan agregat dari agregat — pertanyaan wawancara klasik: berapa rata-rata dari rata-rata gaji per departemen?
Anda tidak dapat langsung menumpuk AVG(AVG(...)). Kueri dalam menghasilkan satu rata-rata per departemen; kueri luar menghitung rata-rata dari nilai-nilai tersebut.
SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d;Memberi Nama pada Kolom Hasil Perhitungan
Setiap ekspresi dalam tabel turunan memerlukan alias jika Anda ingin merujuk padanya dari luar. Ekspresi salary * 12 di bagian dalam jika tidak diberi alias akan memiliki nama yang ditetapkan oleh basis data dan tidak dapat Anda andalkan.
Selalu beri alias pada kolom hasil perhitungan — pewawancara akan memperhatikan ketika Anda merujuk pada ekspresi tanpa alias dan mengasumsikan nama kolom yang mungkin tidak ada.
SELECT name, annual_salary
FROM (
SELECT name, salary * 12 AS annual_salary
FROM employees
) AS yearly
WHERE annual_salary > 100000;Menggabungkan Dua Tabel Turunan
Anda dapat menggabungkan beberapa tabel turunan. Di sini, kami membandingkan jumlah karyawan setiap departemen dengan total penggajiannya dengan menggabungkan dua subkueri yang telah diagregasi sebelumnya.
Setiap tabel turunan menjawab satu subpertanyaan; penggabungan menyatukannya menjadi laporan akhir. Cara berpikir bertahap seperti ini persis yang dihargai dalam wawancara tingkat menengah.
SELECT c.dept_id, c.headcount, p.payroll
FROM (
SELECT dept_id, COUNT(*) AS headcount
FROM employees GROUP BY dept_id
) AS c
JOIN (
SELECT dept_id, SUM(salary) AS payroll
FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;Cakupan: Kueri Luar Tidak Dapat Melihat Bagian Dalam
Aturan penting: kueri luar hanya dapat merujuk pada kolom yang ditampilkan oleh tabel turunan dalam daftar SELECT-nya. Kolom yang hanya digunakan di dalam subkueri tidak terlihat dari luar.
Jika kueri dalam memilih dept_id dan avg_salary, maka salary atau name tidak tersedia dari luar — keduanya telah digunakan oleh agregasi. Pewawancara menguji batas cakupan ini.
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees GROUP BY dept_id
) AS d;Tabel Turunan vs CTE
Tabel turunan dan Common Table Expression (CTE) sering kali menghasilkan rencana yang sama. Pewawancara mungkin bertanya mengapa Anda memilih salah satunya:
- Tabel turunan: ditulis sebaris dan cocok untuk penggunaan satu kali.
- CTE (
WITH): diberi nama di bagian atas, mudah dibaca, dan dapat digunakan kembali jika dirujuk beberapa kali.
Untuk logika yang sangat bertingkat, alur CTE dibaca dari atas ke bawah; tabel turunan dibaca dari bagian dalam ke luar.
WITH dept_avg AS (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;Subkueri LATERAL / FROM Berkorelasi
Biasanya, subkueri FROM tidak dapat merujuk pada baris kueri luar. LATERAL (Postgres) atau CROSS APPLY (SQL Server) menghapus batasan tersebut, sehingga tabel turunan dapat dijalankan untuk setiap baris luar.
Hal ini memungkinkan pencarian N teratas untuk setiap baris. Mengetahui bahwa kata kunci ini ada menunjukkan pemahaman tingkat senior, bahkan dalam proses wawancara tingkat menengah.
SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
SELECT name, salary FROM employees e
WHERE e.dept_id = d.id
ORDER BY salary DESC LIMIT 1
) AS top_emp;Cuplikan Jawaban Wawancara
Jika ditanya tentang subkueri klausa FROM, jawablah: "Tabel turunan adalah subkueri dalam FROM yang mengembalikan kumpulan hasil yang digunakan kueri luar seperti tabel. Tabel ini harus memiliki alias, kueri luar hanya dapat melihat kolom yang dipilihnya, dan tabel ini ideal untuk melakukan agregasi awal sebelum JOIN atau mengagregasikan hasil agregasi."
Tambahkan bahwa LATERAL memungkinkannya mereferensikan baris luar, dan Anda telah mencakup semua sudut penting.
Pemeriksaan Singkat
Pilih pernyataan yang selalu diperlukan untuk subkueri klausa FROM.
Ringkasan
Tabel turunan, kini dikuasai:
- Subkueri FROM mengembalikan tabel virtual — banyak baris dan banyak kolom.
- Tabel ini harus memiliki alias; kueri luar hanya dapat melihat kolom yang dipilihnya.
- Gunakan tabel ini untuk melakukan agregasi awal sebelum JOIN, memfilter berdasarkan hasil agregasi, atau mengagregasikan hasil agregasi.
- CTE adalah alternatif bernama yang lebih mudah dibaca;
LATERAL/CROSS APPLYmemungkinkannya mereferensikan baris luar.
Berikutnya: subkueri keanggotaan himpunan dengan IN, ANY, dan ALL.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Subkueri dalam Klausa FROM (Tabel Turunan)” gratis?
Ya — teks lengkap “Subkueri dalam Klausa FROM (Tabel Turunan)” 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 “Subkueri dalam Klausa FROM (Tabel Turunan)”?
Bungkus kueri sebagai tabel virtual dan pahami mengapa alias wajib digunakan. 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 2 dari 4.
Berapa lama pelajaran “Subkueri dalam Klausa FROM (Tabel Turunan)” 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
- Subkueri Skalar dalam SELECT dan WHERE
- Subkueri dalam Klausa FROM (Tabel Turunan)
- Subkueri IN, ANY, dan ALL
- Kinerja EXISTS vs IN