I SQL, NOT operatorn negerar en boolesk indata (den vänder värdet på valfritt booleskt uttryck). Därför returnerar den TRUE när uttrycket är FALSE .
Källtabell
Följande tabell används för exemplen på den här sidan.
SELECT * FROM Pets; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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)
Exempel 1
Här är ett enkelt exempel för att demonstrera NOT operatör.
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
I det här fallet använde vi NOT operatorn för att förneka resultatet av LIKE operatör. Vår fråga returnerar alla husdjur som inte börjar med bokstaven F.
Exempel 2 – Användning av INTE med jämförelseoperatörer
Om du använder NOT för att förneka en jämförelseoperator, måste du ändra din syntax något från den som användes i föregående exempel.
Till exempel, om du vill använda den för att negera lika-operatorn (= ), använd följande syntax:
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Detta returnerar alla husdjur vars namn inte är Fluffy.
I det här exemplet sätter vi NOT operatorn framför kolumnnamnet. Om vi inte hade gjort det skulle vi ha fått ett felmeddelande som är ungefär så här:
SELECT * FROM Pets
WHERE PetName NOT = 'Fluffy'; Resultat:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='.
Vi kunde också ha uppnått samma resultat genom att använda operatorn inte lika med (antingen <> eller != beroende på ditt DBMS).
Till exempel detta:
SELECT * FROM Pets
WHERE PetName <> 'Fluffy'; Eller det här:
SELECT * FROM Pets
WHERE PetName != 'Fluffy'; Exempel 3 – Samma syntax med logiska operatorer
Som det visar sig kan vi också använda den syntaxen när vi använder logiska operatorer, såsom LIKE operatorn som vi använde i det första exemplet.
Därför skulle vi kunna skriva om det första exemplet till detta:
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Om du inte är säker på vad skillnaden är flyttade vi NOT operatör från efter PetName kolumn, till före den.
Här är de två påståendena tillsammans:
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Exempel 4 – Negera flera villkor
NOT operatören förnekar bara ett enda villkor. Om du har flera villkor som du behöver förneka, använd en separat NOT operatör för varje villkor,
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Exempel 5 – Företräde
När du använder sammansatta villkor, där du har flera operatorer, är NOT operatorn utvärderas före eventuella logiska operatorer, men efter någon. jämförelseoperatorer,
När två operatorer i ett uttryck har samma prioritetsnivå, utvärderas de från vänster till höger baserat på deras position i uttrycket. Du kan dock använda parenteser för att ange i vilken ordning du vill att varje villkor ska utvärderas.
Här är ett exempel.
SELECT * FROM Pets
WHERE
NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag'
AND NOT DOB > '2020-01-01'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi använde inga parenteser här, och alla villkor upphävdes med NOT operatorn och så AND operatorn hade företräde framför OR operatör.
Vi kan dock använda parenteser för att specificera att OR villkoret bör utvärderas före AND skick.
SELECT * FROM Pets
WHERE
(NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag')
AND NOT DOB > '2020-01-01'; Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +---------+-------------+-----------+-----------+------------+
I det här fallet får vi ett annat resultat.
Exempel 6 – Negera MELLAN operatören
Här är ett annat exempel, den här gången med NOT operatorn för att negera resultatet av BETWEEN operatör.
SELECT * FROM Pets
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17'; Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
I det här exemplet returnerade vi alla rader där DOB kolumnen är inte mellan 2018-10-01 och 2020-09-17 .
I det här fallet matchade två rader det kriteriet, och därför returnerades två rader.
Detta är det motsatta resultatet av följande fråga:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17'; Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
I det här exemplet returnerade vi alla rader där DOB kolumn är mellan 2018-10-01 och 2020-09-17 .
I det här fallet matchade fyra rader det kriteriet, och därför returnerades fyra rader.