Les jointures (JOIN) en SQL
La clause JOIN est utilisée pour récupérer les données de deux ou plusieurs tables, qui sont jointes pour apparaître comme un seul ensemble de données. Elle est utilisée pour combiner des colonnes de deux tables ou plus en utilisant des valeurs communes aux deux tables.
Le mot-clé JOIN est utilisé dans les requêtes SQL pour joindre deux tables ou plus. Les conditions minimales requises pour joindre n tables sont (n-1) conditions de jointure.
Une table peut également se joindre à elle-même, appelée SELF JOIN.
Les types de jointures
- CROSS JOIN (produit cartésien)
- INNER JOIN (jointure interne)
- LEFT JOIN (jointure gauche)
- RIGHT JOIN (jointure droite)
- SELF JOIN (jointure d'une table avec elle-même)
Tables d'exemple
Pendant ce cours, nous allons travailler sur ces deux tables :
Table - Employes
+----+---------+-----+---------+------------+------+
| Id | Nom | Age | Salaire | Profession | Dep |
+----+---------+-----+---------+------------+------+
| 1 | Ismail | 25 | 6000.00 | Assistant | 2 |
| 2 | Mohamed | 30 | 8000.40 | Directeur | 1 |
| 3 | Fatima | 29 | 6000.00 | Directeur | 3 |
| 4 | Dounia | 30 | 7000.00 | Assistant | 4 |
| 5 | Omar | 29 | 9000.00 | Ingenieur | 1 |
| 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL |
+----+---------+-----+---------+------------+------+Table - Departement
+--------+--------------+
| Id_dep | Nom_dep |
+--------+--------------+
| 1 | Informatique |
| 2 | RH |
| 3 | Vente |
| 4 | Strategies |
+--------+--------------+1. CROSS JOIN
Ce type de JOIN renvoie le produit cartésien des lignes des tables de la jointure. Elle renverra un jeu de résultats des enregistrements combinant chaque ligne de la première table avec chaque ligne de la deuxième table.
Syntaxe
SELECT liste_colonnes
FROM table1 CROSS JOIN table2;Exemple n°1
Produit cartésien des tables Departement et Employes.
SELECT * FROM Departement CROSS JOIN Employes;+--------+--------------+----+---------+-----+---------+------------+------+ | Id_dep | Nom_dep | Id | Nom | Age | Salaire | Profession | Dep | +--------+--------------+----+---------+-----+---------+------------+------+ | 1 | Informatique | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 2 | RH | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 3 | Vente | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 4 | Strategies | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 1 | Informatique | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 2 | RH | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 3 | Vente | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 4 | Strategies | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 1 | Informatique | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 2 | RH | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 3 | Vente | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 4 | Strategies | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | ... (24 lignes au total)
Comme vous pouvez le constater, cette jointure renvoie le produit cartésien de tous les enregistrements présents dans les deux tables (4 départements × 6 employés = 24 lignes).
2. INNER JOIN
La jointure la plus importante et la plus utilisée est la jointure INNER. Elle est également appelée jointure d'égalité.
INNER JOIN crée un jeu de résultats en combinant les valeurs de colonne de deux tables en fonction du prédicat de jointure. Seules les lignes qui satisfont la condition de jointure sont retournées.
Syntaxes
SELECT liste_colonnes
FROM table1 INNER JOIN table2
ON table1.champ_commun = table2.champ_commun;SELECT liste_colonnes
FROM table1, table2
WHERE table1.champ_commun = table2.champ_commun;Exemple n°2
Obtenir les employés avec leur département respectif.
SELECT * FROM Departement AS D INNER JOIN Employes AS E ON D.Id_dep = E.Dep;+--------+--------------+----+---------+-----+---------+------------+------+ | Id_dep | Nom_dep | Id | Nom | Age | Salaire | Profession | Dep | +--------+--------------+----+---------+-----+---------+------------+------+ | 2 | RH | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 1 | Informatique | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 3 | Vente | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 4 | Strategies | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | | 1 | Informatique | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | +--------+--------------+----+---------+-----+---------+------------+------+
Notez que Mostafa (Dep = NULL) n'apparaît pas dans le résultat car il n'a pas de département correspondant.
3. LEFT JOIN
LEFT JOIN renvoie toutes les lignes de la table de gauche, même s'il n'y a pas de correspondance dans la table de droite.
Si la clause ON correspond à 0 enregistrement dans la table de droite, la jointure retournera toujours une ligne dans le résultat, mais avec NULL dans chaque colonne de la table de droite.
Syntaxe
SELECT liste_colonnes
FROM table1 LEFT JOIN table2
ON table1.champ_commun = table2.champ_commun;Exemple n°3
Obtenir tous les employés avec leur département (si existant).
SELECT * FROM Employes AS E LEFT JOIN Departement AS D ON D.Id_dep = E.Dep;+----+---------+-----+---------+------------+------+--------+--------------+ | Id | Nom | Age | Salaire | Profession | Dep | Id_dep | Nom_dep | +----+---------+-----+---------+------------+------+--------+--------------+ | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | 1 | Informatique | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 1 | Informatique | | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | 2 | RH | | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | 3 | Vente | | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | 4 | Strategies | | 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL | NULL | NULL | +----+---------+-----+---------+------------+------+--------+--------------+
Tous les employés sont affichés. Mostafa apparaît avec des valeurs NULL pour le département car il n'a pas de correspondance.
4. RIGHT JOIN
RIGHT JOIN renvoie toutes les lignes de la table de droite, même s'il n'y a pas de correspondance dans la table de gauche.
Si la clause ON correspond à 0 enregistrement dans la table de gauche, la jointure retournera toujours une ligne dans le résultat, mais avec NULL dans chaque colonne de la table de gauche.
Syntaxe
SELECT liste_colonnes
FROM table1 RIGHT JOIN table2
ON table1.champ_commun = table2.champ_commun;Exemple n°4
Obtenir tous les départements avec leurs employés (si existants).
SELECT * FROM Employes AS E RIGHT JOIN Departement AS D ON D.Id_dep = E.Dep;+------+---------+------+---------+------------+------+--------+--------------+ | Id | Nom | Age | Salaire | Profession | Dep | Id_dep | Nom_dep | +------+---------+------+---------+------------+------+--------+--------------+ | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | 2 | RH | | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | 1 | Informatique | | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | 3 | Vente | | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | 4 | Strategies | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 1 | Informatique | +------+---------+------+---------+------------+------+--------+--------------+
Tous les départements sont affichés. Dans cet exemple, tous les départements ont au moins un employé, donc aucune ligne avec NULL.
5. SELF JOIN
SELF JOIN est utilisée pour joindre une table à elle-même comme si la table était deux tables différentes, en la renommant temporairement.
Syntaxe
SELECT liste_colonnes
FROM table1 AS T1, table1 AS T2
WHERE T1.champ_commun = T2.champ_commun;Exemple n°5
Trouver toutes les paires d'employés où le salaire du premier est supérieur au salaire du second.
SELECT * FROM Employes AS T1, Employes AS T2 WHERE T1.Salaire > T2.Salaire;+----+---------+-----+---------+------------+------+----+---------+-----+---------+------------+------+ | Id | Nom | Age | Salaire | Profession | Dep | Id | Nom | Age | Salaire | Profession | Dep | +----+---------+-----+---------+------------+------+----+---------+-----+---------+------------+------+ | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL | 1 | Ismail | 25 | 6000.00 | Assistant | 2 | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL | 3 | Fatima | 29 | 6000.00 | Directeur | 3 | | 2 | Mohamed | 30 | 8000.40 | Directeur | 1 | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | | 5 | Omar | 29 | 9000.00 | Ingenieur | 1 | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | | 7 | Mostafa | 29 | 9000.00 | Ingenieur | NULL | 4 | Dounia | 30 | 7000.00 | Assistant | 4 | +----+---------+-----+---------+------------+------+----+---------+-----+---------+------------+------+
Cette requête compare chaque employé avec tous les autres pour trouver les paires où le salaire du premier est supérieur au salaire du second.
Récapitulatif des jointures
| Type de jointure | Description | Lignes retournées |
|---|---|---|
| CROSS JOIN | Produit cartésien des deux tables | Toutes les combinaisons possibles |
| INNER JOIN | Lignes correspondant à la condition de jointure | Uniquement les lignes avec correspondance |
| LEFT JOIN | Toutes les lignes de la table de gauche | Toutes les lignes de gauche + correspondances à droite (ou NULL) |
| RIGHT JOIN | Toutes les lignes de la table de droite | Toutes les lignes de droite + correspondances à gauche (ou NULL) |
| SELF JOIN | Jointure d'une table avec elle-même | Dépend de la condition |
Utilisation des jointures
En utilisant les tables Employes et Departement, écrivez les requêtes SQL pour :
- Afficher tous les employés avec le nom de leur département (INNER JOIN).
- Afficher tous les départements même ceux sans employés (RIGHT JOIN).
- Afficher les employés qui n'ont pas de département (LEFT JOIN avec condition).
- Employés avec leur département :
SELECT E.Nom, D.Nom_dep FROM Employes AS E INNER JOIN Departement AS D ON E.Dep = D.Id_dep; - Tous les départements, même sans employés :
SELECT D.Nom_dep, E.Nom FROM Departement AS D LEFT JOIN Employes AS E ON D.Id_dep = E.Dep;Dans notre exemple, tous les départements ont des employés, donc cette requête donnerait le même résultat que INNER JOIN.
- Employés sans département :
SELECT E.Nom FROM Employes AS E LEFT JOIN Departement AS D ON E.Dep = D.Id_dep WHERE D.Id_dep IS NULL;Résultat : Mostafa (car Dep = NULL)
- Les jointures permettent de combiner des données de plusieurs tables.
- CROSS JOIN : produit cartésien (toutes les combinaisons).
- INNER JOIN : seulement les lignes qui correspondent entre les tables.
- LEFT JOIN : toutes les lignes de la table de gauche + correspondances à droite.
- RIGHT JOIN : toutes les lignes de la table de droite + correspondances à gauche.
- SELF JOIN : jointure d'une table avec elle-même.
- Pour n tables, il faut au moins (n-1) conditions de jointure.
- Les valeurs NULL apparaissent quand il n'y a pas de correspondance dans une jointure externe.
- On peut combiner des jointures avec WHERE, GROUP BY, ORDER BY.
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.