Rozdíly mezi EXISTS a IN v SQL
Operátor IN
Operátor IN vrací řádek, pokud je hodnota tabulky. Pokud se kondiciované pole shoduje se seznamem hodnot IN. IN se obvykle používá jako součást hlavního dotazu nebo společně s poddotazem. Příklad 1: WHERE Table.Field v ('a', 'b', 'c') Příklad 2: WHERE Table.Field in (sada hodnot vrácených poddotazem)
Operátor existuje
Operátor EXISTS vrátí všechny hlavní řádky dotazu, pokud poddotaz obsahuje libovolné řádky. EXISTS se používá pouze ve spojení s poddotazem. Vrácené řádky jsou určeny filtrováním na hlavní úrovni dotazu. Příklad: WHERE EXISTS (sada návratových hodnot poddotazů)
Rozdíl
IN nemůže vyhodnotit NULL, takže řádky jsou vždy nepravdivé a nejsou vráceny. EXISTS může vyhodnotit NULL, takže řádky mohou být vráceny.
Podobnosti
EXISTS a IN podporují korelované a nekorelované poddotazy a oba mohou produkovat podobné hlavní výsledky. Při korelování, EXISTS a IN odpovídají hlavní pole dotazu s polem poddotaz (např. Main.id = subquery.id). Poddotaz je vyhodnocen po řádku za každou nalezenou shodu. V tomto případě vrátí IN a EXISTS stejné řádky založené na podobných identifikacích. Pokud nejsou korelovány, EXISTS a IN zpracovávají nejprve své poddotazy a poté se shodují s výsledky hlavního dotazu.
Výkonnost EXISTS a IN
Výkon je určen databázovým optimizátorem a plánem spouštění, který používá pro kód, který je spuštěn. Pro EXISTS a IN může optimalizátor vybrat různé cesty. Ve službě Oracle neexistuje možnost NOT-EXISTS a neprospívá se, a obvykle se ukáže být rychlejší než NO IN. Stručně řečeno, je zapotřebí trochu pokusů a omylů zjistit nejrychlejší cestu v závislosti na databázi a její verzi. Ujistěte se, že používáte operátora, který zaručuje správné výsledky, pokud se všechny pokusy nahradit EXISTS a IN, abyste skutečně viděli, který z nich je rychlejší.