LEFT JOIN, garder tout d'un côté
INNER JOIN cache les lignes sans correspondance. LEFT JOIN les garde toutes — même les réalisateurs sans film — et marque l'absence avec NULL.
INNER JOIN cache ce qui manque
Depuis la leçon précédente, tu sais qu'un INNER JOIN entre films et realisateurs renvoie 4 lignes — un film par ligne. Pourtant la table realisateurs en contient 5. Lequel manquait ?
Table realisateurs — 5 réalisateurs au total
| id | nom | nationalite |
|---|---|---|
| 1 | Christopher Nolan | Britannique |
| 2 | Francis Ford Coppola | Américain |
| 3 | Quentin Tarantino | Américain |
| 4 | Jean-Pierre Jeunet | Français |
| 5 | Fritz Lang | Allemand |
Fritz Lang (id 5). Il est bien dans realisateurs, mais aucun film de la table films ne pointe vers son id. INNER JOIN l'a effacé : il ne garde que les lignes qui trouvent une correspondance dans les deux tables. Un réalisateur sans film n'en a aucune — il disparaît.
Pour qu'il apparaisse quand même — avec ou sans film — il faut un autre type de jointure : LEFT JOIN.
LEFT JOIN : garder tout à gauche
La syntaxe est presque identique à INNER JOIN — seul INNER devient LEFT. La règle : LEFT JOIN garde toutes les lignes de la table placée à gauche (après FROM), qu'elles aient ou non une correspondance dans la table de droite.
Ici, realisateurs est à gauche : FROM realisateurs LEFT JOIN films. Les 5 réalisateurs apparaissent tous — y compris Fritz Lang.
SELECT realisateurs.nom AS realisateur, films.titre
FROM realisateurs
LEFT JOIN films ON films.realisateur_id = realisateurs.id
ORDER BY realisateurs.id| realisateur | titre |
|---|---|
| Christopher Nolan | Inception |
| Francis Ford Coppola | Le Parrain |
| Quentin Tarantino | Pulp Fiction |
| Jean-Pierre Jeunet | Amélie Poulain |
| Fritz Lang | (NULL) |
5 lignes — 4 réalisateurs avec leur film, et Fritz Lang en ligne 5 avec NULL pour titre : il est dans realisateurs mais aucun film ne pointe vers lui. Même condition ON qu'avec INNER JOIN : seul le mot INNER devient LEFT.
Que signifie NULL ici ?
Pour Fritz Lang, LEFT JOIN ne peut pas remplir la colonne titre avec des données qui n'existent pas. Il met NULL — la valeur qui signifie « absent, sans correspondance ».
La ligne 5 du résultat précédent en est la preuve :
SELECT realisateurs.nom AS realisateur, films.titre
FROM realisateurs
LEFT JOIN films ON films.realisateur_id = realisateurs.id
WHERE realisateurs.nom = 'Fritz Lang'| realisateur | titre |
|---|---|
| Fritz Lang | (NULL) |
(NULL) n'est ni une chaîne vide, ni zéro : c'est l'absence de valeur. Tu avais déjà rencontré NULL dans la leçon sur les valeurs manquantes (P2), pour des colonnes vides (budget_dollars absent pour certains films). Ici, les NULL viennent d'une absence de ligne dans la table de droite — Fritz Lang existe dans realisateurs, mais aucun film ne pointe vers son id.
LEFT JOIN + IS NULL : isoler les manquants
Puisque LEFT JOIN place NULL dans les colonnes de films pour les réalisateurs sans correspondance, on peut cibler précisément ces lignes avec WHERE films.titre IS NULL.
C'est la combinaison la plus utile de LEFT JOIN : elle révèle ce qui manque dans une relation.
SELECT realisateurs.nom AS realisateur
FROM realisateurs
LEFT JOIN films ON films.realisateur_id = realisateurs.id
WHERE films.titre IS NULL| realisateur |
|---|
| Fritz Lang |
1 seule ligne — Fritz Lang est le seul réalisateur sans film dans notre sélection. Piège courant : remplacer LEFT JOIN par INNER JOIN dans cette requête. INNER JOIN ... WHERE films.titre IS NULL renvoie toujours zéro ligne : INNER JOIN a déjà éliminé les lignes sans correspondance avant que IS NULL ne s'applique.
RIGHT JOIN : l'inverse (rare)
RIGHT JOIN fait l'inverse : il garde toutes les lignes de la table à droite (après JOIN), même sans correspondance à gauche. Avec films RIGHT JOIN realisateurs ON ..., Fritz Lang apparaîtrait quand même — c'est le même résultat que notre LEFT JOIN, écrit différemment.
En pratique, on l'utilise rarement. Tout résultat obtenu avec RIGHT JOIN peut se réécrire en LEFT JOIN en inversant l'ordre des tables — et LEFT JOIN est la convention lisible dans les équipes. Son existence est à connaître ; son usage quotidien quasi nul.
Récapitulatif
Ce que tu retiens de cette leçon :
SELECT realisateurs.nom AS realisateur, films.titreFROM realisateurs LEFT JOIN films ON films.realisateur_id = realisateurs.idWHERE films.titre IS NULL💡 Bon à savoir : WHERE films.titre IS NULL (aucun film pour ce réalisateur) est différent de WHERE films.oscar IS NULL (le champ oscar manque pour un film qui existe bien). La prochaine leçon complète le tableau avec UNION et les jointures à 3 tables.
Passe à la pratique
Cette leçon t'a montré la théorie. Pour maîtriser SQL, rien ne vaut la pratique : accède aux exercices et au bac à sable PostgreSQL réel.