Imagine que chaque table dans ta base, c’est une pièce d’un gros puzzle. La table des étudiants sait qui étudie, la table des cours — ce qu’on enseigne, et la table des inscriptions — qui est inscrit à quoi. Mais séparément, ces morceaux ne disent pas grand-chose. Tu veux voir l’image complète ? Il faut les assembler — et c’est là que le multiple JOIN entre en scène.
Dans la vraie vie, les données sont souvent organisées dans des tables liées pour garder une structure propre et éviter la redondance. Par exemple, dans notre base universitaire, on a les tables suivantes :
students— données sur les étudiants.enrollments— infos sur les inscriptions des étudiants aux cours.courses— infos sur les cours.
Si on veut la liste complète des étudiants, leurs cours et les profs, il faut joindre les trois tables avec JOIN.
Ordre d’exécution des JOIN
Quand tu utilises plusieurs JOIN, PostgreSQL les traite de gauche à droite. Ça veut dire qu’il commence par joindre les deux premières tables, puis le résultat est joint à la troisième, et ainsi de suite.
Exemple :
SELECT *
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
- D’abord, les tables
studentsetenrollmentssont jointes sur la colonnestudents.id = enrollments.student_id. - Le résultat de cette jointure est utilisé pour joindre la table
coursessur la colonneenrollments.course_id = courses.id.
L’ordre d’exécution est super important quand tu bosses avec de grosses tables. Une mauvaise structure de JOIN peut vraiment plomber les perfs.
Exemple : Liste des étudiants, de leurs cours et des profs
Imaginons qu’on a les tables suivantes avec des données :
Table students :
| id | name |
|---|---|
| 1 | Otto Song |
| 2 | Maria Chi |
| 3 | Alex Lin |
Table courses :
| id | name | teacher |
|---|---|---|
| 101 | Mathematics | Ellen Moore |
| 102 | Physics | James Okoro |
| 103 | Computer Science | Nina Delgado |
Table enrollments :
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 103 |
| 2 | 102 |
| 3 | 101 |
Requête :
SELECT
students.name AS student_name,
courses.name AS course_name,
courses.teacher AS teacher_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
Résultat :
| student_name | course_name | teacher_name |
|---|---|---|
| Otto Song | Mathematics | Ellen Moore |
| Otto Song | Computer Science | Nina Delgado |
| Maria Chi | Physics | James Okoro |
| Alex Lin | Mathematics | Ellen Moore |
Filtrage dans les requêtes avec plusieurs JOIN
Tu peux appliquer des conditions de filtrage dans les requêtes avec JOIN pour limiter le nombre de résultats et accélérer la requête. Par exemple, si tu veux afficher seulement les étudiants inscrits au cours "Mathematics" :
SELECT
students.name AS student_name,
courses.name AS course_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
WHERE courses.name = 'Mathematics';
Résultat :
| student_name | course_name |
|---|---|
| Otto Song | Mathematics |
| Alex Lin | Mathematics |
Optimisation des requêtes avec plusieurs JOIN
Quand tu bosses avec de grosses tables, optimiser tes requêtes devient super important. Voilà quelques tips :
- Utilise des index
Les index permettent à PostgreSQL d’aller plus vite, surtout quand tu joins sur des champs clés. Vérifie que tu as des index sur les colonnes student_id et course_id dans la table enrollments.
Exemple de création d’index :
CREATE INDEX idx_enrollments_student_id ON enrollments(student_id);
CREATE INDEX idx_enrollments_course_id ON enrollments(course_id);
Tu verras plus de détails sur les index dans les prochains niveaux, mais je voulais quand même en parler ici. Ils sont très souvent liés aux JOIN.
- Filtre les données le plus tôt possible
Utilise des conditions WHERE pour réduire le nombre de lignes à traiter avant de faire le JOIN. Par exemple :
SELECT
students.name AS student_name,
courses.name AS course_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
WHERE
courses.teacher = 'Ivan Petrov';
- Minimise le nombre de lignes à joindre
Au lieu de joindre toutes les lignes de deux tables, essaye d’abord de les filtrer avec des sous-requêtes :
SELECT
students.name AS student_name,
courses.name AS course_name
FROM
(SELECT * FROM students WHERE id IN (1, 2)) sub_students
INNER JOIN enrollments ON sub_students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
Tu verras plus sur les SELECT imbriqués littéralement au prochain niveau :P
Exemple de jointure complexe : étudiants, cours et facultés
Imaginons qu’on ajoute une table faculties :
Table faculties :
| id | name |
|---|---|
| 10 | Engineering |
| 20 | Natural Sciences |
Table courses mise à jour :
| id | name | teacher | faculty_id |
|---|---|---|---|
| 101 | Mathematics | Ellen Moore | 10 |
| 102 | Physics | James Okoro | 20 |
| 103 | Computer Science | Nina Delgado | 10 |
Pour avoir la liste des étudiants, des cours et des facultés, on ajoute encore un JOIN :
SELECT
students.name AS student_name,
courses.name AS course_name,
faculties.name AS faculty_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
INNER JOIN faculties ON courses.faculty_id = faculties.id;
Résultat :
| student_name | course_name | faculty_name |
|---|---|---|
| Otto Song | Mathematics | Engineering |
| Otto Song | Computer Science | Engineering |
| Maria Chi | Physics | Natural Sciences |
| Alex Lin | Mathematics | Engineering |
Les requêtes SQL avec plusieurs JOIN peuvent être costaudes, mais elles permettent de faire des rapports puissants et de sortir des infos précieuses. Si tu les optimises et structures bien, ça devient ton outil ultime pour gérer de grosses bases de données.
GO TO FULL VERSION