Jointures

INNER JOIN ou LEFT JOIN : lequel choisir ?

Le choix dépend d’abord des lignes qui doivent rester visibles, pas d’une préférence de syntaxe.

Équipe SQL.tn8 min
Deux jointures comparent les correspondances et les lignes gauches sans équivalent

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.

Les noms, montants et données utilisés dans cet article sont fictifs et créés pour l’apprentissage.

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.

Compter les commandes sans perdre les clients inactifs
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 ?

Données fictives de l’exemple — customers
customer_idcustomer_name
1Emma
2James
3Olivia
Données fictives de l’exemple — orders
order_idcustomer_id
1011
1021
1032
Requête à essayer
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.

Local et privé
Raccourci : Ctrl/⌘ + Entrée
Le simulateur sera préparé à la première exécution.

Continuez avec un exercice lié à ce guide