Skip to content

FULL JOIN – Jointure externe complète

Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes


Dans le langage SQL, la commande FULL JOIN (ou FULL OUTER JOIN) permet de faire une jointure entre 2 tables. L’utilisation de cette commande permet de combiner les résultats des 2 tables, les associer entre eux grâce à une condition, et remplir avec des valeurs NULL si la condition n’est pas respectée.

Bon à savoir : FULL JOIN retourne toutes les lignes de la table de gauche et toutes les lignes de la table de droite. Les lignes qui correspondent sont associées, et les lignes sans correspondance dans l’autre table apparaissent avec des NULL.


Pour retourner les enregistrements de table1 et table2, il convient d’utiliser une requête SQL avec une syntaxe telle que celle-ci :

SELECT *
FROM table1
FULL JOIN table2 ON table1.id = table2.fk_id;

Cette requête peut aussi être conçue de cette façon :

SELECT *
FROM table1
FULL OUTER JOIN table2 ON table1.id = table2.fk_id;

Les deux syntaxes sont équivalentes. Le mot-clé OUTER est optionnel.

Remarque : FULL JOIN est l’union d’un LEFT JOIN et d’un RIGHT JOIN. Toutes les lignes des deux tables sont conservées.


Prenons l’exemple d’une base de données qui contient une table utilisateur ainsi qu’une table commande qui contient toutes les ventes.

Table « utilisateur » :

id prenom nom email ville actif
1 Aimée Marechal [email protected] Paris 1
2 Esmée Lefort [email protected] Lyon 0
3 Marine Prevost [email protected] Lille 1
4 Luc Rolland [email protected] Marseille 1

Table « commande » :

utilisateur_id date_achat num_facture prix_total
1 2013-01-23 A00103 203.14
1 2013-02-14 A00104 124.00
2 2013-02-17 A00105 149.45
3 2013-02-21 A00106 235.35
5 2013-03-02 A00107 47.58

Il est possible d’utiliser FULL JOIN pour lister tous les utilisateurs ayant effectué ou non une vente, et de lister toutes les ventes qui sont associées ou non à un utilisateur. La requête SQL est la suivante :

SELECT utilisateur.id,
utilisateur.prenom,
utilisateur.nom,
commande.utilisateur_id,
commande.date_achat,
commande.num_facture
FROM utilisateur
FULL JOIN commande ON utilisateur.id = commande.utilisateur_id;

Résultat :

id prenom nom utilisateur_id date_achat num_facture
1 Aimée Marechal 1 2013-01-23 A00103
1 Aimée Marechal 1 2013-02-14 A00104
2 Esmée Lefort 2 2013-02-17 A00105
3 Marine Prevost 3 2013-02-21 A00106
4 Luc Rolland NULL NULL NULL
NULL NULL NULL 5 2013-03-02 A00107

Observations :

  • L’utilisateur numéro 4 (Luc) n’a effectué aucun achat → il apparaît avec des NULL pour les colonnes de commande.
  • La facture A00107 est associée à un utilisateur qui n’existe pas (id 5) → elle apparaît avec des NULL pour les colonnes de l’utilisateur.
  • Toutes les lignes des deux tables sont conservées.

Utiliser des alias pour simplifier la requête

Section titled “Utiliser des alias pour simplifier la requête”
SELECT u.id, u.prenom, u.nom,
c.utilisateur_id, c.date_achat, c.num_facture
FROM utilisateur u
FULL JOIN commande c ON u.id = c.utilisateur_id;

FULL JOIN avec condition supplémentaire (WHERE vs ON)

Section titled “FULL JOIN avec condition supplémentaire (WHERE vs ON)”

Comme pour les autres jointures, la position de la condition influence le résultat.

SELECT u.id, u.nom, c.date_achat, c.prix_total
FROM utilisateur u
FULL JOIN commande c ON u.id = c.utilisateur_id AND c.prix_total > 150;

Résultat :

