SQL JOIN: Adakah INNER JOIN Mengatasi OUTER JOIN Sebelum ini?
Artikel ini meneroka interaksi antara klausa INNER JOIN
dan OUTER JOIN
dalam pertanyaan SQL, khususnya menangani sama ada INNER JOIN
berikutnya menafikan kesan OUTER JOIN
sebelumnya.
Jawapan ringkasnya ialah: Tidak, bukan secara automatik. Walau bagaimanapun, INNER JOIN
boleh mengehadkan dengan ketara kesan OUTER JOIN
sebelumnya.
Kuncinya terletak pada ON
klausa INNER JOIN
. Jika fasal ON
memerlukan lajur yang mungkin NULL
disebabkan oleh OUTER JOIN
, maka INNER JOIN
akan menapis baris dengan berkesan di mana lajur itu NULL
. Ini bukan "override" dalam erti kata mengabaikan sepenuhnya OUTER JOIN
, sebaliknya kesan penapisan.
Contoh 1: JOIN DALAM tidak menafikan JOIN LUAR
<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>
Ini berfungsi seperti yang diharapkan. INNER JOIN
pada email
hanya memerlukan person.email_id
yang sah. Walaupun seseorang itu tidak mempunyai alamat (address.id
ialah NULL
), LEFT JOIN
masih termasuk mereka dan jika mereka mempunyai e-mel, INNER JOIN
termasuk data e-mel tersebut.
Contoh 2: INNER JOIN mengehadkan OUTER JOIN
<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, masalah timbul. INNER JOIN
pada city
memerlukan bukan-NULL
address.city_id
. Oleh kerana LEFT JOIN
pada address
mungkin menghasilkan baris dengan NULL
address.city_id
, baris tersebut dikecualikan oleh INNER JOIN
. Kesan OUTER JOIN
sangat terhad.
Penyelesaian: Untuk mengekalkan kelakuan OUTER JOIN
dalam Contoh 2, tukar INNER JOIN
kepada LEFT 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>
Amalan Terbaik:
INNER JOIN
s sebelum OUTER JOIN
s boleh meningkatkan kebolehbacaan, kerana INNER JOIN
s mewakili keadaan yang lebih ketat.RIGHT JOIN
dengan berhati-hati, kerana ia mungkin kurang intuitif daripada LEFT JOIN
s. Selalunya, LEFT JOIN
dengan jadual ditukar akan mencapai hasil yang sama dengan lebih jelas.Memahami interaksi antara INNER JOIN
dan OUTER JOIN
adalah penting untuk menulis pertanyaan SQL yang cekap dan betul. Pertimbangkan dengan teliti fasal ON
semua cantuman untuk memastikan ia sejajar dengan gelagat yang diingini.
Atas ialah kandungan terperinci Adakah JOIN DALAM Mengatasi JOIN OUTER Sebelumnya dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!