Database
 sql >> Base de données >  >> RDS >> Database

Opérateur SQL NOT pour les débutants

En SQL, le NOT annule une entrée booléenne (il inverse la valeur de toute expression booléenne). Par conséquent, il renvoie TRUE lorsque l'expression est FALSE .

Tableau des sources

Le tableau suivant est utilisé pour les exemples sur cette page.

SELECT * FROM Pets;

Résultat :

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

Exemple 1

Voici un exemple simple pour démontrer le NOT opérateur.

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

Résultat :

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

Dans ce cas, nous avons utilisé le NOT opérateur pour annuler le résultat de LIKE opérateur. Notre requête renvoie tous les animaux qui ne commencent pas par la lettre F.

Exemple 2 - Utilisation de NOT avec des opérateurs de comparaison

Si vous utilisez le NOT pour annuler un opérateur de comparaison, vous devrez modifier légèrement votre syntaxe par rapport à celle utilisée dans l'exemple précédent.

Par exemple, si vous voulez l'utiliser pour inverser l'opérateur égal (= ), utilisez la syntaxe suivante :

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

Résultat :

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

Cela renvoie tous les animaux dont le nom n'est pas Fluffy.

Dans cet exemple, nous mettons le NOT opérateur devant le nom de la colonne. Si nous n'avions pas fait cela, nous aurions reçu une erreur qui ressemblerait à ceci :

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

Résultat :

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

Nous aurions également pu obtenir le même résultat en utilisant l'opérateur différent de (soit <> ou != selon votre SGBD).

Par exemple, ceci :

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

Ou ceci :

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

Exemple 3 - Même syntaxe avec des opérateurs logiques

Il s'avère que nous pouvons également utiliser cette syntaxe lors de l'utilisation d'opérateurs logiques, tels que LIKE opérateur que nous avons utilisé dans le premier exemple.

Par conséquent, nous pourrions réécrire le premier exemple comme suit :

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

Résultat :

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

Au cas où vous ne seriez pas sûr de la différence, nous avons déplacé le NOT opérateur après le PetName colonne, à avant.

Voici les deux déclarations ensemble :

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

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

Exemple 4 – Négation de plusieurs conditions

Le NOT l'opérateur n'annule qu'une seule condition. Si vous avez plusieurs conditions que vous devez annuler, utilisez un NOT séparé opérateur pour chaque condition,

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

Résultat :

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

Exemple 5 - Priorité

Lorsque vous utilisez des conditions composées, où vous avez plusieurs opérateurs, le NOT L'opérateur est évalué avant tout opérateur logique, mais après tout. opérateurs de comparaison,

Lorsque deux opérateurs dans une expression ont le même niveau de priorité, ils sont évalués de gauche à droite en fonction de leur position dans l'expression. Cependant, vous pouvez utiliser des parenthèses pour spécifier l'ordre dans lequel vous souhaitez que chaque condition soit évaluée.

Voici un exemple.

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

Résultat :

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

Nous n'avons pas utilisé de parenthèses ici, et toutes les conditions ont été annulées avec le NOT opérateur, et donc le AND l'opérateur a préséance sur le OR opérateur.

Cependant, nous pouvons utiliser des parenthèses pour spécifier que le OR la condition doit être évaluée avant le AND état.

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

Résultat :

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

Dans ce cas, nous obtenons un résultat différent.

Exemple 6 – Inverser l'opérateur BETWEEN

Voici un autre exemple, cette fois en utilisant le NOT opérateur pour inverser le résultat de BETWEEN opérateur.

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

Résultat :

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

Dans cet exemple, nous avons renvoyé toutes les lignes où le DOB la colonne n'est pas entre 2018-10-01 et 2020-09-17 .

Dans ce cas, deux lignes correspondaient à ce critère et, par conséquent, deux lignes ont été renvoyées.

C'est le résultat inverse de la requête suivante :

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

Résultat :

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

Dans cet exemple, nous avons renvoyé toutes les lignes où le DOB la colonne est entre 2018-10-01 et 2020-09-17 .

Dans ce cas, quatre lignes correspondaient à ce critère et, par conséquent, quatre lignes ont été renvoyées.