Jointures SQL expliquées, avec un exemple de chacune

Une jointure combine les lignes de deux tables en faisant correspondre une colonne. Le type de jointure détermine ce qui arrive aux lignes qui n'ont pas de correspondant. Tous les exemples utilisent la base de boulangerie : 8 clients et 12 commandes, dont deux commandes passées au comptoir, sans client.

INNER JOIN : uniquement les correspondances

Ne conserve une ligne que si les deux côtés ont une correspondance. Les clients sans commande et les commandes sans client disparaissent toutes les deux.

SELECT c.last_name, o.order_id
FROM customers AS c
INNER JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Résultat : 10 lignes : les commandes qui appartiennent à un client.

LEFT JOIN : tout garder à gauche

Conserve chaque ligne de la table de gauche. Lorsque la table de droite n'a pas de correspondance, ses colonnes valent NULL. Filtrer sur IS NULL permet de trouver les lignes sans correspondance.

SELECT c.last_name, COUNT(o.order_id) AS orders
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.last_name
ORDER BY c.customer_id;

Résultat : Les 8 clients ; Kim et Meyer affichent 0 commande.

RIGHT JOIN : tout garder à droite

L'image miroir de LEFT JOIN. La plupart des gens inversent l'ordre des tables et utilisent LEFT JOIN, qui se lit plus naturellement.

SELECT o.order_id, c.last_name
FROM customers AS c
RIGHT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Résultat : Les 12 commandes ; les commandes 4 et 11 ont un nom de famille NULL (comptoir).

FULL JOIN : tout garder des deux côtés

Conserve les lignes sans correspondance des deux tables. Utile pour comparer deux listes et voir ce qui manque de chaque côté.

SELECT c.last_name, o.order_id
FROM customers AS c
FULL JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id, c.last_name;

Résultat : 14 lignes : 10 correspondances, 2 commandes au comptoir, et les clients Kim et Meyer sans commande.

CROSS JOIN : toutes les combinaisons

Associe chaque ligne de la première table à chaque ligne de la seconde. Le nombre de lignes est le produit des deux. À utiliser volontairement, par exemple pour construire une grille de dates et de catégories.

SELECT COUNT(*) AS combinations
FROM customers
CROSS JOIN products;

Résultat : 72, soit 8 clients multipliés par 9 produits.

Auto-jointure : une table avec elle-même

Donnez deux alias à la même table pour comparer des lignes d'une même table, par exemple deux clients de la même ville.

SELECT a.first_name AS first_customer, b.first_name AS second_customer, a.city
FROM customers AS a
JOIN customers AS b ON a.city = b.city AND a.customer_id < b.customer_id
ORDER BY a.city;

Résultat : Les paires Emma et Hugo (Berlin), Ben et Dev (Londres), et Chloe et Farid (Paris).

Questions fréquentes

Pourquoi ma jointure renvoie-t-elle plus de lignes que prévu ?
En général, la colonne de jointure n'est pas unique d'un côté, si bien que chaque ligne correspond à plusieurs lignes. Vérifiez les clés et comptez les lignes avant et après la jointure.
Le fait de placer une condition dans ON ou dans WHERE a-t-il de l'importance ?
Pour un INNER JOIN, cela ne change rien. Pour un LEFT JOIN, une condition sur la table de droite placée dans WHERE supprime les lignes sans correspondance et transforme le LEFT JOIN en INNER JOIN. Placez-la dans ON pour les conserver.
Quelle jointure équivaut à VLOOKUP ?
Un LEFT JOIN : chaque ligne de la table principale est conservée, et la colonne recherchée vaut NULL lorsqu'aucune correspondance n'existe, comme #N/A. Contrairement à VLOOKUP, il renvoie toutes les correspondances, et pas seulement la première.

Pratiquer