SQL - Jointe de soi : Un guide amical pour les débutants

Bonjour là-bas, aspirants passionnés de SQL ! Je suis ravi de vous guider dans cette exciting aventure à travers le monde des jointes de soi (Self Joins) en SQL. En tant que quelqu'un qui enseigne l'informatique depuis des années, j'ai vu d'innombrables moments "aha !" lorsque les étudiants saisissent ce concept. Alors, mettons-nous à l'eau et faisons de la magie SQL !

SQL - Self Join

Qu'est-ce qu'une jointe de soi (Self Join) ?

Avant de plonger dans les détails, commençons par une simple analogie. Imaginez que vous êtes à une réunion de famille et que vous souhaitez créer une liste de toutes les relations parent-enfant. Vous avez un grand tableau de membres de la famille, mais vous devez connecter les personnes à leurs parents dans ce même tableau. C'est essentiellement ce que fait une jointe de soi en SQL !

Une jointe de soi se produit lorsque une table est jointe à elle-même. C'est comme si la table se regardait dans un miroir et se connectait à sa propre réflexion. Ça paraît un peu déroutant, n'est-ce pas ? Ne vous inquiétez pas, cela aura tout son sens bientôt !

Pourquoi utiliser une jointe de soi ?

Les jointes de soi sont extrêmement utiles lorsque vous avez des données hiérarchiques ou récursives dans une seule table. Pensez à :

  1. Les relations employé-manager
  2. Les arbres généalogiques
  3. Les composants et sous-composants dans la fabrication
  4. Les réponses de fils dans un forum

La jointe de soi en SQL en action

Mettons en place un exemple simple pour illustrer comment fonctionne une jointe de soi. Nous utiliserons un tableau des employés pour nos démonstrations.

Premièrement, créons notre tableau :

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);

INSERT INTO employees (employee_id, name, manager_id)
VALUES
(1, 'John Doe', NULL),
(2, 'Jane Smith', 1),
(3, 'Bob Johnson', 1),
(4, 'Alice Brown', 2),
(5, 'Charlie Davis', 2);

Maintenant, disons que nous voulons lister chaque employé ainsi que le nom de leur manager. C'est là que la jointe de soi devient pratique :

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id;

Décomposons cette requête :

  1. Nous sélectionnons两次 à partir du tableau employees, en lui donnant les aliases e1 et e2.
  2. e1 représente l'employé, et e2 représente le possible manager.
  3. Nous joignons ces "deux" tableaux sur la condition que e1's manager_id correspond à e2's employee_id.
  4. Nous utilisons une jointe 左 (LEFT JOIN) pour nous assurer d'obtenir tous les employés, même ceux sans manager.

Le résultat pourrait ressembler à ceci :

employé manager
John Doe NULL
Jane Smith John Doe
Bob Johnson John Doe
Alice Brown Jane Smith
Charlie Davis Jane Smith

N'est-ce pas génial ? Avec une seule requête, nous avons cartographié toute la structure de gestion de notre petite entreprise !

Jointe de soi avec clause ORDER BY

Maintenant, ajoutons un peu d'épice à notre requête en ordonnant nos résultats. Nous pourrions vouloir voir les employés classés par ordre alphabétique :

SELECT
e1.name AS employee,
e2.name AS manager
FROM
employees e1
LEFT JOIN
employees e2 ON e1.manager_id = e2.employee_id
ORDER BY
e1.name ASC;

Cette requête est identique à notre précédente, avec l'ajout de la clause ORDER BY à la fin. Elle trie nos résultats par ordre alphabétique du nom de l'employé.

Le résultat pourrait maintenant ressembler à ceci :

employé manager
Alice Brown Jane Smith
Bob Johnson John Doe
Charlie Davis Jane Smith
Jane Smith John Doe
John Doe NULL

Bien mieux ! Maintenant, nous pouvons facilement trouver n'importe quel employé et leur manager.

Techniques avancées de jointe de soi

Prêt à monter en niveau ? Essayons quelque chose de plus complexe. Que ferions-nous si nous voulions trouver des employés qui ont le même manager ?

SELECT
e1.name AS employee1,
e2.name AS employee2,
m.name AS shared_manager
FROM
employees e1
JOIN
employees e2 ON e1.manager_id = e2.manager_id AND e1.employee_id < e2.employee_id
JOIN
employees m ON e1.manager_id = m.employee_id;

Cette requête pourrait sembler intimidante, mais décomposons-la :

  1. Nous joignons le tableau employees avec lui-même deux fois (e1 et e2) pour comparer les employés.
  2. La condition e1.employee_id < e2.employee_id nous assure de ne pas obtenir des paires de duplicata (comme "Alice et Bob" et "Bob et Alice").
  3. Nous joignons une troisième fois (m) pour obtenir le nom du manager.

Le résultat pourrait ressembler à ceci :

employé1 employé2 manager commun
Jane Smith Bob Johnson John Doe
Alice Brown Charlie Davis Jane Smith

Et voilà ! Nous avons trouvé des employés qui partagent le même manager.

Conclusion

Les jointes de soi peuvent sembler délicates au départ, mais elles sont un outil incroyablement puissant dans votre boîte à outils SQL. Elles vous permettent de requêter des données hiérarchiques efficacement et de découvrir des relations au sein d'une seule table.

N'oubliez pas, la pratique rend parfait ! Essayez de créer vos propres tableaux et expérimentez avec différentes requêtes de jointe de soi. Avant de vous en rendre compte, vous serez un pro de la jointe de soi !

Bonne requête, futurs maîtres de SQL ! Et souvenez-vous, dans le monde des bases de données, il est tout à fait normal de parler à soi-même... je veux dire, de se joindre à soi-même !

Credits: Image by storyset