В 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
.
В този случай четири реда отговарят на този критерий и следователно четири реда бяха върнати.