Memahami Interaksi INNER dan OUTER JOIN dalam SQL
Pertanyaan SQL yang kompleks kerap menggunakan berbilang operasi JOIN, menggabungkan jenis JOIN yang berbeza. Pertimbangan utama ialah bagaimana kemasukan nilai NULL, ciri OUTER JOIN, dipengaruhi apabila INNER JOIN kemudiannya digunakan.
Bagaimana Inner JOIN Boleh Mempengaruhi Keputusan OUTER JOIN
SERTAI DALAM, dengan sifatnya, hanya mengembalikan baris yang syarat sambung dipenuhi dalam kedua-dua jadual. Jika JOIN DALAM mengikuti OUTER JOIN dan keadaan INNER JOIN bergantung pada lajur yang mungkin NULL (disebabkan oleh OUTER JOIN), ia menapis keluar baris dengan berkesan di mana lajur tersebut adalah NULL. Ini menafikan kemasukan nilai NULL yang diberikan oleh OUTER JOIN pada mulanya.
Contoh Ilustrasi
Mari kita periksa senario:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN email ON person.email_id = email.id;</code>
LEFT JOIN
memastikan semua baris daripada jadual person
disertakan, walaupun tiada entri yang sepadan dalam address
. Walau bagaimanapun, INNER JOIN
dengan email
kemudian mengehadkan hasil hanya kepada baris yang mempunyai email_id
padanan dalam kedua-dua person
dan email
. Baris daripada person
yang mempunyai padanan address
tetapi NULL email_id
akan dikecualikan.
Senario Bermasalah dan Penyelesaiannya
Pertimbangkan pertanyaan ini:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN city ON address.city_id = city.id;</code>
Di sini, INNER JOIN
dengan city
menganggap bahawa address.city_id
tidak pernah NULL. Jika sesetengah alamat tidak mempunyai city_id
, baris tersebut (dan baris person
yang berkaitan) akan ditinggalkan, secara tidak sengaja mengubah keputusan LEFT JOIN
awal.
Pendekatan yang betul ialah menggunakan LEFT JOIN
yang lain dan bukannya INNER JOIN
:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id LEFT JOIN city ON address.city_id = city.id;</code>
Ini mengekalkan keterangkuman LEFT JOIN
awal, mengendalikan kes dengan betul di mana address.city_id
mungkin NULL. Ini memastikan bahawa semua person
rekod disertakan, tidak kira sama ada mereka mempunyai alamat atau bandar yang berkaitan dengannya.
Atas ialah kandungan terperinci Adakah JOIN DALAM Mengatasi Kemasukan Nilai NULL OUTER JOIN?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!