Rumah > pangkalan data > tutorial mysql > WHERE vs. ON dalam SQL JOINs: Bilakah Saya Perlu Menggunakan Setiap Klausa?

WHERE vs. ON dalam SQL JOINs: Bilakah Saya Perlu Menggunakan Setiap Klausa?

DDD
Lepaskan: 2025-01-05 13:10:44
asal
294 orang telah melayarinya

WHERE vs. ON in SQL JOINs: When Should I Use Each Clause?

Meneroka Perbezaan antara Klausa WHERE dan Keadaan ON dalam JOIN

Pengamal SQL sering menggunakan klausa WHERE dan syarat ON secara bergantian apabila melakukan operasi JOIN . Walaupun kedua-dua pendekatan boleh mengembalikan hasil yang sama, terdapat nuansa yang perlu dipertimbangkan.

Dalam contoh yang disediakan, dua pertanyaan SQL dibentangkan:

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

dan

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

Kedua-dua pertanyaan mengembalikan set baris yang sama, tetapi terdapat perbezaan penting dalam pelaksanaannya. Apabila penapis diletakkan dalam klausa WHERE, ia digunakan selepas operasi JOIN. Ini bermakna JOIN akan mendapatkan semula semua baris yang sepadan daripada kedua-dua jadual, walaupun yang b.IsApproved adalah palsu. Klausa WHERE kemudiannya menapis baris yang tidak memenuhi kriteria b.IsApproved = 1.

Sebaliknya, apabila penapis diletakkan dalam keadaan ON, keadaan dinilai sebelum JOIN. Akibatnya, hanya baris di mana kedua-dua b.BarId dan b.IsApproved memenuhi kriteria yang ditentukan akan dimasukkan ke dalam JOIN.

Outer Joins and Filter Placement

Walau bagaimanapun , perbezaan ini menjadi sangat penting apabila berurusan dengan sambungan luar. Pertimbangkan pertanyaan gabungan luar kiri berikut:

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

Dalam kes ini, penapis dalam keadaan ON akan mengecualikan baris yang b.IsApproved adalah palsu atau yang tiada padanan b.BarId untuk f tertentu .BarId. Tingkah laku ini berbeza daripada meletakkan penapis dalam klausa WHERE:

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

Dalam pertanyaan kedua, baris yang b.IsApproved adalah palsu atau yang melibatkan gabungan yang gagal masih akan dikembalikan, tetapi b.IsApproved akan ditetapkan kepada NULL.

Oleh itu, apabila menggunakan cantuman luar, adalah penting untuk mempertimbangkan dengan teliti penempatan penapis. Keadaan ON menapis baris sebelum sambung, manakala klausa WHERE menapis hasil selepas sambung.

Untuk melengkapkan perbincangan, jika anda inginkan penapis PILIHAN dalam sambung luar kiri, pertanyaan berikut menunjukkan peletakan yang betul :

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

Pertanyaan ini mengembalikan baris di mana gabungan berjaya dan b.IsApproved memenuhi kriteria, sebagai serta baris di mana gabungan gagal (mengakibatkan nilai NULL untuk b.IsApproved).

Atas ialah kandungan terperinci WHERE vs. ON dalam SQL JOINs: Bilakah Saya Perlu Menggunakan Setiap Klausa?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan