CodeGym /Cours /SQL SELF /Fusion complète des données avec FULL OUTER JOIN

Fusion complète des données avec FULL OUTER JOIN

SQL SELF
Niveau 11 , Leçon 4
Disponible

Aujourd'hui, on va plonger dans la forme la plus inclusive de la fusion de données — FULL OUTER JOIN. C'est la jointure où tout le monde est invité dans le résultat, même s'il n'a pas de pair.

FULL OUTER JOIN — c'est un type de jointure où toutes les lignes des deux tables sont retournées. Si une ligne d'une table n'a pas de correspondance dans l'autre, les valeurs manquantes dans le résultat seront remplacées par NULL. C'est comme faire la liste de toutes les personnes venues à deux soirées différentes : même si quelqu'un n'est venu qu'à l'une d'elles, il sera quand même compté.

Visuellement, ça donne ça :

Tableau A                     Tableau B
+----+----------+             +----+----------+
| id | nom      |             | id | cours    |
+----+----------+             +----+----------+
| 1  | Alice    |             | 2  | Math     |
| 2  | Bob      |             | 3  | Physique |
| 4  | Charlie  |             | 5  | Histoire |
+----+----------+             +----+----------+

FULL OUTER JOIN RÉSULTAT :
+----+----------+----------+
| id | nom      | cours    |
+----+----------+----------+
| 1  | Alice    | NULL     |
| 2  | Bob      | Math     |
| 3  | NULL     | Physique |
| 4  | Charlie  | NULL     |
| 5  | NULL     | Histoire |
+----+----------+----------+

Les lignes sans correspondance sont gardées, mais les colonnes manquantes sont remplies avec NULL.

Syntaxe de FULL OUTER JOIN

La syntaxe est simple, mais super puissante :

SELECT
    colonnes
FROM 
    table1
FULL OUTER JOIN 
    table2
ON table1.colonne_commune = table2.colonne_commune;

Le truc important ici — c'est FULL OUTER JOIN, qui dit à PostgreSQL de prendre toutes les lignes des deux tables. Si une ligne ne trouve pas de pair selon la condition ON, les valeurs sont remplacées par NULL.

Exemples d'utilisation

Regardons des exemples concrets avec la base de données university et les tables students et enrollments.

Exemple 1 : liste de tous les étudiants et cours

Imaginons qu'on a deux tables :

Table students :

student_id nom
1 Alice
2 Bob
3 Charlie

Table enrollments :

enrollment_id student_id cours
101 1 Math
102 2 Physique
103 4 Histoire

Notre but — faire une liste complète des étudiants et des cours, y compris ceux qui ne sont inscrits à aucun cours, et les cours sans étudiants.

Voilà la requête :

SELECT
    s.student_id, 
    s.nom, 
    e.cours
FROM 
    students s
FULL OUTER JOIN 
    enrollments e
ON 
    s.student_id = e.student_id;

Résultat :

student_id nom cours
1 Alice Math
2 Bob Physique
3 Charlie NULL
NULL NULL Histoire

Comme tu vois, tous les étudiants et tous les cours sont là. L'étudiant Charlie n'est inscrit à aucun cours, donc pour lui la colonne cours est NULL. Et le cours Histoire n'a pas d'étudiant, donc ses student_id et nom sont NULL.

Exemple 2 : Analyse des ventes et des produits

Maintenant, pensons à un magasin. On a deux tables :

Table products :

product_id nom
1 Ordinateur portable
2 Smartphone
3 Imprimante

Table sales :

sale_id product_id quantité
101 1 5
102 3 2
103 4 10

On veut obtenir la liste complète de tous les produits et ventes, y compris les produits jamais vendus et les ventes avec des product_id incorrects.

Requête :

SELECT
    p.product_id,
    p.nom AS nom_produit,
    s.quantité
FROM 
    products p
FULL OUTER JOIN 
    sales s
ON 
    p.product_id = s.product_id;

Résultat :

product_id nom_produit quantité
1 Ordinateur portable 5
2 Smartphone NULL
3 Imprimante 2
NULL NULL 10

Ici, on voit que Smartphone n'a pas été vendu (quantité = NULL), et la vente avec product_id = 4 ne correspond à aucun produit.

Exercice pratique

Essaie d'écrire une requête pour les tables departments et employees :

Table departments :

department_id nom_département
1 RH
2 IT
3 Marketing

Table employees :

employee_id department_id nom
101 1 Alice
102 2 Bob
103 4 Charlie

Écris un FULL OUTER JOIN pour obtenir la liste complète des départements et des employés. Remplis les données manquantes avec NULL.

Comment gérer les valeurs NULL

Le souci des valeurs NULL — c'est un effet inévitable du FULL OUTER JOIN. Par exemple, dans la vraie vie, tu pourrais vouloir remplacer les NULL par des valeurs plus parlantes. Dans PostgreSQL, tu peux faire ça avec la fonction COALESCE().

Exemple :

SELECT
    COALESCE(s.nom, 'Aucun étudiant') AS nom_étudiant,
    COALESCE(e.cours, 'Aucun cours') AS nom_cours
FROM 
    students s
FULL OUTER JOIN 
    enrollments e
ON 
    s.student_id = e.student_id;

Résultat :

nom_étudiant nom_cours
Alice Math
Bob Physique
Charlie Aucun cours
Aucun étudiant Histoire

Maintenant, au lieu de NULL, on voit des valeurs claires qui rendent les rapports plus lisibles.

Quand utiliser FULL OUTER JOIN

FULL OUTER JOIN est super utile quand tu veux voir toutes les données des deux tables, même si elles ne sont pas complètement liées. Exemples :

  • Rapports sur les ventes et les produits — pour voir à la fois les produits vendus et non vendus.
  • Analyse des étudiants et des cours — pour vérifier s'il y a des données manquantes.
  • Comparaison de listes — par exemple, pour trouver des différences entre deux ensembles de données.

J'espère que cette leçon t'a donné une bonne idée de ce que fait FULL OUTER JOIN. Maintenant, à toi de jouer dans le monde passionnant des jointures plus complexes et du traitement de données !

2
Mission
SQL SELF, niveau 11, leçon 4
Bloqué
Utilisation de FULL OUTER JOIN pour fusionner des données
Utilisation de FULL OUTER JOIN pour fusionner des données
2
Mission
SQL SELF, niveau 11, leçon 4
Bloqué
Comparer les étudiants et les cours en utilisant FULL OUTER JOIN
Comparer les étudiants et les cours en utilisant FULL OUTER JOIN
1
Étude/Quiz
Fusion de données, niveau 11, leçon 4
Indisponible
Fusion de données
Fusion de données
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION