PaliSkill
SQL Intermédiaire

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

À faire

Voici 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

À faire

Voici 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

À faire

Voici 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.

Quitter le module