SQL'de EXISTS ve IN arasındaki farklar
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.