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