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

idnomnationalite
1Christopher NolanBritannique
2Francis Ford CoppolaAméricain
3Quentin TarantinoAméricain
4Jean-Pierre JeunetFrançais
5Fritz LangAllemand

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.

La requête
SELECT realisateurs.nom AS realisateur, films.titre FROM realisateurs LEFT JOIN films ON films.realisateur_id = realisateurs.id ORDER BY realisateurs.id
Résultat — 5 réalisateurs, dont un sans film · 5 lignes
realisateurtitre
Christopher NolanInception
Francis Ford CoppolaLe Parrain
Quentin TarantinoPulp Fiction
Jean-Pierre JeunetAmé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 :

La requête
SELECT realisateurs.nom AS realisateur, films.titre FROM realisateurs LEFT JOIN films ON films.realisateur_id = realisateurs.id WHERE realisateurs.nom = 'Fritz Lang'
La ligne Fritz Lang dans le résultat LEFT JOIN · 1 ligne
realisateurtitre
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.

La requête
SELECT realisateurs.nom AS realisateur FROM realisateurs LEFT JOIN films ON films.realisateur_id = realisateurs.id WHERE films.titre IS NULL
Réalisateur(s) sans film dans notre sélection · 1 ligne
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 :

📌 LEFT JOIN — l'essentiel
INNER JOIN→ seulement les correspondances (Fritz Lang absent)
LEFT JOIN→ toute la table de gauche + matches à droite (trous = NULL)
NULL dans le résultat→ absence de correspondance dans la table de droite
LEFT JOIN + WHERE x IS NULL→ trouver les lignes sans correspondance
RIGHT JOIN→ rare : préférer réécrire en LEFT JOIN en inversant les tables
Exemple complet
SELECT realisateurs.nom AS realisateur, films.titre
FROM realisateurs LEFT JOIN films ON films.realisateur_id = realisateurs.id
WHERE 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.

← Tous les cours SQL