SQL'de EXISTS ve IN arasındaki farklar

EXISTS veya IN seçerken SQL hedeflerinizi düşünün.

Operatör IN

IN operatörü, bir tablo değeri bir satır döndürür. WHERE koşullu alan, IN değerlerinin bir listesiyle eşleşir. IN normal olarak bir ana sorgunun bir parçası olarak veya bir alt sorguyla birlikte kullanılır. Örnek 1: NEREDE Table.Field in ('a', 'b', 'c') Örnek 2: NEREDE Table.Field in (alt sorgu tarafından döndürülen değer kümesi)

Operatör EXISTS

Alt sorgu herhangi bir satır içeriyorsa, EXISTS işleci tüm ana sorgu satırlarını döndürür. EXISTS sadece bir alt sorgu ile bağlantılı olarak kullanılır. İade edilen satırlar, ana sorgu seviyesinde filtrelenerek belirlenir. Örnek: WHERE EXISTS (alt sorgunun dönüş değerleri kümesi)

fark

IN, NULL'leri değerlendiremez, bu nedenle satırlar her zaman yanlıştır ve döndürülmez. EXISTS NULL değerini değerlendirebilir, bu yüzden satırlar iade edilebilir.

benzerlikler

EXISTS ve IN her ikisi de korelasyonlu ve ilişkisiz alt sorgular destekler ve her ikisi de benzer ana sonuçlar üretebilir. İlişkili olduğunda, EXISTS ve IN bir alt sorgu alanıyla bir ana sorgu alanıyla eşleşir (örn: main.id = subquery.id). Alt sorgu, bulunan her eşleşme için satır sırayla değerlendirilir. Bu durumda, IN ve EXISTS, aynı satırları benzer tanımlara dayalı olarak döndürür. İlişkili olmadıklarında, EXISTS ve IN alt sorgularını önce işlemden geçirir ve daha sonra sonuçları ana sorgu ile eşleştirir.

EXISTS ve IN Performansı

Performans, veritabanı iyileştiricisi ve yürütülen kod için kullandığı yürütme planı tarafından belirlenir. EXISTS ve IN için, optimize edici farklı yollar seçebilir. Oracle'da NO EXISTS bir anti-birleştirmeyi önler ve genellikle NO IN'den daha hızlı olduğunu kanıtlar. Kısacası, veritabanına ve kullanımdaki sürümüne bağlı olarak en hızlı yolu belirlemek için biraz deneme ve hata gerektirir. Doğru sonuçları garanti eden operatörü kullandığınızdan emin olun, eğer aynı ise, hangisinin daha hızlı olduğunu görmek için EXISTS ve IN ile değiştirmeyi deneyin.