Leçon 1 / 9 — Chapitre 2: Jointures avancées et combinées
SELF JOIN : comparer des lignes d'une même table
Un SELF JOIN joint une table avec elle-même — utile pour comparer des lignes entre elles, par exemple pour trouver des paires de produits qui partagent une caractéristique.
SELECT a.nom AS produit_a, b.nom AS produit_b, a.categorie
FROM produits a
JOIN produits b ON a.categorie = b.categorie AND a.id < b.id;
produits est utilisée deux fois, sous deux alias différents (a et b) — c'est ce double alias qui rend le SELF JOIN possible : sans lui, le moteur SQL ne saurait pas distinguer les deux occurrences de la table.
La condition a.categorie = b.categorie associe des produits de même catégorie. a.id < b.id évite deux pièges à la fois : qu'un produit se retrouve associé à lui-même (a.id = b.id), et qu'une même paire apparaisse deux fois dans les deux sens (Cahier-Stylo et Stylo-Cahier).
Sur produits, seules deux catégories comptent plus d'un produit : papeterie (Cahier id 1, Stylo id 2) et hygiène (Savon id 3, Dentifrice id 6). Le résultat contient donc 2 lignes : Cahier/Stylo et Savon/Dentifrice. Boisson et alimentaire, avec un seul produit chacune, ne forment aucune paire.
À retenir :
- Un SELF JOIN joint une table avec elle-même, via deux alias différents obligatoires pour la distinguer.
- Une condition comme
a.id < b.idévite qu'une ligne se compare à elle-même et qu'une paire apparaisse deux fois. - Une catégorie qui ne contient qu'une seule ligne ne produit aucune paire dans un SELF JOIN de ce type.
À vous de jouer : sur produits, écrivez la condition qui formerait des paires de produits de même catégorie ET de prix identique.
À vous de jouer
À faireVoici la table produits :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
Combien de lignes retourne :
SELECT a.nom AS produit_a, b.nom AS produit_b, a.categorie
FROM produits a
JOIN produits b ON a.categorie = b.categorie AND a.id < b.id;
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nombre.
À vous de jouer
À faireVoici la table produits :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
Dans le résultat de SELECT a.nom AS produit_a, b.nom AS produit_b, a.categorie FROM produits a JOIN produits b ON a.categorie = b.categorie AND a.id < b.id;, le nom 'Jus' apparaît-il (en produit_a ou produit_b) ? Répondez par oui ou non.
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Oui ou non.
À vous de jouer
À faireVoici la table produits :
produits
id | nom | categorie | prix | stock
1 | Cahier | papeterie | 500 | 40
2 | Stylo | papeterie | 100 | 120
3 | Savon | hygiene | 300 | 25
4 | Jus | boisson | 600 | 15
5 | Biscuits | alimentaire | 400 | 60
6 | Dentifrice | hygiene | 500 | 10
Dans le résultat de SELECT a.nom AS produit_a, b.nom AS produit_b, a.categorie FROM produits a JOIN produits b ON a.categorie = b.categorie AND a.id < b.id;, quel est le produit_a de la paire de catégorie hygiene ?
Testez cette requête dans un bac à sable SQL en ligne (SQLite Fiddle, W3Schools "Try SQL", ou tout autre) pour vérifier le résultat avant de répondre.
💡 Un nom de produit.