CodeGym /Cours /SQL SELF /Erreurs typiques lors de l'utilisation de JOIN

Erreurs typiques lors de l'utilisation de JOIN

SQL SELF
Niveau 12 , Leçon 4
Disponible

Bon, il est temps de parler de la vraie vie. Celle où tu ne peux pas y échapper : les erreurs. Les choper, les corriger et les comprendre — c'est juste une partie obligatoire du taf avec les données. On va voir ensemble sur quels râteaux tu peux marcher avec JOIN en SQL, et comment les éviter.

Erreur 1 : Oublier la condition de jointure — création d’un produit cartésien

L’erreur la plus fréquente — oublier de préciser la condition de jointure avec ON. Là, tu te retrouves avec un produit cartésien, où chaque ligne de la première table est jointe à chaque ligne de la seconde. Résultat : t’as un max de lignes qui ne veulent rien dire et qui te mettent juste la tête à l’envers.

Regarde cet exemple. Disons qu’on a ces tables :

Étudiants (students):

student_id name
1 Otto
2 Anna

Cours (courses):

course_id course_name
101 Mathématiques
102 Histoire

Maintenant, on écrit une requête en oubliant le ON :

SELECT *
FROM students
JOIN courses;

Résultat :

student_id name course_id course_name
1 Otto 101 Mathématiques
1 Otto 102 Histoire
2 Anna 101 Mathématiques
2 Anna 102 Histoire

Ça n’a aucun sens, non ? Ce cauchemar, c’est ce qu’on appelle le produit cartésien.

Comment corriger : utilise ON pour dire comment les données sont liées entre les tables.

SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;

Et là, une nouvelle galère peut arriver...

Protection contre les bourdes

C’est tellement courant comme souci que PostgreSQL interdit d’utiliser JOIN sans ON et condition.

Si tu veux vraiment tout combiner avec tout, tu peux utiliser la syntaxe sans JOIN :

SELECT *
FROM students, courses;

Encore une 3ème option — quand JOIN sans ON marche :

  • Avec NATURAL JOIN — il prend automatiquement les colonnes qui ont le même nom.
  • Avec USING — tu précises la liste des colonnes sur lesquelles joindre.
  • CROSS JOIN — toujours sans condition, c’est pareil que le produit cartésien.

Erreur 2 : Mauvaise condition de jointure

Parfois tu mets une condition de jointure, mais tu te plantes. Genre tu joins les tables sur des colonnes qui n’ont rien à voir.

Imaginons qu’on veut la liste des étudiants et des cours auxquels ils sont inscrits, mais on se trompe et on joint sur des champs qui n’ont aucun rapport :

SELECT *
FROM students
JOIN courses
ON students.student_id = courses.course_id;

Cette requête va donner un résultat bidon, parce que student_id et course_id — c’est pas du tout la même chose.

Comment corriger : vérifie bien que tu utilises les bonnes colonnes pour joindre. Une jointure correcte pourrait ressembler à ça (si t’as une table enrollments qui relie étudiants et cours) :

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Erreur 3 : Duplication de lignes dans le résultat

Quand tu ajoutes plusieurs JOIN dans ta requête, parfois ça fait des doublons. Ça arrive si t’as des enregistrements en double dans les tables JOIN, ou si t’as mal mis tes conditions de jointure.

Par exemple, l’étudiant Otto est inscrit deux fois au même cours dans la table enrollments.

Enregistrements dans enrollments :

student_id course_id
1 101
1 101

Maintenant, la requête avec JOIN donne ça :

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Résultat :

name course_name
Otto Mathématiques
Otto Mathématiques

Comment corriger : d’abord, vérifie qu’il n’y a pas de doublons dans tes tables. Sinon, si c’est normal, enlève les doublons avec DISTINCT :

SELECT DISTINCT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Erreur 4 : Perte de lignes avec INNER JOIN

INNER JOIN ne renvoie que les lignes qui matchent dans les deux tables. Si une des tables n’a pas la valeur correspondante, la ligne saute. Tu peux perdre des données si tu choisis pas le bon type de jointure.

Par exemple, on a un étudiant qui n’est inscrit à aucun cours :

Étudiants (students):

student_id name
1 Otto
2 Anna
3 Dhany

Inscriptions (enrollments):

student_id course_id
1 101
2 102

Maintenant, la requête avec INNER JOIN :

SELECT students.name, courses.course_name
FROM students
JOIN enrollments ON students.student_id = enrollments.student_id
JOIN courses ON enrollments.course_id = courses.course_id;

Résultat :

name course_name
Otto Mathématiques
Anna Histoire

Mais où est Dhany ? Si tu veux inclure les étudiants sans cours, il faut utiliser LEFT JOIN :

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id;

Erreur 5 : Mauvaise gestion des valeurs NULL

Si t’as des lignes avec des valeurs vides (NULL) dans une table, elles peuvent disparaître du résultat (genre si tu filtres après).

Exemple : tu utilises LEFT JOIN, mais ensuite tu ajoutes un WHERE pour filtrer.

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name = 'Mathématiques';

Du coup, les étudiants sans cours ne seront pas dans le résultat, même si t’as utilisé LEFT JOIN.

Comment corriger : si tu veux inclure les lignes sans cours, remplace WHERE par ON ou ajoute une condition :

SELECT students.name, courses.course_name
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
LEFT JOIN courses ON enrollments.course_id = courses.course_id
WHERE courses.course_name IS NULL OR courses.course_name = 'Mathématiques';

Erreur 6 : Confusion entre les types de jointures

Tu t’emmêles les pinceaux sur quel type de jointure utiliser. Genre tu mets un RIGHT JOIN alors qu’un LEFT JOIN aurait suffi, juste en changeant l’ordre des tables.

Comment éviter la confusion :

  • Utilise LEFT JOIN si tu peux. C’est plus intuitif.
  • Change l’ordre des tables pour éviter d’avoir besoin de RIGHT JOIN.
1
Étude/Quiz
JOINS multiples, niveau 12, leçon 4
Indisponible
JOINS multiples
JOINS multiples
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION