Imagine que tu as deux tables : une liste d'étudiants et une liste de leurs inscriptions aux cours. Tous les étudiants ne sont pas inscrits à des cours, et tu veux voir la liste complète de tous les étudiants, y compris ceux qui, pour une raison ou une autre, n'ont pas encore choisi de cours. Avec INNER JOIN, tu ne verras que ceux qui sont inscrits à des cours, mais qu'en est-il des autres étudiants ? C'est là qu'intervient le LEFT JOIN.
LEFT JOIN renvoie toutes les lignes de la table de gauche (celle qui est indiquée en premier dans la requête) et les lignes correspondantes de la table de droite. S'il n'y a pas de correspondance, les colonnes de la table de droite auront la valeur NULL.
Syntaxe de LEFT JOIN
SELECT
table1.colonne1,
table1.colonne2,
table2.colonne1,
table2.colonne2
FROM
table1 LEFT JOIN table2
ON
table1.colonne_commune = table2.colonne_commune;
table1— c'est la table "de gauche".table2— c'est la table "de droite".colonne_commune— la colonne commune sur laquelle on fait la jointure.
Exemple simple
Si la table students ressemble à ça :
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
Et la table enrollments ressemble à ça :
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Mathématiques |
| 2 | 1 | Physique |
| 3 | 2 | Biologie |
Alors la requête :
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
donnera :
| name | course |
|---|---|
| Otto | Mathématiques |
| Otto | Physique |
| Anna | Biologie |
| Peter | NULL |
Comme tu peux le voir, tous les étudiants restent dans le résultat, même Peter, qui ne s'est pas encore inscrit à un cours. Pour Peter, dans la colonne course, tu as NULL.
Exemples d'utilisation de LEFT JOIN
Exemple 1 : Obtenir la liste de tous les étudiants et leurs cours
Regardons le cas où tu veux la liste complète des étudiants avec les cours auxquels ils sont inscrits, s'il y en a. Si un étudiant n'a pas encore choisi de cours, ça doit aussi apparaître.
La même requête :
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Résultat :
| name | course |
|---|---|
| Otto | Mathématiques |
| Otto | Physique |
| Anna | Biologie |
| Peter | NULL |
C'est un exemple classique d'utilisation de LEFT JOIN.
Exemple 2 : Afficher les produits et leurs ventes
Imaginons que tu as deux tables :
La table products, qui contient tous les produits :
| product_id | product_name |
|---|---|
| 1 | Smartphone |
| 2 | Tablette |
| 3 | Ordinateur portable |
La table sales, qui contient les données de ventes :
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
Maintenant tu veux voir tous les produits et la quantité vendue, y compris ceux qui n'ont pas encore été vendus.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Résultat :
| product_name | total_sold |
|---|---|
| Smartphone | 8 |
| Tablette | 2 |
| Ordinateur portable | NULL |
Particularités et problèmes avec LEFT JOIN
Est-ce qu'on veut toujours du NULL ?
Parfois, LEFT JOIN ajoute du NULL là où tu ne t'y attends pas. Dans ces cas-là, tu peux remplacer NULL par une valeur plus parlante avec la fonction COALESCE().
SELECT
students.name,
COALESCE(enrollments.course, 'Cours non choisi') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Résultat :
| name | course |
|---|---|
| Otto | Mathématiques |
| Otto | Physique |
| Anna | Biologie |
| Peter | Cours non choisi |
Doublons inutiles
Si les données dans la table de droite contiennent des doublons, le résultat de la requête aura plus de lignes que tu ne t'y attends. Fais bien attention aux données avec lesquelles tu bosses, et utilise DISTINCT si tu ne veux pas de doublons.
GO TO FULL VERSION