Rumah > pangkalan data > tutorial mysql > Adakah JOIN DALAM Mengatasi JOIN OUTER Sebelumnya dalam SQL?

Adakah JOIN DALAM Mengatasi JOIN OUTER Sebelumnya dalam SQL?

Mary-Kate Olsen
Lepaskan: 2025-01-09 10:22:40
asal
865 orang telah melayarinya

Does an INNER JOIN Override a Preceding OUTER JOIN in SQL?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Amalan Terbaik:

  • Walaupun tidak diperlukan, meletakkan INNER JOINs sebelum OUTER JOINs boleh meningkatkan kebolehbacaan, kerana INNER JOINs mewakili keadaan yang lebih ketat.
  • Gunakan RIGHT JOINdengan berhati-hati, kerana ia mungkin kurang intuitif daripada LEFT JOINs. 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan