Różnice między EXISTS i IN w SQL

Rozważ swoje cele SQL przy wyborze EXISTS lub IN.

Operator IN

Operator IN zwraca wiersz, jeśli wartość w tabeli WHERE pole warunkowe pasuje do listy wartości IN. IN jest zwykle używane jako część głównej kwerendy lub razem z podzapytaniem. Przykład 1: WHERE Table.Field in ('a', 'b', 'c') Przykład 2: WHERE Table.Field in (zestaw wartości zwracanych przez podzapytanie)

Operator EXISTS

Operator EXISTS zwraca wszystkie główne wiersze zapytania, jeśli podzapytanie zawiera dowolne wiersze. EXISTS jest używany tylko w połączeniu z podzapytaniem. Zwracane wiersze są określane przez filtrowanie na głównym poziomie zapytania. Przykład: WHERE EXISTS (zestaw zwracanych wartości podzapytania)

Różnica

IN nie może oszacować wartości NULL, więc wiersze są zawsze fałszywe i nie są zwracane. EXISTS może ocenić NULL, więc wiersze mogą zostać zwrócone.

Podobieństwa

EXISTS i IN obsługują podkwerendy skorelowane i nieskorelowane, a oba mogą generować podobne główne wyniki. Po skorelowaniu EXISTS i IN sąsiadują z głównym polem zapytania z polem podkwerendy (ex: main.id = subquery.id). Podzapyt jest oceniany wiersz po wierszu dla każdego znalezionego dopasowania. W takim przypadku IN i EXISTS zwrócą te same wiersze w oparciu o podobne identyfikatory. Gdy nie są skorelowane, EXISTS i IN najpierw przetwarzają swoje podzapytania, a następnie dopasowują wyniki do głównego zapytania.

Wykonanie EXISTS i IN

Wydajność jest określana przez optymalizator bazy danych i plan wykonania, który jest używany dla kodu, który jest wykonywany. W przypadku EXISTS i IN optymalizator może wybrać różne ścieżki. W Oracle NO EXISTS unika anti-join i zwykle okazuje się szybszy niż NO IN. W skrócie, wymaga to odrobiny prób i błędów, aby określić najszybszą ścieżkę w zależności od bazy danych i używanej wersji. Upewnij się, że korzystasz z operatora, który gwarantuje poprawne wyniki, jeśli mimo wszystko, spróbuj wymienić EXISTS i IN, aby zobaczyć, który z nich jest szybszy.