CaveSQL SQLPièce 4/7Intermédiaire

Les jointures

Combiner plusieurs tables dans une seule requête avec INNER JOIN et LEFT JOIN, et utiliser des alias pour garder des requêtes lisibles.

Ce que tu vas apprendre

  • Pourquoi on répartit les données dans plusieurs tables, puis comment les recombiner.
  • Utiliser INNER JOIN et LEFT JOIN.
  • Écrire des requêtes lisibles avec des alias.

Le problème

La table recettes contient seulement un categorie_id. Si tu lis cette table, tu vois des numéros, pas des noms :

idtitrecategorie_id
1Velouté de potimarron1
2Gratin dauphinois2
4Tarte aux pommes3

Le nom « Desserts » est dans la table categories. Une jointure (join) associe les lignes de deux tables grâce à une colonne commune.

INNER JOIN

SELECT recettes.titre, categories.nom
FROM recettes
INNER JOIN categories ON categories.id = recettes.categorie_id;

Résultat (extrait, une ligne par catégorie pour faire court) :

titrenom
Velouté de potimarronEntrées
Gratin dauphinoisPlats
Tarte aux pommesDesserts

Après ON, tu écris la condition qui relie les lignes. PostgreSQL associe chaque recette à la catégorie dont l'id correspond.

INNER JOIN ne garde que les lignes qui ont une correspondance des deux côtés. On peut écrire JOIN tout court : c'est la même chose.

Les alias

Les noms de table répétés alourdissent la requête. Donne-leur un alias, un surnom court :

SELECT r.titre, c.nom AS categorie
FROM recettes AS r
JOIN categories AS c ON c.id = r.categorie_id
WHERE c.nom = 'Desserts'
ORDER BY r.titre;

AS categorie renomme aussi la colonne du résultat. Le WHERE et le ORDER BY s'appliquent comme avant, sur les colonnes des deux tables.

LEFT JOIN

Que se passe-t-il pour une catégorie sans recette, comme « Boissons » ? Un INNER JOIN l'oublie. Un LEFT JOIN garde toutes les lignes de la table de gauche, celle citée après FROM :

SELECT c.nom, r.titre
FROM categories AS c
LEFT JOIN recettes AS r ON r.categorie_id = c.id;

Résultat (extrait) :

nomtitre
EntréesVelouté de potimarron
PlatsGratin dauphinois
DessertsTarte aux pommes
BoissonsNULL

Quand aucune recette ne correspond, les colonnes de droite valent NULL.

Trouver ce qui n'a pas de correspondance

Cette propriété sert à repérer les lignes orphelines. Voici les catégories sans aucune recette :

SELECT c.nom
FROM categories AS c
LEFT JOIN recettes AS r ON r.categorie_id = c.id
WHERE r.id IS NULL;

On garde les lignes où le côté droit est vide. Rappelle-toi qu'un NULL se teste avec IS NULL, jamais avec =.

Quel type de jointure choisir ?

BesoinJointure
Seulement les lignes liées des deux côtésINNER JOIN
Toute la table de gauche, liée ou nonLEFT JOIN
Toute la table de droite, liée ou nonRIGHT JOIN

RIGHT JOIN est l'image miroir de LEFT JOIN. On l'utilise rarement : il suffit d'échanger l'ordre des tables.

Joindre trois tables

Tu enchaînes les JOIN. Voici chaque ingrédient avec sa recette et sa catégorie :

SELECT r.titre, c.nom AS categorie, i.nom AS ingredient
FROM ingredients AS i
JOIN recettes AS r ON r.id = i.recette_id
JOIN categories AS c ON c.id = r.categorie_id;

Chaque JOIN ajoute une table, avec sa propre condition ON.

N'oublie jamais la condition ON. Sans elle (avec une virgule entre les tables, ou avec CROSS JOIN), PostgreSQL associe chaque ligne de la première table à chaque ligne de la seconde. Avec 1 000 lignes de chaque côté, tu obtiens 1 000 000 de lignes.
Quand deux tables ont une colonne du même nom, comme id ou nom, préfixe-la par l'alias de sa table. Sinon PostgreSQL répond que la colonne est « ambiguë ».

À retenir

  • Une jointure recombine des tables grâce à une colonne commune, en général une clé étrangère.
  • INNER JOIN ... ON garde seulement les lignes qui se correspondent des deux côtés.
  • LEFT JOIN garde toutes les lignes de gauche et met NULL à droite quand rien ne correspond.
  • LEFT JOIN ... WHERE droite.id IS NULL trouve les lignes sans correspondance.
  • Utilise des alias courts et préfixe les colonnes pour lever toute ambiguïté.

Pour aller plus loin

Sources officielles

Ensuite

Projet
Lignes de code
Niveau
Cave
Appartement
SQL
Pièce
4/7
Plan n°
sql/04.jointures
Lignes de code · fiches rédigées à partir des documentations officielles, sources citées en bas de chaque page.