← Tous les articles
Base de données

Les jointures SQL : INNER, LEFT, RIGHT et FULL JOIN expliquées

20 juillet 2026 · par Romain RICHER

Dès qu’une base de données contient plusieurs tables, une question revient sans cesse : comment croiser les informations de deux tables pour obtenir un résultat unique ? C’est le rôle des jointures SQL. Récupérer le nom du client associé à chaque commande, la désignation d’un produit à partir de son identifiant, le service d’un employé… tout cela passe par une jointure.

Il existe quatre grands types de jointures — INNER JOIN, LEFT JOIN, RIGHT JOIN et FULL JOIN — et choisir le bon fait toute la différence entre un résultat juste et un résultat trompeur. Cet article les explique un par un, avec des exemples concrets et leur résultat. Il complète notre panorama des requêtes SQL essentielles du quotidien.

Le jeu de données d’exemple

Tous les exemples s’appuient sur deux tables. Une table employes :

id_employe nom id_service
1 Martin 10
2 Durand 20
3 Petit 10
4 Moreau NULL

Et une table services :

id_service libelle
10 Informatique
20 Comptabilité
30 Marketing

Remarquez deux points qui vont tout illustrer : l’employé Moreau n’a pas de service (id_service à NULL), et le service Marketing (id 30) n’a aucun employé. Ce sont exactement ces cas « aux bords » qui distinguent les types de jointures.

Le principe d’une jointure

Une jointure relie deux tables sur une condition, généralement l’égalité entre une colonne de la première et une colonne de la seconde. Ici, le lien naturel est employes.id_service = services.id_service. La syntaxe générale est :

SELECT colonnes
FROM table1
[TYPE] JOIN table2
  ON table1.colonne = table2.colonne;

Le mot qui remplace [TYPE] (INNER, LEFT, RIGHT, FULL) détermine quelles lignes sont conservées quand la correspondance n’existe pas des deux côtés. C’est tout l’enjeu.

INNER JOIN : uniquement les correspondances

La jointure interne ne renvoie que les lignes qui ont une correspondance dans les deux tables. C’est la plus courante.

SELECT e.nom, s.libelle
FROM employes e
INNER JOIN services s
  ON e.id_service = s.id_service;

Résultat :

nom libelle
Martin Informatique
Durand Comptabilité
Petit Informatique

Moreau disparaît (son service est NULL, aucune correspondance) et Marketing disparaît aussi (aucun employé). L’INNER JOIN ne garde que l’intersection : les lignes appariées des deux côtés. Notez au passage l’usage des alias (e et s) qui allègent l’écriture.

LEFT JOIN : toute la table de gauche

La jointure gauche conserve toutes les lignes de la table de gauche (celle du FROM), même sans correspondance à droite. Les colonnes de droite sont alors remplies avec NULL.

SELECT e.nom, s.libelle
FROM employes e
LEFT JOIN services s
  ON e.id_service = s.id_service;

Résultat :

nom libelle
Martin Informatique
Durand Comptabilité
Petit Informatique
Moreau NULL

Cette fois Moreau apparaît, avec un service à NULL. C’est le grand intérêt du LEFT JOIN : ne perdre aucune ligne de la table principale. On l’utilise typiquement pour répondre à « tous les employés, avec leur service s’il existe ». Marketing, en revanche, reste absent (il n’est pas dans la table de gauche).

RIGHT JOIN : toute la table de droite

La jointure droite est le miroir de la précédente : elle conserve toutes les lignes de la table de droite, même sans correspondance à gauche.

SELECT e.nom, s.libelle
FROM employes e
RIGHT JOIN services s
  ON e.id_service = s.id_service;

Résultat :

nom libelle
Martin Informatique
Petit Informatique
Durand Comptabilité
NULL Marketing

Ici c’est Marketing qui apparaît (service sans employé, nom à NULL), tandis que Moreau disparaît. En pratique, le RIGHT JOIN est peu utilisé : on préfère souvent inverser l’ordre des tables et écrire un LEFT JOIN, plus lisible. Les deux formulations suivantes donnent le même résultat :

-- Ces deux requêtes sont équivalentes :
FROM employes e RIGHT JOIN services s ON …
FROM services s LEFT JOIN employes e ON …

FULL JOIN : tout des deux côtés

La jointure complète (ou FULL OUTER JOIN) conserve toutes les lignes des deux tables, appariées quand c’est possible, avec des NULL partout où la correspondance manque.

SELECT e.nom, s.libelle
FROM employes e
FULL JOIN services s
  ON e.id_service = s.id_service;

Résultat :

nom libelle
Martin Informatique
Durand Comptabilité
Petit Informatique
Moreau NULL
NULL Marketing

On retrouve à la fois Moreau et Marketing : le FULL JOIN ne laisse aucune ligne de côté. C’est utile pour repérer les « orphelins » des deux tables — par exemple les employés sans service et les services sans employé, en une seule requête.

Récapitulatif visuel

Type Lignes conservées Dans notre exemple
INNER JOIN Correspondances des deux côtés Ni Moreau, ni Marketing
LEFT JOIN Toute la table de gauche + Moreau
RIGHT JOIN Toute la table de droite + Marketing
FULL JOIN Tout des deux tables + Moreau et Marketing

Points d’attention et compatibilité

  • MySQL ne connaît pas FULL JOIN. Pour l’émuler, on combine un LEFT JOIN et un RIGHT JOIN avec UNION. Oracle, PostgreSQL et SQL Server le prennent en charge nativement.
  • Attention aux doublons. Si la colonne de jointure n’est pas unique dans une table, chaque ligne de gauche peut être associée à plusieurs lignes de droite — le résultat gonfle. Vérifiez toujours la cardinalité de votre lien. Pour accélérer les jointures sur de grosses tables, pensez aux index SQL.
  • Le mot OUTER est optionnel. LEFT JOIN et LEFT OUTER JOIN sont strictement équivalents ; de même pour RIGHT et FULL. INNER aussi peut être omis (un simple JOIN est un INNER JOIN).
  • Jointure sur plusieurs colonnes : la clause ON peut combiner plusieurs conditions avec AND, quand le lien repose sur plus d’une colonne.

En résumé

Le choix du type de jointure se résume à une question : quelles lignes voulez-vous garder quand la correspondance manque ? INNER pour l’intersection stricte, LEFT pour tout garder à gauche, RIGHT pour tout garder à droite, FULL pour ne rien perdre. Dans la pratique, INNER et LEFT couvrent l’immense majorité des besoins. Une fois ce réflexe acquis, les jointures deviennent l’un des outils les plus puissants du SQL pour croiser vos données. La prise en charge exacte (comme FULL JOIN) varie selon les moteurs : voyez notre comparatif des SGBD relationnels.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les commentaires sont modérés avant publication.