Разлики между EXISTS и IN в SQL

Помислете дали вашите SQL цели са избрани EXISTS или IN.

Оператор IN

Операторът IN връща ред, ако има таблична стойност. ВКЛЮЧЕНОто поле, при което съответства списък с IN стойности. IN обикновено се използва като част от основна заявка или заедно с подзаявка. Пример 1: WHERE Table.Field в ('a', 'b', 'c') Пример 2: WHERE Table.Field в (набор от стойности, върнати от подзаявката)

Оператор съществува

Операторът EXISTS връща всички основни линии на заявки, ако подзапитанието съдържа ред. EXISTS се използва само във връзка с подзаявка. Връщаните редове се определят чрез филтриране на основното ниво на заявката. Пример: WHERE EXISTS (набор от връщащи стойности на подзаявката)

разлика

IN не може да оцени NULL, така че редовете винаги са неверни и не се връщат. EXISTS може да оцени NULL, така че редове могат да бъдат върнати.

прилики

EXISTS и IN both поддържат корелативни и несвързани подчинености, и двете могат да доведат до подобни основни резултати. Когато корелира, EXISTS и IN съвпадат с основното поле на заявката с поле за подпрочивление (напр. Main.id = subquery.id). Подзапитването се оценява по ред, за всеки открит мач. В този случай IN и EXISTS ще върнат същите редове въз основа на подобни идентификации. Когато те не са корелирани, EXISTS и IN обработват първо подчинените си и след това сравняват резултатите с основната заявка.

Изпълнение на EXISTS и IN

Ефективността се определя от оптимизатора на базата данни и плана за изпълнение, който използва за изпълнения код. За EXISTS и IN, оптимизаторът може да избере различни пътища. В Oracle, NO EXISTS избягва анти-свързване и обикновено се оказва по-бързо от NO IN. Накратко, това изисква малко опити и грешки, за да се определи най-бързият път в зависимост от базата данни и нейната версия в употреба. Уверете се, че използвате оператора, който гарантира правилните резултати, ако все пак се опитате да замените EXISTS и IN, за да видите кой е по-бърз.