Rozdíly mezi EXISTS a IN v SQL

Zvažte své cíle SQL při výběru EXISTS nebo IN.

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ší.