Leçon 3 / 15

Conserver les lignes sans correspondance

12 min SQL — jointures, agrégats et sous-requêtes Gratuit

Objectif : Afficher tous les adhérents, y compris ceux qui n’ont aucun emprunt, sans créer de produit cartésien.

Un rapport fondé sur les emprunts peut faire disparaître les adhérents qui n’ont encore rien emprunté. C’est gênant lorsque vous voulez contrôler l’activité de toute la médiathèque, y compris l’absence d’activité. Vous allez conserver chaque adhérent et afficher les informations d’emprunt seulement lorsqu’une correspondance existe.

Conserver la table placée à gauche

Dans LEFT JOIN, la table écrite à gauche de la jointure fournit toutes les lignes du résultat. La table à droite apporte ses colonnes lorsqu’une ligne correspond ; en l’absence de correspondance, ces colonnes prennent la valeur NULL. Comme dans la leçon précédente, reliez les lignes par leurs clés dans ON : ici, un emprunt est rattaché à l’adhérent dont l’identifiant correspond.

Tous les adhérents et leurs emprunts éventuelsSQL
SELECT
    a.id AS adherent_id,
    e.id AS emprunt_id
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
ORDER BY a.id, e.id;
Résultat attendu
Exemple de résultat :

+-------------+------------+
| adherent_id | emprunt_id |
+-------------+------------+
| 1           | 12         |
| 1           | 18         |
| 2           | NULL       |
| 3           | 21         |
+-------------+------------+

L’adhérent 2 reste présent, bien qu’aucun emprunt ne lui corresponde.

L’exemple utilise uniquement des identifiants afin de rendre la relation visible sans dépendre d’autres colonnes du schéma. Les valeurs affichées sont illustratives : votre résultat dépend des données réellement présentes dans la base. Un adhérent qui possède plusieurs emprunts apparaît plusieurs fois, une ligne par emprunt ; un adhérent sans emprunt apparaît une fois, avec NULL pour emprunt_id.

Placer les conditions au bon endroit

Une condition sur la table de droite placée dans ON détermine quelles lignes peuvent correspondre, sans retirer les lignes de la table de gauche. À l’inverse, une condition portant sur cette même table dans WHERE est appliquée au résultat de la jointure : les lignes sans correspondance ont NULL dans e.id et ne satisfont pas une comparaison comme e.id = 12. Elles disparaissent donc.

Comparer le placement d’un filtreSQL
-- Le filtre limite les emprunts correspondants ; tous les adhérents restent.
SELECT
    a.id AS adherent_id,
    e.id AS emprunt_id
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
   AND e.id = 12
ORDER BY a.id;

-- Le filtre élimine les lignes sans emprunt correspondant.
SELECT
    a.id AS adherent_id,
    e.id AS emprunt_id
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
WHERE e.id = 12
ORDER BY a.id;
Résultat attendu
Dans la première requête, tous les adhérents sont affichés ; seul l’emprunt d’identifiant 12 peut être associé. Dans la seconde, seuls les adhérents associés à cet emprunt apparaissent : les lignes où e.id vaut NULL sont exclues.

Ces requêtes ne produisent pas de produit cartésien : la relation entre les tables est explicitement définie par e.adherent_id = a.id. Avant d’ajouter un filtre, décidez donc si vous souhaitez limiter les correspondances tout en préservant les adhérents, ou éliminer du résultat les lignes qui ne satisfont pas ce filtre. Dans le premier cas, utilisez ON ; dans le second, utilisez WHERE en sachant que les adhérents sans correspondance ne seront pas conservés.

À retenir

  • Avec LEFT JOIN, toutes les lignes de la table de gauche sont conservées.
  • Sans correspondance à droite, les colonnes de cette table valent NULL.
  • Une condition dans ON limite les correspondances ; une condition dans WHERE filtre le résultat et peut exclure les lignes sans correspondance.
  • Une condition de jointure explicite relie les tables et évite un produit cartésien.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.