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
Lepaskan: 2025-01-05 08:12:40
asal
1038 orang telah melayarinya

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

SERTAI DALAM dengan Klausa ON

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

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

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

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

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