SQL Quest
Se connecter English 0 XP Niv. 1
Intermédiaire

SQL self join : joindre une table avec elle-même

4 min de lecture · 3 exemples exécutables · mis à jour le 9 octobre 2026

Parfois, la relation est à l'intérieur d'une même table. Dans la table employes, la colonne manager_id contient l'identifiant… d'un autre employé. Pour afficher « Léa travaille sous la responsabilité de Hugo », il faut joindre la table employes avec elle-même : c'est une auto-jointure.

Syntaxe

SELECT e.nom, m.nom AS manager
FROM employes e
LEFT JOIN employes m ON m.id = e.manager_id;

Comment ça marche

Une auto-jointure n'a pas de mot-clé spécial : c'est un JOIN classique où la même table apparaît deux fois. Pour les distinguer, les alias sont obligatoires : ici e représente l'employé et m son manager.

On utilise souvent un LEFT JOIN, pour garder les lignes qui n'ont pas de « parent » (le PDG n'a pas de manager).

Les auto-jointures servent aussi à comparer des lignes entre elles : les employés qui gagnent plus que leur manager, les produits de même catégorie, les clients d'une même ville…

Schéma

employes
idnommanager_id
1DurandNULL
2Martin1
3Roux2
résultat
employémanager
DurandNULL
MartinDurand
RouxMartin
employes e LEFT JOIN employes m : chaque employé retrouve la ligne de son manager dans la même table.

Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).

Exemples avec leurs résultats

1. Chaque employé et son manager

Le PDG apparaît avec un manager NULL grâce au LEFT JOIN.

SELECT e.prenom || ' ' || e.nom AS employe, e.poste,
       m.prenom || ' ' || m.nom AS manager
FROM employes e
LEFT JOIN employes m ON m.id = e.manager_id
LIMIT 8;
Essayer dans le bac à sable
Résultat
employepostemanager
Chloé DuboisPDGNULL
Jade LefebvreDirecteur commercialChloé Dubois
Nathan RouxDirectrice techniqueChloé Dubois
Samir SimonResponsable RHChloé Dubois
Alice SimonCommercialJade Lefebvre
Nathan MartinCommercialJade Lefebvre
Lucas MoreauCommercialJade Lefebvre
Emma LambertCommercialJade Lefebvre

8 lignes au total

2. Compter les subordonnés

Combien de personnes chaque manager encadre-t-il directement ?

SELECT m.prenom, m.nom, m.poste, COUNT(e.id) AS equipe
FROM employes m
JOIN employes e ON e.manager_id = m.id
GROUP BY m.id
ORDER BY equipe DESC;
Essayer dans le bac à sable
Résultat
prenomnomposteequipe
JadeLefebvreDirecteur commercial12
SamirSimonResponsable RH5
NathanRouxDirectrice technique4
ChloéDuboisPDG3

4 lignes au total

3. Comparer deux lignes

Les employés qui gagnent plus que la moitié du salaire de leur manager.

SELECT e.nom, e.salaire, m.nom AS manager, m.salaire AS salaire_manager
FROM employes e
JOIN employes m ON m.id = e.manager_id
WHERE e.salaire > m.salaire / 2
LIMIT 8;
Essayer dans le bac à sable
Résultat
nomsalairemanagersalaire_manager
Lefebvre6 200Dubois9 500
Roux6 800Dubois9 500
Simon4 800Dubois9 500
Simon4 800Lefebvre6 200
Martin3 400Lefebvre6 200
Moreau4 600Lefebvre6 200
Lambert4 200Lefebvre6 200
Lefebvre3 800Lefebvre6 200

8 lignes au total

Les erreurs fréquentes

Oublier les alias

Sans alias, SQL ne peut pas savoir à quelle « copie » de la table chaque colonne appartient.

À éviter
SELECT nom, nom FROM employes JOIN employes ON id = manager_id;
Correct
SELECT e.nom, m.nom FROM employes e JOIN employes m ON m.id = e.manager_id;

Inverser la condition

e.id = m.manager_id donne les subordonnés au lieu des managers. Relisez la condition : l'id du manager doit être égal au manager_id de l'employé.

À éviter
SELECT e.nom, m.nom AS manager FROM employes e JOIN employes m ON e.id = m.manager_id;
Correct
SELECT e.nom, m.nom AS manager FROM employes e JOIN employes m ON m.id = e.manager_id;

Perdre le sommet de la hiérarchie

Avec un INNER JOIN, l'employé sans manager disparaît. Utilisez LEFT JOIN pour le garder.

À éviter
SELECT e.nom, m.nom FROM employes e JOIN employes m ON m.id = e.manager_id;
Correct
SELECT e.nom, m.nom FROM employes e LEFT JOIN employes m ON m.id = e.manager_id;

Exercices

Essayez d'écrire la requête vous-même avant d'ouvrir la solution.

Défi 1. Affichez les employés (prénom, nom) dont le manager est le Directeur commercial.

Voir une solution
SELECT e.prenom, e.nom FROM employes e JOIN employes m ON m.id = e.manager_id WHERE m.poste = 'Directeur commercial';
prenomnom
AliceSimon
NathanMartin
LucasMoreau
EmmaLambert
AliceLefebvre
InèsMercier
LouisBernard
LouisGarcia

12 lignes au total · 8 affichées

Essayer dans le bac à sable

Défi 2. Affichez chaque manager et le salaire moyen de son équipe.

Voir une solution
SELECT m.nom, ROUND(AVG(e.salaire)) AS salaire_moyen_equipe FROM employes m JOIN employes e ON e.manager_id = m.id GROUP BY m.id;
nomsalaire_moyen_equipe
Dubois5 933
Lefebvre4 417
Roux4 250
Simon4 120

4 lignes au total

Essayer dans le bac à sable
Envie de vous entraîner davantage ?

Les exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.

Faire les exercices interactifs

Questions fréquentes

Existe-t-il un mot-clé SELF JOIN ?

Non. Une auto-jointure s'écrit avec un JOIN ordinaire où la même table apparaît deux fois, avec deux alias différents.

Comment afficher toute la hiérarchie sur plusieurs niveaux ?

Avec une CTE récursive (WITH RECURSIVE), qui répète l'auto-jointure niveau par niveau.

Une auto-jointure est-elle lente ?

Pas plus qu'une jointure entre deux tables différentes. Un index sur la colonne de liaison (ici manager_id) l'accélère sur les grosses tables.

À lire ensuite