Quelle population devez-vous conserver ?
INNER JOIN retourne uniquement les lignes possédant une correspondance. LEFT JOIN conserve toutes les lignes de la table gauche et complète les colonnes absentes avec NULL.
Pour trouver les clients sans commande, clients doit être à gauche. Pour analyser uniquement les commandes reliées à un client valide, INNER JOIN exprime mieux le besoin.
La requête expliquée
Commencez par définir ce que doit représenter une ligne du résultat. Cette décision détermine les colonnes, les regroupements et les contrôles nécessaires.
L’exemple suivant isole le mécanisme principal. Exécutez-le, observez le résultat, puis modifiez une seule clause à la fois pour comprendre son effet.
SELECT c.nom, COUNT(co.id_commande) AS commandes
FROM clients c
LEFT JOIN commandes co ON co.id_client = c.id_client
GROUP BY c.id_client, c.nom;Lire le résultat comme un analyste
COUNT porte sur l’identifiant de commande nullable, pas sur *. Un client sans correspondance obtient ainsi zéro.
Un filtre sur commandes placé dans WHERE pourrait supprimer les lignes NULL et annuler l’effet du LEFT JOIN ; placez-le dans ON si la population gauche doit rester complète.
- Nommer la population de référence.
- Prévoir les lignes sans correspondance.
- Compter une colonne du côté droit.
- Contrôler les filtres placés dans ON ou WHERE.
Les erreurs qui faussent l’analyse
Une requête peut être valide sans répondre correctement à la question. Les erreurs les plus coûteuses sont souvent silencieuses : mauvais périmètre, ligne multipliée ou valeur absente interprétée comme zéro.
Avant de partager le résultat, confrontez-le à un petit échantillon calculé à la main et conservez la définition du périmètre avec la requête.
- Choisir INNER JOIN par habitude.
- Placer un filtre droit dans WHERE après LEFT JOIN.
- Compter * et afficher 1 pour une absence.
- Regrouper uniquement par nom et fusionner des homonymes.
Passez à la pratique
Faites l’exercice clients sans commande et réécrivez-le ensuite avec NOT EXISTS.
Le simulateur SQL de SQL.tn exécute uniquement des requêtes de lecture sur des données fictives dans votre navigateur. Vous pouvez essayer plusieurs écritures et comparer leur résultat sans installer de logiciel.
Testez la différence sur des données concrètes
La boutique veut voir tous ses clients, même sans commande. Emma en a deux, James une et Olivia aucune. Quelle jointure conservera Olivia ?
| customer_id | customer_name |
|---|---|
| 1 | Emma |
| 2 | James |
| 3 | Olivia |
| order_id | customer_id |
|---|---|
| 101 | 1 |
| 102 | 1 |
| 103 | 2 |
SELECT c.customer_name, o.order_id
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY c.customer_id, o.order_id;Exécutez LEFT JOIN, puis remplacez-le par INNER JOIN. Olivia disparaît alors du résultat. Les deux lignes d’Emma ne sont pas des doublons accidentels : elles représentent deux commandes différentes.
Objectif de contrôle : obtenir quatre lignes, dont Olivia avec un numéro de commande NULL. Filtrer ensuite sur une colonne de orders dans WHERE peut exclure cette ligne sans commande.
Simulateur SQL dans le navigateur
Testez la différence sur des données concrètes
Exécutez une requête de lecture sur les données fictives de cet exercice. Rien n’est envoyé à SQL.tn.
