Zawartość
Stałym wyzwaniem w korzystaniu z SQL jest określenie właściwego użycia operatorów EXISTS i IN. Obaj operatorzy mogą uzyskać takie same wyniki, ale nie zawsze. Ponadto toczy się poważna debata na temat optymalizacji prędkości każdego operatora. Użytkownicy powinni rozumieć różne atrybuty każdego operatora i eksperymentować z dwoma, aby określić odpowiednie użycie.
Rozważ swoje cele SQL, wybierając EXISTS lub IN (Jupiterimages / Photos.com / Getty Images)
Operator IN
Operator IN zwraca wiersz, jeśli wartość pola tabeli spełnia warunek WHERE na liście wartości IN. Zazwyczaj jest używany jako część głównego zapytania lub w połączeniu z podzapytaniem.
Przykład 1: WHERE table.field IN ('a', 'b', 'c') Przykład 2: WHERE table.field IN (Podzapytanie, które zwraca zestaw)
Operator EXISTS
Operator EXISTS zwraca wszystkie główne wiersze, jeśli podzapytanie zawiera jakiekolwiek wiersze. Jest używany tylko w połączeniu z podzapytaniem. Zwrócone wiersze są określane przez filtr w głównym zapytaniu.
Przykład: WHERE EXISTS (podzapytanie, które zwraca zestaw)
Różnica
Operator IN nie może oceniać wartości NULL, więc takie linie zawsze będą fałszywe i nie będą zwracane, w przeciwieństwie do operatora EXISTS, który ocenia i zwraca linie z wartościami NULL.
Podobieństwa
Zarówno EXISTS, jak i IN obsługują skorelowane i nieskorelowane podzapytania i oba mogą dawać podobne wyniki. Gdy są skorelowane, spełniają główne pole zapytania dla pola podzapytania (np .: principal.id = subquery.id). Podzapytanie ocenia wiersz po wierszu dla każdego znalezionego zdarzenia. W tym przypadku IN i EXISTS zwrócą te same linie na podstawie podobnych warunków „id”. Gdy nie są skorelowane, dwa operatory przetwarzają podzapytania, a następnie łączą wyniki dla głównego zapytania.
Wydajność
Wydajność jest określana przez optymalizator bazy danych i plan wykonania używany dla wykonanego kodu. Dla EXISTS i IN optymalizator może wybierać różne ścieżki. W Oracle NOT EXISTS jest zazwyczaj szybszy niż NOT IN. W końcu niektóre próby i błędy są wymagane do sortowania najkrótszej ścieżki, w zależności od używanej bazy danych i wersji. Upewnij się, że używasz operatora, który najpierw gwarantuje poprawne wyniki, a następnie spróbuj zastąpić operatorów, aby zobaczyć, który jest najszybszy.