Adloun

Le produit cartésien, voulu et subi

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 21 — Bases de données relationnelles et SQL

Énoncé

Que comptent ces trois requêtes ?


SELECT COUNT(*) FROM Eleve, Note;
SELECT COUNT(*) FROM Eleve, Note, Matiere;
SELECT COUNT(*) FROM Eleve e JOIN Note n ON n.eleve = e.id;

Écrire, avec la virgule, la requête équivalente à la dernière.

Corrigé

, , puis — mesuré.

La virgule dans le FROM construit le produit cartésien : toutes les combinaisons. Avec élèves et notes, lignes ; en ajoutant les matières, .

Le JOIN ... ON n'est rien d'autre qu'un produit cartésien filtré : sur les couples, seuls les où n.eleve = e.id survivent — soit exactement autant que de lignes dans Note, puisque chaque note désigne un et un seul élève.

Les deux écritures, rigoureusement équivalentes :


SELECT e.nom, n.valeur FROM Eleve e JOIN Note n ON n.eleve = e.id;
SELECT e.nom, n.valeur FROM Eleve e, Note n WHERE n.eleve = e.id;

Pourquoi la première est meilleure, alors qu'elles disent la même chose. Parce qu'elle sépare deux rôles que la seconde mélange : la condition de recollement (dans le ON) et la condition de sélection (dans le WHERE). Avec la virgule, on écrit tout dans le WHERE, et une condition oubliée ne se voit pas — elle se traduit par un résultat plus gros, pas par une erreur.

Requêtelignesce que c'est
`FROM Eleve, Note`produit, condition oubliée
`FROM Eleve, Note WHERE n.eleve = e.id`la même, complète
`FROM Eleve JOIN Note ON n.eleve = e.id`la forme qui le dit

Le compte est le seul témoin : au lieu de , c'est-à-dire un facteur , et sur une vraie base, un facteur des dizaines de milliers. Un produit cartésien involontaire ne plante pas : il ralentit, puis il fausse tous les agrégats — c'est le problème 21.5.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.