Jointures entre tables
Pourquoi plusieurs tables plutôt qu'une seule
Stocker les commandes d'un client directement dans la table clients (nom, ville, commande1, commande2...) devient vite ingérable : un client peut avoir 0, 5 ou 500 commandes. Les bases relationnelles séparent l'information en tables liées par des clés étrangères.
Table clients Table commandes
| id | nom | | id | client_id | montant |
|----|---------| |----|-----------|---------|
| 1 | Dupont | | 101| 1 | 45.00 |
| 2 | Martin | | 102| 1 | 12.50 |
| 103| 2 | 78.00 |
client_id dans la table commandes référence id dans la table clients : c'est la clé étrangère qui relie les deux tables.
INNER JOIN : combiner deux tables
SELECT clients.nom, commandes.montant
FROM clients
INNER JOIN commandes ON clients.id = commandes.client_id;
Cette requête retourne une ligne par commande, avec le nom du client associé. Un client sans aucune commande n'apparaît pas avec un INNER JOIN.
LEFT JOIN : garder toutes les lignes de la table de gauche
SELECT clients.nom, commandes.montant
FROM clients
LEFT JOIN commandes ON clients.id = commandes.client_id;
Avec un LEFT JOIN, tous les clients apparaissent, même ceux sans commande (avec montant à NULL pour eux).
flowchart LR
A[INNER JOIN] --> B["Seulement les lignes\nprésentes dans les deux tables"]
C[LEFT JOIN] --> D["Toutes les lignes de gauche,\nmême sans correspondance à droite"]
Cas concret
Un rapport doit lister tous les clients, y compris ceux qui n'ont jamais passé commande (pour une campagne de relance marketing ciblée). Utiliser un INNER JOIN exclurait silencieusement ces clients inactifs du résultat, faussant le rapport sans erreur visible. Un LEFT JOIN est la seule option qui capture réellement l'intégralité de la base clients.
Erreurs fréquentes
- Utiliser INNER JOIN par défaut sans réfléchir, alors que le besoin réel (inclure les lignes sans correspondance) nécessite un LEFT JOIN : erreur silencieuse, sans message d'erreur, juste des données manquantes non détectées.
- Oublier la condition ON, produisant un produit cartésien (chaque ligne de la table 1 combinée à chaque ligne de la table 2), un résultat massif et incohérent.
- Confondre la direction du LEFT JOIN : "gauche" désigne la table mentionnée avant
LEFT JOINdans la requête, pas une notion géographique universelle.
À retenir
- INNER JOIN ne retourne que les lignes ayant une correspondance dans les deux tables.
- LEFT JOIN garde toutes les lignes de la table de gauche, même sans correspondance à droite (valeurs NULL).
- Oublier la condition ON produit un produit cartésien, un résultat massif et généralement inexploitable.
Mini-exercice
Un rapport doit inclure tous les produits d'un catalogue, y compris ceux jamais vendus, avec leur total de ventes (0 si aucune vente). Quel type de jointure utiliser entre la table produits et la table ventes ?
Réponse : un LEFT JOIN depuis la table produits vers la table ventes, garantissant que tous les produits apparaissent même sans aucune vente associée, contrairement à un INNER JOIN qui les exclurait silencieusement.