Pourquoi les jointures sont essentielles en SQL ?
En NSI, quand tu commences à travailler avec des bases de données, tu te rends vite compte que les informations sont souvent éclatées dans plusieurs tables. Imagine une base de données pour un lycée : tu as une table Élèves avec les noms et prénoms, et une table Notes avec les résultats. Pour savoir qui a eu quelle note, il faut relier ces deux tables. C'est exactement le rôle des jointures (JOIN en anglais). Elles sont le cœur de la puissance de SQL pour interroger des données complexes. Sans elles, tu serais obligé de faire des requêtes séparées et de tout recoller toi-même dans ton programme, ce qui serait long et peu efficace.
Le principe de base : les clés primaires et étrangères
Avant de plonger dans les jointures, il faut absolument comprendre deux concepts clés :
- Clé primaire (PK) : Un identifiant unique pour chaque enregistrement dans une table. Par exemple, un
id_elevedans la table Élèves. - Clé étrangère (FK) : Une colonne dans une table qui fait référence à la clé primaire d'une autre table. Par exemple, la colonne
eleve_iddans la table Notes, qui pointe versid_elevedans la table Élèves.
C'est sur ces liens entre clés primaires et étrangères que les jointures opèrent leur magie. Pour nos exemples, nous allons utiliser deux tables simples :
Table `eleves`
id | nom
1 | Alice
2 | Bruno
3 | Clara
Table `notes`
id | eleve_id | note
1 | 1 | 15
2 | 1 | 17
3 | 3 | 12
INNER JOIN : La jointure par défaut (l'intersection)
C'est la jointure la plus courante. INNER JOIN ne retourne que les enregistrements qui ont une correspondance dans les deux tables. Si on reprend nos schémas, c'est comme si on prenait seulement la zone où les deux cercles (les deux tables) se chevauchent.
Schéma mental : Imagine deux ensembles qui s'intersectent. Seuls les éléments présents dans les deux ensembles sont sélectionnés.
Requête pour lier les élèves à leurs notes :
SELECT eleves.nom, notes.note
FROM eleves
INNER JOIN notes ON eleves.id = notes.eleve_id;Résultat :
Alice | 15
Alice | 17
Clara | 12
Note que Bruno n'apparaît pas car il n'a aucune note dans la table `notes`. Seules les correspondances parfaites sont conservées.
LEFT JOIN et RIGHT JOIN : Inclure tous les éléments d'un côté
Parfois, tu veux voir tous les élèves, même ceux qui n'ont pas de note. C'est là que LEFT JOIN (jointure gauche) entre en jeu. Elle retourne tous les enregistrements de la table de gauche (celle après FROM), et les correspondances de la table de droite. S'il n'y a pas de correspondance, les colonnes de la table de droite contiennent NULL.
Schéma mental : Tu prends tout le cercle de gauche, et tu y attaches les parties du cercle de droite qui s'y superposent. Le reste du cercle de gauche reste visible, mais vide de l'autre côté.
SELECT eleves.nom, notes.note
FROM eleves
LEFT JOIN notes ON eleves.id = notes.eleve_id;Résultat :
Alice | 15
Alice | 17
Bruno | NULL
Clara | 12
Bruno apparaît maintenant, mais avec une note à NULL. RIGHT JOIN fonctionne de manière symétrique : elle retourne tous les enregistrements de la table de droite. En pratique, LEFT JOIN est beaucoup plus utilisé.
FULL OUTER JOIN : L'union complète
Cette jointure, parfois appelée FULL JOIN, est moins courante mais très utile pour un audit complet. Elle retourne tous les enregistrements des deux tables, qu'il y ait une correspondance ou non. Là où il n'y a pas de correspondance, les colonnes de l'autre table contiennent NULL.
Schéma mental : Tu prends l'union des deux cercles en entier. Tous les éléments des deux tables sont présents.
SELECT eleves.nom, notes.note
FROM eleves
FULL OUTER JOIN notes ON eleves.id = notes.eleve_id;Résultat (théorique, selon nos données) :
Alice | 15
Alice | 17
Bruno | NULL
Clara | 12
NULL | [note sans élève?] -> Dans notre exemple, ce cas n'existe pas.
Attention, MySQL ne supporte pas nativement FULL OUTER JOIN. Il faut simuler cela avec une UNION de LEFT JOIN et RIGHT JOIN. C'est une bonne question d'approfondissement !
Résumé visuel et tableau comparatif
Pour bien fixer les idées, voici un tableau récapitulatif des 4 jointures principales :
- INNER JOIN : Intersection. Que les correspondances parfaites.
- LEFT JOIN : Tout depuis la table principale (gauche) + correspondances à droite.
- RIGHT JOIN : Tout depuis la table secondaire (droite) + correspondances à gauche.
- FULL OUTER JOIN : Union totale des deux tables.
Le meilleur conseil pour les maîtriser ? Dessine-toi les schémas en cercle (diagrammes de Venn) au brouillon quand tu construis ta requête. Demande-toi toujours : "Est-ce que je veux tous les éléments de cette table, même sans correspondance ?"
Aller plus loin : jointures multiples et astuces NSI
Dans un vrai projet, tu auras souvent besoin d'enchaîner les jointures. Par exemple, pour relier Élèves -> Inscriptions -> Matières. La logique reste la même, tu ajoutes simplement un autre JOIN ... ON ....
SELECT eleves.nom, matieres.nom_matiere
FROM eleves
INNER JOIN inscriptions ON eleves.id = inscriptions.eleve_id
INNER JOIN matieres ON inscriptions.matiere_id = matieres.id;Astuce pour l'épreuve pratique : Sois méthodique. Identifie bien tes tables sources (FROM), détermine le type de jointure dont tu as besoin, et écris tes conditions ON avec soin en reliant les clés primaires et étrangères. Un alias (ex: FROM eleves AS e) peut rendre tes requêtes plus lisibles.
