SQL WHERE : filtrer les lignes
Une table contient souvent des milliers de lignes, alors qu'on n'en veut que quelques-unes : les clients d'une ville, les produits sous un certain prix, les commandes annulées… La clause WHERE sert exactement à ça : elle ne garde que les lignes qui respectent une condition.
Syntaxe
SELECT colonnes
FROM table
WHERE condition;Comment ça marche
Pour chaque ligne de la table, SQL évalue la condition du WHERE. Si elle est vraie, la ligne est gardée ; sinon, elle est écartée.
Les opérateurs de comparaison
| Opérateur | Signification | Exemple |
|---|---|---|
= | égal à | ville = 'Lyon' |
<> ou != | différent de | statut <> 'annulée' |
<, > | strictement inférieur / supérieur | prix < 20 |
<=, >= | inférieur / supérieur ou égal | age >= 18 |
Les textes et les dates s'écrivent entre apostrophes ('Paris', '2025-01-01'), les nombres sans.
Combiner plusieurs conditions
AND: les deux conditions doivent être vraies.OR: au moins une des deux doit être vraie.NOT: inverse une condition.
AND est évalué avant OR, comme la multiplication avant l'addition. Dès que vous mélangez les deux, ajoutez des parenthèses pour être sûr du sens de votre requête.
Schéma
| prenom | ville |
|---|---|
| Léa | Lyon |
| Hugo | Paris |
| Inès | Lyon |
| Adam | Nantes |
| prenom | ville |
|---|---|
| Léa | Lyon |
| Inès | Lyon |
Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).
Exemples avec leurs résultats
1. Une condition simple
Les clients qui habitent à Paris.
SELECT prenom, nom, ville
FROM clients
WHERE ville = 'Paris'; Essayer dans le bac à sable| prenom | nom | ville |
|---|---|---|
| Zoé | Laurent | Paris |
| Jade | Garcia | Paris |
| Sarah | Lambert | Paris |
| Yanis | Haddad | Paris |
| Chloé | Bonnet | Paris |
| Jade | Dubois | Paris |
| Lucas | Dubois | Paris |
| Omar | Dubois | Paris |
| Clara | Lefebvre | Paris |
| Inès | Fontaine | Paris |
13 lignes au total · 10 affichées
2. Comparer des nombres
Les produits qui coûtent moins de 10 €.
SELECT nom, prix
FROM produits
WHERE prix < 10; Essayer dans le bac à sable| nom | prix |
|---|---|
| Tapis de yoga | 6,53 |
| Roman policier | 8,03 |
| BD aventure | 9,98 |
| Miel bio | 3,7 |
4 lignes au total
3. Deux conditions avec AND
Les employés du département IT qui gagnent plus de 4 000 €.
SELECT prenom, nom, departement, salaire
FROM employes
WHERE departement = 'IT' AND salaire > 4000; Essayer dans le bac à sable| prenom | nom | departement | salaire |
|---|---|---|---|
| Nathan | Roux | IT | 6 800 |
| Inès | Moreau | IT | 4 500 |
| Clara | Garcia | IT | 5 100 |
3 lignes au total
4. AND et OR avec des parenthèses
Les produits de sport ou de maison qui coûtent moins de 15 €. Sans les parenthèses, la condition sur le prix ne s'appliquerait qu'à la maison.
SELECT nom, categorie, prix
FROM produits
WHERE (categorie = 'Sport' OR categorie = 'Maison') AND prix < 15; Essayer dans le bac à sable| nom | categorie | prix |
|---|---|---|
| Coussin | Maison | 10,86 |
| Tapis de yoga | Sport | 6,53 |
| Ballon de foot | Sport | 14,68 |
3 lignes au total
Les erreurs fréquentes
Oublier les apostrophes autour d'un texte
Sans apostrophes, SQL pense que Paris est un nom de colonne et renvoie l'erreur no such column.
SELECT * FROM clients WHERE ville = Paris;SELECT * FROM clients WHERE ville = 'Paris';Mélanger AND et OR sans parenthèses
a OR b AND c se lit a OR (b AND c). Le résultat est souvent différent de ce qu'on voulait.
SELECT * FROM produits WHERE categorie = 'Sport' OR categorie = 'Maison' AND prix < 15;SELECT * FROM produits WHERE (categorie = 'Sport' OR categorie = 'Maison') AND prix < 15;Comparer avec = NULL
Une valeur manquante (NULL) ne s'égale à rien, même pas à NULL. Utilisez IS NULL (voir le cours sur NULL).
SELECT * FROM clients WHERE age = NULL;SELECT * FROM clients WHERE age IS NULL;Exercices
Essayez d'écrire la requête vous-même avant d'ouvrir la solution.
Défi 1. Affichez les commandes (toutes colonnes) dont le statut est « annulée ».
Voir une solution
SELECT * FROM commandes WHERE statut = 'annulée';| id | client_id | date_commande | statut | employe_id |
|---|---|---|---|---|
| 1 | 103 | 2023-06-02 | annulée | 6 |
| 13 | 77 | 2024-06-02 | annulée | 6 |
| 22 | 84 | 2023-02-03 | annulée | 25 |
| 23 | 82 | 2023-05-24 | annulée | 8 |
| 25 | 50 | 2024-09-02 | annulée | 9 |
| 27 | 18 | 2024-10-25 | annulée | 24 |
| 35 | 101 | 2025-04-07 | annulée | 14 |
| 43 | 57 | 2025-11-13 | annulée | 18 |
92 lignes au total · 8 affichées
Essayer dans le bac à sableDéfi 2. Affichez les clients de Lyon âgés de moins de 30 ans.
Voir une solution
SELECT prenom, nom, age FROM clients WHERE ville = 'Lyon' AND age < 30;| prenom | nom | age |
|---|---|---|
| Théo | Michel | 20 |
1 ligne au total
Essayer dans le bac à sableLes exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.
Questions fréquentes
Quelle différence entre WHERE et HAVING ?
WHERE filtre les lignes avant qu'elles soient regroupées ; HAVING filtre les groupes après un GROUP BY. Pour filtrer sur un COUNT ou une SUM, il faut HAVING.
WHERE est-il sensible aux majuscules ?
Avec =, la comparaison de textes tient compte des majuscules et des accents en SQLite : 'paris' n'est pas égal à 'Paris'. LIKE, lui, ignore les majuscules pour les lettres non accentuées.
Peut-on comparer deux colonnes ?
Oui, par exemple WHERE prix_unitaire > prix pour comparer deux colonnes d'une même ligne.
Comment écrire « différent de » ?
Avec <> (standard SQL) ou != (accepté par la plupart des bases, dont SQLite).