id nom date_achat prix_total
1 Aimée 2013-01-23 203.14
1 Aimée NULL NULL
2 Esmée NULL NULL
3 Marine 2013-02-21 235.35
4 Luc NULL NULL
NULL NULL 2013-03-02 47.58

Explication : La condition c.prix_total > 150 s’applique uniquement aux lignes correspondantes. Tous les utilisateurs et toutes les commandes sont conservés, mais seules les commandes de plus de 150€ sont associées.

SELECT u.id, u.nom, c.date_achat, c.prix_total
FROM utilisateur u
FULL JOIN commande c ON u.id = c.utilisateur_id
WHERE c.prix_total > 150;

Résultat :

id nom date_achat prix_total
1 Aimée 2013-01-23 203.14
3 Marine 2013-02-21 235.35

Explication : La condition WHERE filtre le résultat final. Les utilisateurs sans commande (Luc) et les commandes sans utilisateur (A00107) sont exclus, car ils ont NULL dans prix_total. Le FULL JOIN se comporte alors comme un INNER JOIN.


On peut enchaîner plusieurs FULL JOIN :

SELECT u.nom, c.date_achat, p.nom AS produit_nom
FROM utilisateur u
FULL JOIN commande c ON u.id = c.utilisateur_id
FULL JOIN commande_produit cp ON c.id = cp.commande_id
FULL JOIN produit p ON cp.produit_id = p.id;

Remarque : Les FULL JOIN multiples peuvent devenir complexes à interpréter. Utilisez-les avec précaution.


Un FULL JOIN peut être reproduit en utilisant l’union d’un LEFT JOIN et d’un RIGHT JOIN :

SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.fk_id
UNION
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.id = table2.fk_id;

Cette approche est parfois utilisée dans des SGBD qui ne supportent pas FULL JOIN nativement.


SGBD Support de FULL JOIN
PostgreSQL Oui (FULL JOIN ou FULL OUTER JOIN)
SQL Server Oui (FULL JOIN ou FULL OUTER JOIN)
SQLite Non (pas de support natif)
MySQL Non (pas de support natif avant 8.0.1)
Oracle Oui (FULL OUTER JOIN), mais attention aux performances

Alternative pour MySQL (avant 8.0.1) :

SELECT u.id, u.nom, c.date_achat, c.prix_total
FROM utilisateur u
LEFT JOIN commande c ON u.id = c.utilisateur_id
UNION
SELECT u.id, u.nom, c.date_achat, c.prix_total
FROM utilisateur u
RIGHT JOIN commande c ON u.id = c.utilisateur_id;

Type de jointure Résultat
INNER JOIN Uniquement les lignes correspondantes
LEFT JOIN Toutes les lignes de la table de gauche + correspondances
RIGHT JOIN Toutes les lignes de la table de droite + correspondances
FULL JOIN Toutes les lignes des deux tables + correspondances

  1. Utilisez FULL JOIN uniquement lorsque vous avez besoin de toutes les lignes des deux tables.

  2. Faites attention aux performances : FULL JOIN peut être coûteux sur de grandes tables, car il nécessite de traiter toutes les lignes des deux côtés.

  3. Préférez LEFT JOIN ou RIGHT JOIN si vous n’avez besoin de conserver que les lignes d’une seule table.

  4. Faites la différence entre les conditions dans ON et WHERE pour contrôler précisément le résultat.

  5. Testez avec des données représentatives avant d’exécuter un FULL JOIN en production.

  6. Si votre SGBD ne supporte pas FULL JOIN, utilisez l’alternative LEFT JOIN ... UNION ... RIGHT JOIN en veillant à éliminer les doublons si nécessaire.


Vous savez désormais comment utiliser FULL JOIN pour conserver toutes les lignes des deux tables. Mais que faire si vous souhaitez joindre une table avec elle-même ?

👉 Chapitre 37 : SELF JOIN – Auto-jointure


Bonne continuation !
Junior TSAFACK – 08/08/2026