W SQL NOT operator neguje dane wejściowe typu Boolean (odwraca wartość dowolnego wyrażenia Boolean). Dlatego zwraca TRUE gdy wyrażenie to FALSE .
Tabela źródłowa
Poniższa tabela jest używana jako przykłady na tej stronie.
SELECT * FROM Pets; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Przykład 1
Oto prosty przykład demonstrujący NOT operatora.
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
W tym przypadku użyliśmy NOT operator do zanegowania wyniku LIKE operator. Nasze zapytanie zwraca wszystkie zwierzęta, które nie zaczynają się na literę F.
Przykład 2 – Używanie NOT z operatorami porównania
Jeśli używasz NOT operatora, aby zanegować operator porównania, będziesz musiał nieznacznie zmodyfikować składnię w stosunku do tej użytej w poprzednim przykładzie.
Na przykład, jeśli chcesz go użyć do zanegowania operatora równości (= ), użyj następującej składni:
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Spowoduje to zwrócenie wszystkich zwierząt, których imię nie brzmi Fluffy.
W tym przykładzie wstawiamy NOT operator przed nazwą kolumny. Gdybyśmy tego nie zrobili, otrzymalibyśmy błąd, który wygląda mniej więcej tak:
SELECT * FROM Pets
WHERE PetName NOT = 'Fluffy'; Wynik:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='.
Mogliśmy również osiągnąć ten sam wynik, używając operatora nierównego (albo <> lub != w zależności od systemu DBMS).
Na przykład to:
SELECT * FROM Pets
WHERE PetName <> 'Fluffy'; Albo to:
SELECT * FROM Pets
WHERE PetName != 'Fluffy'; Przykład 3 – ta sama składnia z operatorami logicznymi
Jak się okazuje, możemy również użyć tej składni podczas korzystania z operatorów logicznych, takich jak LIKE operatora, którego użyliśmy w pierwszym przykładzie.
Dlatego możemy przepisać pierwszy przykład do tego:
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Jeśli nie jesteś pewien, jaka jest różnica, przenieśliśmy NOT operator po PetName kolumna, do przed nim.
Oto dwa stwierdzenia razem:
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Przykład 4 – Negowanie wielu warunków
NOT operator neguje tylko jeden warunek. Jeśli masz wiele warunków, które musisz zanegować, użyj oddzielnego NOT operator dla każdego warunku,
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Przykład 5 – Pierwszeństwo
Podczas korzystania z warunków złożonych, w których masz wiele operatorów, NOT operator jest oceniany przed dowolnymi operatorami logicznymi, ale po dowolnym. operatory porównania,
Gdy dwa operatory w wyrażeniu mają ten sam poziom pierwszeństwa, są oceniane od lewej do prawej na podstawie ich pozycji w wyrażeniu. Możesz jednak użyć nawiasów, aby określić kolejność, w jakiej chcesz oceniać każdy warunek.
Oto przykład.
SELECT * FROM Pets
WHERE
NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag'
AND NOT DOB > '2020-01-01'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Nie użyliśmy tutaj żadnych nawiasów, a wszystkie warunki zostały zanegowane za pomocą NOT operator, a więc AND operator miał pierwszeństwo przed OR operator.
Możemy jednak użyć nawiasów, aby określić, że OR warunek powinien być oceniany przed AND stan.
SELECT * FROM Pets
WHERE
(NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag')
AND NOT DOB > '2020-01-01'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +---------+-------------+-----------+-----------+------------+
W tym przypadku otrzymujemy inny wynik.
Przykład 6 – Zanegowanie operatora BETWEEN
Oto kolejny przykład, tym razem z użyciem NOT operator do zanegowania wyniku BETWEEN operatora.
SELECT * FROM Pets
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
W tym przykładzie zwróciliśmy wszystkie wiersze, w których DOB kolumna nie między 2018-10-01 i 2020-09-17 .
W tym przypadku dwa wiersze spełniały to kryterium, a zatem zostały zwrócone dwa wiersze.
Jest to odwrotny wynik następującego zapytania:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17'; Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
W tym przykładzie zwróciliśmy wszystkie wiersze, w których DOB kolumna jest między 2018-10-01 i 2020-09-17 .
W tym przypadku cztery wiersze spełniały te kryteria, a zatem zostały zwrócone cztery wiersze.