logo oujood
🔍

Opérateurs logiques SQL : AND, OR et NOT

AND, OR et NOT permettent de combiner plusieurs conditions dans une clause WHERE. Ce tutoriel explique comment chacun fonctionne, comment les mélanger sans erreur, et quels pièges éviter.

OUJOOD.COM

Filtrer avec plusieurs conditions en SQL

Une clause WHERE avec une seule condition, ça suffit rarement. En pratique, on croise des critères : un pays, un statut, une plage de dates, un montant minimum. Pour ça, SQL propose trois opérateurs logiques — AND, OR et NOT — qui fonctionnent sur tous les moteurs relationnels courants : MySQL, PostgreSQL, MariaDB, SQL Server et Oracle.

Leurs logiques sont simples à comprendre séparément. Le problème vient quand on les mélange sans parenthèses — et dans ce cas, le moteur n'affiche aucune erreur. Il exécute autre chose que ce qu'on voulait, en silence. Ce tutoriel couvre les trois opérateurs avec des exemples commentés et les pièges concrets à éviter.

L'opérateur AND : toutes les conditions doivent être vraies

AND est strict. Une ligne n'apparaît dans les résultats que si chacune des conditions est vraie en même temps. Il suffit qu'une seule soit fausse pour que la ligne soit exclue. En logique booléenne : VRAI AND VRAI = VRAI — toute autre combinaison retourne FAUX.

  📋 Copier le code

SELECT *
FROM nom_table
WHERE condition1 AND condition2;

Exemple 1 — Clients français et majeurs

On veut uniquement les clients qui répondent aux deux critères à la fois : résider en France et avoir plus de 18 ans. Un client français de 16 ans est exclu (condition 2 fausse). Un client belge de 30 ans est exclu (condition 1 fausse). Les deux doivent passer.

  📋 Copier le code

SELECT id_client, nom, prenom, age, pays
FROM clients
-- AND impose que LES DEUX conditions soient vraies simultanément
WHERE pays = 'France'   -- condition 1 : résidence en France
  AND age > 18;         -- condition 2 : strictement majeur

Exemple 2 — Enchaîner trois conditions avec AND

AND n'est pas limité à deux conditions. Ici, on extrait des commandes récentes, d'un montant minimum, et non annulées. Le moteur évalue les conditions de gauche à droite — et élimine toute ligne qui échoue sur l'une d'elles. Toutes les trois doivent passer.

  📋 Copier le code

SELECT id_commande, montant, statut, date_commande
FROM commandes
WHERE montant > 500                        -- commandes de plus de 500 €
  AND statut <> 'annulée'                  -- on écarte les commandes annulées
  AND date_commande >= '2025-01-01';       -- à partir du 1er janvier 2025

L'opérateur OR : au moins une condition doit être vraie

Là où AND restreint, OR élargit. Une ligne est incluse dès qu'une seule des conditions est vraie — elle n'est exclue que si toutes les conditions sont fausses en même temps. Règle de vérité : FAUX OR FAUX = FAUX seulement. Dès qu'une condition passe, la ligne passe.

  📋 Copier le code

SELECT *
FROM nom_table
WHERE condition1 OR condition2;

Exemple 1 — Clients français OU majeurs

Mêmes conditions qu'avec AND, mais le résultat est très différent — beaucoup plus de lignes remontent. Un client belge de 25 ans est inclus (condition 2 vraie). Un client français de 15 ans est inclus (condition 1 vraie). Seul un client non-français de moins de 18 ans est exclu.

  📋 Copier le code

SELECT id_client, nom, pays, age
FROM clients
-- OR retourne la ligne si AU MOINS UNE des conditions est vraie
WHERE pays = 'France'   -- condition 1 : client résidant en France
   OR age > 18;         -- condition 2 : client majeur, quelle que soit sa nationalité

Exemple 2 — Recherche multi-catégories

Quand on enchaîne plusieurs OR sur la même colonne, SQL propose une syntaxe plus lisible : IN. Les deux formulations donnent le même résultat, mais IN est plus clair à lire et mieux exploité par les index du moteur. À préférer dès qu'il y a plus de deux valeurs.

  📋 Copier le code

SELECT id_produit, nom_produit, categorie
FROM produits
WHERE categorie = 'Informatique'  -- produits de la catégorie informatique
   OR categorie = 'Téléphonie'    -- OU téléphonie
   OR categorie = 'Audio';        -- OU audio
