SQL WHERE

Par :

,le

La clause WHERE sélectionne uniquement les lignes qui répondent à une condition précise. Elle suit toujours la clause FROM dans une commande SQL SELECT. Les développeurs utilisent WHERE avec SELECT, UPDATE et DELETE pour cibler des actions précises. Nous allons voir différentes requêtes utilisant les principaux opérateurs liés à la clause WHERE.

Qu’est-ce que la clause SQL WHERE et quelle est sa syntaxe SQL de base?

La clause WHERE applique un filtre sur les lignes d’une table. Elle garde uniquement les enregistrements qui respectent la condition définie. Cette clause apparaît après FROM et avant GROUP BY ou ORDER BY. La requête ci-dessous sélectionne les produits dont le prix reste inférieur à 100

SELECT nom, prix
FROM produits
WHERE prix < 100;

L’ordre d’exécution place WHERE en troisième position juste après FROM. La base de données charge d’abord les tables puis applique immédiatement le filtre. Cette séquence optimise les performances dès le début du traitement.

Les opérateurs WHERE essentiels

La clause WHERE utilise différents opérateurs pour créer des conditions . Chaque opérateur répond à un besoin spécifique de filtrage. Les développeurs choisissent l’opérateur selon les types de données SQL stockées et le regroupement de résultat attendu.

Comparaisons de base

Les opérateurs de comparaison forment la base du filtrage . Ces opérateurs fonctionnent avec les nombres et les chaînes de caractères aussi appelées « String » qui doivent toujours être incluses entre guillemets. Cette requête sélectionne les clients âgés de plus de 25 ans et qui habitent Paris. L’opérateur ou mot-clé AND exige que les deux conditions soient vraies. La base de donnée vérifie chaque ligne selon ces critères combinés.

SELECT nom
FROM clients
WHERE age > 25 AND ville = 'Paris';

Créer une requête utilisant BETWEEN pour spécifier les plages

L’opérateur BETWEEN teste une plage de valeurs inclusive. Il équivaut à une double comparaison avec AND. Cette condition garde les produits avec une quantité comprise entre 10 et 50 unités. Les développeurs utilisent fréquemment cet opérateur pour les dates et les nombres .

SELECT produit
FROM stock
WHERE quantite BETWEEN 10 AND 50;

LIKE pour une chaine de caractères

La requête suivante avec le mot-clé LIKE recherche des motifs dans les chaînes de caractères. Les caractères spéciaux % et _ créent des masques flexibles. Un % représente zéro ou plusieurs caractères . Le _ représente exactement un caractère. Ces jokers permettent des recherches partielles précises. La requête de sélection ci-dessous trouve tous les noms commençant par « Du ». Le % après Du capture n’importe quelle suite de caractères. LIKE distingue les majuscules et minuscules selon le SGBD.

SELECT nom
FROM clients
WHERE nom LIKE 'Du%';

Utiliser une requête avec le mot-clé IN pour les listes de valeurs

IN teste si une valeur appartient à une liste prédéfinie. Cette syntaxe raccourcit les multiples OR. Cette condition équivaut à trois OR séparés. IN fonctionne aussi avec des sous-requêtes. La liste peut contenir jusqu’à plusieurs centaines de valeurs selon le SGBD.

SELECT nom
FROM commandes
WHERE statut IN ('en cours', 'expédié', 'livré');

IS NULL pour les valeurs manquantes

IS NULL détecte les cellules vides dans une table. L’opérateur d’égalite (=) ne fonctionne jamais avec NULL. NULL signifie « valeur inconnue » et non « égale à zéro ».

IS NULL retourne vrai pour les cellules vides. IS NOT NULL sélectionne les cellules remplies. La requête suivante identifie les clients sans adresse email. Les développeurs vérifient souvent les données incomplètes avec l’opérateur IS NULL pour éviter les erreurs courantes de filtrage.

SELECT nom
FROM clients
WHERE email IS NULL;

Exemples concrets avec la clause WHERE

SELECT nom, date_naissance
FROM employes
WHERE date_naissance BETWEEN '1980-01-01' AND '1990-12-31';

Cette autre requête combine LIKE et NOT qui exclut les produits en déstockage tout en gardant les articles chers. NOT LIKE inverse le résultat de la requête LIKE. La combinaison crée un filtre sophistiqué.

SELECT produit
FROM catalogue
WHERE description NOT LIKE '%déstockage%' 
  AND prix > 50;

Règles de priorité des opérateurs logiques sur un ensemble de requêtes

Les opérateurs logiques AND, OR et NOT suivent des règles de priorité précises. AND s’évalue avant OR. Les parenthèses modifient cette priorité naturelle.

