Retour au cours

data / sql

SELECT et WHERE

Leçon 21 exercice

Explication

Ce que vous allez apprendre

  • Sélectionner des colonnes précises plutôt que d'utiliser systématiquement SELECT *
  • Filtrer des lignes avec WHERE selon des conditions numériques, textuelles ou d'ensembles
  • Tester correctement une valeur NULL avec IS NULL / IS NOT NULL
  • Combiner AND/OR sans se faire piéger par leur ordre de priorité
  • Rechercher un motif texte avec LIKE et ILIKE

Dans quel contexte ?

Un développeur travaille sur la page de recherche d'un site e-commerce qui interroge une table produits de 40 000 lignes. Il doit afficher uniquement les produits de la catégorie 'electronique' dont le prix est inférieur à 200 euros et qui sont en stock. Sans un WHERE bien construit, la page afficherait soit trop de résultats non pertinents, soit aucun produit à cause d'un piège classique sur les valeurs NULL.

D'abord, la version la plus simple : tout demander

Commençons petit. SELECT * FROM produits pose la question la plus basique possible : "montre-moi toutes les colonnes, de toutes les lignes". C'est déjà utile, mais sur une table de dix mille produits, ça devient vite illisible.

Ensuite, choisir précisément quoi voir

SELECT nom, prix FROM produits répond à une question plus fine : "je ne veux voir que ces deux colonnes-là". SELECT répond donc toujours à la question "quelles colonnes m'intéressent ?", jamais à "quelles lignes ?".

Il reste un problème : trop de lignes

Même en choisissant les bonnes colonnes, on récupère encore TOUTES les lignes de la table. Si on ne veut que les produits de plus de 50 euros, il manque un outil pour filtrer.

La solution : WHERE filtre ligne par ligne

WHERE prix > 50 répond à la question "quelles lignes m'intéressent ?". La base examine chaque fiche une par une et ne garde que celles qui respectent la condition, avant tout tri ou regroupement ultérieur.

Un piège qu'il faut connaître dès maintenant : le NULL

NULL ne veut pas dire "zéro" ni "texte vide" : il signifie "valeur inconnue". Du coup, colonne = NULL ne renvoie jamais vrai, même si la colonne est réellement NULL, parce que comparer de l'inconnu à quoi que ce soit reste... inconnu.

Piège fréquent

SELECT * FROM produits WHERE description = NULL renvoie toujours zéro ligne, même si des produits ont bien une description NULL. C'est l'une des toutes premières erreurs que fait un débutant en SQL, et elle passe souvent inaperçue car elle ne provoque aucune erreur, juste un résultat vide et silencieux.

La bonne façon de tester un NULL

C'est pour cette raison précise qu'il faut toujours écrire IS NULL ou IS NOT NULL, jamais un simple =. C'est une des toutes premières habitudes à prendre en SQL.

OpérateurRôleExemple
=, <>, >, <Comparaison directeprix > 50
BETWEEN ... AND ...Intervalle inclusifprix BETWEEN 10 AND 100
IN (...)Appartenance à une listecategorie IN ('jeux', 'audio')
LIKE / ILIKEMotif texte (%, _)nom LIKE 'Sam%'
IS NULL / IS NOT NULLTest de valeur inconnuedescription IS NULL

Un dernier piège : l'ordre de AND et OR

AND est évalué avant OR, comme la multiplication avant l'addition en mathématiques. Une condition comme A OR B AND C peut donc surprendre : le plus sûr est de toujours parenthéser explicitement ce qu'on veut dire.

Bonne pratique

Parenthèse systématiquement dès que tu mélanges AND et OR dans la même clause WHERE, même quand tu es certain de la priorité par cœur. Un collègue qui relit ta requête six mois plus tard n'aura pas à deviner ton intention.

Vers la suite

Une fois qu'on sait choisir des colonnes et filtrer des lignes, l'étape logique suivante consiste à les trier et à les découper en pages — exactement le sujet de la prochaine leçon.

Commandes & code

SELECT et WHERE

sql
-- Sélectionner toutes les colonnes
SELECT * FROM produits;

-- Sélectionner des colonnes précises
SELECT nom, prix, stock FROM produits;

-- Renommer une colonne dans le résultat (alias)
SELECT nom AS nom_produit, prix AS prix_unitaire FROM produits;

-- Filtrer avec WHERE
SELECT * FROM produits WHERE prix > 50;
SELECT * FROM produits WHERE categorie = 'electronique';
SELECT * FROM produits WHERE prix BETWEEN 10 AND 100;
SELECT * FROM produits WHERE categorie IN ('electronique', 'informatique', 'jeux');
SELECT * FROM produits WHERE categorie NOT IN ('archive', 'obsolete');

-- Recherche de motifs (LIKE)
SELECT * FROM produits WHERE nom LIKE 'Sam%';      -- commence par "Sam"
SELECT * FROM produits WHERE nom LIKE '%pro%';      -- contient "pro"
SELECT * FROM produits WHERE nom LIKE '_hone';      -- un caractère puis "hone" -> "Phone"
SELECT * FROM produits WHERE nom ILIKE 'sam%';      -- insensible à la casse (PostgreSQL)

-- Valeurs nulles : IS NULL, jamais "= NULL"
SELECT * FROM produits WHERE description IS NULL;
SELECT * FROM produits WHERE description IS NOT NULL;

-- Combiner des conditions
SELECT * FROM produits
WHERE categorie = 'electronique'
  AND prix < 200
  AND stock > 0;

SELECT * FROM produits
WHERE categorie = 'electronique' OR categorie = 'informatique';

-- Priorité des opérateurs : parenthéser pour éviter les pièges
SELECT * FROM produits
WHERE (categorie = 'electronique' OR categorie = 'informatique')
  AND prix < 200;

-- Négation
SELECT * FROM produits WHERE NOT (stock = 0);

-- DISTINCT : supprimer les doublons
SELECT DISTINCT categorie FROM produits;
SELECT DISTINCT categorie, fournisseur FROM produits;  -- doublons sur la paire

Résumé

  • WHERE filtre les lignes avant tout regroupement/tri.
  • IS NULL / IS NOT NULL sont obligatoires pour tester le NULL (jamais =).
  • LIKE avec % (0..n caractères) et _ (1 caractère) ; ILIKE ignore la casse.
  • AND est prioritaire sur OR : parenthéser explicitement.
  • DISTINCT porte sur la combinaison de toutes les colonnes sélectionnées.

Exercices pratiques

1 disponible
1

Mission : réparer la page de recherche d'un site e-commerce

Objectif : Corriger un filtre WHERE défaillant (piège NULL et priorité AND/OR) sur la page de recherche produits.

Contexte

La page de recherche d'un site e-commerce interroge la table produits (40 000 lignes). Deux bugs remontés par le support : une section "produits sans description renseignée" qui affiche toujours zéro résultat alors que la base en contient, et un filtre "électronique ou informatique, à moins de 200 euros" qui laisse passer des produits d'autres catégories à des prix élevés.

Résoudre l’exercice →