Database
 sql >> Database >  >> RDS >> Database

Operatore SQL NOT per principianti

In SQL, il NOT nega un input booleano (inverte il valore di qualsiasi espressione booleana). Pertanto restituisce TRUE quando l'espressione è FALSE .

Tabella delle sorgenti

La tabella seguente viene utilizzata per gli esempi in questa pagina.

SELECT * FROM Pets;

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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)

Esempio 1

Ecco un semplice esempio per dimostrare il NOT operatore.

SELECT * FROM Pets 
WHERE PetName NOT LIKE 'F%';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

In questo caso, abbiamo usato NOT operatore per negare il risultato del LIKE operatore. La nostra query restituisce tutti gli animali domestici che non iniziano con la lettera F.

Esempio 2 – Utilizzo di NOT con operatori di confronto

Se stai usando il NOT per negare un operatore di confronto, dovrai modificare leggermente la tua sintassi rispetto a quella utilizzata nell'esempio precedente.

Ad esempio, se vuoi usarlo per negare l'operatore uguale (= ), utilizza la seguente sintassi:

SELECT * FROM Pets 
WHERE NOT PetName = 'Fluffy';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Questo restituisce tutti gli animali il cui nome non è Fluffy.

In questo esempio, mettiamo NOT operatore davanti al nome della colonna. Se non lo avessimo fatto, avremmo ricevuto un errore simile a questo:

SELECT * FROM Pets 
WHERE PetName NOT = 'Fluffy';

Risultato:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '='.

Avremmo potuto ottenere lo stesso risultato anche utilizzando l'operatore diverso da (o <> o != a seconda del tuo DBMS).

Ad esempio, questo:

SELECT * FROM Pets 
WHERE PetName <> 'Fluffy';

O questo:

SELECT * FROM Pets 
WHERE PetName != 'Fluffy';

Esempio 3 – Stessa sintassi con operatori logici

A quanto pare, possiamo anche usare quella sintassi quando utilizziamo operatori logici, come LIKE operatore che abbiamo usato nel primo esempio.

Pertanto, potremmo riscrivere il primo esempio in questo:

SELECT * FROM Pets 
WHERE NOT PetName LIKE 'F%';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Nel caso in cui non sei sicuro di quale sia la differenza, abbiamo spostato NOT operatore dopo il PetName colonna, prima di essa.

Ecco le due affermazioni insieme:

SELECT * FROM Pets 
WHERE PetName NOT LIKE 'F%';

SELECT * FROM Pets 
WHERE NOT PetName LIKE 'F%';

Esempio 4:negazione di più condizioni

Il NOT operatore nega solo una singola condizione. Se hai più condizioni che devi negare, usa un NOT separato operatore per ogni condizione,

SELECT * FROM Pets 
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Esempio 5 – Precedenza

Quando si utilizzano condizioni composte, in cui sono presenti più operatori, NOT viene valutato prima di qualsiasi operatore logico, ma dopo qualsiasi operatore. operatori di confronto,

Quando due operatori in un'espressione hanno lo stesso livello di precedenza, vengono valutati da sinistra a destra in base alla loro posizione nell'espressione. Tuttavia, puoi utilizzare le parentesi per specificare l'ordine in cui desideri che ogni condizione venga valutata.

Ecco un esempio.

SELECT * FROM Pets 
WHERE 
    NOT PetName = 'Fluffy'
    OR NOT PetName = 'Wag'
    AND NOT DOB > '2020-01-01';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Non abbiamo usato parentesi qui e tutte le condizioni sono state negate con NOT operatore, e quindi il AND l'operatore ha la precedenza su OR operatore.

Tuttavia, possiamo usare le parentesi per specificare che OR la condizione dovrebbe essere valutata prima di AND condizione.

SELECT * FROM Pets 
WHERE 
    (NOT PetName = 'Fluffy'
    OR NOT PetName = 'Wag')
    AND NOT DOB > '2020-01-01';

Risultato:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
+---------+-------------+-----------+-----------+------------+

In questo caso otteniamo un risultato diverso.

Esempio 6 – Annulla l'operatore BETWEEN

Ecco un altro esempio, questa volta usando il NOT operatore per negare il risultato di BETWEEN operatore.

SELECT * FROM Pets 
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17';

Risultato:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

In questo esempio, abbiamo restituito tutte le righe in cui DOB la colonna non tra il 2018-10-01 e 2020-09-17 .

In questo caso, due righe corrispondevano a quel criterio e, pertanto, sono state restituite due righe.

Questo è il risultato opposto della seguente query:

SELECT * FROM Pets 
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';

Risultato:

+---------+-------------+-----------+-----------+------------+
| 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 |
+---------+-------------+-----------+-----------+------------+

In questo esempio, abbiamo restituito tutte le righe in cui DOB la colonna è tra il 2018-10-01 e 2020-09-17 .

In questo caso, quattro righe corrispondevano a quel criterio e, pertanto, sono state restituite quattro righe.