-- Équivalent avec IN — plus lisible et souvent mieux optimisé :
-- WHERE categorie IN ('Informatique', 'Téléphonie', 'Audio')

L'opérateur NOT : inverser une condition

NOT retourne l'inverse d'une condition : ce qui était vrai devient faux, ce qui était faux devient vrai. Il s'associe naturellement avec IN, LIKE, BETWEEN et EXISTS pour exclure des valeurs ou des plages précises.

  📋 Copier le code

SELECT *
FROM nom_table
WHERE NOT condition;

Exemple 1 — Exclure les clients français

Pour une comparaison simple, NOT pays = 'France' et pays <> 'France' donnent exactement le même résultat. NOT devient intéressant quand on l'associe à d'autres opérateurs comme IN ou LIKE — c'est là que ça devient utile au-delà d'un simple <>.

  📋 Copier le code

SELECT id_client, nom, pays
FROM clients
-- NOT inverse : on obtient tout sauf les clients français
WHERE NOT pays = 'France'; -- identique à : WHERE pays <> 'France'

Exemple 2 — NOT IN, NOT LIKE, NOT BETWEEN

Cas concret : filtrer un catalogue pour n'afficher que les articles actifs, sans mention promotionnelle dans le nom, et à plus de 5 €. Les trois NOT fonctionnent ensemble avec AND.

  📋 Copier le code

SELECT id_produit, nom_produit, prix, categorie
FROM produits
WHERE categorie NOT IN ('Soldé', 'Archivé')    -- on exclut les catégories soldé et archivé
  AND nom_produit NOT LIKE '%promo%'            -- on exclut les noms contenant "promo"
  AND prix NOT BETWEEN 0 AND 5;                -- on exclut les articles à moins de 5 €

Piège avec NULL : les valeurs NULL ne sont ni vraies ni fausses en SQL — elles sont "inconnues". NOT NULL ne fonctionne pas comme on l'attend. Pour tester l'absence de valeur, utilisez toujours IS NULL ou IS NOT NULL.

Mélanger AND, OR et NOT : la question des parenthèses

En SQL, les opérateurs ont une priorité fixe : NOT d'abord, puis AND, puis OR. Sans parenthèses, cette hiérarchie peut produire des résultats inattendus — et le moteur ne lèvera aucune erreur. Il exécutera silencieusement une logique différente de celle voulue. C'est le type de bug qui passe les tests et reste en production pendant des mois.

  📋 Copier le code

-- ❌ AMBIGU : AND est évalué avant OR, sans que ça soit visible
-- SQL lit : pays='France' OR (statut='VIP' AND age > 25)
-- Résultat : tous les Français + les VIP de plus de 25 ans
SELECT * FROM clients
WHERE pays = 'France' OR statut = 'VIP' AND age > 25;
-- ✅ EXPLICITE : les parenthèses forcent OR à être évalué en premier
-- On cible : les clients (français OU VIP) ayant plus de 25 ans
SELECT * FROM clients
WHERE (pays = 'France' OR statut = 'VIP') AND age > 25;
-- ✅ AVEC NOT : clients ni français ni allemands, et majeurs
SELECT * FROM clients
WHERE NOT (pays = 'France' OR pays = 'Allemagne')
  AND age >= 18;

La règle simple : dès que AND et OR coexistent dans une même requête, mettez des parenthèses. Même si la priorité joue en votre faveur, elles rendent la requête lisible pour quiconque la reprendra — y compris vous dans six mois.

Quelques points à retenir en production

Ces opérateurs s'utilisent au quotidien. Sur des tables volumineuses, quelques réflexes font la différence :

  • Indexez les colonnes présentes dans vos conditions WHERE. OR peut parfois empêcher le moteur d'utiliser un index — vérifiez avec EXPLAIN (ou EXPLAIN ANALYZE sous PostgreSQL).
  • Sur de grands volumes, NOT EXISTS est souvent plus rapide que NOT IN : il court-circuite l'évaluation dès le premier résultat trouvé.
  • SQL utilise une logique ternaire : VRAI, FAUX, ou INCONNU. Toute comparaison avec NULL retourne INCONNU — d'où l'importance de IS NULL et IS NOT NULL.
  • Plusieurs OR sur la même colonne s'écrivent plus proprement avec IN, avec des performances équivalentes ou meilleures.

Par carabde | Mis à jour le 7 mai 2026