Rumah >pangkalan data >tutorial mysql >WHERE lwn. ON dalam Klausa JOIN: Bilakah Peletakan Penapis Penting?

WHERE lwn. ON dalam Klausa JOIN: Bilakah Peletakan Penapis Penting?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-05 08:12:401030semak imbas

WHERE vs. ON in JOIN Clauses: When Does Filter Placement Matter?

Memahami Perbezaan Antara Klausa WHERE dan ON dalam JOIN Queries

Pertimbangkan senario berikut apabila menyertai dua jadual, Foo dan Bar, berdasarkan lajur BarId mereka:

BATIN SERTAI dengan Klausa WHERE

SELECT * 
FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId
WHERE b.IsApproved = 1;

SERTAI DALAM dengan Klausa ON

SELECT * 
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

Dua pertanyaan ini mengembalikan hasil yang sama. Walau bagaimanapun, apabila berurusan dengan sambungan luar, perbezaan kritikal muncul. Mari teroka menggunakan LEFT OUTER JOIN:

LEFT OOTER JOIN dengan ON Clause Filter

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId); 

LEFT OUTER JOIN dengan WHERE Clause Filter

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1); 

Dalam pertanyaan pertama, baris dari kanan jadual (Bar) ditapis berdasarkan lajur IsApproved semasa proses gabungan. Sebaliknya, dalam pertanyaan kedua, penapisan ini dilakukan selepas cantuman.

Perbezaan ini menjadi ketara apabila terdapat nilai nol untuk b.BarId. Dalam pertanyaan pertama, baris tersebut masih akan disertakan dalam hasil (dengan nilai nol untuk lajur daripada Bar). Dalam pertanyaan kedua, baris ini akan ditapis keluar oleh klausa WHERE.

Kesamaan untuk Penapis PILIHAN

Untuk penapis PILIHAN (mis., b.IsApproved bukan terhad), bersamaan LEFT OUTER JOIN dengan klausa WHERE be:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

Ini mengambil kira kedua-dua kes di mana gabungan gagal (b.BarId adalah batal dan penapis harus diabaikan) dan kes di mana gabungan berjaya dan penapis harus digunakan.

Kesimpulan

Walaupun peletakan penapis dalam klausa WHERE atau ON mungkin pada mulanya kelihatan tidak penting, perbezaan halus dalam tingkah laku, terutamanya untuk gabungan luar, memerlukan pertimbangan yang teliti. Perbezaan ini memastikan pengambilan data yang tepat dan pengoptimuman pertanyaan yang cekap.

Atas ialah kandungan terperinci WHERE lwn. ON dalam Klausa JOIN: Bilakah Peletakan Penapis Penting?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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