Dans le langage SQL, la commande LEFT JOIN (aussi appelée LEFT OUTER JOIN) est un type de jointure entre 2 tables. Cela permet de lister tous les résultats de la table de gauche (left = gauche) même s’il n’y a pas de correspondance dans la deuxième tables.
Syntaxe
Pour lister les enregistrement de table1, même s’il n’y a pas de correspondance avec table2, il convient d’effectuer une requête SQL utilisant la syntaxe suivante.
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.fk_id
La requête peux aussi s’écrire de la façon suivante :
SELECT * FROM table1 LEFT OUTER JOIN table2 ON table1.id = table2.fk_id
Cette requête est particulièrement intéressante pour récupérer les informations de table1 tout en récupérant les données associées, même s’il n’y a pas de correspondance avec table2. A savoir, s’il n’y a pas de correspondance les colonnes de table2 vaudront toutes NULL.
Exemple
Imaginons une application contenant des utilisateurs et des commandes pour chacun de ces utilisateurs. La base de données de cette application contient une table pour les utilisateurs et sauvegarde leurs achats dans une seconde table. Les 2 tables sont reliées grâce à la colonne utilisateur_id de la table des commandes. Cela permet d’associer une commande à un utilisateur.
Table utilisateur :
id | prenom | nom | ville | |
---|---|---|---|---|
1 | Aimée | Marechal | aime.marechal@example.com | Paris |
2 | Esmée | Lefort | esmee.lefort@example.com | Lyon |
3 | Marine | Prevost | m.prevost@example.com | Lille |
4 | Luc | Rolland | lucrolland@example.com | Marseille |
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 |
2 | 2013-02-21 | A00106 | 235.35 |
5 | 2013-03-02 | A00107 | 47.58 |
Pour lister tous les utilisateurs avec leurs commandes et afficher également les utilisateurs qui n’ont pas effectuées d’achats, il est possible d’utiliser la requête suivante:
SELECT * FROM utilisateur LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id
Résultats :
id | prenom | nom | date_achat | num_facture | prix_total |
---|---|---|---|---|---|
1 | Aimée | Marechal | 2013-01-23 | A00103 | 203.14 |
1 | Aimée | Marechal | 2013-02-14 | A00104 | 124.00 |
2 | Esmée | Lefort | 2013-02-17 | A00105 | 149.45 |
2 | Esmée | Lefort | 2013-02-21 | A00106 | 235.35 |
3 | Marine | Prevost | NULL | NULL | NULL |
4 | Luc | Rolland | NULL | NULL | NULL |
Les dernières lignes montrent des utilisateurs qui n’ont effectuée aucune commande. La ligne retourne la valeur NULL pour les colonnes concernant les achats qu’ils n’ont pas effectués.
Filtrer sur la valeur NULL
Attention, la valeur NULL n’est pas une chaîne de caractère. Pour filtrer sur ces caractères il faut utiliser la commande IS NULL. Par exemple, pour lister les utilisateurs qui n’ont pas effectués d’achats il est possible d’utiliser la requête suivante.
SELECT id, prenom, nom, utilisateur_id FROM utilisateur LEFT JOIN commande ON utilisateur.id = commande.utilisateur_id WHERE utilisateur_id IS NULL
Résultats :
id | prenom | nom | utilisateur_id |
---|---|---|---|
3 | Marine | Prevost | NULL |
4 | Luc | Rolland | NULL |