Aller au contenu principal
ShadowAcademy

Les langages SQL Plusieurs tables

Garder les lignes sans correspondance

Pour répondre à « quels clients n'ont aucune carte ? », une jointure ordinaire ne sert à rien : elle supprime justement ces clients-là.

SELECT c.prenom, k.type
FROM clients AS c
LEFT JOIN cartes AS k ON k.titulaire_id = c.id;

LEFT JOIN garde toutes les lignes de la table de gauche. Sans correspondance, les colonnes de droite valent NULL :

Alice|Visa Premier
Alice|Carte virtuelle
Driss|NULL
...

Trouver ce qui manque

SELECT c.prenom
FROM clients AS c
LEFT JOIN cartes AS k ON k.titulaire_id = c.id
WHERE k.id IS NULL;

On teste k.id, la clé primaire de droite : elle n'est jamais vide pour une vraie ligne. Un NULL à cet endroit signifie qu'il n'y avait rien à joindre.

Compter en gardant les zéros

SELECT c.prenom, count(k.id) AS nb_cartes
FROM clients AS c
LEFT JOIN cartes AS k ON k.titulaire_id = c.id
GROUP BY c.id, c.prenom
ORDER BY c.prenom;

count(*) compterait la ligne fabriquée par le LEFT JOIN et afficherait 1 pour un client sans carte. count(k.id) ignore les NULL et affiche bien 0.

2 exercices pour cette lecon

Les exercices demandent un compte : il faut bien enregistrer votre progression quelque part. La lecture, elle, reste libre. Creer un compte

  • Les clients sans carte moyen lecon a valider
  • Les cartes de chacun difficile lecon a valider