Requêtes complexes et priorité de AND sur l’opérateur OR

Les parenthèses forcent l’ordre d’évaluation souhaité. Sans parenthèses, AND lie toujours ville et statut, ce qui piège souvent les débutants.

-- AMBIGU
SELECT nom
FROM clients
WHERE age > 18 OR ville = 'Paris' AND statut = 'actif';
-- = (age > 18) OR (ville = 'Paris' AND statut = 'actif')

-- CLAIR
SELECT nom
FROM clients
WHERE (age > 18 OR ville = 'Paris') AND statut = 'actif';

Requêtes simples en utilisant le mot-clé NOT

NOT inverse une condition entière, applique la priorité la plus élevée et s’applique à l’ensemble de la condition placée entre parenthèses. Le moteur SQL évalue d’abord ce qui est entre parenthèses avant d’appliquer les opérateurs extérieurs, exactement comme en algèbre.

SELECT nom
FROM produits
WHERE NOT (prix < 100 OR en_promo = 1);

WHERE dans les autres commandes SQL

WHERE filtre aussi les actions de modification et suppression. Cette clause protège les bases de données contre les changements massifs accidentels. UPDATE et DELETE exigent toujours une condition WHERE.

Création d’une requête UPDATE avec WHERE

Cette commande augmente de 20% le prix des produits de luxe uniquement en limitant l’action à un sous-ensemble précis. Sans la clause WHERE, tous les prix augmenteraient.

UPDATE produits
SET prix = prix * 1.2
WHERE categorie = 'luxe';

Exécuter une requête DELETE avec WHERE pour supprimer des enregistrements

Cette requête supprime les logs antérieurs à 2026. DELETE FROM cible toujours une table spécifique et WHERE évite la suppression complète accidentelle.

DELETE FROM logs
WHERE date_creation < '2026-01-01';

Bonnes pratiques WHERE

Les bonnes pratiques améliorent les performances, la sécurité des requêtes et évite les problèmes courants.

Créez des index sur les colonnes utilisées dans WHERE. Un index accélère le filtrage sur les grandes tables, car la base de données utilise l’index automatiquement pour les opérateurs =, >, <, BETWEEN.

Évitez les fonctions dans les conditions WHERE. Une fonction comme YEAR(date) empêche l’utilisation des index, préférez plutôt les comparaisons directes sur les colonnes.

Testez toujours vos conditions WHERE avec LIMIT 10 en développement. Cette précaution vérifie le filtrage avant exécution sur l’ensemble des données afin de detecter les erreurs rapidement sur de petits échantillons.

Utilisez EXPLAIN ou EXPLAIN ANALYZE pour analyser les performances. Cet outil révèle si la base utilise les index correctement

Erreurs courantes à éviter

Égalité avec NULL

NULL ne se compare jamais avec l’opérateur = mais avec IS NULL pour tester l’absence de valeur. Cette règle surprend tous les nouveaux utilisateurs du langage SQL.

-- ❌ FAUX
WHERE email = NULL

-- ✅ CORRECT
WHERE email IS NULL

Éviter le délimiteur « % » en début de motif LIKE

Le % initial empêche l’utilisation des index texte ce qui ralentit les recherches sur de gros volumes. Les développeurs préfèrent les préfixes quand c’est possible.

-- ❌ LENT sur 1M lignes
WHERE description LIKE '%moteur%'

-- ✅ RAPIDE avec index
WHERE description LIKE 'moteur%'

Oubli du mot-clé WHERE dans la requête SQL UPDATE/DELETE

Sans le mot-clé WHERE, l’action s’applique à toutes les lignesce qui détruit des bases en production. Les outils de développement bloquent parfois ces requêtes dangereuses.

-- ⚠️ DANGEREUX
UPDATE produits SET prix = 0;
DELETE FROM clients;

-- ✅ SÉCURISÉ
UPDATE produits SET prix = 0 WHERE en_promo = 1;
DELETE FROM clients WHERE derniere_connexion < '2025-01-01';

Vérifiez vos acquis

Testez maintenant votre compréhension de WHERE avec ces exercices pratiques.

Exercice 1 : Sélectionnez les clients parisiens de plus de 30 ans :

-- Complétez :
SELECT nom FROM clients WHERE _________;

-- requêtes complète : 
SELECT nom FROM clients WHERE age > 30 AND ville = 'Paris';

Exercice 2 : Corrigez cette requête fausse :

-- ❌
SELECT * FROM produits WHERE prix = NULL;

-- ✅
SELECT * FROM produits WHERE prix IS NULL;

Sources : MySql , Postgresql