Ce cours sur le SQL a pour but de donner des bases pour quiconque voudrait avoir une vision globale sur ce sujet. Il permet d’avoir une vision globale sur comment lire une base de données et faire des requêtes. Cet article est le troisième d’une série de 5 articles et a pour vocation à présenter les jointures.
Ce cours est la suite de la partie 2, il va présenter les jointures en SQL. Si vous débutez totalement en SQL, commencez par la partie 1 !
Les jointures
Supposons qu’on a maintenant une seconde table appelée revenue, donnant le salaire annuel brut selon le numéro de sécurité sociale. On a donc 2 colonnes :
- Une première colonne secu qui est le numéro de sécurité
- Une seconde colonne salaire qui est le salaire annuel brut
Grâce aux jointures, on va pouvoir faire le lien entre cette table et la table précédente à l’aide d’une clé de jointure. Une clé de jointure et un ensemble de règles entre les colonnes permettant de lier plusieurs tables entre elles. Ici par exemple, les deux tables ont en commun le numéro de sécurité sociale qui est un identifiant unique.
Voici la table revenue :
secu | salaire |
1 | 30 000 |
2 | 50 000 |
3 | 21 000 |
4 | 70 000 |
5 | 45 000 |
7 | 41 000 |
A noter : On n’a pas de salaire connu pour le numéro de sécurité sociale 6 et on n’a pas le nom ni le prénom du numéro de sécurité sociale 7 (cf la table de la partie 1)
On a différents types de jointures, qui vont maintenant être présentées.
Les différents type de jointure
- LEFT JOIN : On garde tous les résultats de la table de gauche même si la clé de jointure n’est pas présente dans la table de droite
- RIGHT JOIN : On garde tous les résultats de la table de droite même si la clé de jointure n’est pas présente dans la table de droite
- INNER JOIN : On garde les résultats si la condition de jointure est vraie dans les 2 tables.
- FULL JOIN : On garde les résultats si la condition de jointure est vraie d’un côté ou de l’autre.
- CROSS JOIN : Jointure permettant le produit cartésien entre deux tables.
Un peu de mathématiques maintenant, définissons ce qu’est un produit cartésien.
Produit cartésien : Le produit cartésien de deux ensembles est l’ensemble des couples X et Y dont la première composante appartient à X et la seconde composante appartient à Y.
Concrètement, si on fait un CROSS JOIN entre une table qui a 10 lignes et une table qui a 50 lignes, on obtient une table de 10 x 50 = 500 lignes correspondant à tous les croisement possibles.
L’opérateur LEFT JOIN
Voici un schéma pour bien se représenter le left join :

Admettons qu’on veuille récupérer les noms, prénom et salaires des personnes dont on connait nom et prénom. Voici la requête que l’on va faire :
SELECT
nom, prenom, salaire
FROM
personnes
LEFT JOIN
revenue
ON
secu_sociale = secu
Voici le résultat de la requête SQL.
nom | prenom | salaire |
Duchene | Pierre | 30 000 |
Dupont | Paul | 50 000 |
Dupont | Baptiste | 21 000 |
Durand | Jean | 70 000 |
Durand | Jacques | 45 000 |
Girard | Baptiste | null |
L’opérateur RIGHT JOIN
Voici un schéma représentant le right join :

On veut trouver les noms, prénom et salaires des personnes dont on connaît le salaire. Voici la requête SQL que l’on va faire pour cela :
SELECT
nom, prenom, salaire
FROM
personnes
RIGHT JOIN
revenue
ON
secu_sociale = secu
Et voici ce que l’on récupère
nom | prenom | salaire |
Duchene | Pierre | 30 000 |
Dupont | Paul | 50 000 |
Dupont | Baptiste | 21 000 |
Durand | Jean | 70 000 |
Durand | Jacques | 45 000 |
null | null | 41 000 |
L’opérateur FULL JOIN
Voici une représentation graphique du full join :

On veut trouver les noms, prénom et salaires des personnes dont on a au moins une information. Voici la requête SQL que l’on va faire pour cela :
SELECT
nom, prenom, salaire
FROM
personnes
FULL JOIN
revenue
ON
secu_sociale = secu
On obtient alors :
nom | prenom | salaire |
Duchene | Pierre | 30 000 |
Dupont | Paul | 50 000 |
Dupont | Baptiste | 21 000 |
Durand | Jean | 70 000 |
Durand | Jacques | 45 000 |
Girard | Baptiste | null |
null | null | 41 000 |
L’opérateur INNER JOIN
Voici la représentation graphique de cet opérateur :

On veut sélection les noms, prénom et salaires des personnes qui sont présentes dans les 2 tables
SELECT
nom, prenom, salaire
FROM
personnes
INNER JOIN
revenue
ON
secu_sociale = secu
Et on obtient comme donc résultat de requête :
nom | prenom | salaire |
Duchene | Pierre | 30 000 |
Dupont | Paul | 50 000 |
Dupont | Baptiste | 21 000 |
Durand | Jean | 70 000 |
Durand | Jacques | 45 000 |
On a bien toutes les tables contenant toutes les informations.
L’opérateur UNION
Supposons maintenant qu’on dispose d’une autre partie de la table de base appelée personne2. Grâce à la fonction UNION, on peut rassembler les deux tables.
Voici la table personne2
secu_sociale | nom | prenom | ville |
4 | Dupont | Paul | Parisis |
11 | Doe | John | Londres |
12 | Smith | Josh | Manchester |
L’opérateur UNION ALL
Avec l’opérateur UNION ALL, on concatène à la suite les deux tables, sans se poser de questions
SELECT
*
FROM
personne
UNION ALL
SELECT
*
FROM
personne2
Voici le résultat :
secu_sociale | nom | prenom | ville |
1 | Dupont | Baptiste | Paris |
2 | Durand | Jean | Marseille |
3 | Duchene | Pierre | Lyon |
4 | Dupont | Paul | Parisis |
5 | Durand | Jacques | Marseille |
6 | Girard | Baptiste | Paris |
4 | Dupont | Paul | Parisis |
11 | Doe | John | Londres |
12 | Smith | Josh | Manchester |
L’opérateur UNION DISTINCT
On concatène à la suite les deux tables, mais en enlevant les doublons. Cela se fait grâce à UNION DISTINCT
SELECT
*
FROM
personne
UNION DISTINCT
SELECT
*
FROM
personne2
On obtient donc :
secu_sociale | nom | prenom | ville |
1 | Dupont | Baptiste | Paris |
2 | Durand | Jean | Marseille |
3 | Duchene | Pierre | Lyon |
4 | Dupont | Paul | Parisis |
5 | Durand | Jacques | Marseille |
6 | Girard | Baptiste | Paris |
11 | Doe | John | Londres |
12 | Smith | Josh | Manchester |
L’opérateur INTERSECT
On recherche les lignes qui sont à la fois dans la première et la seconde table. Voici la requête à faire pour obtenir ce résultat :
SELECT
*
FROM
personne
INTERSECT
SELECT
*
FROM
personne2
On obtient alors le résultat suivant :
secu_sociale | nom | prenom | ville |
4 | Dupont | Paul | Parisis |
Et maintenant l’entrainement
Pour vous entrainer sur cette partie 3, faites les exercices 6 à 8 de SQLBolt :
https://sqlbolt.com/lesson/select_queries_with_joins
Et voilà pour cette partie 3 sur les jointures en SQL. Au prochain article : les fonction d’agrégation !