Em SQL, o
NOT
O operador nega uma entrada booleana (inverte o valor de qualquer expressão booleana). Portanto, ele retorna TRUE
quando a expressão é FALSE
. Tabela de origem
A tabela a seguir é usada para os exemplos nesta página.
SELECT * FROM Pets;
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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)
Exemplo 1
Aqui está um exemplo simples para demonstrar o
NOT
operador. SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Neste caso, usamos o
NOT
operador para negar o resultado do LIKE
operador. Nossa consulta retorna todos os animais de estimação que não começam com a letra F. Exemplo 2 – Usando NOT com operadores de comparação
Se você estiver usando o
NOT
para negar um operador de comparação, você precisará modificar sua sintaxe ligeiramente daquela usada no exemplo anterior. Por exemplo, se você quiser usá-lo para negar o operador igual (
=
), use a seguinte sintaxe:SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Isso retorna todos os animais de estimação cujo nome não é Fluffy.
Neste exemplo, colocamos o
NOT
operador na frente do nome da coluna. Se não tivéssemos feito isso, teríamos recebido um erro mais ou menos assim:SELECT * FROM Pets
WHERE PetName NOT = 'Fluffy';
Resultado:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '='.
Também poderíamos ter alcançado o mesmo resultado usando o operador diferente de (ou
<>
ou !=
dependendo do seu SGBD). Por exemplo, isso:
SELECT * FROM Pets
WHERE PetName <> 'Fluffy';
Ou isto:
SELECT * FROM Pets
WHERE PetName != 'Fluffy';
Exemplo 3 – Mesma Sintaxe com Operadores Lógicos
Como se vê, também podemos usar essa sintaxe ao usar operadores lógicos, como o
LIKE
operador que usamos no primeiro exemplo. Portanto, poderíamos reescrever o primeiro exemplo para isso:
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Caso você não tenha certeza de qual é a diferença, movemos o
NOT
operador após o PetName
coluna, para antes dela. Aqui estão as duas declarações juntas:
SELECT * FROM Pets
WHERE PetName NOT LIKE 'F%';
SELECT * FROM Pets
WHERE NOT PetName LIKE 'F%';
Exemplo 4 – Negar várias condições
O
NOT
operador apenas nega uma única condição. Se você tiver várias condições que precisa negar, use um NOT
separado operador para cada condição, SELECT * FROM Pets
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Exemplo 5 – Precedência
Ao usar condições compostas, onde você tem vários operadores, o
NOT
operador é avaliado antes de qualquer operador lógico, mas depois de qualquer. operadores de comparação, Quando dois operadores em uma expressão têm o mesmo nível de precedência, eles são avaliados da esquerda para a direita com base em sua posição na expressão. No entanto, você pode usar parênteses para especificar a ordem na qual deseja que cada condição seja avaliada.
Aqui está um exemplo.
SELECT * FROM Pets
WHERE
NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag'
AND NOT DOB > '2020-01-01';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Não usamos parênteses aqui e todas as condições foram negadas com o
NOT
operador, e assim o AND
operador teve precedência sobre o OR
operador. No entanto, podemos usar parênteses para especificar que o
OR
condição deve ser avaliada antes do AND
doença. SELECT * FROM Pets
WHERE
(NOT PetName = 'Fluffy'
OR NOT PetName = 'Wag')
AND NOT DOB > '2020-01-01';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | +---------+-------------+-----------+-----------+------------+
Neste caso obtemos um resultado diferente.
Exemplo 6 – Negar o operador BETWEEN
Aqui está outro exemplo, desta vez usando o
NOT
operador para negar o resultado do BETWEEN
operador. SELECT * FROM Pets
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17';
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Neste exemplo, retornamos todas as linhas em que o
DOB
coluna é não entre 2018-10-01
e 2020-09-17
. Nesse caso, duas linhas corresponderam a esse critério e, portanto, duas linhas foram retornadas.
Este é o resultado oposto da seguinte consulta:
SELECT * FROM Pets
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';
Resultado:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Neste exemplo, retornamos todas as linhas em que o
DOB
coluna é entre 2018-10-01
e 2020-09-17
. Nesse caso, quatro linhas corresponderam a esse critério e, portanto, quatro linhas foram retornadas.