SQL IN vs SQL EXISTS
W tym artykule szczegółowo omówiono operatory IN i EXISTS w SQL . Częstym pytaniem deweloperów jest to, jaka jest różnica między tymi dwoma operatorami. Aby poznać różnicę, najpierw omówmy szczegółowo każdy z tych operatorów.
Operator IN
Operator IN jest używany do uzyskania wyników, gdy określona wartość pasuje do wartości w zestawie wartości lub jest zwracana przez zapytanie wewnętrzne. Ten operator może być również używany z WHERE klauzula, aby określić więcej niż jedną wartość. Operator IN jest często określany jako akronim operatora OR, ponieważ ogranicza użycie wielu warunków OR w zapytaniach SELECT, INSERT, UPDATE lub DELETE .
W tym operatorze podzapytanie jest rozwiązywane jako pierwsze, a wynik jest następnie używany do rozwiązania zapytania zewnętrznego.
Poniżej znajduje się ogólna składnia operatora IN:
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Przykład:
Rozważmy poniższą tabelę klientów.
Cust_id | Cust_name | Miasto | Zawód |
1 | Harry | Kalkuta | Biznes |
2 | Ron | Bombaj | Lekarz |
3 | Albus | Delhi | Inżynier |
4 | Zgredek | Pune | Naukowiec |
5 | Snap | Bangalur | Student |
Zapytanie:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
Powyższe zapytanie zwróci wszystkich klientów, którzy są lekarzem, naukowcem lub inżynierem.
Wyjście:
Cust_id | Cust_name | Miasto | Zawód |
2 | Ron | Bombaj | Lekarz |
3 | Albus | Delhi | Inżynier |
4 | Zgredek | Pune | Naukowiec |
EXISTS Operator
Operator EXISTS, w przeciwieństwie do operatora IN, zwraca wartość logiczną. Ten operator sprawdza wynik wewnętrznego zapytania i zwraca wartość logiczną, tj. Prawdę lub fałsz. Jeśli wewnętrzne zapytanie zwraca jeden lub wiele rekordów, operator zwraca prawdę, w przeciwnym razie zwraca fałsz, gdy nie znaleziono żadnych rekordów.
Ten operator jest również skuteczny, ponieważ zatrzymuje dalsze przetwarzanie zaraz po wykryciu pierwszego prawdziwego zdarzenia.
Poniżej znajduje się składnia operatora EXISTS:
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Przykład:
Rozważmy poniższą tabelę klientów.
Cust_id | Nazwa | Zawód | Wiek |
101 | Harry | Inżynier | 32 |
102 | Ron | Programista | 30 |
103 | Zgredek | Lider | 28 |
104 | Albus | Naukowiec | 45 |
105 | Snap | Cieśla | 26 |
106 | Imbir | Aktor | 25 |
107 | NULL | NULL | NULL |
Rozważmy inny stół Zamówienia.
Identyfikator zamówienia | Cust_id | Nazwa_produktu | Data_zamówienia |
1 | 101 | Laptop | 2021-01-10 |
2 | 103 | Pulpit | 12.02.20 |
3 | 106 | IPhone | 2021-02-15 |
4 | 104 | Komórka | 2021-03-05 |
5 | 102 | telewizor | 2021-03-20 |
Zapytanie:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
Powyższe zapytanie zwróci nazwę i zawód wszystkich klientów, którzy złożyli co najmniej jedno zamówienie.
Wyjście:
Nazwa | Zawód |
Harry | Inżynier |
Ron | Programista |
Zgredek | Lider |
Albus | Naukowiec |
Imbir | Aktor |
Tabela różnic między operatorem IN i EXISTS
Kluczowe różnice między operatorem IN a operatorem EXISTS są wymienione poniżej w formie tabelarycznej:
Operator IN | Operator ISTNIEJE |
Minimalizuje użycie warunków OR. | Sprawdza istnienie rekordu w wewnętrznym zapytaniu. |
Porównuje wartości wewnętrznego zapytania z wartością zewnętrznego zapytania. | Nie porównuje wartości między zapytaniem wewnętrznym a zapytaniem podrzędnym. |
Sprawdza wszystkie wartości wewnątrz bloku klauzuli IN. | Zatrzymuje dalsze wykonywanie, gdy tylko spełniony zostanie pierwszy prawdziwy warunek. |
Może zwrócić PRAWDA, FAŁSZ lub NULL. | Zwraca wartość PRAWDA lub FAŁSZ. |
Może być używany do sprawdzania wartości NULL. | Nie można go używać do sprawdzania wartości NULL. |
Jest używany zarówno z podzapytaniami, jak i wartościami. | Jest używany tylko z podzapytaniami. |
Wykonanie jest szybsze, gdy wynik wewnętrznego zapytania jest mniejszy. | Wykonywanie jest szybsze, nawet gdy wynik wewnętrznego zapytania jest duży. Jest bardziej wydajny niż operator IN. |
Składnia :SELECT nazwy_kolumn FROM nazwa_tabeli WHERE nazwa_kolumny IN (podzapytanie); | Składnia :SELECT nazwy_kolumnFROM nazwa_tabeliWHERE [NOT] EXISTS (podzapytanie); |
Wniosek:
W tym temacie dokonano porównania między operatorem IN i operatorami EXISTS języka SQL. Obaj operatorzy wykonują tę samą operację, ale ich wewnętrzna praca jest inna. Mają inną logikę działania. Każdy z nich można wybrać zgodnie z wymaganiami. Ale jeśli zestaw danych jest duży, zawsze zaleca się skorzystanie z operatora EXISTS.