Operatory EXCEPT i NOT IN służą do filtrowania rekordów z tabeli na podstawie określonego kryterium. W tym artykule przyjrzymy się szczegółowo tym operatorom i zbadamy różnice między nimi.
Zanim przejdziemy dalej, stwórzmy kilka fikcyjnych danych, których użyjemy w tym przykładzie:
Przygotowywanie fikcyjnych danych
Wykonaj następujący skrypt, aby utworzyć fikcyjną bazę danych i tabele, których będziemy używać w tym artykule.
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) CREATE TABLE Cars2 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
W powyższym skrypcie tworzymy bazę danych ShowRoom z dwiema tabelami, Samochody1 i Samochody2.
Dodajmy kilka fikcyjnych rekordów do tabel Auta1 i Auta2.
Wykonaj następujący skrypt:
USE ShowRoom INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) INSERT INTO Cars2 VALUES (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2800)
Mamy teraz przydatny zestaw danych.
Przyjrzyjmy się, jak operatory EXCEPT i NOT IN różnią się od siebie na podstawie tych danych.
OPRÓCZ operatora
Operator EXCEPT filtruje wszystkie rekordy z lewego wyniku zapytania, które są również obecne w wyniku prawego zapytania i zwraca pozostałe wyniki z lewego zapytania.
Składnia operatora EXCEPT jest następująca:
Right_Query EXCEPT Left_Query
Istnieją dwa warunki, które muszą być spełnione przed wykonaniem operatora EXCEPT. Są to:
- Kolejność i liczba kolumn zwracanych przez oba zapytania muszą być takie same.
- Typy danych w kolumnach muszą być zgodne lub zgodne.
To może wydawać się trudne. Jednak poniższy przykład wyjaśni to.
W tabelach Samochody1 i Samochody2 rekordy o identyfikatorach od 6 do 10 są wspólne. Jeśli użyjemy operatora EXCEPT z rekordami z tabeli Samochody1 po lewej stronie i tabeli Samochody2 po prawej, zwrócone zostaną te rekordy z tabeli Samochody1, których nie ma w tabeli Samochody2.
Zobaczmy, jak działa operator EXCEPT.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Wynik powyższego zapytania będzie wyglądał tak:
Zapytanie po lewej stronie pobiera wszystkie rekordy z tabeli Samochody1, podczas gdy zapytanie po prawej stronie pobiera wszystkie rekordy z tabeli Samochody2. W tabeli Samochody1 rekordy o identyfikatorach od 6 do 10 są również obecne w tabeli Samochody2, dlatego operator EXCEPT zwrócił tylko pierwsze pięć wierszy z tabeli Samochody1.
Podobnie, jeśli chcesz zwrócić wszystkie rekordy z tabeli Samochody2, których nie ma w tabeli Samochody1, możesz po prostu przenieść tabelę Samochody2 na lewo od operatora EXCEPT, jak pokazano w następującym zapytaniu:
USE ShowRoom SELECT id, name, company, power FROM Cars2 Except SELECT id, name, company, power FROM Cars1
Używanie OPRÓCZ operatora na jednej tabeli
W poprzednich przykładach zastosowaliśmy operator EXCEPT na dwóch tabelach. Jednak operatora EXCEPT można użyć również do filtrowania rekordów z pojedynczej tabeli. Na przykład, jeśli chcesz odfiltrować wszystkie rekordy z tabeli Samochody1, gdzie wartość mocy jest większa niż 3000, możesz użyć operatora EXCEPT w następujący sposób:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power from Cars1 WHERE power < 3000
W powyższym skrypcie zapytanie po lewej stronie operatora EXCEPT pobiera wszystkie rekordy z tabeli Cars1. Zapytanie po prawej stronie operatora EXCEPT pobiera tylko te rekordy z tabeli Cars1, w których wartość mocy jest mniejsza niż 3000. Operator EXCEPT filtruje rekordy z zapytania po lewej stronie, które istnieją w wynikach zapytania po prawej stronie. Dlatego wszystkie rekordy w tabeli Samochody1, w których moc jest mniejsza niż 3000, zostaną odfiltrowane, a reszta rekordów zostanie zwrócona, jak pokazano na poniższym rysunku:
NIE W Operatorze
Operator NOT IN jest również używany do filtrowania wierszy. Znajdźmy wszystkie rekordy z tabeli Samochody1, które są również obecne w tabeli Samochody2, i zwróćmy resztę rekordów za pomocą operatora NOT IN.
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Wynik powyższego zapytania wygląda tak:
Jest to podobne do wyników uzyskanych przy użyciu operatora EXCEPT.
Różnica między operatorami EXCEPT i NOT IN
Widzimy, że wyniki uzyskane za pomocą operatora EXCEPT i NOT IN są podobne. Istnieją jednak dwie główne różnice między operatorami EXCEPT i NOT IN:
1- NOT IN zwraca zduplikowane rekordy, podczas gdy Z WYJĄTKIEM zwraca tylko odrębne rekordy
Operator EXCEPT usuwa zduplikowane wiersze z wyników i zwraca tylko rekordy DISTINCT. Z drugiej strony operator NOT IN zwróci zduplikowane rekordy.
Spójrzmy na to za pomocą przykładu. Wykonaj następujące zapytanie, aby wstawić zduplikowany rekord w tabeli Cars1.
INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800)
Teraz tabela Cars1 ma dwa zduplikowane rekordy. Możesz to sprawdzić, wykonując następujące zapytanie:
SELECT * FROM Cars1
Stół Cars1 będzie wyglądał tak:
Widać, że wiersze 1 i 11 są duplikatami siebie.
Najpierw użyjmy operatora EXCEPT, aby odfiltrować wszystkie rekordy z tabeli Samochody1, które są obecne w tabeli Samochody2.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Wynik wygląda tak:
Widać, że chociaż wiersze 1 i 11 były duplikatami w tabeli Samochody1 i nie było ich w tabeli Samochody2, operator EXCEPT nie zwrócił obu tych wierszy. Zwrócił tylko różne wiersze.
Teraz użyjmy operatora NOT IN do tego samego zadania:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Wynik powyższego zapytania wygląda tak:
Widać, że NOT IN zwraca zduplikowane wiersze, tj. wiersz 1 i wiersz 6.
2- OPRÓCZ porównuje kolumny, a NOT IN porównuje pojedynczą wartość
Operator EXCEPT porównuje wartości w jednej lub więcej niż jednej kolumnie. Oznacza to, że liczba kolumn musi być taka sama. Z drugiej strony operator NOT IN porównuje wartości w jednej kolumnie.
Na przykład nie możesz mieć nierównej liczby kolumn dla zapytań po lewej i prawej stronie operatora Z WYJĄTKIEM, jak pokazano w poniższym przykładzie:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name,power FROM Cars2
Powyższe zapytanie zwraca następujący błąd:
W przypadku operatora NOT IN nie można mieć więcej niż jednej kolumny w podzapytaniu. Oznacza to, że następujące zapytanie zwróci błąd:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id, name from Cars2)
W powyższym skrypcie podzapytanie ma dwie kolumny, tj. id i nazwa. Dlatego zostanie zgłoszony błąd:
Dalsze czytanie:
- Szkoły W3:Przykłady IN i NOT IN
- TechontheNet:Z WYJĄTKIEM operatora
- YouTube:Z WYJĄTKIEM operatora