Les jointures en SQL - JOIN

23 Sep 2019 23 Sep 2019 17102 vues ESSADDOUKI Mostafa 9 min de lecture

Les jointures (JOIN) en SQL

Définition

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.

Conditions minimales

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

Description

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

   
CROSS JOIN SQL
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;
Résultat (extrait)
+--------+--------------+----+---------+-----+---------+------------+------+
| 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

Description

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

   
INNER JOIN (explicite) SQL
SELECT liste_colonnes
FROM table1 INNER JOIN table2
ON table1.champ_commun = table2.champ_commun;
   
INNER JOIN (implicite) SQL
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;
Résultat
+--------+--------------+----+---------+-----+---------+------------+------+
| 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

Description

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

   
LEFT JOIN SQL
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;
Résultat
+----+---------+-----+---------+------------+------+--------+--------------+
| 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

Description

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

   
RIGHT JOIN SQL
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;
Résultat
+------+---------+------+---------+------------+------+--------+--------------+
| 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

Description

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

   
SELF JOIN SQL
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;
Résultat (extrait)
+----+---------+-----+---------+------------+------+----+---------+-----+---------+------------+------+
| 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 jointureDescriptionLignes retournées
CROSS JOINProduit cartésien des deux tablesToutes les combinaisons possibles
INNER JOINLignes correspondant à la condition de jointureUniquement les lignes avec correspondance
LEFT JOINToutes les lignes de la table de gaucheToutes les lignes de gauche + correspondances à droite (ou NULL)
RIGHT JOINToutes les lignes de la table de droiteToutes les lignes de droite + correspondances à gauche (ou NULL)
SELF JOINJointure d'une table avec elle-mêmeDépend de la condition
 Exercice pratique

Utilisation des jointures

 Niveau : Débutant

En utilisant les tables Employes et Departement, écrivez les requêtes SQL pour :

  1. Afficher tous les employés avec le nom de leur département (INNER JOIN).
  2. Afficher tous les départements même ceux sans employés (RIGHT JOIN).
  3. Afficher les employés qui n'ont pas de département (LEFT JOIN avec condition).
Points clés à retenir
  • 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.