Database
 sql >> Base de Dados >  >> RDS >> Database

Operador SQL NOT para iniciantes


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.