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.
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.
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.
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.
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.
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.
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.
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 <>.
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.
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.
-- ❌ 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(ouEXPLAIN ANALYZEsous PostgreSQL). - Sur de grands volumes,
NOT EXISTSest souvent plus rapide queNOT 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 NULLetIS 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