Rumah >pangkalan data >tutorial mysql >WHERE lwn. ON dalam Klausa JOIN: Bilakah Peletakan Penapis Penting?
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!