Subqueries berkorelasi, juga dikenali sebagai subqueries bersarang, adalah subqueries yang bergantung pada pertanyaan luar. Mereka dilaksanakan berulang kali, sekali untuk setiap baris yang diproses oleh pertanyaan luar. Ciri utama adalah bahawa pertanyaan dalaman merujuk lajur dari senarai SELECT
pertanyaan luar, FROM
klausa, atau WHERE
klausa.
Mari kita gambarkan dengan contoh. Katakan kami mempunyai dua jadual: Employees
dan Departments
. Employees
mempunyai lajur employee_id
, employee_name
, dan department_id
, manakala Departments
mempunyai department_id
dan department_name
. Kami mahu mencari nama setiap pekerja dan nama jabatan mereka.
Pendekatan subquery berkorelasi akan kelihatan seperti ini:
<code class="sql">SELECT e.employee_name, (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id) AS department_name FROM Employees e;</code>
Dalam pertanyaan ini, subquery dalaman (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id)
dikaitkan dengan pertanyaan luar kerana menggunakan e.department_id
dari jadual Employees
pertanyaan luar. Untuk setiap baris dalam jadual Employees
, pertanyaan dalaman dilaksanakan untuk mencari nama jabatan yang sepadan.
Subqueries berkorelasi boleh menjadi kurang cekap daripada pendekatan lain, terutamanya dengan dataset yang besar. Ini kerana pertanyaan dalaman dilaksanakan berulang kali untuk setiap baris dalam pertanyaan luar. Ini membawa kepada pelan pelaksanaan gelung bersarang, yang boleh menghasilkan prestasi yang O (n*m), di mana n adalah bilangan baris dalam pertanyaan luar dan m ialah bilangan baris dalam pertanyaan dalaman. Ini boleh menjadi sangat perlahan untuk jadual besar.
Pengoptimal pangkalan data mungkin tidak dapat mengoptimumkan subquery berkorelasi sebagai efektif sebagai gabungan kerana kebergantungan antara pertanyaan dalaman dan luar. Enjin pangkalan data mungkin tidak dapat menggunakan indeks dengan cekap dalam beberapa kes, lebih banyak mempengaruhi prestasi. Masa pemprosesan yang meningkat dan penggunaan sumber boleh menyebabkan pelaksanaan pertanyaan perlahan dan berpotensi memberi kesan kepada prestasi pangkalan data keseluruhan.
Walaupun secara amnya kurang cekap, subqueries berkorelasi boleh lebih baik dalam situasi tertentu:
JOIN
tidak dapat dikendalikan secara langsung tanpa pengagregatan), subquery berkorelasi mungkin diperlukan. Hampir selalu, alternatif yang paling berkesan untuk subquery berkorelasi adalah JOIN
. Satu JOIN
membolehkan pangkalan data melaksanakan operasi dengan lebih cekap menggunakan algoritma yang dioptimumkan. Contoh yang sama dari atas boleh ditulis semula menggunakan JOIN
seperti berikut:
<code class="sql">SELECT e.employee_name, d.department_name FROM Employees e JOIN Departments d ON e.department_id = d.department_id;</code>
Versi JOIN
ini jauh lebih cepat kerana pangkalan data dapat melakukan operasi dalam satu pas, sering menggunakan indeks untuk mempercepatkan carian. Alternatif lain, bergantung kepada pertanyaan khusus, mungkin termasuk menggunakan fungsi tetingkap atau ekspresi jadual umum (CTE) untuk meningkatkan prestasi dan kebolehbacaan. Teknik -teknik ini sering membolehkan pelan pertanyaan yang lebih cekap berbanding dengan subqueries berkorelasi.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan subqueries berkorelasi dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!