Code SQL copié dans le presse-papiers
RU EN PT

Leçon 5.5 : FULL OUTER JOIN — Tout combiner des deux tables

Le FULL OUTER JOIN est le type de jointure le plus inclusif. Il retourne toutes les lignes lorsqu'il y a une correspondance dans l'une ou l'autre table. C'est essentiellement une combinaison de LEFT JOIN et de RIGHT JOIN.

Qu'est-ce qu'un FULL OUTER JOIN ?

Un FULL OUTER JOIN crée un résultat qui inclut tous les enregistrements des deux tables :

  • Si une ligne correspond, les colonnes des deux tables sont remplies.
  • Si une ligne de gauche n'a pas de correspondance à droite, les colonnes de droite sont NULL.
  • Si une ligne de droite n'a pas de correspondance à gauche, les colonnes de gauche sont NULL.

Visualisation :

   Table A (potential_leads)    Table B (active_clients)
   +----+----------+            +----+----------+
   | id | name     |            | id | status   |
   +----+----------+            +----+----------+
   | 1  | Alice    | <--------> | 1  | Active   | (Correspondance !)
   | 2  | Bob      | <--------? | NULL          | (Lead uniquement, pas encore client)
   | NULL          | <--------> | 3  | Active   | (Client uniquement, pas dans les leads)
   +----+----------+            +----+----------+

Syntaxe du FULL OUTER JOIN

SELECT
    table1.column1,
    table2.column2
FROM
    table1
FULL OUTER JOIN
    table2 ON table1.common_column = table2.common_column;

Attention à la compatibilité : Toutes les bases de données ne supportent pas FULL OUTER JOIN nativement.

  • PostgreSQL, SQL Server et Oracle le supportent.
  • MySQL et MariaDB ne le supportent PAS.

Astuce pour MySQL/MariaDB

Comme MySQL ne propose pas FULL OUTER JOIN, on obtient le même résultat en combinant un LEFT JOIN et un RIGHT JOIN avec UNION :

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

Exemple pratique

Imaginons que l'on fusionne les données de deux agences. L'agence A a sa propre liste de clients, l'agence B aussi. On veut une liste complète de tous les clients, montrant où ils se recoupent.

SELECT
    a.customer_name AS branch_a_name,
    b.customer_name AS branch_b_name
FROM
    branch_a_customers AS a
FULL OUTER JOIN
    branch_b_customers AS b ON a.customer_id = b.customer_id;

Points clés de cette leçon

  • FULL OUTER JOIN retourne tous les enregistrements des deux tables.
  • Il utilise des NULL pour combler les manques de correspondance.
  • C'est l'outil idéal pour synchroniser des bases ou trouver des différences entre deux listes.
  • Si votre base ne le supporte pas (comme MySQL), utilisez une UNION de LEFT et RIGHT JOIN.