В SQL, NOT Операторът отрича булев вход (той обръща стойността на всеки булев израз). Следователно връща TRUE когато изразът е FALSE .
Изходна таблица
Следната таблица се използва за примерите на тази страница.
SELECT * FROM Pets; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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)
Пример 1
Ето един прост пример за демонстрация на NOT оператор.
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
В този случай използвахме NOT оператор за отричане на резултата от LIKE оператор. Нашата заявка връща всички домашни любимци, които не започват с буквата F.
Пример 2 – Използване на NOT с оператори за сравнение
Ако използвате NOT оператор, за да отричате оператор за сравнение, ще трябва леко да промените синтаксиса си от този, използван в предишния пример.
Например, ако искате да го използвате, за да отричате оператора за равенство (= ), използвайте следния синтаксис:
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Това връща всички домашни любимци, чието име не е Fluffy.
В този пример поставяме NOT оператор пред името на колоната. Ако не го бяхме направили, щяхме да получим грешка, която е нещо подобно:
SELECT * FROM Pets
WHERE PetName NOT = 'Fluffy'; Резултат:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='.
Можехме също да постигнем същия резултат, като използваме оператора не е равно на (или <> или != в зависимост от вашата СУБД).
Например това:
SELECT * FROM Pets
WHERE PetName <> 'Fluffy'; Или това:
SELECT * FROM Pets
WHERE PetName != 'Fluffy'; Пример 3 – Същият синтаксис с логически оператори
Както се оказва, можем също да използваме този синтаксис, когато използваме логически оператори, като LIKE оператор, който използвахме в първия пример.
Следователно бихме могли да пренапишем първия пример на това:
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
В случай, че не сте сигурни каква е разликата, преместихме NOT оператор от след PetName колона до преди.
Ето двете твърдения заедно:
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%'; Пример 4 – Отричане на множество условия
NOT операторът отрича само едно условие. Ако имате няколко условия, които трябва да отхвърлите, използвайте отделен NOT оператор за всяко условие,
SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Пример 5 – Приоритет
Когато използвате съставни условия, когато имате няколко оператора, NOT операторът се оценява преди всички логически оператори, но след всеки. оператори за сравнение,
Когато два оператора в израза имат едно и също ниво на приоритет, те се оценяват отляво надясно въз основа на тяхната позиция в израза. Въпреки това, можете да използвате скоби, за да посочите реда, в който искате да бъде оценено всяко условие.
Ето един пример.
SELECT * FROM Pets
WHERE
NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag'
AND NOT DOB > '2020-01-01'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Тук не използвахме никакви скоби и всички условия бяха отхвърлени с NOT оператор и така AND операторът имаше предимство пред OR оператор.
Въпреки това можем да използваме скоби, за да посочим, че OR условието трябва да бъде оценено преди AND състояние.
SELECT * FROM Pets
WHERE
(NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag')
AND NOT DOB > '2020-01-01'; Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +---------+-------------+-----------+-----------+------------+
В този случай получаваме различен резултат.
Пример 6 – Отричайте оператора BETWEEN
Ето още един пример, този път с помощта на NOT оператор за отричане на резултата от BETWEEN оператор.
SELECT * FROM Pets
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17'; Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
В този пример върнахме всички редове, където DOB колоната е не между 2018-10-01 и 2020-09-17 .
В този случай два реда отговарят на този критерий и следователно бяха върнати два реда.
Това е обратният резултат от следната заявка:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17'; Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
В този пример върнахме всички редове, където DOB колона е между 2018-10-01 и 2020-09-17 .
В този случай четири реда отговарят на този критерий и следователно четири реда бяха върнати.