Anatomi Subpertanyaan Berkorelasi
Cara pertanyaan dalaman merujuk baris luaran serta model pelaksanaan setiap baris
Anatomi Subpertanyaan Berkorelasi ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Perkara yang Menjadikan Subkueri Berkorelasi
Penemuduga membahagikan subkueri kepada dua kumpulan. Subkueri biasa (tidak berkorelasi) boleh dijalankan sendiri. Subkueri berkorelasi merujuk lajur daripada kueri luar, jadi ia tidak boleh dijalankan secara bersendirian.
- Tidak berkorelasi: dinilai sekali dan hasilnya digunakan semula untuk setiap baris luar.
- Berkorelasi: dinilai semula sekali bagi setiap baris luar kerana ia bergantung pada baris tersebut.
Tanda yang paling jelas ialah lajur daripada jadual luar muncul di dalam kueri dalam. Kenal pasti tanda itu dan anda boleh menamakan corak tersebut serta-merta.
Model Pelaksanaan Per Baris
Bayangkan enjin mengulangi baris luar. Bagi setiap baris luar, enjin memasukkan nilai baris itu ke dalam kueri dalaman, menjalankannya, lalu menggunakan hasilnya untuk menentukan atau mengira sesuatu.
Inilah model mental yang mahu anda jelaskan oleh penemuduga: "kueri dalaman dijalankan sekali untuk setiap baris luar."
Ungkapan itu juga membayangkan soalan susulan klasik: subkueri berkorelasi boleh menjadi perlahan kerana kueri dalaman mungkin dilaksanakan beribu-ribu kali. Kita akan membetulkannya dalam pelajaran 4.
Mengenal Pasti Rujukan Luar
Di sini, data pekerja dan alias luar untuk pekerja bergaji e1 memacu kueri dalaman yang membaca e1.dept_id. Rujukan kepada baris luar itu ialah korelasi.
Buang awalan alias dan kueri dalaman tidak lagi boleh dikompil sendiri. Kebergantungan itulah yang menjadikannya 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 bahasa mudah seperti yang akan anda lakukan dalam temu duga:
"Bagi setiap pekerja e1, cari purata gaji jabatan mereka sendiri, dan kekalkan pekerja itu hanya jika gajinya lebih tinggi daripada purata jabatan tersebut."
Bahagian WHERE e2.dept_id = e1.dept_id dalam kueri dalaman mengaitkan purata itu dengan jabatan pekerja ini. Tanpa baris itu, anda sebaliknya akan membandingkan semua orang dengan purata seluruh syarikat.
Alias Adalah Wajib
Apabila kueri dalaman dan kueri luar menyentuh jadual yang sama, anda mesti memberikan alias kepada kedua-duanya supaya enjin mengetahui baris yang menjadi milik sesuatu lajur.
e1= baris luar yang sedang diuji.e2= imbasan dalaman terhadap jadual tersebut.
Jika alias dibuang, dept_id menjadi taksa; banyak enjin kemudian akan mengikatnya secara senyap-senyap kepada jadual dalaman, lalu merosakkan korelasi. Penemuduga sering sengaja memasukkan kesilapan tepat ini.
Subkueri Berkorelasi dalam SELECT
Subkueri berkorelasi tidak terhad kepada WHERE. Dalam senarai SELECT, subkueri ini menghasilkan lajur terhitung yang sekali lagi dinilai bagi setiap baris luar.
Di bawah, setiap pesanan menunjukkan bilangan pesanan lain yang dibuat oleh pelanggan yang sama. Kiraan dalaman itu 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 Bermaksud Tepat Satu Nilai
Subkueri berkorelasi yang digunakan dalam SELECT atau dibandingkan dengan =, >, < mesti mengembalikan satu nilai skalar bagi setiap baris luar.
Jika subkueri itu mengembalikan lebih daripada satu baris, pangkalan data menghasilkan ralat seperti "subquery returns more than one row."
Agregat seperti COUNT, MAX atau AVG menjamin satu nilai, sebab itulah agregat tersebut lazim digunakan dalam subkueri berkorelasi skalar. Mengetahui peraturan ini dapat mengelakkan kejutan masa jalan yang kerap berlaku.
Apabila Subkueri Mengembalikan NULL
Subkueri berkorelasi skalar boleh sepadan dengan tiada baris dalaman. Agregat kemudiannya mengembalikan NULL atau, bagi COUNT, mengembalikan 0.
NULL itu mengalir ke dalam ungkapan luar anda. Perbandingan dengan NULL menghasilkan UNKNOWN, jadi baris luar mungkin tersisih tanpa disedari.
Jika anda memerlukan nilai sandaran, balut subkueri itu dengan COALESCE. Penemuduga suka bertanya perkara yang berlaku apabila tiada baris dalaman sepadan, dan mengharapkan anda menyebut tingkah laku 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 Berpandu: Tarikh Pesanan Terkini
Tugas lazim: paparkan setiap pelanggan bersama tarikh pesanan mereka yang paling terkini. Subkueri berkorelasi dalam SELECT melakukannya secara langsung.
Bagi setiap baris pelanggan, kueri dalaman mencari tarikh pesanan MAX bagi 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 Ia Boleh Menjadi Perlahan
Oleh sebab kueri dalaman dijalankan sekali bagi setiap baris luar, subkueri berkorelasi pada jadual luar yang besar boleh mencetuskan pelaksanaan dalaman berjuta-juta kali.
- Indeks pada lajur berkorelasi, iaitu
orders.customer_iddi sini, membolehkan setiap pelaksanaan dalaman selesai dengan cepat. - Tanpa indeks, setiap pelaksanaan mungkin mengimbas seluruh jadual, lalu menghasilkan kerja kira-kira O(n*m).
Dalam temu duga, sentiasa sebut indeks dan penulisan semula menggunakan cantuman sebagai tuil prestasi anda.
Perbandingan Berkorelasi dan Tidak Berkorelasi
Bezanya hanya satu baris. Versi tidak berkorelasi membandingkan semua orang dengan purata syarikat; versi berkorelasi membandingkan setiap orang dengan jabatan mereka sendiri.
Baca kedua-duanya dan perhatikan bagaimana satu baris WHERE e2.dept_id = e1.dept_id mengubah keseluruhan maksudnya.
-- 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
);Semakan Ringkas
Uji pemahaman anda tentang perkara yang mentakrifkan subkueri berkorelasi.
Imbas Kembali: Anatomi Subkueri Berkorelasi
Perkara utama:
- Subkueri berkorelasi merujuk kepada baris luar dan dijalankan sekali bagi setiap baris luar.
- Berikan alias kepada kedua-dua jadual apabila kedua-duanya ialah jadual yang sama supaya korelasi tidak samar.
- Penggunaan skalar mesti mengembalikan tepat satu nilai; tiada padanan menghasilkan NULL, jadi lindunginya dengan
COALESCE. - Subkueri ini boleh berada dalam SELECT atau WHERE, dan prestasinya bergantung pada pengindeksan lajur berkorelasi.
Sebut "dijalankan sekali bagi setiap baris luar" dalam temu duga dan anda sudah menguasai konsep teras ini.
Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 90
- Pelajaran
- 360
Soalan Lazim
Adakah pelajaran “Anatomi Subpertanyaan Berkorelasi” percuma?
Ya — teks penuh “Anatomi Subpertanyaan Berkorelasi” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Anatomi Subpertanyaan Berkorelasi”?
Cara pertanyaan dalaman merujuk baris luaran serta model pelaksanaan setiap baris Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Anatomi Subpertanyaan Berkorelasi” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?
Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Anatomi Subpertanyaan Berkorelasi
- Agregat Setiap Kumpulan Tanpa GROUP BY
- EXISTS dan NOT EXISTS Berkorelasi
- Menulis Semula Subpertanyaan Berkorelasi sebagai Cantuman