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 JOINretourne 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 desNULL.
Syntaxe
Section titled “Syntaxe”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 table1FULL JOIN table2 ON table1.id = table2.fk_id;Cette requête peut aussi être conçue de cette façon :
SELECT *FROM table1FULL OUTER JOIN table2 ON table1.id = table2.fk_id;Les deux syntaxes sont équivalentes. Le mot-clé OUTER est optionnel.
Remarque :
FULL JOINest l’union d’unLEFT JOINet d’unRIGHT JOIN. Toutes les lignes des deux tables sont conservées.
Exemple concret
Section titled “Exemple concret”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 | 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_factureFROM utilisateurFULL 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
NULLpour les colonnes de commande. - La facture A00107 est associée à un utilisateur qui n’existe pas (id 5) → elle apparaît avec des
NULLpour 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_factureFROM utilisateur uFULL 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.
Condition dans ON (JOIN)
Section titled “Condition dans ON (JOIN)”SELECT u.id, u.nom, c.date_achat, c.prix_totalFROM utilisateur uFULL 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 > 150s’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.
Condition dans WHERE
Section titled “Condition dans WHERE”SELECT u.id, u.nom, c.date_achat, c.prix_totalFROM utilisateur uFULL JOIN commande c ON u.id = c.utilisateur_idWHERE 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
WHEREfiltre le résultat final. Les utilisateurs sans commande (Luc) et les commandes sans utilisateur (A00107) sont exclus, car ils ontNULLdansprix_total. LeFULL JOINse comporte alors comme unINNER JOIN.
FULL JOIN avec plusieurs tables
Section titled “FULL JOIN avec plusieurs tables”On peut enchaîner plusieurs FULL JOIN :
SELECT u.nom, c.date_achat, p.nom AS produit_nomFROM utilisateur uFULL JOIN commande c ON u.id = c.utilisateur_idFULL JOIN commande_produit cp ON c.id = cp.commande_idFULL JOIN produit p ON cp.produit_id = p.id;Remarque : Les
FULL JOINmultiples peuvent devenir complexes à interpréter. Utilisez-les avec précaution.
Équivalence entre FULL JOIN et UNION
Section titled “Équivalence entre FULL JOIN et UNION”Un FULL JOIN peut être reproduit en utilisant l’union d’un LEFT JOIN et d’un RIGHT JOIN :
SELECT *FROM table1LEFT JOIN table2 ON table1.id = table2.fk_idUNIONSELECT *FROM table1RIGHT JOIN table2 ON table1.id = table2.fk_id;Cette approche est parfois utilisée dans des SGBD qui ne supportent pas FULL JOIN nativement.
Compatibilité entre SGBD
Section titled “Compatibilité entre SGBD”| 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_totalFROM utilisateur uLEFT JOIN commande c ON u.id = c.utilisateur_idUNIONSELECT u.id, u.nom, c.date_achat, c.prix_totalFROM utilisateur uRIGHT JOIN commande c ON u.id = c.utilisateur_id;Comparaison des jointures
Section titled “Comparaison des jointures”| 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 |
Bonnes pratiques
Section titled “Bonnes pratiques”-
Utilisez
FULL JOINuniquement lorsque vous avez besoin de toutes les lignes des deux tables. -
Faites attention aux performances :
FULL JOINpeut être coûteux sur de grandes tables, car il nécessite de traiter toutes les lignes des deux côtés. -
Préférez
LEFT JOINouRIGHT JOINsi vous n’avez besoin de conserver que les lignes d’une seule table. -
Faites la différence entre les conditions dans
ONetWHEREpour contrôler précisément le résultat. -
Testez avec des données représentatives avant d’exécuter un
FULL JOINen production. -
Si votre SGBD ne supporte pas
FULL JOIN, utilisez l’alternativeLEFT JOIN ... UNION ... RIGHT JOINen veillant à éliminer les doublons si nécessaire.
Prochain chapitre
Section titled “Prochain chapitre”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